aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2004-10-01 21:33:35 +0000
committerDaniel Berlin <dberlin@dberlin.org>2004-10-01 21:33:35 +0000
commit6ab4dd6e85203547f862fcb9a1e4183405ffa272 (patch)
treeaa27d6128a110e84a73069e09f0b6d6a33b80efc
parent5c7804e054c3f0e489e0e28fda158977587847d9 (diff)
Merge from mainline
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/structure-aliasing-branch@88409 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--ChangeLog9
-rw-r--r--MAINTAINERS2
-rw-r--r--boehm-gc/ChangeLog6
-rwxr-xr-xboehm-gc/configure150
-rw-r--r--boehm-gc/configure.ac100
-rw-r--r--boehm-gc/include/gc_config.h.in118
-rwxr-xr-xconfigure4
-rw-r--r--configure.in4
-rw-r--r--gcc/ChangeLog1046
-rw-r--r--gcc/Makefile.in33
-rw-r--r--gcc/aclocal.m419
-rw-r--r--gcc/ada/ChangeLog4
-rw-r--r--gcc/ada/misc.c2
-rw-r--r--gcc/alias.c12
-rw-r--r--gcc/basic-block.h129
-rw-r--r--gcc/bb-reorder.c110
-rw-r--r--gcc/bitmap.h10
-rw-r--r--gcc/bt-load.c6
-rw-r--r--gcc/builtin-attrs.def8
-rw-r--r--gcc/builtins.c393
-rw-r--r--gcc/builtins.def20
-rw-r--r--gcc/c-decl.c24
-rw-r--r--gcc/c-parse.in5
-rw-r--r--gcc/c-tree.h1
-rw-r--r--gcc/c-typeck.c90
-rw-r--r--gcc/cfg.c174
-rw-r--r--gcc/cfganal.c169
-rw-r--r--gcc/cfgbuild.c21
-rw-r--r--gcc/cfgcleanup.c202
-rw-r--r--gcc/cfgexpand.c41
-rw-r--r--gcc/cfghooks.c91
-rw-r--r--gcc/cfglayout.c29
-rw-r--r--gcc/cfgloop.c104
-rw-r--r--gcc/cfgloopanal.c10
-rw-r--r--gcc/cfgloopmanip.c89
-rw-r--r--gcc/cfgrtl.c272
-rw-r--r--gcc/cgraphunit.c2
-rw-r--r--gcc/combine.c3
-rw-r--r--gcc/common.opt6
-rw-r--r--gcc/config/alpha/alpha.c16
-rw-r--r--gcc/config/alpha/alpha.h1
-rw-r--r--gcc/config/alpha/qrnnd.asm4
-rw-r--r--gcc/config/arm/arm.c4
-rw-r--r--gcc/config/arm/symbian.h7
-rw-r--r--gcc/config/arm/t-symbian3
-rw-r--r--gcc/config/cris/cris.md14
-rw-r--r--gcc/config/frv/frv.c2
-rw-r--r--gcc/config/i386/i386.c83
-rw-r--r--gcc/config/ia64/ia64.c3
-rw-r--r--gcc/config/rs6000/linux64.h4
-rw-r--r--gcc/config/rs6000/rs6000.c16
-rw-r--r--gcc/config/s390/s390-protos.h7
-rw-r--r--gcc/config/s390/s390.c409
-rw-r--r--gcc/config/s390/s390.h25
-rw-r--r--gcc/config/s390/s390.md644
-rw-r--r--gcc/config/sh/sh-protos.h1
-rw-r--r--gcc/config/sh/sh.c88
-rw-r--r--gcc/config/sh/sh.h42
-rw-r--r--gcc/config/sparc/sparc-protos.h1
-rw-r--r--gcc/config/sparc/sparc.c86
-rw-r--r--gcc/config/sparc/sparc.h6
-rw-r--r--gcc/config/sparc/sparc.md15
-rw-r--r--gcc/config/stormy16/stormy16.c2
-rwxr-xr-xgcc/configure1
-rw-r--r--gcc/configure.ac1
-rw-r--r--gcc/cp/ChangeLog123
-rw-r--r--gcc/cp/call.c5
-rw-r--r--gcc/cp/class.c207
-rw-r--r--gcc/cp/cp-tree.h29
-rw-r--r--gcc/cp/cvt.c23
-rw-r--r--gcc/cp/decl.c24
-rw-r--r--gcc/cp/error.c2
-rw-r--r--gcc/cp/g++spec.c3
-rw-r--r--gcc/cp/parser.c51
-rw-r--r--gcc/cp/pt.c133
-rw-r--r--gcc/cp/search.c64
-rw-r--r--gcc/cp/semantics.c12
-rw-r--r--gcc/cp/tree.c13
-rw-r--r--gcc/cp/typeck.c119
-rw-r--r--gcc/cse.c11
-rw-r--r--gcc/df.c19
-rw-r--r--gcc/doc/extend.texi25
-rw-r--r--gcc/doc/tm.texi16
-rw-r--r--gcc/dominance.c72
-rw-r--r--gcc/domwalk.c2
-rw-r--r--gcc/dwarf2.h3
-rw-r--r--gcc/dwarf2out.c86
-rw-r--r--gcc/emit-rtl.c159
-rw-r--r--gcc/except.c24
-rw-r--r--gcc/expr.c37
-rw-r--r--gcc/final.c3
-rw-r--r--gcc/flags.h2
-rw-r--r--gcc/flow.c26
-rw-r--r--gcc/fold-const.c61
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/f95-lang.c2
-rw-r--r--gcc/fortran/trans-decl.c2
-rw-r--r--gcc/function.c53
-rw-r--r--gcc/gcse.c104
-rw-r--r--gcc/genopinit.c4
-rw-r--r--gcc/ggc-page.c11
-rw-r--r--gcc/gimplify.c2
-rw-r--r--gcc/global.c9
-rw-r--r--gcc/graph.c3
-rw-r--r--gcc/hooks.c7
-rw-r--r--gcc/hooks.h1
-rw-r--r--gcc/ifcvt.c110
-rw-r--r--gcc/java/ChangeLog150
-rw-r--r--gcc/java/check-init.c4
-rw-r--r--gcc/java/class.c12
-rw-r--r--gcc/java/decl.c10
-rw-r--r--gcc/java/expr.c63
-rw-r--r--gcc/java/java-gimplify.c6
-rw-r--r--gcc/java/java-tree.def5
-rw-r--r--gcc/java/java-tree.h30
-rw-r--r--gcc/java/jcf-parse.c236
-rw-r--r--gcc/java/jcf-write.c4
-rw-r--r--gcc/java/jv-scan.c30
-rw-r--r--gcc/java/lang.c4
-rw-r--r--gcc/java/lex.c964
-rw-r--r--gcc/java/lex.h121
-rw-r--r--gcc/java/parse.h63
-rw-r--r--gcc/java/parse.y507
-rw-r--r--gcc/lambda-code.c8
-rw-r--r--gcc/lcm.c40
-rw-r--r--gcc/libgcc2.c2
-rw-r--r--gcc/local-alloc.c5
-rw-r--r--gcc/loop-doloop.c12
-rw-r--r--gcc/loop-init.c8
-rw-r--r--gcc/loop-invariant.c3
-rw-r--r--gcc/loop-iv.c27
-rw-r--r--gcc/loop-unroll.c38
-rw-r--r--gcc/loop-unswitch.c25
-rw-r--r--gcc/modulo-sched.c45
-rw-r--r--gcc/optabs.c191
-rw-r--r--gcc/optabs.h12
-rw-r--r--gcc/po/ChangeLog4
-rw-r--r--gcc/po/gcc.pot5651
-rw-r--r--gcc/postreload-gcse.c8
-rw-r--r--gcc/predict.c95
-rw-r--r--gcc/profile.c72
-rw-r--r--gcc/protoize.c2
-rw-r--r--gcc/ra-build.c6
-rw-r--r--gcc/ra-rewrite.c7
-rw-r--r--gcc/ra.c4
-rw-r--r--gcc/read-rtl.c4
-rw-r--r--gcc/recog.c4
-rw-r--r--gcc/reg-stack.c24
-rw-r--r--gcc/regrename.c13
-rw-r--r--gcc/reload1.c27
-rw-r--r--gcc/rtl.h19
-rw-r--r--gcc/sbitmap.c33
-rw-r--r--gcc/sched-ebb.c15
-rw-r--r--gcc/sched-rgn.c658
-rw-r--r--gcc/stor-layout.c51
-rw-r--r--gcc/system.h4
-rw-r--r--gcc/target-def.h3
-rw-r--r--gcc/target.h7
-rw-r--r--gcc/targhooks.c4
-rw-r--r--gcc/testsuite/ChangeLog79
-rw-r--r--gcc/toplev.c12
-rw-r--r--gcc/toplev.h2
-rw-r--r--gcc/tracer.c26
-rw-r--r--gcc/tree-cfg.c306
-rw-r--r--gcc/tree-chrec.c13
-rw-r--r--gcc/tree-dfa.c11
-rw-r--r--gcc/tree-flow.h5
-rw-r--r--gcc/tree-gimple.c54
-rw-r--r--gcc/tree-gimple.h2
-rw-r--r--gcc/tree-if-conv.c37
-rw-r--r--gcc/tree-into-ssa.c40
-rw-r--r--gcc/tree-mudflap.c2
-rw-r--r--gcc/tree-optimize.c13
-rw-r--r--gcc/tree-outof-ssa.c11
-rw-r--r--gcc/tree-phinodes.c2
-rw-r--r--gcc/tree-pretty-print.c37
-rw-r--r--gcc/tree-scalar-evolution.c16
-rw-r--r--gcc/tree-sra.c3
-rw-r--r--gcc/tree-ssa-alias.c167
-rw-r--r--gcc/tree-ssa-ccp.c31
-rw-r--r--gcc/tree-ssa-copy.c18
-rw-r--r--gcc/tree-ssa-copyrename.c13
-rw-r--r--gcc/tree-ssa-dce.c30
-rw-r--r--gcc/tree-ssa-dom.c41
-rw-r--r--gcc/tree-ssa-live.c14
-rw-r--r--gcc/tree-ssa-loop-ch.c23
-rw-r--r--gcc/tree-ssa-loop-im.c16
-rw-r--r--gcc/tree-ssa-loop-ivcanon.c4
-rw-r--r--gcc/tree-ssa-loop-ivopts.c170
-rw-r--r--gcc/tree-ssa-loop-manip.c26
-rw-r--r--gcc/tree-ssa-loop-niter.c227
-rw-r--r--gcc/tree-ssa-loop-unswitch.c8
-rw-r--r--gcc/tree-ssa-loop.c2
-rw-r--r--gcc/tree-ssa-phiopt.c46
-rw-r--r--gcc/tree-ssa-pre.c60
-rw-r--r--gcc/tree-ssa-propagate.c51
-rw-r--r--gcc/tree-ssa-threadupdate.c133
-rw-r--r--gcc/tree-ssa.c12
-rw-r--r--gcc/tree-tailcall.c41
-rw-r--r--gcc/tree-vectorizer.c15
-rw-r--r--gcc/tree.c49
-rw-r--r--gcc/tree.def2
-rw-r--r--gcc/tree.h8
-rw-r--r--gcc/treelang/ChangeLog5
-rw-r--r--gcc/treelang/treetree.c2
-rw-r--r--gcc/unwind-dw2.c5
-rw-r--r--gcc/var-tracking.c27
-rw-r--r--gcc/version.c2
-rw-r--r--libcpp/ChangeLog6
-rw-r--r--libcpp/directives.c4
-rw-r--r--libjava/ChangeLog68
-rw-r--r--libjava/Makefile.am192
-rw-r--r--libjava/Makefile.in840
-rw-r--r--libjava/java/beans/Beans.java5
-rw-r--r--libjava/java/beans/EventHandler.java3
-rw-r--r--libjava/java/beans/EventSetDescriptor.java3
-rw-r--r--libjava/java/beans/Introspector.java3
-rw-r--r--libjava/java/beans/PropertyEditorManager.java3
-rw-r--r--libjava/java/beans/beancontext/BeanContext.java8
-rw-r--r--libjava/java/beans/beancontext/BeanContextChild.java2
-rw-r--r--libjava/java/beans/beancontext/BeanContextChildSupport.java7
-rw-r--r--libjava/java/beans/beancontext/BeanContextMembershipEvent.java7
-rw-r--r--libjava/java/io/BufferedInputStream.java28
-rw-r--r--libjava/java/net/InetAddress.java55
-rw-r--r--libjava/java/net/URLClassLoader.java4
-rw-r--r--libjava/java/net/URLConnection.java69
-rw-r--r--libjava/java/text/MessageFormat.java2
-rw-r--r--libjava/javax/crypto/MacSpi.java2
-rw-r--r--libjava/jni.cc5
-rw-r--r--libobjc/ChangeLog10
-rwxr-xr-xlibobjc/configure389
-rw-r--r--libobjc/configure.ac56
-rw-r--r--libobjc/exception.c3
-rw-r--r--libstdc++-v3/ChangeLog76
-rw-r--r--libstdc++-v3/README7
-rw-r--r--libstdc++-v3/acconfig.h3
-rw-r--r--libstdc++-v3/acinclude.m419
-rw-r--r--libstdc++-v3/config.h.in3
-rwxr-xr-xlibstdc++-v3/configure30
-rw-r--r--libstdc++-v3/configure.ac1
-rw-r--r--libstdc++-v3/docs/html/configopts.html13
-rw-r--r--libstdc++-v3/docs/html/ext/howto.html6
-rw-r--r--libstdc++-v3/include/bits/basic_string.h9
-rw-r--r--libstdc++-v3/include/bits/basic_string.tcc22
-rw-r--r--libstdc++-v3/include/bits/c++config2
-rw-r--r--libstdc++-v3/include/bits/sstream.tcc22
-rw-r--r--libstdc++-v3/include/std/std_sstream.h27
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_istream/seekg/char/2346-fstream.cc89
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_istream/seekg/char/2346-sstream.cc80
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_istream/tellg/char/1.cc7
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_ostream/tellp/char/1.cc10
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_ostream/tellp/char/2.cc8
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_streambuf/cons/char/1.cc61
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_streambuf/cons/wchar_t/1.cc61
-rw-r--r--libstdc++-v3/testsuite/testsuite_io.h87
255 files changed, 11686 insertions, 8661 deletions
diff --git a/ChangeLog b/ChangeLog
index 952e282196d..d3ec519713f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2004-10-01 Bernd Schmidt <bernds_cb1@t-online.de>
+
+ * MAINTAINERS: Change my email address to my new work account.
+
+2004-09-24 Michael Roth <mroth@nessie.de>
+
+ * configure.in (--without-headers): Add missing double quotes.
+ * configure: Regenerate.
+
2004-09-24 Kelley Cook <kcook@gcc.gnu.org>
* ylwrap: Revert to previous version.
diff --git a/MAINTAINERS b/MAINTAINERS
index 9b409138efb..983995aac4e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -29,7 +29,7 @@ Michael Meissner gnu@the-meissners.org
Jason Merrill jason@redhat.com
David S. Miller davem@redhat.com
Mark Mitchell mark@codesourcery.com
-Bernd Schmidt bernds@redhat.com
+Bernd Schmidt bernd.schmidt@analog.com
Zack Weinberg zack@codesourcery.com
Jim Wilson wilson@specifixinc.com
diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog
index 4d48b580265..68dd4204e56 100644
--- a/boehm-gc/ChangeLog
+++ b/boehm-gc/ChangeLog
@@ -1,3 +1,9 @@
+2004-09-27 Kelley Cook <kcook@gcc.gnu.org>
+
+ * configure.ac: Update all AC_DEFINEs to newer style.
+ * configure: Regenerate.
+ * include/gc_config.h.in: Regenerate.
+
2004-08-27 Hans Boehm <Hans.Boehm@hp.com>
* backgraph.c, gc_priv.h (GC_traverse_back_graph,
diff --git a/boehm-gc/configure b/boehm-gc/configure
index 7cbcb5f2ac0..68e7411250f 100755
--- a/boehm-gc/configure
+++ b/boehm-gc/configure
@@ -967,7 +967,7 @@ esac
else
echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi
- cd "$ac_popdir"
+ cd $ac_popdir
done
fi
@@ -2522,7 +2522,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2580,7 +2581,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2696,7 +2698,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2750,7 +2753,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2795,7 +2799,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2839,7 +2844,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3197,7 +3203,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3255,7 +3262,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3326,7 +3334,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3370,7 +3379,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4731,7 +4741,7 @@ test x"$pic_mode" = xno && libtool_flags="$libtool_flags --prefer-non-pic"
case $host in
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 4734 "configure"' > conftest.$ac_ext
+ echo '#line 4744 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
@@ -4878,7 +4888,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5322,21 +5333,25 @@ case "$THREADS" in
THREADLIBS=-lpthread
case "$host" in
x86-*-linux* | ia64-*-linux* | i586-*-linux* | i686-*-linux* | x86_64-*-linux* | alpha-*-linux*)
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define GC_LINUX_THREADS 1
_ACEOF
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define _REENTRANT 1
_ACEOF
if test "${enable_parallel_mark}" = yes; then
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define PARALLEL_MARK 1
_ACEOF
fi
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define THREAD_LOCAL_ALLOC 1
_ACEOF
@@ -5352,7 +5367,8 @@ _ACEOF
;;
*-*-aix*)
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define GC_AIX_THREADS 1
_ACEOF
@@ -5364,11 +5380,13 @@ _ACEOF
*-*-hpux*)
{ echo "$as_me:$LINENO: WARNING: \"Only HP/UX 11 threads are supported.\"" >&5
echo "$as_me: WARNING: \"Only HP/UX 11 threads are supported.\"" >&2;}
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define GC_HPUX_THREADS 1
_ACEOF
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define _POSIX_C_SOURCE 199506L
_ACEOF
@@ -5387,7 +5405,8 @@ _ACEOF
*-*-freebsd*)
{ echo "$as_me:$LINENO: WARNING: \"FreeBSD does not yet fully support threads with Boehm GC.\"" >&5
echo "$as_me: WARNING: \"FreeBSD does not yet fully support threads with Boehm GC.\"" >&2;}
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define GC_FREEBSD_THREADS 1
_ACEOF
@@ -5395,29 +5414,34 @@ _ACEOF
THREADLIBS=-pthread
;;
*-*-solaris*)
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define GC_SOLARIS_THREADS 1
_ACEOF
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define GC_SOLARIS_PTHREADS 1
_ACEOF
;;
*-*-irix*)
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define GC_IRIX_THREADS 1
_ACEOF
;;
*-*-cygwin*)
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define GC_WIN32_THREADS 1
_ACEOF
;;
*-*-darwin*)
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define GC_DARWIN_THREADS 1
_ACEOF
@@ -5433,7 +5457,8 @@ _ACEOF
fi
;;
*-*-osf*)
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define GC_OSF1_THREADS 1
_ACEOF
@@ -5476,11 +5501,13 @@ _ACEOF
#define THREAD_LOCAL_ALLOC 1
_ACEOF
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define GC_DGUX386_THREADS 1
_ACEOF
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define DGUX_THREADS 1
_ACEOF
@@ -5576,7 +5603,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5630,7 +5658,8 @@ case "$TARGET_ECOS" in
no)
;;
*)
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define ECOS 1
_ACEOF
@@ -5721,18 +5750,21 @@ echo "$as_me: WARNING: OpenBSD/Alpha without dlopen(). Shared library support is
machdep="alpha_mach_dep.lo"
;;
i?86-*-solaris2.[89] | i?86-*-solaris2.1?)
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define SOLARIS25_PROC_VDB_BUG_FIXED 1
_ACEOF
;;
mipstx39-*-elf*)
machdep="mips_ultrix_mach_dep.lo"
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define STACKBASE __stackbase
_ACEOF
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define DATASTART_IS_ETEXT 1
_ACEOF
@@ -5752,7 +5784,8 @@ _ACEOF
;;
sparc-sun-solaris2.3)
machdep="sparc_mach_dep.lo"
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define SUNOS53_SHARED_LIB 1
_ACEOF
@@ -5761,7 +5794,8 @@ _ACEOF
machdep="sparc_mach_dep.lo"
;;
ia64-*-*)
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define NO_EXECUTE_PERMISSION 1
_ACEOF
@@ -6068,7 +6102,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -6238,7 +6273,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -6301,7 +6337,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -6458,38 +6495,46 @@ esac
MY_CFLAGS="$CFLAGS"
+
cat >>confdefs.h <<\_ACEOF
#define SILENT 1
_ACEOF
+
cat >>confdefs.h <<\_ACEOF
#define NO_SIGNALS 1
_ACEOF
+
cat >>confdefs.h <<\_ACEOF
#define ALL_INTERIOR_POINTERS 1
_ACEOF
+
cat >>confdefs.h <<\_ACEOF
#define JAVA_FINALIZATION 1
_ACEOF
+
cat >>confdefs.h <<\_ACEOF
#define GC_GCJ_SUPPORT 1
_ACEOF
+
cat >>confdefs.h <<\_ACEOF
#define ATOMIC_UNCOLLECTABLE 1
_ACEOF
if test -n "${with_cross_host}"; then
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define NO_SIGSET 1
_ACEOF
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define NO_DEBUGGING 1
_ACEOF
@@ -6501,17 +6546,20 @@ if test "${enable_gc_debug+set}" = set; then
if test "$enable_gc_debug" = "yes"; then
{ echo "$as_me:$LINENO: WARNING: \"Must define GC_DEBUG and use debug alloc. in clients.\"" >&5
echo "$as_me: WARNING: \"Must define GC_DEBUG and use debug alloc. in clients.\"" >&2;}
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define KEEP_BACK_PTRS 1
_ACEOF
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define DBG_HDRS_ALL 1
_ACEOF
case $host in
ia64-*-linux* )
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define MAKE_BACK_GRAPH 1
_ACEOF
@@ -6523,7 +6571,8 @@ _ACEOF
{ echo "$as_me:$LINENO: WARNING: \"Client must not use -fomit-frame-pointer.\"" >&5
echo "$as_me: WARNING: \"Client must not use -fomit-frame-pointer.\"" >&2;}
- cat >>confdefs.h <<\_ACEOF
+
+cat >>confdefs.h <<\_ACEOF
#define SAVE_CALL_COUNT 8
_ACEOF
@@ -7501,6 +7550,11 @@ esac
*) ac_INSTALL=$ac_top_builddir$INSTALL ;;
esac
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
# Let's still pretend it is `configure' which instantiates (i.e., don't
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
@@ -7539,12 +7593,6 @@ echo "$as_me: error: cannot find input file: $f" >&2;}
fi;;
esac
done` || { (exit 1); exit 1; }
-
- if test x"$ac_file" != x-; then
- { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
- rm -f "$ac_file"
- fi
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF
sed "$ac_vpsub
diff --git a/boehm-gc/configure.ac b/boehm-gc/configure.ac
index b98d8fbbc00..69ee3d8d5a8 100644
--- a/boehm-gc/configure.ac
+++ b/boehm-gc/configure.ac
@@ -126,59 +126,59 @@ case "$THREADS" in
THREADLIBS=-lpthread
case "$host" in
x86-*-linux* | ia64-*-linux* | i586-*-linux* | i686-*-linux* | x86_64-*-linux* | alpha-*-linux*)
- AC_DEFINE(GC_LINUX_THREADS)
- AC_DEFINE(_REENTRANT)
+ AC_DEFINE(GC_LINUX_THREADS,1,[support for Xavier Leroy's Linux threads])
+ AC_DEFINE(_REENTRANT,1,[Use reentrant code])
if test "${enable_parallel_mark}" = yes; then
- AC_DEFINE(PARALLEL_MARK)
+ AC_DEFINE(PARALLEL_MARK,1,[allow the marker to run in multiple threads])
fi
- AC_DEFINE(THREAD_LOCAL_ALLOC)
+ AC_DEFINE(THREAD_LOCAL_ALLOC,1,[define GC_local_malloc() & GC_local_malloc_atomic()])
;;
*-*-linux*)
- AC_DEFINE(GC_LINUX_THREADS)
- AC_DEFINE(_REENTRANT)
+ AC_DEFINE(GC_LINUX_THREADS,1)
+ AC_DEFINE(_REENTRANT,1)
;;
*-*-aix*)
- AC_DEFINE(GC_AIX_THREADS)
- AC_DEFINE(_REENTRANT)
+ AC_DEFINE(GC_AIX_THREADS,1,[support AIX threads])
+ AC_DEFINE(_REENTRANT,1)
;;
*-*-hpux*)
AC_MSG_WARN("Only HP/UX 11 threads are supported.")
- AC_DEFINE(GC_HPUX_THREADS)
- AC_DEFINE(_POSIX_C_SOURCE,199506L)
+ AC_DEFINE(GC_HPUX_THREADS,1,[enables support for HP/UX 11 pthreads])
+ AC_DEFINE(_POSIX_C_SOURCE,199506L,[POSIX version of C Source])
if test "${enable_parallel_mark}" = yes; then
- AC_DEFINE(PARALLEL_MARK)
+ AC_DEFINE(PARALLEL_MARK,1)
fi
- AC_DEFINE(THREAD_LOCAL_ALLOC)
+ AC_DEFINE(THREAD_LOCAL_ALLOC,1)
THREADLIBS="-lpthread -lrt"
;;
*-*-freebsd*)
AC_MSG_WARN("FreeBSD does not yet fully support threads with Boehm GC.")
- AC_DEFINE(GC_FREEBSD_THREADS)
+ AC_DEFINE(GC_FREEBSD_THREADS,1,[support FreeBSD threads])
AM_CPPFLAGS="$AM_CPPFLAGS -pthread"
THREADLIBS=-pthread
;;
*-*-solaris*)
- AC_DEFINE(GC_SOLARIS_THREADS)
- AC_DEFINE(GC_SOLARIS_PTHREADS)
+ AC_DEFINE(GC_SOLARIS_THREADS,1,[support for Solaris (thr_) threads])
+ AC_DEFINE(GC_SOLARIS_PTHREADS,1,[support for Solaris pthreads])
;;
*-*-irix*)
- AC_DEFINE(GC_IRIX_THREADS)
+ AC_DEFINE(GC_IRIX_THREADS,1,[support for Irix pthreads])
;;
*-*-cygwin*)
- AC_DEFINE(GC_WIN32_THREADS)
+ AC_DEFINE(GC_WIN32_THREADS,1,[support for win32 threads])
;;
*-*-darwin*)
- AC_DEFINE(GC_DARWIN_THREADS)
- AC_DEFINE(THREAD_LOCAL_ALLOC)
+ AC_DEFINE(GC_DARWIN_THREADS,1,[support for Mac OS X pthreads])
+ AC_DEFINE(THREAD_LOCAL_ALLOC,1)
if test "${enable_parallel_mark}" = yes; then
- AC_DEFINE(PARALLEL_MARK)
+ AC_DEFINE(PARALLEL_MARK,1)
fi
;;
*-*-osf*)
- AC_DEFINE(GC_OSF1_THREADS)
+ AC_DEFINE(GC_OSF1_THREADS,1,[support for Tru64 pthreads])
if test "${enable_parallel_mark}" = yes; then
- AC_DEFINE(PARALLEL_MARK)
- AC_DEFINE(THREAD_LOCAL_ALLOC)
+ AC_DEFINE(PARALLEL_MARK,1)
+ AC_DEFINE(THREAD_LOCAL_ALLOC,1)
# May want to enable it in other cases, too.
# Measurements havent yet been done.
fi
@@ -188,7 +188,7 @@ case "$THREADS" in
esac
;;
win32)
- AC_DEFINE(GC_WIN32_THREADS)
+ AC_DEFINE(GC_WIN32_THREADS,1)
dnl Old wine getenv may not return NULL for missing entry.
dnl Define EMPTY_GETENV_RESULTS here to work around the bug.
;;
@@ -198,19 +198,19 @@ AC_MSG_RESULT($THREADLIBS)
# Use pthread GCC switch
THREADLIBS=-pthread
if test "${enable_parallel_mark}" = yes; then
- AC_DEFINE(PARALLEL_MARK)
+ AC_DEFINE(PARALLEL_MARK,1)
fi
- AC_DEFINE(THREAD_LOCAL_ALLOC)
- AC_DEFINE(GC_DGUX386_THREADS)
- AC_DEFINE(DGUX_THREADS)
+ AC_DEFINE(THREAD_LOCAL_ALLOC,1)
+ AC_DEFINE(GC_DGUX386_THREADS,1,[support for DB/UX on I386 threads])
+ AC_DEFINE(DGUX_THREADS,1,[No description])
# Enable _POSIX4A_DRAFT10_SOURCE with flag -pthread
AM_CPPFLAGS="-pthread $AM_CPPFLAGS"
;;
aix)
THREADS=posix
THREADLIBS=-lpthread
- AC_DEFINE(GC_AIX_THREADS)
- AC_DEFINE(_REENTRANT)
+ AC_DEFINE(GC_AIX_THREADS,1)
+ AC_DEFINE(_REENTRANT,1)
;;
decosf1 | irix | mach | os2 | solaris | dce | vxworks)
AC_MSG_ERROR(thread package $THREADS not yet supported)
@@ -260,7 +260,7 @@ case "$TARGET_ECOS" in
no)
;;
*)
- AC_DEFINE(ECOS)
+ AC_DEFINE(ECOS,1,[Target is ECOS])
AM_CPPFLAGS="${AM_CPPFLAGS} -I${TARGET_ECOS}/include"
addobjs="$addobjs ecos.lo"
;;
@@ -313,12 +313,12 @@ case "$host" in
machdep="alpha_mach_dep.lo"
;;
i?86-*-solaris2.[[89]] | i?86-*-solaris2.1?)
- AC_DEFINE(SOLARIS25_PROC_VDB_BUG_FIXED)
+ AC_DEFINE(SOLARIS25_PROC_VDB_BUG_FIXED,1,[PROC_VDB in Solaris 2.5 gives wrong values for dirty bits])
;;
mipstx39-*-elf*)
machdep="mips_ultrix_mach_dep.lo"
- AC_DEFINE(STACKBASE, __stackbase)
- AC_DEFINE(DATASTART_IS_ETEXT)
+ AC_DEFINE(STACKBASE, __stackbase,[No description])
+ AC_DEFINE(DATASTART_IS_ETEXT,1,[No description])
;;
mips-dec-ultrix*)
machdep="mips_ultrix_mach-dep.lo"
@@ -335,13 +335,13 @@ case "$host" in
;;
sparc-sun-solaris2.3)
machdep="sparc_mach_dep.lo"
- AC_DEFINE(SUNOS53_SHARED_LIB)
+ AC_DEFINE(SUNOS53_SHARED_LIB,1,[Avoid Solaris 5.3 dynamic library bug])
;;
sparc-sun-solaris2.*)
machdep="sparc_mach_dep.lo"
;;
ia64-*-*)
- AC_DEFINE(NO_EXECUTE_PERMISSION)
+ AC_DEFINE(NO_EXECUTE_PERMISSION,1,[cause some or all of the heap to not have execute permission])
machdep="mach_dep.lo ia64_save_regs_in_stack.lo"
;;
esac
@@ -409,40 +409,40 @@ AC_SUBST(MY_CFLAGS)
dnl Include defines that have become de facto standard.
dnl ALL_INTERIOR_POINTERS can be overridden in startup code.
-AC_DEFINE(SILENT)
-AC_DEFINE(NO_SIGNALS)
-AC_DEFINE(ALL_INTERIOR_POINTERS)
+AC_DEFINE(SILENT,1,[disables statistics printing])
+AC_DEFINE(NO_SIGNALS,1,[does not disable signals])
+AC_DEFINE(ALL_INTERIOR_POINTERS,1,[allows all pointers to the interior of objects to be recognized])
dnl By default, make the library as general as possible.
-AC_DEFINE(JAVA_FINALIZATION)
-AC_DEFINE(GC_GCJ_SUPPORT)
-AC_DEFINE(ATOMIC_UNCOLLECTABLE)
+AC_DEFINE(JAVA_FINALIZATION,1,[make it somewhat safer to finalize objects out of order])
+AC_DEFINE(GC_GCJ_SUPPORT,1,[include support for gcj])
+AC_DEFINE(ATOMIC_UNCOLLECTABLE,1,[include code for GC_malloc_atomic_uncollectable])
dnl This is something of a hack. When cross-compiling we turn off
dnl some functionality. These is only correct when targetting an
dnl embedded system. FIXME.
if test -n "${with_cross_host}"; then
- AC_DEFINE(NO_SIGSET)
- AC_DEFINE(NO_DEBUGGING)
+ AC_DEFINE(NO_SIGSET,1,[use empty GC_disable_signals and GC_enable_signals])
+ AC_DEFINE(NO_DEBUGGING,1,[removes GC_dump])
fi
AC_ARG_ENABLE(gc-debug,
[ --enable-gc-debug include full support for pointer backtracing etc.],
[ if test "$enable_gc_debug" = "yes"; then
AC_MSG_WARN("Must define GC_DEBUG and use debug alloc. in clients.")
- AC_DEFINE(KEEP_BACK_PTRS)
- AC_DEFINE(DBG_HDRS_ALL)
+ AC_DEFINE(KEEP_BACK_PTRS,1,[Add code to save back pointers])
+ AC_DEFINE(DBG_HDRS_ALL,1,[Make sure that all objects have debug headers])
case $host in
ia64-*-linux* )
- AC_DEFINE(MAKE_BACK_GRAPH)
+ AC_DEFINE(MAKE_BACK_GRAPH,1,[Enable GC_PRINT_BACK_HEIGHT environment variable])
;;
x86-*-linux* | i586-*-linux* | i686-*-linux* | x86_64-*-linux* )
- AC_DEFINE(MAKE_BACK_GRAPH)
+ AC_DEFINE(MAKE_BACK_GRAPH,1)
AC_MSG_WARN("Client must not use -fomit-frame-pointer.")
- AC_DEFINE(SAVE_CALL_COUNT, 8)
+ AC_DEFINE(SAVE_CALL_COUNT, 8, [number of call frames saved with objects allocated through the debugging interface])
;;
i[3456]86-*-dgux*)
- AC_DEFINE(MAKE_BACK_GRAPH)
+ AC_DEFINE(MAKE_BACK_GRAPH,1)
;;
esac
fi])
diff --git a/boehm-gc/include/gc_config.h.in b/boehm-gc/include/gc_config.h.in
index fbd244610aa..60ffb9741b6 100644
--- a/boehm-gc/include/gc_config.h.in
+++ b/boehm-gc/include/gc_config.h.in
@@ -1,34 +1,152 @@
+/* include/gc_config.h.in. Generated from configure.ac by autoheader. */
+
+/* allows all pointers to the interior of objects to be recognized */
#undef ALL_INTERIOR_POINTERS
+
+/* include code for GC_malloc_atomic_uncollectable */
#undef ATOMIC_UNCOLLECTABLE
+
+/* No description */
#undef DATASTART_IS_ETEXT
+
+/* Make sure that all objects have debug headers */
#undef DBG_HDRS_ALL
+
+/* No description */
#undef DGUX_THREADS
+
+/* Target is ECOS */
#undef ECOS
+
+/* support AIX threads */
#undef GC_AIX_THREADS
+
+/* support for Mac OS X pthreads */
#undef GC_DARWIN_THREADS
+
+/* support for DB/UX on I386 threads */
#undef GC_DGUX386_THREADS
+
+/* support FreeBSD threads */
#undef GC_FREEBSD_THREADS
+
+/* include support for gcj */
#undef GC_GCJ_SUPPORT
+
+/* enables support for HP/UX 11 pthreads */
#undef GC_HPUX_THREADS
+
+/* support for Irix pthreads */
#undef GC_IRIX_THREADS
+
+/* support for Xavier Leroy's Linux threads */
#undef GC_LINUX_THREADS
+
+/* support for Tru64 pthreads */
#undef GC_OSF1_THREADS
+
+/* support for Solaris pthreads */
#undef GC_SOLARIS_PTHREADS
+
+/* support for Solaris (thr_) threads */
#undef GC_SOLARIS_THREADS
+
+/* support for win32 threads */
#undef GC_WIN32_THREADS
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* make it somewhat safer to finalize objects out of order */
#undef JAVA_FINALIZATION
+
+/* Add code to save back pointers */
#undef KEEP_BACK_PTRS
+
+/* Enable GC_PRINT_BACK_HEIGHT environment variable */
#undef MAKE_BACK_GRAPH
+
+/* removes GC_dump */
#undef NO_DEBUGGING
+
+/* cause some or all of the heap to not have execute permission */
#undef NO_EXECUTE_PERMISSION
+
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+#undef NO_MINUS_C_MINUS_O
+
+/* does not disable signals */
#undef NO_SIGNALS
+
+/* use empty GC_disable_signals and GC_enable_signals */
#undef NO_SIGSET
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* allow the marker to run in multiple threads */
#undef PARALLEL_MARK
+
+/* number of call frames saved with objects allocated through the debugging
+ interface */
#undef SAVE_CALL_COUNT
+
+/* disables statistics printing */
#undef SILENT
+
+/* PROC_VDB in Solaris 2.5 gives wrong values for dirty bits */
#undef SOLARIS25_PROC_VDB_BUG_FIXED
+
+/* No description */
#undef STACKBASE
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Avoid Solaris 5.3 dynamic library bug */
#undef SUNOS53_SHARED_LIB
+
+/* define GC_local_malloc() & GC_local_malloc_atomic() */
#undef THREAD_LOCAL_ALLOC
+
+/* POSIX version of C Source */
#undef _POSIX_C_SOURCE
+
+/* Use reentrant code */
#undef _REENTRANT
diff --git a/configure b/configure
index 0efae53ddff..29f99597291 100755
--- a/configure
+++ b/configure
@@ -1024,8 +1024,8 @@ esac
# If both --with-headers and --with-libs are specified, default to
# --without-newlib.
-if test x"${with_headers}" != x && test x"${with_headers} != xno \
- && test x"${with_libs}" != x && test x"${with_libs} != xno ; then
+if test x"${with_headers}" != x && test x"${with_headers}" != xno \
+ && test x"${with_libs}" != x && test x"${with_libs}" != xno ; then
if test x"${with_newlib}" = x ; then
with_newlib=no
fi
diff --git a/configure.in b/configure.in
index 97240991399..3863cff271a 100644
--- a/configure.in
+++ b/configure.in
@@ -250,8 +250,8 @@ esac
# If both --with-headers and --with-libs are specified, default to
# --without-newlib.
-if test x"${with_headers}" != x && test x"${with_headers} != xno \
- && test x"${with_libs}" != x && test x"${with_libs} != xno ; then
+if test x"${with_headers}" != x && test x"${with_headers}" != xno \
+ && test x"${with_libs}" != x && test x"${with_libs}" != xno ; then
if test x"${with_newlib}" = x ; then
with_newlib=no
fi
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5bde1115c96..5233ce39abd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,1041 @@
+2004-01-01 Paul Brook <paul@codesourcery.com>
+
+ * config/arm/arm.c (thumb_compute_saved_rag_mask): Or with bitmask,
+ not register number.
+ (thumb_find_work_register): Search full register range.
+
+2004-10-01 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR tree-opt/17343
+ * tree-cfg.c (group_case_labels): Get the label and not
+ the case expr for the default case.
+ When the label we looking at is the default, decrement the
+ new_size.
+
+2004-10-01 Jan Hubicka <jh@suse.cz>
+
+ * c-decl.c (c_expand_body): Update call tree_rest_of_compilation.
+ * cgraphunit.c (cgraph_build_static_cdtor): Likewise.
+ * toplev.h (tree_rest_of_compilation): Update prototype.
+ * tree-optimize.c (tree_rest_of_compilation): Kill nested_p argument.
+
+2004-10-01 Kazu Hirata <kazu@cs.umass.edu>
+
+ * tree-cfg.c (cleanup_tree_cfg): Pull a call to
+ cleanup_control_flow() out of the while loop.
+
+2004-10-01 Paolo Bonzini <bonzini@gnu.org>
+
+ * tree-vectorizer.c (vectorizable_operation): Fail unless
+ the mode for the vector type is indeed a vector mode.
+
+2004-10-01 Zdenek Dvorak <dvorakz@suse.cz>
+
+ * tree-chrec.c (chrec_fold_plus_poly_poly, chrec_fold_plus_1,
+ chrec_fold_multiply): Use fold_convert or build_int_cst_type instead
+ of convert.
+ * tree-scalar-evolution.c (compute_overall_effect_of_inner_loop,
+ add_to_evolution, set_nb_iterations_in_loop, follow_ssa_edge_in_rhs,
+ follow_ssa_edge_in_rhs): Ditto.
+ * tree-ssa-loop-ivopts.c (struct iv): Add base_object field.
+ (dump_iv): Dump base_object.
+ (dump_use, dump_cand): Use dump_iv.
+ (determine_base_object): New function.
+ (alloc_iv): Initialize base_object field.
+ (record_use): Clear the ssa_name field of iv.
+ (get_computation_cost_at): Do not use difference of addresses of
+ two different objects.
+ (may_eliminate_iv): Do not require the loop to have just single exit.
+ * tree-ssa-loop-niter.c (zero_p): Do not check for overflows.
+ (nonzero_p): New function.
+ (inverse, number_of_iterations_cond, simplify_using_outer_evolutions,
+ tree_simplify_using_condition, simplify_using_initial_conditions,
+ loop_niter_by_eval, find_loop_niter_by_eval,
+ estimate_numbers_of_iterations_loop, compare_trees,
+ upper_bound_in_type, lower_bound_in_type,
+ can_count_iv_in_wider_type_bound): Use buildN instead of build. Use
+ fold_convert or build_int_cst_type instead of convert. Use (non)zero_p
+ instead of integer_(non)zerop.
+
+2004-10-01 Jakub Jelinek <jakub@redhat.com>
+
+ Revert
+ 2004-09-29 Jakub Jelinek <jakub@redhat.com>
+
+ * tree.h (enum tree_index): Add TI_VA_LIST_GPR_COUNTER_FIELD
+ and TI_VA_LIST_FPR_COUNTER_FIELD.
+ (va_list_gpr_counter_field, va_list_fpr_counter_field): Define.
+ * tree-pass.h (pass_stdarg): Add.
+ * tree-optimize.c (init_tree_optimization_passes): Add pass_stdarg.
+ * tree-stdarg.c: New file.
+ * Makefile.in (OBJS-common): Add tree-stdarg.o.
+ (tree-stdarg.o): Add dependencies.
+ * function.h (struct function): Add va_list_gpr_size and
+ va_list_fpr_size fields.
+ * function.c (allocate_struct_function): Initialize them.
+
+ * config/i386/i386.c (ix86_build_builtin_va_list): Initialize
+ va_list_{g,f}pr_counter_field.
+ (ix86_setup_incoming_varargs): Don't do anything if reg_save
+ area will not be used. Only save registers that tree-stdarg.c
+ detected they need saving.
+ (ix86_va_start): Don't set up fields that won't be used.
+
+ * config/rs6000/rs6000.c (rs6000_build_builtin_va_list): Initialize
+ va_list_{g,f}pr_counter_field.
+ (setup_incoming_varargs): Don't do anything if reg_save
+ area will not be used. Only save registers that tree-stdarg.c
+ detected they need saving.
+ (rs6000_va_start): Don't set up fields that won't be used.
+
+2004-09-30 Eric Christopher <echristo@redhat.com>
+
+ * dwarf2.h (dwarf_calling_convention): Add enum for renesas
+ sh abi.
+ * dwarf2out.c (add_calling_convention_attribute): New function.
+ (gen_subroutine_type_die): Use.
+ * target-def.h (TARGET_DWARF_CALLING_CONVENTION): New hook.
+ * target.h (gcc_target): Add dwarf_calling_convention.
+ * hooks.c (hook_int_tree_0): New function.
+ * hooks.h: Prototype.
+ * config/sh/sh.c: Include dwarf2.h.
+ (sh_dwarf_calling_convention): New function.
+ (TARGET_DWARF_CALLING_CONVENTION): Use.
+ * doc/tm.texi (TARGET_DWARF_CALLING_CONVENTION): Document.
+
+2004-09-30 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * builtins.c (expand_builtin_strstr, expand_builtin_strchr,
+ expand_builtin_strrchr, expand_builtin_strpbrk,
+ expand_builtin_strncat, expand_builtin_strspn,
+ expand_builtin_strcspn, expand_builtin_fputs): Eliminate duplicate
+ code.
+
+2004-09-30 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390-protos.h (s390_expand_logical_operator): Add
+ prototype.
+ (s390_logical_operator_ok_p): Likewise.
+ * config/s390/s390.c (s390_expand_logical_operator): New function.
+ (s390_logical_operator_ok_p): Likewise.
+ * config/s390/s390.md ("anddi3"): New expander.
+ ("*anddi3"): Rename from old anddi3 pattern, add Q->Q alternative.
+ ("*anddi3_ss", "*anddi3_ss_inv"): Remove.
+ ("andsi3"): Use s390_expand_logical_operator.
+ ("*andsi3_esa", "*andsi3_zarch"): Add Q->Q alternative.
+ ("*andsi3_ss", "*andsi3_ss_inv"): Remove.
+ ("andhi3"): New expander.
+ ("*andhi3_zarch", "*andhi3_esa"): New patterns.
+ ("andhi3", "*andhi3_ni", "*andhi3_ss", "*andhi3_ss_inv"): Remove.
+ ("andqi3"): New expander.
+ ("*andqi3_zarch", "*andqi3_esa"): New patterns.
+ ("andqi3", "*andqi3_ni", "*andqi3_ss", "*andqi3_ss_inv"): Remove.
+ ("iordi3"): New expander.
+ ("*iordi3"): Rename from old iordi3 pattern, add Q->Q alternative.
+ ("*iordi3_ss", "*iordi3_ss_inv"): Remove.
+ ("iorsi3"): Use s390_expand_logical_operator.
+ ("*iorsi3_esa", "*iorsi3_zarch"): Add Q->Q alternative.
+ ("*iorsi3_ss", "*iorsi3_ss_inv"): Remove.
+ ("iorhi3"): New expiorer.
+ ("*iorhi3_zarch", "*iorhi3_esa"): New patterns.
+ ("iorhi3", "*iorhi3_ni", "*iorhi3_ss", "*iorhi3_ss_inv"): Remove.
+ ("iorqi3"): New expiorer.
+ ("*iorqi3_zarch", "*iorqi3_esa"): New patterns.
+ ("iorqi3", "*iorqi3_ni", "*iorqi3_ss", "*iorqi3_ss_inv"): Remove.
+ ("xordi3"): New expander.
+ ("*xordi3"): Rename from old xordi3 pattern, add Q->Q alternative.
+ ("*xordi3_ss", "*xordi3_ss_inv"): Remove.
+ ("xorsi3"): New expander.
+ ("*xorsi3"): Rename from old xorsi3 pattern, add Q->Q alternative.
+ ("*xorsi3_ss", "*xorsi3_ss_inv"): Remove.
+ ("xorhi3"): New expander.
+ ("*xorqi3"): Rename from old xorhi3 pattern, add Q->Q alternative.
+ ("*xorhi3_ss", "*xorhi3_ss_inv"): Remove.
+ ("xorqi3"): New expander.
+ ("*xorqi3"): Rename from old xorqi3 pattern, add Q->Q alternative.
+ ("*xorqi3_ss", "*xorqi3_ss_inv"): Remove.
+
+2004-09-30 Roger Sayle <roger@eyesopen.com>
+
+ * combine.c (force_to_mode) <NE_EXPR>: Only convert the expression
+ (AND (NE FOO 0) CONST) into (AND FOO CONST) if FOO has the same
+ machine mode as the result.
+
+2004-09-30 Ben Elliston <bje@au.ibm.com>
+
+ PR bootstrap/17761
+ * lcm.c (optimize_mode_switching): Update to use EDGE_SUCC and
+ FOR_EACH_EDGE macros.
+
+2004-09-30 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ * c-tree.h (readonly_error): Remove.
+ * c-typeck (enum lvalue_use): New.
+ (lvalue_or_else, readonly_error): Use it. All callers changed.
+ (readonly_error): Make static.
+
+2004-09-30 Jan Hubicka <jh@suse.cz>
+
+ PR debug/13974
+ * cfgrtl.c (try_redirect_by_replacing_jump,
+ force_nonfallthru_and_redirect, commit_one_edge_insertion,
+ cfg_layout_merge_blocks): Do not attach any line number information
+ to newly inserted instructions.
+ * emit-rtl.c (emit_insn*_before, emit_insn*_after): Rename to
+ emit_insn_*_noloc.
+ (emit_*insn_before, emit_insn*_after): New.
+ (emit_*insn_before_setloc, emit_*insn_after_setloc): Do not overwrite
+ existing locators.
+ * rtl.h (emit_*insn_before_noloc, emit_*insn_after_noloc): Declare.
+ (emit_*insn_before_sameloc, emit_*insn_after_sameloc): Kill.
+
+2004-09-30 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390-protos.h (s390_arg_frame_offset): Remove.
+ (s390_return_address_offset): Remove.
+ (s390_can_eliminate): Add prototype.
+ (s390_initial_elimination_offset): Add prototype.
+ * config/s390/s390.h (CAN_ELIMINATE): Call s390_can_eliminate.
+ (INITIAL_ELIMINATION_OFFSET): Call s390_initial_elimination_offset.
+ * config/s390/s390.c (s390_arg_frame_offset): Remove.
+ (s390_return_address_offset): Remove.
+ (s390_can_eliminate, s390_initial_elimination_offset): New functions.
+ (struct machine_function): New member split_branches_pending_p.
+ (s390_mainpool_start): Allow nonexistant pool insn for empty pool.
+ (s390_mainpool_finish): Likewise. Clear base_reg if pool empty.
+ (s390_optimize_prologue): Remove base_used argument. Call
+ s390_update_frame_layout instead of s390_register_info. Handle
+ prologue/epilogue insns that touch only RETURN_REGNUM.
+ (s390_reorg): Remove base_used. Clear split_branches_pending_p.
+ (s390_register_info): Remove base_used and return_addr_used
+ arguments, compute special register usage inline. Return live
+ register data to caller.
+ (s390_frame_info): Remove arguments, do not call s390_register_info.
+ (s390_init_frame_layout): New function.
+ (s390_update_frame_layout): Likewise.
+ (s390_emit_prologue): Call s390_update_frame_layout; some code
+ move to there. Do not emit pool placeholder insn if unnecessary.
+
+2004-09-30 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (legitimate_reload_constant_p): Remove
+ floating point constant workaround.
+ (s390_secondary_input_reload_class): Handle PLUS reloads
+ with too-large constant.
+ (s390_expand_plus_operand): Likewise.
+ * config/s390/s390.md ("movdi"): Do not call force_const_mem.
+ ("movsi"): Likewise. Also, remove workaround for non-general
+ operands.
+ ("movdf"): Do not call force_const_mem.
+ ("movsf"): Likewise. Merge expander with *movsf insn.
+ ("*movsf"): Remove, merge with movsf expander.
+
+2004-09-30 Paul Brook <paul@codesourcery.com>
+
+ * config/arm/symbian.h (STARTFILE_SPEC): Remove crt*.o.
+ (ENDFILE_SPEC): Define.
+ * config/arm/t-symbian.h (EXTRA_MULTILIB_PARTS): Set.
+
+2004-09-30 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/qrnnd.asm: Mark for noexecstack.
+
+2004-09-30 Kazu Hirata <kazu@cs.umass.edu>
+
+ * protoize.c, tree-cfg.c: Fix comment typos.
+
+2004-09-30 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ PR c/17730
+ * c-typeck.c (lvalue_or_else): Pass msgid directly to error.
+
+2004-09-30 Diego Novillo <dnovillo@redhat.com>
+
+ * tree-ssa-alias.c (collect_points_to_info_r): Move analysis of
+ expressions...
+ (add_pointed_to_expr): ... here.
+ Call add_pointed_to_expr for variables with DECL_INITIAL set.
+ * tree-dfa.c (add_referenced_var): Scan DECL_INITIAL of any
+ pointer variable, if set.
+
+2004-09-30 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/sh/sh.c: Follow spelling conventions.
+
+2004-09-29 Richard Henderson <rth@redhat.com>
+
+ * unwind-dw2.c (_Unwind_GetGR): Honor DWARF_ZERO_REG.
+ * doc/tm.texi (DWARF_ZERO_REG): New.
+
+ * config/alpha/alpha.c (alpha_sa_mask, alpha_expand_prologue,
+ alpha_expand_epilogue): Revert 2003-09-30 change to store zero.
+ * config/alpha/alpha.h (DWARF_ZERO_REG): New.
+
+2004-09-29 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * builtins.c (expand_builtin_strlen): Do not call emit_move_insn
+ with a PLUS as source operand.
+ (expand_movstr): Likewise.
+ (expand_builtin_stpcpy): Likewise.
+
+2004-09-29 Richard Henderson <rth@redhat.com>
+
+ PR 17739
+ * tree-gimple.c (is_gimple_reg): Reject hard registers.
+ (is_gimple_asm_val): New.
+ * tree-gimple.h (is_gimple_asm_val): Declare.
+ * gimplify.c (gimplify_asm_expr): Use it.
+ * tree-pretty-print.c (print_declaration): Dump hard regs.
+ * tree-outof-ssa.c (check_replaceable): Don't check for hard regs.
+ * tree-ssa-copyrename.c (copy_rename_partition_coalesce): Likewise.
+ * tree-ssa-pre.c (is_undefined_value): Likewise.
+ * tree-ssa-copy.c (may_propagate_copy): Likewise.
+ (may_propagate_copy_into_asm): Protect DECL_HARD_REGISTER.
+ * tree-ssa.c (warn_uninit): Likewise.
+ * tree.h (DECL_HARD_REGISTER): Check for VAR_DECL.
+
+2004-09-29 Fariborz Jahanian <fjahanian@apple.com>
+
+ * c-decl.c (merge_decls): Use comptype when comparing
+ types to decide on DECL_SIZE save of olddecl.
+
+2004-09-29 Daniel Berlin <dberlin@dberlin.org>
+
+ * tree.h (INDIRECT_REF_P): New macro.
+ * alias.c (get_alias_set): Use it
+ (nonoverlapping_memrefs_p): Ditto.
+ * emit-rtl.c (mem_expr_equal_p): Ditto.
+ (set_mem_attributes_minus_bitpos): Ditto.
+ (is_gimple_addressable): Ditto.
+ (get_base_address): Ditto.
+ * tree-ssa-alias.c (find_ptr_derefernece): Ditto.
+ * tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Ditto.
+ * tree-ssa-dom.c (record_equivalences_from_stmt): Ditto.
+ * tree-ssa-loop-im.c (is_call_clobbered_ref): Ditto.
+ * tree-ssa-loop-ivopts.c (find_interesting_uses_address): Ditto.
+ (add_address_candidates): Ditto.
+ (rewrite_address_base): Ditto.
+
+2004-09-30 Ben Elliston <bje@au.ibm.com>
+
+ * tree-flow.h (struct bb_ann_d): Remove num_preds member.
+ * tree-into-ssa.c (rewrite_into_ssa): Don't set it.
+ (rewrite_ssa_into_ssa): Likewise.
+ * tree-phinodes.c (create_phi_node): Access the number of
+ predecessor edges using EDGE_COUNT() and not num_preds.
+
+2004-09-29 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ PR c/7425
+ * c-decl.c (merge_decls): Merge TREE_DEPRECATED.
+
+2004-09-29 Eric Christopher <echristo@redhat.com>
+
+ * fold-const.c (tree_swap_operands_p): Remove duplicated code.
+
+2004-09-29 Hans-Peter Nilsson <hp@axis.com>
+
+ * config/cris/cris.md (moverside, movemside): With MEM, make sure
+ the address is (plus reg mem).
+
+2004-09-29 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/linux64.h (PROCESSOR_DEFAULT): Define.
+
+2004-09-29 Nathan Sidwell <nathan@codesourcery.com>
+
+ * tree.c (make_node_stat): Fix uninitialized warning. Replace
+ cascaded if ... else if with a switch.
+
+2004-09-29 Aaron W. LaFramboise <aaronavay62@aaronwl.com>
+
+ * read-rtl.c (apply_macro_to_string): Replace index with strchr.
+
+2004-09-29 Jakub Jelinek <jakub@redhat.com>
+
+ * tree.h (enum tree_index): Add TI_VA_LIST_GPR_COUNTER_FIELD
+ and TI_VA_LIST_FPR_COUNTER_FIELD.
+ (va_list_gpr_counter_field, va_list_fpr_counter_field): Define.
+ * tree-pass.h (pass_stdarg): Add.
+ * tree-optimize.c (init_tree_optimization_passes): Add pass_stdarg.
+ * tree-stdarg.c: New file.
+ * Makefile.in (OBJS-common): Add tree-stdarg.o.
+ (tree-stdarg.o): Add dependencies.
+ * function.h (struct function): Add va_list_gpr_size and
+ va_list_fpr_size fields.
+ * function.c (allocate_struct_function): Initialize them.
+
+ * config/i386/i386.c (ix86_build_builtin_va_list): Initialize
+ va_list_{g,f}pr_counter_field.
+ (ix86_setup_incoming_varargs): Don't do anything if reg_save
+ area will not be used. Only save registers that tree-stdarg.c
+ detected they need saving.
+ (ix86_va_start): Don't set up fields that won't be used.
+
+ * config/rs6000/rs6000.c (rs6000_build_builtin_va_list): Initialize
+ va_list_{g,f}pr_counter_field.
+ (setup_incoming_varargs): Don't do anything if reg_save
+ area will not be used. Only save registers that tree-stdarg.c
+ detected they need saving.
+ (rs6000_va_start): Don't set up fields that won't be used.
+
+2004-09-29 Jakub Jelinek <jakub@redhat.com>
+
+ * builtins.def (BUILT_IN_FPUTC, BUILT_IN_FPUTC_UNLOCKED,
+ BUILT_IN_FPUTS, BUILT_IN_FPUTS_UNLOCKED, BUILT_IN_FWRITE,
+ BUILT_IN_FWRITE_UNLOCKED, BUILT_IN_PUTCHAR, BUILT_IN_PUTCHAR_UNLOCKED,
+ BUILT_IN_PUTS, BUILT_IN_PUTS_UNLOCKED): Remove nothrow attribute.
+ * builtin-attrs.def (ATTR_NONNULL_1, ATTR_NONNULL_2, ATTR_NONNULL_1_2,
+ ATTR_NONNULL_1_4): New.
+
+2004-09-29 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/17697
+ * tree-ssa-ccp.c (execute_fold_all_builtins): Update eh and cleanup
+ cfg if needed.
+
+2004-09-28 Per Bothner <per@bothner.com>
+
+ * profile.c (branch_prob): Pass correct value to output_location,
+ even when USE_MAPPED_LOCATION. Fixes bug from 09-11.
+
+2004-09-28 Richard Henderson <rth@redhat.com>
+
+ PR 15089
+ * tree-ssa-copy.c (may_propagate_copy_into_asm): New.
+ * tree-flow.h (may_propagate_copy_into_asm): Declare.
+ * tree-ssa-ccp.c (replace_uses_in): Use it.
+ * tree-ssa-dom.c (cprop_operand): Likewise.
+
+2004-09-28 Jeff Law <law@redhat.com>
+
+ * tree-ssa-threadupdate.c (create_block_for_threading): Request
+ that no outgoing edges be left in the duplicate block. Do no
+ update information on outgoing edges or PHI nodes in target
+ blocks here.
+ (remove_ctrl_stmt_and_useless_edges): Renamed from
+ remove_last_stmt_and_useless_edges. Handle case where the
+ block is empty or has no control statements. Do not update edge
+ flags here.
+ (thread_block): Create a template block rather than copying the
+ original block every time. Create outgoing edges from the
+ duplicate blocks and update PHIs at the target of the outgoing
+ edges here. Fix edge flags for the original block if necessary.
+ * cfghooks (duplicate_block): No longer assert that the original
+ block has incoming edges.
+
+2004-09-29 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * doc/extend.texi (Extended Asm): Add blurb about using Explicit
+ Reg Vars to enforce register allocation with general constraints.
+ (Explicit Reg Vars): Clarify relation to asm statements.
+ (Local Reg Vars): Similar.
+
+2004-09-28 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * sched-rgn.c (haifa_edge, edge_table, NEXT_IN, NEXT_OUT, FROM_BLOCK,
+ TO_BLOCK, nr_edges, in_edges, out_edges, IN_EDGES, OUT_EDGES,
+ build_control_flow, new_edge): Remove.
+ (schedule_insns): Remove edge_table/in_edges/out_edges cleanup.
+ (bitlst, bitlst_table_last, bitlst_table): Remove.
+ (bblst): Store basic_block pointer instead of block index.
+ (bblst_table): Likewise.
+ (edgelst): Store edge pointer instead of edge index.
+ (edgelst_table, edgelst_last): New variables.
+ (extract_bitlst): Rename to ...
+ (extract_edgelst): ... this. Return edge pointers, not indices.
+ (split_edges): Update call.
+ (rgn_edges): Store edge pointers instead of indices.
+ (edge_to_bit): Remove.
+ (EDGE_TO_BIT): Store per-region edge index in edge->aux.
+ (SET_EDGE_TO_BIT): New macro.
+ (is_cfg_nonregular): Check for simple cases of unreachable blocks.
+ (find_rgns): Remove edge_list parameter. Traverse standard CFG
+ data structures instead of haifa_edge et al. Use edge pointers
+ instead of edge indices everywhere.
+ (compute_dom_prob_ps): Use standard CFG data structures. Account
+ for exit edges.
+ (compute_trg_info): Likewise.
+ (propagate_deps): Likewise.
+ (debug_candidate): Account for bblst data structure change.
+ (check_live_1, update_live_1, is_pfree): Likewise.
+ (IS_REACHABLE): Use standard CFG data structures.
+ (init_ready_list): Update bblst_table/edgelst_table allocation.
+ (schedule_region): Update alloc/cleanup code to data structure
+ changes. Use edge->aux to store per-region edge index.
+ (init_regions): No longer call build_control_flow. Do not
+ create edge list any more.
+
+2004-09-28 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * cse.c (cse_insn): Avoid creating direct non-local jumps.
+ * combine.c (can_combine_p): Likewise.
+ * local-alloc. (update_equiv_regs): Likewise.
+
+2004-09-28 Richard Henderson <rth@redhat.com>
+
+ PR 17531
+ * expr.c (expand_expr_addr_expr_1): Only assemble_external for decls.
+ Don't check VOIDmode here. Force PLUS operands to common type.
+ (expand_expr_addr_expr): Do VOIDmode check earlier. Force use of
+ Pmode if given a non pointer type.
+
+2004-09-28 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
+
+ PR 17531
+ * optabs.c (expand_binop): Force constants to the correct mode.
+
+2004-09-28 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (s390_adjust_cost): Remove.
+ (TARGET_SCHED_ADJUST_COST): Do not redefine.
+ (s390_adjust_priority): Handle TYPE_STM like TYPE_STORE.
+ * config/s390/s390.md ("main_pool"): Use "larl" type
+ attribute if TARGET_CPU_ZARCH.
+
+2004-09-28 Jakub Jelinek <jakub@redhat.com>
+
+ * config/ia64/ia64.c (ia64_expand_prologue): Declare ei
+ variable.
+
+2004-09-28 Diego Novillo <dnovillo@redhat.com>
+
+ * tree-ssa-loop.c (pass_record_bounds): Do not assign a
+ name to the pass.
+
+2004-09-28 Steven Bosscher <stevenb@suse.de>
+
+ * common.opt (flag_gcse_sm): Disable by default.
+ (flag_gcse_las): Likewise.
+ (flag_web): Likewise. Create from this file.
+ * flags.h: Remove flag_web declaration.
+ * toplev.c (flag_web): Likewise.
+ (process_options): Never set flag_web.
+
+2004-09-28 Steven Bosscher <stevenb@suse.de>
+
+ * Makefile.in (tree-ssa-propagate.o): Depend on vec.h.
+ * tree-ssa-propagate.c: Include vec.h.
+ (interesting_ssa_edges, varying_ssa_edges): Make these VECs
+ instead of varrays.
+ (cfg_blocks_add): Assert the block is not already in the worklist.
+ Update uses of interesting_ssa_edges and varying_ssa_edges.
+ (process_ssa_edge_worklist, ssa_prop_init, ssa_prop_fini,
+ ssa_propagate): Likewise.
+
+2004-09-28 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ PR c/16409
+ * c-decl.c (start_decl): Check for initializing incomplete array
+ of VLAs.
+ (build_compound_literal): Check for TYPE being error_mark_node.
+ * c-parse.in (primary): Check for VLA compound literals.
+
+2004-09-28 Diego Novillo <dnovillo@redhat.com>
+
+ * tree-ssa-live.c (calculate_live_on_entry): Fix warnings
+ with --disable-checking.
+
+2004-09-28 Devang Patel <dpatel@apple.com>
+
+ * tree-pretty-print.c (dump_generic_node): Print vector types.
+
+2004-09-28 Nick Clifton <nickc@redhat.com>
+
+ * config/sh/sh.h (INIT_CUMULATIVE_ARGS): Replace with an
+ invocation of the function sh_init_cumulative_args.
+ (INIT_CUMULATIVE_LIBCALL_ARGS): Likewise.
+ (INIT_CUMULATIVE_INCOMING_ARGS): Delete.
+ * config/sh/sh-protos.h: Prototype sh_init_cumulative_args.
+ * config/sh/sh.c (sh_init_cumulative_args): New function based
+ on the contents of the old INIT_CUMULATIVE_ARGS macro but with a
+ heuristic added to determine the setting of force_mem when a
+ library function is being called.
+
+2004-09-28 Diego Novillo <dnovillo@redhat.com>
+
+ * tree-ssa-loop-im.c (single_reachable_address) <PHI_NODE>:
+ Skip constant arguments.
+
+2004-09-28 Diego Novillo <dnovillo@redhat.com>
+
+ * tree-ssa-alias.c (create_name_tags): If PTR points to a
+ volatile type, mark the tag volatile.
+ (get_tmt_for): If TAG_TYPE is a volatile type, mark the tag
+ volatile.
+
+2004-09-28 Andrew Pinski <pinskia@physics.uc.edu>
+
+ * tree.def (vec_cond_expr): Fix. Change 'e'
+ to tcc_expression.
+
+2004-09-28 Kazu Hirata <kazu@cs.umass.edu>
+
+ * basic-block.h: Fix a comment typo.
+
+2004-09-28 Kazu Hirata <kazu@cs.umass.edu>
+
+ * optabs.c, optabs.h: Fix comment typos.
+
+2004-09-28 Eric Botcazou <ebotcazou@act-europe.fr>
+
+ * config/sparc/sparc.md (call_address_struct_value_sp32):
+ Properly mask the immediate field of the 'unimp' instruction.
+ (call_symbolic_struct_value_sp32): Likewise.
+
+2004-09-28 Ben Elliston <bje@au.ibm.com>
+ Steven Bosscher <stevenb@suse.de>
+ Andrew Pinski <pinskia@physics.uc.edu>
+
+ Merge from edge-vector-branch:
+ * basic-block.h: Include vec.h, errors.h. Instantiate a VEC(edge).
+ (struct edge_def): Remove pred_next, succ_next members.
+ (struct basic_block_def): Remove pred, succ members. Add preds
+ and succs members of type VEC(edge).
+ (FALLTHRU_EDGE): Redefine using EDGE_SUCC.
+ (BRANCH_EDGE): Likewise.
+ (EDGE_CRITICAL_P): Redefine using EDGE_COUNT.
+ (EDGE_COUNT, EDGE_I, EDGE_PRED, EDGE_SUCC): New.
+ (edge_iterator): New.
+ (ei_start, ei_last, ei_end_p, ei_one_before_end_p): New.
+ (ei_next, ei_prev, ei_edge, ei_safe_edge): Likewise.
+ (FOR_EACH_EDGE): New.
+ * bb-reorder.c (find_traces): Use FOR_EACH_EDGE and EDGE_* macros
+ where applicable.
+ (rotate_loop): Likewise.
+ (find_traces_1_route): Likewise.
+ (bb_to_key): Likewise.
+ (connect_traces): Likewise.
+ (copy_bb_p): Likewise.
+ (find_rarely_executed_basic_blocks_and_crossing_edges): Likewise.
+ (add_labels_and_missing_jumps): Likewise.
+ (fix_up_fall_thru_edges): Likewise.
+ (find_jump_block): Likewise.
+ (fix_crossing_conditional_branches): Likewise.
+ (fix_crossing_unconditional_branches): Likewise.
+ (add_reg_crossing_jump_notes): Likewise.
+ * bt-load.c (augment_live_range): Likewise.
+ * cfg.c (clear_edges): Likewise.
+ (unchecked_make_edge): Likewise.
+ (cached_make_edge): Likewise.
+ (make_single_succ_edge): Likewise.
+ (remove_edge): Likewise.
+ (redirect_edge_succ_nodup): Likewise.
+ (check_bb_profile): Likewise.
+ (dump_flow_info): Likewise.
+ (alloc_aux_for_edges): Likewise.
+ (clear_aux_for_edges): Likewise.
+ (dump_cfg_bb_info): Likewise.
+ * cfganal.c (forwarder_block_p): Likewise.
+ (can_fallthru): Likewise.
+ (could_fall_through): Likewise.
+ (mark_dfs_back_edges): Likewise.
+ (set_edge_can_fallthru_flag): Likewise.
+ (find_unreachable_blocks): Likewise.
+ (create_edge_list): Likewise.
+ (verify_edge_list): Likewise.
+ (add_noreturn_fake_exit_edges): Likewise.
+ (connect_infinite_loops_to_exit): Likewise.
+ (flow_reverse_top_sort_order_compute): Likewise.
+ (flow_depth_first_order_compute): Likewise.
+ (flow_preorder_transversal_compute): Likewise.
+ (flow_dfs_compute_reverse_execute): Likewise.
+ (dfs_enumerate_from): Likewise.
+ (compute_dominance_frontiers_1): Likewise.
+ * cfgbuild.c (make_edges): Likewise.
+ (compute_outgoing_frequencies): Likewise.
+ (find_many_sub_basic_blocks): Likewise.
+ (find_sub_basic_blocks): Likewise.
+ * cfgcleanup.c (try_simplify_condjump): Likewise.
+ (thread_jump): Likewise.
+ (try_forward_edges): Likewise.
+ (merge_blocks_move): Likewise.
+ (outgoing_edges_match): Likewise.
+ (try_crossjump_to_edge): Likewise.
+ (try_crossjump_bb): Likewise.
+ (try_optimize_cfg): Likewise.
+ (merge_seq_blocks): Likewise.
+ * cfgexpand.c (expand_gimple_tailcall): Likewise.
+ (expand_gimple_basic_block): Likewise.
+ (construct_init_block): Likewise.
+ (construct_exit_block): Likewise.
+ * cfghooks.c (verify_flow_info): Likewise.
+ (dump_bb): Likewise.
+ (delete_basic_block): Likewise.
+ (split_edge): Likewise.
+ (merge_blocks): Likewise.
+ (make_forwarder_block): Likewise.
+ (tidy_fallthru_edges): Likewise.
+ (can_duplicate_block_p): Likewise.
+ (duplicate_block): Likewise.
+ * cfglayout.c (fixup_reorder_chain): Likewise.
+ (fixup_fallthru_exit_predecessor): Likewise.
+ (can_copy_bbs_p): Likewise.
+ (copy_bbs): Likewise.
+ * cfgloop.c (flow_loops_cfg_dump): Likewise.
+ (flow_loop_entry_edges_find): Likewise.
+ (flow_loop_exit_edges_find): Likewise.
+ (flow_loop_nodes_find): Likewise.
+ (mark_single_exit_loops): Likewise.
+ (flow_loop_pre_header_scan): Likewise.
+ (flow_loop_pre_header_find): Likewise.
+ (update_latch_info): Likewise.
+ (canonicalize_loop_headers): Likewise.
+ (flow_loops_find): Likewise.
+ (get_loop_body_in_bfs_order): Likewise.
+ (get_loop_exit_edges): Likewise.
+ (num_loop_branches): Likewise.
+ (verify_loop_structure): Likewise.
+ (loop_latch_edge): Likewise.
+ (loop_preheader_edge): Likewise.
+ * cfgloopanal.c (mark_irreducible_loops): Likewise.
+ (expected_loop_iterations): Likewise.
+ * cfgloopmanip.c (remove_bbs): Likewise.
+ (fix_bb_placement): Likewise.
+ (fix_irreducible_loops): Likewise.
+ (remove_path): Likewise.
+ (scale_bbs_frequencies): Likewise.
+ (loopify): Likewise.
+ (unloop): Likewise.
+ (fix_loop_placement): Likewise.
+ (loop_delete_branch_edge): Likewise.
+ (duplicate_loop_to_header_edge): Likewise.
+ (mfb_keep_just): Likewise.
+ (create_preheader): Likewise.
+ (force_single_succ_latches): Likewise.
+ (loop_split_edge_with): Likewise.
+ (create_loop_notes): Likewise.
+ * cfgrtl.c (rtl_split_block): Likewise.
+ (rtl_merge_blocks): Likewise.
+ (rtl_can_merge_blocks): Likewise.
+ (try_redirect_by_replacing_jump): Likewise.
+ (force_nonfallthru_and_redirect): Likewise.
+ (rtl_tidy_fallthru_edge): Likewise.
+ (commit_one_edge_insertion): Likewise.
+ (commit_edge_insertions): Likewise.
+ (commit_edge_insertions_watch_calls): Likewise.
+ (rtl_verify_flow_info_1): Likewise.
+ (rtl_verify_flow_info): Likewise.
+ (purge_dead_edges): Likewise.
+ (cfg_layout_redirect_edge_and_branch): Likewise.
+ (cfg_layout_can_merge_blocks_p): Likewise.
+ (rtl_flow_call_edges_add): Likewise.
+ * cse.c (cse_cc_succs): Likewise.
+ * df.c (hybrid_search): Likewise.
+ * dominance.c (calc_dfs_tree_nonrec): Likewise.
+ (calc_dfs_tree): Likewise.
+ (calc_idoms): Likewise.
+ (recount_dominator): Likewise.
+ * domwalk.c (walk_dominator_tree): Likewise.
+ * except.c (emit_to_new_bb_before): Likewise.
+ (connect_post_landing_pads): Likewise.
+ (sjlj_emit_function_enter): Likewise.
+ (sjlj_emit_function_exit): Likewise.
+ (finish_eh_generation): Likewise.
+ * final.c (compute_alignments): Likewise.
+ * flow.c (calculate_global_regs_live): Likewise.
+ (initialize_uninitialized_subregs): Likewise.
+ (init_propagate_block_info): Likewise.
+ * function.c (thread_prologue_and_epilogue_insns): Likewise.
+ * gcse.c (find_implicit_sets): Likewise.
+ (bypass_block): Likewise.
+ (bypass_conditional_jumps): Likewise.
+ (compute_pre_data): Likewise.
+ (insert_insn_end_bb): Likewise.
+ (insert_store): Likewise.
+ (remove_reachable_equiv_notes): Likewise.
+ * global.c (global_conflicts): Likewise.
+ (calculate_reg_pav): Likewise.
+ * graph.c (print_rtl_graph_with_bb): Likewise.
+ * ifcvt.c (mark_loop_exit_edges): Likewise.
+ (merge_if_block): Likewise.
+ (find_if_header): Likewise.
+ (block_jumps_and_fallthru_p): Likewise.
+ (find_if_block): Likewise.
+ (find_cond_trap): Likewise.
+ (block_has_only_trap): Likewise.
+ (find_if_case1): Likewise.
+ (find_if_case_2): Likewise.
+ * lambda-code.c (lambda_loopnest_to_gcc_loopnest): Likewise.
+ (perfect_nestify): Likewise.
+ * lcm.c (compute_antinout_edge): Likewise.
+ (compute_laterin): Likewise.
+ (compute_available): Likewise.
+ (compute_nearerout): Likewise.
+ * loop-doloop.c (doloop_modify): Likewise.
+ * loop-init.c (loop_optimizer_init): Likewise.
+ * loop-invariant.c (find_exits): Likewise.
+ * loop-iv.c (simplify_using_initial_values): Likewise.
+ (check_simple_exit): Likewise.
+ (find_simple_exit): Likewise.
+ * loop-unroll.c (peel_loop_completely): Likewise.
+ (unroll_loop_constant_iterations): Likewise.
+ (unroll_loop_runtime_iterations): Likewise.
+ * loop-unswitch.c (may_unswitch_on): Likewise.
+ (unswitch_loop): Likewise.
+ * modulo-sched.c (generate_prolog_epilog): Likewise.
+ (sms_schedule): Likewise.
+ * postreload-gcse.c (eliminate_partially_redundant_load):
+ Likewise.
+ * predict.c (can_predict_insn_p): Likewise.
+ (set_even_probabilities): Likewise.
+ (combine_predictions_for_bb): Likewise.
+ (predict_loops): Likewise.
+ (estimate_probability): Likewise.
+ (tree_predict_by_opcode): Likewise.
+ (tree_estimate_probability): Likewise.
+ (last_basic_block_p): Likewise.
+ (propagate_freq): Likewise.
+ (estimate_loops_at_level): Likewise.
+ (estimate_bb_frequencies): Likewise.
+ * profile.c (instrument_edges): Likewise.
+ (get_exec_counts): Likewise.
+ (compute_branch_probabilities): Likewise.
+ (branch_prob): Likewise.
+ * ra-build.c (live_in): Likewise.
+ * ra-rewrite.c (rewrite_program2): Likewise.
+ * ra.c (reg_alloc): Likewise.
+ * reg-stack.c (reg_to_stack): Likewise.
+ (convert_regs_entry): Likewise.
+ (compensate_edge): Likewise.
+ (convert_regs_1): Likewise,
+ (convert_regs_2): Likewise.
+ (convert_regs): Likewise.
+ * regrename.c (copyprop_hardreg_forward): Likewise.
+ * reload1.c (fixup_abnormal_edges): Likewise.
+ * sbitmap.c (sbitmap_intersection_of_succs): Likewise.
+ (sbitmap_insersection_of_preds): Likewise.
+ (sbitmap_union_of_succs): Likewise.
+ (sbitmap_union_of_preds): Likewise.
+ * sched-ebb.c (compute_jump_reg_dependencies): Likewise.
+ (fix_basic_block_boundaries): Likewise.
+ (sched_ebbs): Likewise.
+ * sched-rgn.c (build_control_flow): Likewise.
+ (find_rgns): Likewise.
+ * tracer.c (find_best_successor): Likewise.
+ (find_best_predecessor): Likewise.
+ (tail_duplicate): Likewise.
+ * tree-cfg.c (make_edges): Likewise.
+ (make_ctrl_stmt_edges): Likewise.
+ (make_goto_expr_edges): Likewise.
+ (tree_can_merge_blocks_p): Likewise.
+ (tree_merge_blocks): Likewise.
+ (cfg_remove_useless_stmts_bb): Likewise.
+ (remove_phi_nodes_and_edges_for_unreachable_block): Likewise.
+ (tree_block_forwards_to): Likewise.
+ (cleanup_control_expr_graph): Likewise.
+ (find_taken_edge): Likewise.
+ (dump_cfg_stats): Likewise.
+ (tree_cfg2vcg): Likewise.
+ (disband_implicit_edges): Likewise.
+ (tree_find_edge_insert_loc): Likewise.
+ (bsi_commit_edge_inserts): Likewise.
+ (tree_split_edge): Likewise.
+ (tree_verify_flow_info): Likewise.
+ (tree_make_forwarder_block): Likewise.
+ (tree_forwarder_block_p): Likewise.
+ (thread_jumps): Likewise.
+ (tree_try_redirect_by_replacing_jump): Likewise.
+ (tree_split_block): Likewise.
+ (add_phi_args_after_copy_bb): Likewise.
+ (rewrite_to_new_ssa_names_bb): Likewise.
+ (dump_function_to_file): Likewise.
+ (print_pred_bbs): Likewise.
+ (print_loop): Likewise.
+ (tree_flow_call_edges_add): Likewise.
+ (split_critical_edges): Likewise.
+ (execute_warn_function_return): Likewise.
+ (extract_true_false_edges_from_block): Likewise.
+ * tree-if-conv.c (tree_if_conversion): Likewise.
+ (if_convertable_bb_p): Likewise.
+ (find_phi_replacement_condition): Likewise.
+ (combine_blocks): Likewise.
+ * tree-into-ssa.c (compute_global_livein): Likewise.
+ (ssa_mark_phi_uses): Likewise.
+ (ssa_rewrite_initialize_block): Likewise.
+ (rewrite_add_phi_arguments): Likewise.
+ (ssa_rewrite_phi_arguments): Likewise.
+ (insert_phi_nodes_for): Likewise.
+ (rewrite_into_ssa): Likewise.
+ (rewrite_ssa_into_ssa): Likewise.
+ * tree-mudflap.c (mf_build_check_statement_for): Likewise.
+ * tree-outof-ssa.c (coalesce_abnormal_edges): Likewise.
+ (rewrite_trees): Likewise.
+ * tree-pretty-print.c (dump_bb_header): Likewise.
+ (dump_implicit_edges): Likewise.
+ * tree-sra.c (insert_edge_copies): Likewise.
+ (find_obviously_necessary_stmts): Likewise.
+ (remove_data_stmt): Likewise.
+ * tree-ssa-dom.c (thread_across_edge): Likewise.
+ (dom_opt_finalize_block): Likewise.
+ (single_incoming_edge_ignoring_loop_edges): Likewise.
+ (record_equivalences_from_incoming_edges): Likewise.
+ (cprop_into_successor_phis): Likewise.
+ * tree-ssa-live.c (live_worklist): Likewise.
+ (calculate_live_on_entry): Likewise.
+ (calculate_live_on_exit): Likewise.
+ * tree-ssa-loop-ch.c (should_duplicate_loop_header_p): Likewise.
+ (copy_loop_headers): Likewise.
+ * tree-ssa-loop-im.c (loop_commit_inserts): Likewise.
+ (fill_always_executed_in): Likewise.
+ * tree-ssa-loop-ivcanon.c (create_canonical_iv): Likewise.
+ * tree-ssa-loop-ivopts.c (find_interesting_uses): Likewise.
+ (compute_phi_arg_on_exit): Likewise.
+ * tree-ssa-loop-manip.c (add_exit_phis_edge): Likewise.
+ (get_loops_exit): Likewise.
+ (split_loop_exit_edge): Likewise.
+ (ip_normal_pos): Likewise.
+ * tree-ssa-loop-niter.c (simplify_using_initial_conditions):
+ Likewise.
+ * tree-ssa-phiopt.c (candidate_bb_for_phi_optimization): Likewise.
+ (replace_phi_with_stmt): Likewise.
+ (value_replacement): Likewise.
+ * tree-ssa-pre.c (compute_antic_aux): Likewise.
+ (insert_aux): Likewise.
+ (init_pre): Likewise.
+ * tree-ssa-propagate.c (simulate_stmt): Likewise.
+ (simulate_block): Likewise.
+ (ssa_prop_init): Likewise.
+ * tree-ssa-threadupdate.c (thread_block): Likewise.
+ (create_block_for_threading): Likewise.
+ (remove_last_stmt_and_useless_edges): Likewise.
+ * tree-ssa.c (verify_phi_args): Likewise.
+ (verify_ssa): Likewise.
+ * tree_tailcall.c (independent_of_stmt_p): Likewise.
+ (find_tail_calls): Likewise.
+ (eliminate_tail_call): Likewise.
+ (tree_optimize_tail_calls_1): Likewise.
+ * tree-vectorizer.c (vect_transform_loop): Likewise.
+ * var-tracking.c (prologue_stack_adjust): Likewise.
+ (vt_stack_adjustments): Likewise.
+ (vt_find_locations): Likewise.
+ * config/frv/frv.c (frv_ifcvt_modify_tests): Likewise.
+ * config/i386/i386.c (ix86_pad_returns): Likewise.
+ * config/ia64/ia64.c (ia64_expand_prologue): Likewise.
+ * config/rs6000/rs6000.c (rs6000_emit_prologue): Likewise.
+
+2004-09-28 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ PR target/16532
+ * config/sparc/sparc.c (struct machine_function): New field
+ 'leaf_function_p' and 'prologue_data_valid_p'.
+ (sparc_leaf_function_p, sparc_prologue_data_valid_p): New macro
+ to conveniently access the above fields.
+ (TARGET_LATE_RTL_PROLOGUE_EPILOGUE): Delete.
+ (eligible_for_return_delay): Use 'sparc_leaf_function_p' instead
+ of the generic flavor 'current_function_uses_only_leaf_regs'.
+ (eligible_for_sibcall_delay): Likewise.
+ (sparc_expand_prologue): Compute 'sparc_leaf_function_p' and set
+ 'sparc_prologue_data_valid_p'. Use 'sparc_leaf_function_p'.
+ (sparc_asm_function_prologue): Add sanity check for the assumption
+ made in 'sparc_expand_prologue'. Use 'sparc_leaf_function_p'.
+ (sparc_can_use_return_insn_p): New function.
+ (sparc_expand_epilogue): Use 'sparc_leaf_function_p'.
+ (output_restore): Likewise.
+ (output_sibcall): Likewise.
+ (sparc_output_mi_thunk): Likewise.
+ * config/sparc/sparc-protos.h (sparc_can_use_return_insn_p): Declare.
+ * config/sparc/sparc.md (return): New expander.
+
+ * config/sparc/sparc.h (INITIAL_ELIMINATION_OFFSET): Minor tweak.
+
+2004-09-27 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/17642
+ * stor-layout.c (layout_decl): Use fold_convert, not convert.
+ (bit_from_pos): Likewise.
+ (byte_from_pos): Likewise.
+ (pos_from_bit): Likewise.
+ (normalize_offset): Likewise.
+ (place_field): Likewise.
+ (finalize_type_size): Likewise.
+ (layout_type): Likewise.
+ * tree.c (build_index_type): Likewise.
+
+2004-09-27 Devang Patel <dpatel@apple.com>
+
+ * expr.c (expand_expr_real_1): Handle VEC_COND_EXPR.
+ * genopinit.c (optabs): New entry for vcond_gen_code and
+ vcondu_gen_code.
+ * optabs.c (vcond_gen_code, vcondu_gen_code): New optabs.
+ (get_rtx_code): New function.
+ (vector_compare_rtx): New function.
+ (init_optabs): Initialize vcond_gen_code and vcondu_gen_code.
+ (expand_vec_cond_expr_p): New function.
+ (expand_vec_cond_expr): New function.
+ (get_vcond_icode): New function.
+ * optabs.h (expand_vec_cond_expr, expand_vec_cond_expr_p): New externs.
+ (vcond_gen_code, vcondu_gen_code): Same.
+
+2004-09-27 Kelley Cook <kcook@gcc.gnu.org>
+
+ * Makefile.in (STAGESTUFF): Split into ...
+ (STAGECOPYSTUFF, STAGEMOVESTUFF): ... these.
+ (mostlyclean): Update.
+ (stage1-start, stage2-start, stage3-start, stage4-start,
+ stageprofile-start, stagefeedback-start): Copy the STAGECOPYSTUFF.
+ Move the STAGEMOVESTUFF.
+
+2004-09-27 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ * system.h (getpagesize): Return 'int' instead of 'long'.
+
+2004-09-27 Michael Matz <matz@suse.de>
+
+ PR bootstrap/17698
+ PR bootstrap/17702
+ * bitmap.h (bmp_iter_single_init, bmp_iter_and_not_init,
+ bmp_iter_and_init): Shift by bit_in_word.
+
+2004-09-27 Kelley Cook <kcook@gcc.gnu.org>
+
+ * aclocal.m4: Quote m4_includes. Include ../config/gcc-lib-path.m4.
+ * configure.ac: Don't sinclude it here.
+ * configure: Regenerate.
+
+2004-09-27 Dorit Naishlos <dorit@il.ibm.com>
+
+ * config/rs6000/rs6000.c (rs6000_legitimate_address, print_operand):
+ Handle AND pattern
+
+2004-09-27 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ PR c/13804
+ * c-typeck.c (build_component_ref): Name type involved in
+ diagnostic for structure or union without a member of the given
+ name.
+
+2004-09-27 DJ Delorie <dj@redhat.com>
+
+ * config/stormy16/stormy16.c (xstormy16_asm_output_aligned_common):
+ .comm alignment is bytes, not bits.
+
+2004-09-27 Devang Patel <dpatel@apple.com>
+
+ * tree-pretty-print.c (dump_generic_node): Print VEC_COND_EXPR.
+ (print_call_name): Do not print VEC_COND_EXPR.
+
+2004-09-27 Devang Patel <dpatel@apple.com>
+
+ * tree-pretty-print.c (dump_generic_node): Print VEC_COND_EXPR.
+
+2004-09-27 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (athlon_cost, k8_cost): Set BRANCH_COST to 5.
+
+2004-09-27 Kazu Hirata <kazu@cs.umass.edu>
+
+ * bitmap.h: Fix a comment typo.
+
+2004-09-27 Aaron W. LaFramboise <aaronraolete36@aaronwl.com>
+
+ * libgcc2.c (getpagesize): Change type of return value to int.
+
+2004-09-26 Matt Austern <austern@apple.com>
+
+ * ggc-page.c (GGC_QUIRE_SIZE): Bump up from 16 to 256 if we're
+ using mmap.
+
2004-09-26 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
* bitmap.h (EXECUTE_IF_SET_IN_BITMAP, EXECUTE_IF_AND_COMPL_IN_BITMAP,
@@ -195,7 +1233,7 @@
only if compiling with back chain.
("save_stack_nonlocal", "restore_stack_nonlocal"): Save/restore
back chain only if back chain enabled. Use s390_back_chain_rtx.
-
+
2004-09-25 Joseph S. Myers <jsm@polyomino.org.uk>
* doc/trouble.texi: Remove obsolete information. Update
@@ -277,7 +1315,7 @@
* tree-if-conv.c (tree_if_convert_cond_expr0: Create temp. variable
only when necesssary.
(combine_blocks): Combine loop header and exit block.
-
+
2004-09-24 Paolo Bonzini <bonzini@gnu.org>
* hooks.c (hook_tree_tree_bool_null): New.
@@ -384,7 +1422,7 @@
PR c++/13989
PR c++/9844
* tree.c (reconstruct_complex_type): Remove extra "this".
- * config/rs6000/rs6000.c (rs6000_handle_altivec_attribute):
+ * config/rs6000/rs6000.c (rs6000_handle_altivec_attribute):
Add V4SFmode to case statement.
2004-09-23 Joseph S. Myers <jsm@polyomino.org.uk>
@@ -402,7 +1440,7 @@
dominance data during error message printing.
* tree-mudflap.c (mf_build_check_statement_for): Build basic blocks
and edges more correctly.
-
+
2004-09-23 Dorit Naishlos <dorit@il.ibm.com>
* tree.def (ALIGN_INDIRECT_REF, MISALIGNED_INDIRECT_REF):
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 513b7b629c5..1194942c709 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -937,16 +937,19 @@ OBJS-onestep = libbackend.o $(OBJS-archive)
BACKEND = main.o @TREEBROWSER@ libbackend.a $(CPPLIB)
-# Files to be copied away after each stage in building.
-STAGESTUFF = *$(objext) insn-flags.h insn-config.h insn-codes.h \
+# Files to be copied after each stage in building.
+STAGECOPYSTUFF = insn-flags.h insn-config.h insn-codes.h \
insn-output.c insn-recog.c insn-emit.c insn-extract.c insn-peep.c \
insn-attr.h insn-attrtab.c insn-opinit.c insn-preds.c insn-constants.h \
tm-preds.h \
tree-check.h insn-conditions.c min-insn-modes.c insn-modes.c insn-modes.h \
- s-flags s-config s-codes s-mlib s-genrtl s-modes s-gtype gtyp-gen.h \
+ genrtl.c genrtl.h gt-*.h gtype-*.h gtype-desc.c gtyp-gen.h
+
+# Files to be moved away after each stage in building.
+STAGEMOVESTUFF = *$(objext) \
+ s-flags s-config s-codes s-mlib s-genrtl s-modes s-gtype \
s-gtyp-gen s-output s-recog s-emit s-extract s-peep s-check s-conditions \
s-attr s-attrtab s-opinit s-preds s-constants s-crt0 \
- genrtl.c genrtl.h gt-*.h gtype-*.h gtype-desc.c \
xgcc$(exeext) cpp$(exeext) cc1$(exeext) $(EXTRA_PASSES) \
$(EXTRA_PARTS) $(EXTRA_PROGRAMS) gcc-cross$(exeext) \
protoize$(exeext) unprotoize$(exeext) \
@@ -1635,7 +1638,7 @@ tree-ssa-propagate.o : tree-ssa-propagate.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-propagate.h
+ tree-ssa-propagate.h vec.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) \
@@ -3034,7 +3037,7 @@ fsf-funding.pod: funding.texi
# (less duplicated code).
mostlyclean: lang.mostlyclean
- -rm -f $(STAGESTUFF)
+ -rm -f $(STAGECOPYSTUFF) $(STAGEMOVESTUFF)
-rm -f *$(coverageexts)
-rm -rf libgcc
# Delete build programs
@@ -3898,7 +3901,8 @@ stage1-start:
done
# If SPECS is overridden, make sure it is `installed' as specs.
-mv $(SPECS) stage1/specs
- -mv $(STAGESTUFF) stage1
+ -mv $(STAGEMOVESTUFF) stage1
+ -cp -p $(STAGECOPYSTUFF) stage1
# Copy as/ld if they exist to stage dir, so that running xgcc from the stage
# dir will work properly.
-if [ -f as$(exeext) ] ; then (cd stage1 && $(LN_S) ../as$(exeext) .) ; else true ; fi
@@ -3935,7 +3939,8 @@ stage2-start:
done
# If SPECS is overridden, make sure it is `installed' as specs.
-mv $(SPECS) stage2/specs
- -mv $(STAGESTUFF) stage2
+ -mv $(STAGEMOVESTUFF) stage2
+ -cp -p $(STAGECOPYSTUFF) stage2
# Copy as/ld if they exist to stage dir, so that running xgcc from the stage
# dir will work properly.
-if [ -f as$(exeext) ] ; then (cd stage2 && $(LN_S) ../as$(exeext) .) ; else true ; fi
@@ -3968,7 +3973,8 @@ stage3-start:
done
# If SPECS is overridden, make sure it is `installed' as specs.
-mv $(SPECS) stage3/specs
- -mv $(STAGESTUFF) stage3
+ -mv $(STAGEMOVESTUFF) stage3
+ -cp -p $(STAGECOPYSTUFF) stage3
# Copy as/ld if they exist to stage dir, so that running xgcc from the stage
# dir will work properly.
-if [ -f as$(exeext) ] ; then (cd stage3 && $(LN_S) ../as$(exeext) .) ; else true ; fi
@@ -4001,7 +4007,8 @@ stage4-start:
done
# If SPECS is overridden, make sure it is `installed' as specs.
-mv $(SPECS) stage4/specs
- -mv $(STAGESTUFF) stage4
+ -mv $(STAGEMOVESTUFF) stage4
+ -cp -p $(STAGECOPYSTUFF) stage4
# Copy as/ld if they exist to stage dir, so that running xgcc from the stage
# dir will work properly.
-if [ -f as$(exeext) ] ; then (cd stage4 && $(LN_S) ../as$(exeext) .) ; else true ; fi
@@ -4032,7 +4039,8 @@ stageprofile-start:
do \
if [ -d stageprofile/$$dir ] ; then true ; else mkdir stageprofile/$$dir ; fi ; \
done
- -mv $(STAGESTUFF) stageprofile
+ -mv $(STAGEMOVESTUFF) stageprofile
+ -cp -p $(STAGECOPYSTUFF) stageprofile
# Copy as/ld if they exist to stage dir, so that running xgcc from the stage
# dir will work properly.
-if [ -f as$(exeext) ] ; then (cd stageprofile && $(LN_S) ../as$(exeext) .) ; else true ; fi
@@ -4063,7 +4071,8 @@ stagefeedback-start:
do \
if [ -d stagefeedback/$$dir ] ; then true ; else mkdir stagefeedback/$$dir ; fi ; \
done
- -mv $(STAGESTUFF) stagefeedback
+ -mv $(STAGEMOVESTUFF) stagefeedback
+ -cp -p $(STAGECOPYSTUFF) stagefeedback
# Copy as/ld if they exist to stage dir, so that running xgcc from the stage
# dir will work properly.
-if [ -f as$(exeext) ] ; then (cd stagefeedback && $(LN_S) ../as$(exeext) .) ; else true ; fi
diff --git a/gcc/aclocal.m4 b/gcc/aclocal.m4
index 6298451c79d..38c10c8238a 100644
--- a/gcc/aclocal.m4
+++ b/gcc/aclocal.m4
@@ -1,12 +1,13 @@
-m4_include(../config/accross.m4)
-m4_include(../config/acx.m4)
-m4_include(../config/gettext-sister.m4)
-m4_include(../config/iconv.m4)
-m4_include(../config/lcmessage.m4)
-m4_include(../config/lib-ld.m4)
-m4_include(../config/lib-link.m4)
-m4_include(../config/lib-prefix.m4)
-m4_include(../config/progtest.m4)
+m4_include([../config/accross.m4])
+m4_include([../config/acx.m4])
+m4_include([../config/gettext-sister.m4])
+m4_include([../config/gcc-lib-path.m4])
+m4_include([../config/iconv.m4])
+m4_include([../config/lcmessage.m4])
+m4_include([../config/lib-ld.m4])
+m4_include([../config/lib-link.m4])
+m4_include([../config/lib-prefix.m4])
+m4_include([../config/progtest.m4])
dnl See whether we need a declaration for a function.
dnl The result is highly dependent on the INCLUDES passed in, so make sure
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 3b042591110..c03adf8204c 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,7 @@
+2004-10-01 Jan Hubicka <jh@suse.cz>
+
+ * misc.c (gnat_expand_body): Update call of tree_rest_of_compilation.
+
2004-09-23 Robert Dewar <dewar@gnat.com>
PR ada/17540
diff --git a/gcc/ada/misc.c b/gcc/ada/misc.c
index d1631cdb463..f74626ad4ed 100644
--- a/gcc/ada/misc.c
+++ b/gcc/ada/misc.c
@@ -649,7 +649,7 @@ gnat_expand_body (tree gnu_decl)
if (!DECL_INITIAL (gnu_decl) || DECL_INITIAL (gnu_decl) == error_mark_node)
return;
- tree_rest_of_compilation (gnu_decl, false);
+ tree_rest_of_compilation (gnu_decl);
}
/* Adjusts the RLI used to layout a record after all the fields have been
diff --git a/gcc/alias.c b/gcc/alias.c
index e096cbf6bc3..9155791d1d8 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -450,9 +450,7 @@ get_alias_set (tree t)
}
/* Check for accesses through restrict-qualified pointers. */
- if (TREE_CODE (inner) == INDIRECT_REF
- || TREE_CODE (inner) == ALIGN_INDIRECT_REF
- || TREE_CODE (inner) == MISALIGNED_INDIRECT_REF)
+ if (INDIRECT_REF_P (inner))
{
tree decl = find_base_decl (TREE_OPERAND (inner, 0));
@@ -2008,9 +2006,7 @@ nonoverlapping_memrefs_p (rtx x, rtx y)
moffsetx = adjust_offset_for_component_ref (exprx, moffsetx);
exprx = t;
}
- else if (TREE_CODE (exprx) == INDIRECT_REF
- || TREE_CODE (exprx) == ALIGN_INDIRECT_REF
- || TREE_CODE (exprx) == MISALIGNED_INDIRECT_REF)
+ else if (INDIRECT_REF_P (exprx))
{
exprx = TREE_OPERAND (exprx, 0);
if (flag_argument_noalias < 2
@@ -2027,9 +2023,7 @@ nonoverlapping_memrefs_p (rtx x, rtx y)
moffsety = adjust_offset_for_component_ref (expry, moffsety);
expry = t;
}
- else if (TREE_CODE (expry) == INDIRECT_REF
- || TREE_CODE (expry) == ALIGN_INDIRECT_REF
- || TREE_CODE (expry) == MISALIGNED_INDIRECT_REF)
+ else if (INDIRECT_REF_P (expry))
{
expry = TREE_OPERAND (expry, 0);
if (flag_argument_noalias < 2
diff --git a/gcc/basic-block.h b/gcc/basic-block.h
index 978f313a3cc..16d5ab3b1fd 100644
--- a/gcc/basic-block.h
+++ b/gcc/basic-block.h
@@ -28,6 +28,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "partition.h"
#include "hard-reg-set.h"
#include "predict.h"
+#include "vec.h"
+#include "errors.h"
/* Head of register set linked list. */
typedef bitmap_head regset_head;
@@ -147,12 +149,8 @@ do { \
typedef HOST_WIDEST_INT gcov_type;
/* Control flow edge information. */
-struct edge_def GTY((chain_next ("%h.pred_next")))
+struct edge_def GTY(())
{
- /* Links through the predecessor and successor lists. */
- struct edge_def *pred_next;
- struct edge_def *succ_next;
-
/* The two blocks at the ends of the edge. */
struct basic_block_def *src;
struct basic_block_def *dest;
@@ -176,6 +174,7 @@ struct edge_def GTY((chain_next ("%h.pred_next")))
};
typedef struct edge_def *edge;
+DEF_VEC_GC_P(edge);
#define EDGE_FALLTHRU 1 /* 'Straight line' flow */
#define EDGE_ABNORMAL 2 /* Strange flow, like computed
@@ -250,8 +249,8 @@ struct basic_block_def GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb")
tree stmt_list;
/* The edges into and out of the block. */
- edge pred;
- edge succ;
+ VEC(edge) *preds;
+ VEC(edge) *succs;
/* Liveness info. */
@@ -539,12 +538,12 @@ struct edge_list
#define NUM_EDGES(el) ((el)->num_edges)
/* BB is assumed to contain conditional jump. Return the fallthru edge. */
-#define FALLTHRU_EDGE(bb) ((bb)->succ->flags & EDGE_FALLTHRU \
- ? (bb)->succ : (bb)->succ->succ_next)
+#define FALLTHRU_EDGE(bb) (EDGE_SUCC ((bb), 0)->flags & EDGE_FALLTHRU \
+ ? EDGE_SUCC ((bb), 0) : EDGE_SUCC ((bb), 1))
/* BB is assumed to contain conditional jump. Return the branch edge. */
-#define BRANCH_EDGE(bb) ((bb)->succ->flags & EDGE_FALLTHRU \
- ? (bb)->succ->succ_next : (bb)->succ)
+#define BRANCH_EDGE(bb) (EDGE_SUCC ((bb), 0)->flags & EDGE_FALLTHRU \
+ ? EDGE_SUCC ((bb), 1) : EDGE_SUCC ((bb), 0))
/* Return expected execution frequency of the edge E. */
#define EDGE_FREQUENCY(e) (((e)->src->frequency \
@@ -553,8 +552,112 @@ struct edge_list
/ REG_BR_PROB_BASE)
/* Return nonzero if edge is critical. */
-#define EDGE_CRITICAL_P(e) ((e)->src->succ->succ_next \
- && (e)->dest->pred->pred_next)
+#define EDGE_CRITICAL_P(e) (EDGE_COUNT ((e)->src->succs) >= 2 \
+ && EDGE_COUNT ((e)->dest->preds) >= 2)
+
+#define EDGE_COUNT(ev) VEC_length (edge, (ev))
+#define EDGE_I(ev,i) VEC_index (edge, (ev), (i))
+#define EDGE_PRED(bb,i) VEC_index (edge, (bb)->preds, (i))
+#define EDGE_SUCC(bb,i) VEC_index (edge, (bb)->succs, (i))
+
+/* Iterator object for edges. */
+
+typedef struct {
+ unsigned index;
+ VEC(edge) *container;
+} edge_iterator;
+
+/* Return an iterator pointing to the start of an edge vector. */
+static inline edge_iterator
+ei_start (VEC(edge) *ev)
+{
+ edge_iterator i;
+
+ i.index = 0;
+ i.container = ev;
+
+ return i;
+}
+
+/* Return an iterator pointing to the last element of an edge
+ vector. */
+static inline edge_iterator
+ei_last (VEC(edge) *ev)
+{
+ edge_iterator i;
+
+ i.index = EDGE_COUNT (ev) - 1;
+ i.container = ev;
+
+ return i;
+}
+
+/* Is the iterator `i' at the end of the sequence? */
+static inline bool
+ei_end_p (edge_iterator i)
+{
+ return (i.index == EDGE_COUNT (i.container));
+}
+
+/* Is the iterator `i' at one position before the end of the
+ sequence? */
+static inline bool
+ei_one_before_end_p (edge_iterator i)
+{
+ return (i.index + 1 == EDGE_COUNT (i.container));
+}
+
+/* Advance the iterator to the next element. */
+static inline void
+ei_next (edge_iterator *i)
+{
+ gcc_assert (i->index < EDGE_COUNT (i->container));
+ i->index++;
+}
+
+/* Move the iterator to the previous element. */
+static inline void
+ei_prev (edge_iterator *i)
+{
+ gcc_assert (i->index > 0);
+ i->index--;
+}
+
+/* Return the edge pointed to by the iterator `i'. */
+static inline edge
+ei_edge (edge_iterator i)
+{
+ return EDGE_I (i.container, i.index);
+}
+
+/* Return an edge pointed to by the iterator. Do it safely so that
+ NULL is returned when the iterator is pointing at the end of the
+ sequence. */
+static inline edge
+ei_safe_edge (edge_iterator i)
+{
+ return !ei_end_p (i) ? ei_edge (i) : NULL;
+}
+
+/* This macro serves as a convenient way to iterate each edge in a
+ vector of predecessor or successor edges. It must not be used when
+ an element might be removed during the traversal, otherwise
+ elements will be missed. Instead, use a for-loop like that shown
+ in the following pseudo-code:
+
+ FOR (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
+ {
+ IF (e != taken_edge)
+ ssa_remove_edge (e);
+ ELSE
+ ei_next (&ei);
+ }
+*/
+
+#define FOR_EACH_EDGE(EDGE,ITER,EDGE_VEC) \
+ for ((EDGE) = NULL, (ITER) = ei_start ((EDGE_VEC)); \
+ ((EDGE) = ei_safe_edge ((ITER))); \
+ ei_next (&(ITER)))
struct edge_list * create_edge_list (void);
void free_edge_list (struct edge_list *);
diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c
index 11db0c58bd8..1d0b097de20 100644
--- a/gcc/bb-reorder.c
+++ b/gcc/bb-reorder.c
@@ -229,6 +229,7 @@ find_traces (int *n_traces, struct trace *traces)
int i;
int number_of_rounds;
edge e;
+ edge_iterator ei;
fibheap_t heap;
/* Add one extra round of trace collection when partitioning hot/cold
@@ -243,7 +244,7 @@ find_traces (int *n_traces, struct trace *traces)
heap = fibheap_new ();
max_entry_frequency = 0;
max_entry_count = 0;
- for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
{
bbd[e->dest->index].heap = heap;
bbd[e->dest->index].node = fibheap_insert (heap, bb_to_key (e->dest),
@@ -311,7 +312,9 @@ rotate_loop (edge back_edge, struct trace *trace, int trace_n)
do
{
edge e;
- for (e = bb->succ; e; e = e->succ_next)
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->dest != EXIT_BLOCK_PTR
&& e->dest->rbi->visited != trace_n
&& (e->flags & EDGE_CAN_FALLTHRU)
@@ -382,9 +385,9 @@ rotate_loop (edge back_edge, struct trace *trace, int trace_n)
prev_bb->rbi->next = best_bb->rbi->next;
/* Try to get rid of uncond jump to cond jump. */
- if (prev_bb->succ && !prev_bb->succ->succ_next)
+ if (EDGE_COUNT (prev_bb->succs) == 1)
{
- basic_block header = prev_bb->succ->dest;
+ basic_block header = EDGE_SUCC (prev_bb, 0)->dest;
/* Duplicate HEADER if it is a small block containing cond jump
in the end. */
@@ -392,7 +395,7 @@ rotate_loop (edge back_edge, struct trace *trace, int trace_n)
&& !find_reg_note (BB_END (header), REG_CROSSING_JUMP,
NULL_RTX))
{
- copy_bb (header, prev_bb->succ, prev_bb, trace_n);
+ copy_bb (header, EDGE_SUCC (prev_bb, 0), prev_bb, trace_n);
}
}
}
@@ -448,6 +451,7 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
struct trace *trace;
edge best_edge, e;
fibheapkey_t key;
+ edge_iterator ei;
bb = fibheap_extract_min (*heap);
bbd[bb->index].heap = NULL;
@@ -498,7 +502,7 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
bb->index, *n_traces - 1);
/* Select the successor that will be placed after BB. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
gcc_assert (!(e->flags & EDGE_FAKE));
@@ -537,12 +541,12 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
/* If the best destination has multiple predecessors, and can be
duplicated cheaper than a jump, don't allow it to be added
to a trace. We'll duplicate it when connecting traces. */
- if (best_edge && best_edge->dest->pred->pred_next
+ if (best_edge && EDGE_COUNT (best_edge->dest->preds) >= 2
&& copy_bb_p (best_edge->dest, 0))
best_edge = NULL;
/* Add all non-selected successors to the heaps. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e == best_edge
|| e->dest == EXIT_BLOCK_PTR
@@ -637,9 +641,7 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
/* Check whether there is another edge from BB. */
edge another_edge;
- for (another_edge = bb->succ;
- another_edge;
- another_edge = another_edge->succ_next)
+ FOR_EACH_EDGE (another_edge, ei, bb->succs)
if (another_edge != best_edge)
break;
@@ -678,18 +680,17 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
*/
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e != best_edge
&& (e->flags & EDGE_CAN_FALLTHRU)
&& !(e->flags & EDGE_COMPLEX)
&& !e->dest->rbi->visited
- && !e->dest->pred->pred_next
+ && EDGE_COUNT (e->dest->preds) == 1
&& !(e->flags & EDGE_CROSSING)
- && e->dest->succ
- && (e->dest->succ->flags & EDGE_CAN_FALLTHRU)
- && !(e->dest->succ->flags & EDGE_COMPLEX)
- && !e->dest->succ->succ_next
- && e->dest->succ->dest == best_edge->dest
+ && EDGE_COUNT (e->dest->succs) == 1
+ && (EDGE_SUCC (e->dest, 0)->flags & EDGE_CAN_FALLTHRU)
+ && !(EDGE_SUCC (e->dest, 0)->flags & EDGE_COMPLEX)
+ && EDGE_SUCC (e->dest, 0)->dest == best_edge->dest
&& 2 * e->dest->frequency >= EDGE_FREQUENCY (best_edge))
{
best_edge = e;
@@ -712,7 +713,7 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
/* The trace is terminated so we have to recount the keys in heap
(some block can have a lower key because now one of its predecessors
is an end of the trace). */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->dest == EXIT_BLOCK_PTR
|| e->dest->rbi->visited)
@@ -801,7 +802,7 @@ static fibheapkey_t
bb_to_key (basic_block bb)
{
edge e;
-
+ edge_iterator ei;
int priority = 0;
/* Do not start in probably never executed blocks. */
@@ -812,7 +813,7 @@ bb_to_key (basic_block bb)
/* Prefer blocks whose predecessor is an end of some trace
or whose predecessor edge is EDGE_DFS_BACK. */
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
if ((e->src != ENTRY_BLOCK_PTR && bbd[e->src->index].end_of_trace >= 0)
|| (e->flags & EDGE_DFS_BACK))
@@ -969,9 +970,10 @@ connect_traces (int n_traces, struct trace *traces)
/* Find the predecessor traces. */
for (t2 = t; t2 > 0;)
{
+ edge_iterator ei;
best = NULL;
best_len = 0;
- for (e = traces[t2].first->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, traces[t2].first->preds)
{
int si = e->src->index;
@@ -1016,9 +1018,10 @@ connect_traces (int n_traces, struct trace *traces)
while (1)
{
/* Find the continuation of the chain. */
+ edge_iterator ei;
best = NULL;
best_len = 0;
- for (e = traces[t].last->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, traces[t].last->succs)
{
int di = e->dest->index;
@@ -1058,12 +1061,13 @@ connect_traces (int n_traces, struct trace *traces)
basic_block next_bb = NULL;
bool try_copy = false;
- for (e = traces[t].last->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, traces[t].last->succs)
if (e->dest != EXIT_BLOCK_PTR
&& (e->flags & EDGE_CAN_FALLTHRU)
&& !(e->flags & EDGE_COMPLEX)
&& (!best || e->probability > best->probability))
{
+ edge_iterator ei;
edge best2 = NULL;
int best2_len = 0;
@@ -1079,7 +1083,7 @@ connect_traces (int n_traces, struct trace *traces)
continue;
}
- for (e2 = e->dest->succ; e2; e2 = e2->succ_next)
+ FOR_EACH_EDGE (e2, ei, e->dest->succs)
{
int di = e2->dest->index;
@@ -1177,24 +1181,17 @@ copy_bb_p (basic_block bb, int code_may_grow)
int size = 0;
int max_size = uncond_jump_length;
rtx insn;
- int n_succ;
- edge e;
if (!bb->frequency)
return false;
- if (!bb->pred || !bb->pred->pred_next)
+ if (EDGE_COUNT (bb->preds) < 2)
return false;
if (!can_duplicate_block_p (bb))
return false;
/* Avoid duplicating blocks which have many successors (PR/13430). */
- n_succ = 0;
- for (e = bb->succ; e; e = e->succ_next)
- {
- n_succ++;
- if (n_succ > 8)
- return false;
- }
+ if (EDGE_COUNT (bb->succs) > 8)
+ return false;
if (code_may_grow && maybe_hot_bb_p (bb))
max_size *= 8;
@@ -1262,6 +1259,7 @@ find_rarely_executed_basic_blocks_and_crossing_edges (edge *crossing_edges,
bool has_hot_blocks = false;
edge e;
int i;
+ edge_iterator ei;
/* Mark which partition (hot/cold) each basic block belongs in. */
@@ -1281,7 +1279,7 @@ find_rarely_executed_basic_blocks_and_crossing_edges (edge *crossing_edges,
the hot partition (if there is one). */
if (has_hot_blocks)
- for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
if (e->dest->index >= 0)
{
BB_SET_PARTITION (e->dest, BB_HOT_PARTITION);
@@ -1294,7 +1292,7 @@ find_rarely_executed_basic_blocks_and_crossing_edges (edge *crossing_edges,
if (targetm.have_named_sections)
{
FOR_EACH_BB (bb)
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->src != ENTRY_BLOCK_PTR
&& e->dest != EXIT_BLOCK_PTR
@@ -1384,7 +1382,7 @@ add_labels_and_missing_jumps (edge *crossing_edges, int n_crossing_edges)
/* bb just falls through. */
{
/* make sure there's only one successor */
- gcc_assert (src->succ && !src->succ->succ_next);
+ gcc_assert (EDGE_COUNT (src->succs) == 1);
/* Find label in dest block. */
label = block_label (dest);
@@ -1432,9 +1430,13 @@ fix_up_fall_thru_edges (void)
FOR_EACH_BB (cur_bb)
{
fall_thru = NULL;
- succ1 = cur_bb->succ;
- if (succ1)
- succ2 = succ1->succ_next;
+ if (EDGE_COUNT (cur_bb->succs) > 0)
+ succ1 = EDGE_SUCC (cur_bb, 0);
+ else
+ succ1 = NULL;
+
+ if (EDGE_COUNT (cur_bb->succs) > 1)
+ succ2 = EDGE_SUCC (cur_bb, 1);
else
succ2 = NULL;
@@ -1522,7 +1524,7 @@ fix_up_fall_thru_edges (void)
partition as bb it's falling through from. */
BB_COPY_PARTITION (new_bb, cur_bb);
- new_bb->succ->flags |= EDGE_CROSSING;
+ EDGE_SUCC (new_bb, 0)->flags |= EDGE_CROSSING;
}
/* Add barrier after new jump */
@@ -1557,8 +1559,9 @@ find_jump_block (basic_block jump_dest)
basic_block source_bb = NULL;
edge e;
rtx insn;
+ edge_iterator ei;
- for (e = jump_dest->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, jump_dest->preds)
if (e->flags & EDGE_CROSSING)
{
basic_block src = e->src;
@@ -1619,11 +1622,15 @@ fix_crossing_conditional_branches (void)
FOR_EACH_BB (cur_bb)
{
crossing_edge = NULL;
- succ1 = cur_bb->succ;
- if (succ1)
- succ2 = succ1->succ_next;
+ if (EDGE_COUNT (cur_bb->succs) > 0)
+ succ1 = EDGE_SUCC (cur_bb, 0);
+ else
+ succ1 = NULL;
+
+ if (EDGE_COUNT (cur_bb->succs) > 1)
+ succ2 = EDGE_SUCC (cur_bb, 1);
else
- succ2 = NULL;
+ succ2 = NULL;
/* We already took care of fall-through edges, so only one successor
can be a crossing edge. */
@@ -1738,10 +1745,10 @@ fix_crossing_conditional_branches (void)
will be a successor for new_bb and a predecessor
for 'dest'. */
- if (!new_bb->succ)
+ if (EDGE_COUNT (new_bb->succs) == 0)
new_edge = make_edge (new_bb, dest, 0);
else
- new_edge = new_bb->succ;
+ new_edge = EDGE_SUCC (new_bb, 0);
crossing_edge->flags &= ~EDGE_CROSSING;
new_edge->flags |= EDGE_CROSSING;
@@ -1769,7 +1776,7 @@ fix_crossing_unconditional_branches (void)
FOR_EACH_BB (cur_bb)
{
last_insn = BB_END (cur_bb);
- succ = cur_bb->succ;
+ succ = EDGE_SUCC (cur_bb, 0);
/* Check to see if bb ends in a crossing (unconditional) jump. At
this point, no crossing jumps should be conditional. */
@@ -1839,9 +1846,10 @@ add_reg_crossing_jump_notes (void)
{
basic_block bb;
edge e;
+ edge_iterator ei;
FOR_EACH_BB (bb)
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if ((e->flags & EDGE_CROSSING)
&& JUMP_P (BB_END (e->src)))
REG_NOTES (BB_END (e->src)) = gen_rtx_EXPR_LIST (REG_CROSSING_JUMP,
diff --git a/gcc/bitmap.h b/gcc/bitmap.h
index 76cd473cee6..cac84c11fba 100644
--- a/gcc/bitmap.h
+++ b/gcc/bitmap.h
@@ -269,7 +269,7 @@ bmp_iter_single_init (bitmap_iterator *bi, bitmap bmp, unsigned min)
bi->word = word_in_elt;
bi->word_bit = min - bit_in_word;
bi->bit = min;
- bi->actual = bi->ptr1->bits[word_in_elt] >> bit_in_elt;
+ bi->actual = bi->ptr1->bits[word_in_elt] >> bit_in_word;
}
else
{
@@ -282,7 +282,7 @@ bmp_iter_single_init (bitmap_iterator *bi, bitmap bmp, unsigned min)
return bmp_iter_single_next_1 (bi);
}
-/* Returns true if all elements of the bitmap refered to by iterator BI
+/* Returns true if all elements of the bitmap referred to by iterator BI
were processed. */
static inline bool
@@ -400,9 +400,9 @@ bmp_iter_and_not_init (bitmap_iterator *bi, bitmap bmp1, bitmap bmp2,
if (bi->ptr2 && bi->ptr2->indx == indx)
bi->actual = (bi->ptr1->bits[word_in_elt]
- & ~bi->ptr2->bits[word_in_elt]) >> bit_in_elt;
+ & ~bi->ptr2->bits[word_in_elt]) >> bit_in_word;
else
- bi->actual = bi->ptr1->bits[word_in_elt] >> bit_in_elt;
+ bi->actual = bi->ptr1->bits[word_in_elt] >> bit_in_word;
}
else
{
@@ -539,7 +539,7 @@ bmp_iter_and_init (bitmap_iterator *bi, bitmap bmp1, bitmap bmp2,
bi->bit = min;
bi->actual = (bi->ptr1->bits[word_in_elt]
- & bi->ptr2->bits[word_in_elt]) >> bit_in_elt;
+ & bi->ptr2->bits[word_in_elt]) >> bit_in_word;
}
else
{
diff --git a/gcc/bt-load.c b/gcc/bt-load.c
index ef4cf92864a..b0ced417518 100644
--- a/gcc/bt-load.c
+++ b/gcc/bt-load.c
@@ -879,6 +879,7 @@ augment_live_range (bitmap live_range, HARD_REG_SET *btrs_live_in_range,
else
{
edge e;
+ edge_iterator ei;
int new_block = new_bb->index;
gcc_assert (dominated_by_p (CDI_DOMINATORS, head_bb, new_bb));
@@ -900,7 +901,7 @@ augment_live_range (bitmap live_range, HARD_REG_SET *btrs_live_in_range,
dump_hard_reg_set (*btrs_live_in_range);
fprintf (dump_file, "\n");
}
- for (e = head_bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, head_bb->preds)
*tos++ = e->src;
}
@@ -910,6 +911,7 @@ augment_live_range (bitmap live_range, HARD_REG_SET *btrs_live_in_range,
if (!bitmap_bit_p (live_range, bb->index))
{
edge e;
+ edge_iterator ei;
bitmap_set_bit (live_range, bb->index);
IOR_HARD_REG_SET (*btrs_live_in_range,
@@ -923,7 +925,7 @@ augment_live_range (bitmap live_range, HARD_REG_SET *btrs_live_in_range,
fprintf (dump_file, "\n");
}
- for (e = bb->pred; e != NULL; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
basic_block pred = e->src;
if (!bitmap_bit_p (live_range, pred->index))
diff --git a/gcc/builtin-attrs.def b/gcc/builtin-attrs.def
index f376f5571b5..34b078cdb43 100644
--- a/gcc/builtin-attrs.def
+++ b/gcc/builtin-attrs.def
@@ -101,6 +101,14 @@ DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LIST, ATTR_MALLOC, \
DEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LIST, ATTR_SENTINEL, \
ATTR_NULL, ATTR_NOTHROW_LIST)
+DEF_ATTR_TREE_LIST (ATTR_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, ATTR_NULL)
+DEF_ATTR_TREE_LIST (ATTR_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, ATTR_NULL)
+/* Functions whose first and second parameters are nonnull pointers. */
+DEF_ATTR_TREE_LIST (ATTR_NONNULL_1_2, ATTR_NONNULL, ATTR_LIST_2, \
+ ATTR_NONNULL_1)
+/* Functions whose first and fourth parameters are nonnull pointers. */
+DEF_ATTR_TREE_LIST (ATTR_NONNULL_1_4, ATTR_NONNULL, ATTR_LIST_4, \
+ ATTR_NONNULL_1)
DEF_ATTR_TREE_LIST (ATTR_NOTHROW_SENTINEL_1, ATTR_SENTINEL, ATTR_LIST_1, \
ATTR_NOTHROW_LIST)
DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, \
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 1aeae965401..1362c2a83c2 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -2433,8 +2433,7 @@ expand_builtin_strlen (tree arglist, rtx target,
/* Now that we are assured of success, expand the source. */
start_sequence ();
- pat = memory_address (BLKmode,
- expand_expr (src, src_reg, ptr_mode, EXPAND_SUM));
+ pat = expand_expr (src, src_reg, ptr_mode, EXPAND_NORMAL);
if (pat != src_reg)
emit_move_insn (src_reg, pat);
pat = get_insns ();
@@ -2464,51 +2463,13 @@ expand_builtin_strlen (tree arglist, rtx target,
static rtx
expand_builtin_strstr (tree arglist, rtx target, enum machine_mode mode)
{
- if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
- return 0;
- else
+ if (validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
{
- tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
- tree fn, tmp;
- const char *p1, *p2;
-
- p2 = c_getstr (s2);
- if (p2 == NULL)
- return 0;
-
- p1 = c_getstr (s1);
- if (p1 != NULL)
- {
- const char *r = strstr (p1, p2);
-
- if (r == NULL)
- return const0_rtx;
-
- /* Return an offset into the constant string argument. */
- tmp = fold (build2 (PLUS_EXPR, TREE_TYPE (s1), s1,
- fold_convert (TREE_TYPE (s1),
- ssize_int (r - p1))));
- return expand_expr (tmp, target, mode, EXPAND_NORMAL);
- }
-
- if (p2[0] == '\0')
- return expand_expr (s1, target, mode, EXPAND_NORMAL);
-
- if (p2[1] != '\0')
- return 0;
-
- fn = implicit_built_in_decls[BUILT_IN_STRCHR];
- if (!fn)
- return 0;
-
- /* New argument list transforming strstr(s1, s2) to
- strchr(s1, s2[0]). */
- arglist = build_tree_list (NULL_TREE,
- build_int_cst (NULL_TREE, p2[0]));
- arglist = tree_cons (NULL_TREE, s1, arglist);
- return expand_expr (build_function_call_expr (fn, arglist),
- target, mode, EXPAND_NORMAL);
+ tree result = fold_builtin_strstr (arglist);
+ if (result)
+ return expand_expr (result, target, mode, EXPAND_NORMAL);
}
+ return 0;
}
/* Expand a call to the strchr builtin. Return 0 if we failed the
@@ -2518,42 +2479,15 @@ expand_builtin_strstr (tree arglist, rtx target, enum machine_mode mode)
static rtx
expand_builtin_strchr (tree arglist, rtx target, enum machine_mode mode)
{
- if (!validate_arglist (arglist, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
- return 0;
- else
+ if (validate_arglist (arglist, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
{
- tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
- const char *p1;
-
- if (TREE_CODE (s2) != INTEGER_CST)
- return 0;
-
- p1 = c_getstr (s1);
- if (p1 != NULL)
- {
- char c;
- const char *r;
- tree tmp;
-
- if (target_char_cast (s2, &c))
- return 0;
-
- r = strchr (p1, c);
-
- if (r == NULL)
- return const0_rtx;
+ tree result = fold_builtin_strchr (arglist);
+ if (result)
+ return expand_expr (result, target, mode, EXPAND_NORMAL);
- /* Return an offset into the constant string argument. */
- tmp = fold (build2 (PLUS_EXPR, TREE_TYPE (s1), s1,
- fold_convert (TREE_TYPE (s1),
- ssize_int (r - p1))));
- return expand_expr (tmp, target, mode, EXPAND_NORMAL);
- }
-
- /* FIXME: Should use here strchrM optab so that ports can optimize
- this. */
- return 0;
+ /* FIXME: Should use strchrM optab so that ports can optimize this. */
}
+ return 0;
}
/* Expand a call to the strrchr builtin. Return 0 if we failed the
@@ -2563,49 +2497,13 @@ expand_builtin_strchr (tree arglist, rtx target, enum machine_mode mode)
static rtx
expand_builtin_strrchr (tree arglist, rtx target, enum machine_mode mode)
{
- if (!validate_arglist (arglist, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
- return 0;
- else
+ if (validate_arglist (arglist, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
{
- tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
- tree fn, tmp;
- const char *p1;
-
- if (TREE_CODE (s2) != INTEGER_CST)
- return 0;
-
- p1 = c_getstr (s1);
- if (p1 != NULL)
- {
- char c;
- const char *r;
-
- if (target_char_cast (s2, &c))
- return 0;
-
- r = strrchr (p1, c);
-
- if (r == NULL)
- return const0_rtx;
-
- /* Return an offset into the constant string argument. */
- tmp = fold (build2 (PLUS_EXPR, TREE_TYPE (s1), s1,
- fold_convert (TREE_TYPE (s1),
- ssize_int (r - p1))));
- return expand_expr (tmp, target, mode, EXPAND_NORMAL);
- }
-
- if (! integer_zerop (s2))
- return 0;
-
- fn = implicit_built_in_decls[BUILT_IN_STRCHR];
- if (!fn)
- return 0;
-
- /* Transform strrchr(s1, '\0') to strchr(s1, '\0'). */
- return expand_expr (build_function_call_expr (fn, arglist),
- target, mode, EXPAND_NORMAL);
+ tree result = fold_builtin_strrchr (arglist);
+ if (result)
+ return expand_expr (result, target, mode, EXPAND_NORMAL);
}
+ return 0;
}
/* Expand a call to the strpbrk builtin. Return 0 if we failed the
@@ -2615,57 +2513,13 @@ expand_builtin_strrchr (tree arglist, rtx target, enum machine_mode mode)
static rtx
expand_builtin_strpbrk (tree arglist, rtx target, enum machine_mode mode)
{
- if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
- return 0;
- else
+ if (validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
{
- tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
- tree fn, tmp;
- const char *p1, *p2;
-
- p2 = c_getstr (s2);
- if (p2 == NULL)
- return 0;
-
- p1 = c_getstr (s1);
- if (p1 != NULL)
- {
- const char *r = strpbrk (p1, p2);
-
- if (r == NULL)
- return const0_rtx;
-
- /* Return an offset into the constant string argument. */
- tmp = fold (build2 (PLUS_EXPR, TREE_TYPE (s1), s1,
- fold_convert (TREE_TYPE (s1),
- ssize_int (r - p1))));
- return expand_expr (tmp, target, mode, EXPAND_NORMAL);
- }
-
- if (p2[0] == '\0')
- {
- /* strpbrk(x, "") == NULL.
- Evaluate and ignore the arguments in case they had
- side-effects. */
- expand_expr (s1, const0_rtx, VOIDmode, EXPAND_NORMAL);
- return const0_rtx;
- }
-
- if (p2[1] != '\0')
- return 0; /* Really call strpbrk. */
-
- fn = implicit_built_in_decls[BUILT_IN_STRCHR];
- if (!fn)
- return 0;
-
- /* New argument list transforming strpbrk(s1, s2) to
- strchr(s1, s2[0]). */
- arglist = build_tree_list (NULL_TREE,
- build_int_cst (NULL_TREE, p2[0]));
- arglist = tree_cons (NULL_TREE, s1, arglist);
- return expand_expr (build_function_call_expr (fn, arglist),
- target, mode, EXPAND_NORMAL);
+ tree result = fold_builtin_strpbrk (arglist);
+ if (result)
+ return expand_expr (result, target, mode, EXPAND_NORMAL);
}
+ return 0;
}
/* Callback routine for store_by_pieces. Read GET_MODE_BITSIZE (MODE)
@@ -3045,8 +2899,10 @@ expand_movstr (tree dest, tree src, rtx target, int endp)
terminator. If the caller requested a mempcpy-like return value,
adjust it. */
if (endp == 1 && target != const0_rtx)
- emit_move_insn (target, plus_constant (gen_lowpart (GET_MODE (target),
- end), 1));
+ {
+ rtx tem = plus_constant (gen_lowpart (GET_MODE (target), end), 1);
+ emit_move_insn (target, force_operand (tem, NULL_RTX));
+ }
return target;
}
@@ -3156,9 +3012,8 @@ expand_builtin_stpcpy (tree arglist, rtx target, enum machine_mode mode)
if (GET_MODE (target) != GET_MODE (ret))
ret = gen_lowpart (GET_MODE (target), ret);
- ret = emit_move_insn (target,
- plus_constant (ret,
- INTVAL (len_rtx)));
+ ret = plus_constant (ret, INTVAL (len_rtx));
+ ret = emit_move_insn (target, force_operand (ret, NULL_RTX));
gcc_assert (ret);
return target;
@@ -3982,46 +3837,14 @@ expand_builtin_strcat (tree arglist, rtx target, enum machine_mode mode)
static rtx
expand_builtin_strncat (tree arglist, rtx target, enum machine_mode mode)
{
- if (!validate_arglist (arglist,
- POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
- return 0;
- else
+ if (validate_arglist (arglist,
+ POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
{
- tree dst = TREE_VALUE (arglist),
- src = TREE_VALUE (TREE_CHAIN (arglist)),
- len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
- const char *p = c_getstr (src);
-
- /* If the requested length is zero, or the src parameter string
- length is zero, return the dst parameter. */
- if (integer_zerop (len) || (p && *p == '\0'))
- {
- /* Evaluate and ignore the src and len parameters in case
- they have side-effects. */
- expand_expr (src, const0_rtx, VOIDmode, EXPAND_NORMAL);
- expand_expr (len, const0_rtx, VOIDmode, EXPAND_NORMAL);
- return expand_expr (dst, target, mode, EXPAND_NORMAL);
- }
-
- /* If the requested len is greater than or equal to the string
- length, call strcat. */
- if (TREE_CODE (len) == INTEGER_CST && p
- && compare_tree_int (len, strlen (p)) >= 0)
- {
- tree newarglist
- = tree_cons (NULL_TREE, dst, build_tree_list (NULL_TREE, src));
- tree fn = implicit_built_in_decls[BUILT_IN_STRCAT];
-
- /* If the replacement _DECL isn't initialized, don't do the
- transformation. */
- if (!fn)
- return 0;
-
- return expand_expr (build_function_call_expr (fn, newarglist),
- target, mode, EXPAND_NORMAL);
- }
- return 0;
+ tree result = fold_builtin_strncat (arglist);
+ if (result)
+ return expand_expr (result, target, mode, EXPAND_NORMAL);
}
+ return 0;
}
/* Expand expression EXP, which is a call to the strspn builtin.
@@ -4031,31 +3854,13 @@ expand_builtin_strncat (tree arglist, rtx target, enum machine_mode mode)
static rtx
expand_builtin_strspn (tree arglist, rtx target, enum machine_mode mode)
{
- if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
- return 0;
- else
+ if (validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
{
- tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
- const char *p1 = c_getstr (s1), *p2 = c_getstr (s2);
-
- /* If both arguments are constants, evaluate at compile-time. */
- if (p1 && p2)
- {
- const size_t r = strspn (p1, p2);
- return expand_expr (size_int (r), target, mode, EXPAND_NORMAL);
- }
-
- /* If either argument is "", return 0. */
- if ((p1 && *p1 == '\0') || (p2 && *p2 == '\0'))
- {
- /* Evaluate and ignore both arguments in case either one has
- side-effects. */
- expand_expr (s1, const0_rtx, VOIDmode, EXPAND_NORMAL);
- expand_expr (s2, const0_rtx, VOIDmode, EXPAND_NORMAL);
- return const0_rtx;
- }
- return 0;
+ tree result = fold_builtin_strspn (arglist);
+ if (result)
+ return expand_expr (result, target, mode, EXPAND_NORMAL);
}
+ return 0;
}
/* Expand expression EXP, which is a call to the strcspn builtin.
@@ -4065,45 +3870,13 @@ expand_builtin_strspn (tree arglist, rtx target, enum machine_mode mode)
static rtx
expand_builtin_strcspn (tree arglist, rtx target, enum machine_mode mode)
{
- if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
- return 0;
- else
+ if (validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
{
- tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
- const char *p1 = c_getstr (s1), *p2 = c_getstr (s2);
-
- /* If both arguments are constants, evaluate at compile-time. */
- if (p1 && p2)
- {
- const size_t r = strcspn (p1, p2);
- return expand_expr (size_int (r), target, mode, EXPAND_NORMAL);
- }
-
- /* If the first argument is "", return 0. */
- if (p1 && *p1 == '\0')
- {
- /* Evaluate and ignore argument s2 in case it has
- side-effects. */
- expand_expr (s2, const0_rtx, VOIDmode, EXPAND_NORMAL);
- return const0_rtx;
- }
-
- /* If the second argument is "", return __builtin_strlen(s1). */
- if (p2 && *p2 == '\0')
- {
- tree newarglist = build_tree_list (NULL_TREE, s1),
- fn = implicit_built_in_decls[BUILT_IN_STRLEN];
-
- /* If the replacement _DECL isn't initialized, don't do the
- transformation. */
- if (!fn)
- return 0;
-
- return expand_expr (build_function_call_expr (fn, newarglist),
- target, mode, EXPAND_NORMAL);
- }
- return 0;
+ tree result = fold_builtin_strcspn (arglist);
+ if (result)
+ return expand_expr (result, target, mode, EXPAND_NORMAL);
}
+ return 0;
}
/* Expand a call to __builtin_saveregs, generating the result in TARGET,
@@ -4678,78 +4451,15 @@ expand_builtin_unop (enum machine_mode target_mode, tree arglist, rtx target,
static rtx
expand_builtin_fputs (tree arglist, rtx target, bool unlocked)
{
- tree len, fn;
- tree fn_fputc = unlocked ? implicit_built_in_decls[BUILT_IN_FPUTC_UNLOCKED]
- : implicit_built_in_decls[BUILT_IN_FPUTC];
- tree fn_fwrite = unlocked ? implicit_built_in_decls[BUILT_IN_FWRITE_UNLOCKED]
- : implicit_built_in_decls[BUILT_IN_FWRITE];
-
- /* If the return value is used, or the replacement _DECL isn't
- initialized, don't do the transformation. */
- if (target != const0_rtx || !fn_fputc || !fn_fwrite)
- return 0;
-
/* Verify the arguments in the original call. */
- if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
- return 0;
-
- /* Get the length of the string passed to fputs. If the length
- can't be determined, punt. */
- if (!(len = c_strlen (TREE_VALUE (arglist), 1))
- || TREE_CODE (len) != INTEGER_CST)
- return 0;
-
- switch (compare_tree_int (len, 1))
+ if (validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
{
- case -1: /* length is 0, delete the call entirely . */
- {
- /* Evaluate and ignore the argument in case it has
- side-effects. */
- expand_expr (TREE_VALUE (TREE_CHAIN (arglist)), const0_rtx,
- VOIDmode, EXPAND_NORMAL);
- return const0_rtx;
- }
- case 0: /* length is 1, call fputc. */
- {
- const char *p = c_getstr (TREE_VALUE (arglist));
-
- if (p != NULL)
- {
- /* New argument list transforming fputs(string, stream) to
- fputc(string[0], stream). */
- arglist = build_tree_list (NULL_TREE,
- TREE_VALUE (TREE_CHAIN (arglist)));
- arglist = tree_cons (NULL_TREE,
- build_int_cst (NULL_TREE, p[0]),
- arglist);
- fn = fn_fputc;
- break;
- }
- }
- /* Fall through. */
- case 1: /* length is greater than 1, call fwrite. */
- {
- tree string_arg;
-
- /* If optimizing for size keep fputs. */
- if (optimize_size)
- return 0;
- string_arg = TREE_VALUE (arglist);
- /* New argument list transforming fputs(string, stream) to
- fwrite(string, 1, len, stream). */
- arglist = build_tree_list (NULL_TREE, TREE_VALUE (TREE_CHAIN (arglist)));
- arglist = tree_cons (NULL_TREE, len, arglist);
- arglist = tree_cons (NULL_TREE, size_one_node, arglist);
- arglist = tree_cons (NULL_TREE, string_arg, arglist);
- fn = fn_fwrite;
- break;
- }
- default:
- gcc_unreachable ();
+ tree result = fold_builtin_fputs (arglist, (target == const0_rtx),
+ unlocked, NULL_TREE);
+ if (result)
+ return expand_expr (result, target, VOIDmode, EXPAND_NORMAL);
}
-
- return expand_expr (build_function_call_expr (fn, arglist),
- const0_rtx, VOIDmode, EXPAND_NORMAL);
+ return 0;
}
/* Expand a call to __builtin_expect. We return our argument and emit a
@@ -8728,9 +8438,6 @@ fold_builtin_strchr (tree arglist)
return fold (build2 (PLUS_EXPR, TREE_TYPE (s1),
s1, build_int_cst (TREE_TYPE (s1), r - p1)));
}
-
- /* FIXME: Should use here strchrM optab so that ports can optimize
- this. */
return 0;
}
}
diff --git a/gcc/builtins.def b/gcc/builtins.def
index 1bdc8aa79ee..9fc347f7369 100644
--- a/gcc/builtins.def
+++ b/gcc/builtins.def
@@ -470,19 +470,19 @@ DEF_LIB_BUILTIN (BUILT_IN_STRSTR, "strstr", BT_FN_STRING_CONST_STRING_CON
/* Category: stdio builtins. */
DEF_LIB_BUILTIN (BUILT_IN_FPRINTF, "fprintf", BT_FN_INT_FILEPTR_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_2_3)
DEF_EXT_LIB_BUILTIN (BUILT_IN_FPRINTF_UNLOCKED, "fprintf_unlocked", BT_FN_INT_FILEPTR_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_2_3)
-DEF_LIB_BUILTIN (BUILT_IN_FPUTC, "fputc", BT_FN_INT_INT_FILEPTR, ATTR_NOTHROW_NONNULL_2)
-DEF_EXT_LIB_BUILTIN (BUILT_IN_FPUTC_UNLOCKED, "fputc_unlocked", BT_FN_INT_INT_FILEPTR, ATTR_NOTHROW_NONNULL_2)
-DEF_LIB_BUILTIN (BUILT_IN_FPUTS, "fputs", BT_FN_INT_CONST_STRING_FILEPTR, ATTR_NOTHROW_NONNULL_1_2)
-DEF_EXT_LIB_BUILTIN (BUILT_IN_FPUTS_UNLOCKED, "fputs_unlocked", BT_FN_INT_CONST_STRING_FILEPTR, ATTR_NOTHROW_NONNULL_1_2)
+DEF_LIB_BUILTIN (BUILT_IN_FPUTC, "fputc", BT_FN_INT_INT_FILEPTR, ATTR_NONNULL_2)
+DEF_EXT_LIB_BUILTIN (BUILT_IN_FPUTC_UNLOCKED, "fputc_unlocked", BT_FN_INT_INT_FILEPTR, ATTR_NONNULL_2)
+DEF_LIB_BUILTIN (BUILT_IN_FPUTS, "fputs", BT_FN_INT_CONST_STRING_FILEPTR, ATTR_NONNULL_1_2)
+DEF_EXT_LIB_BUILTIN (BUILT_IN_FPUTS_UNLOCKED, "fputs_unlocked", BT_FN_INT_CONST_STRING_FILEPTR, ATTR_NONNULL_1_2)
DEF_LIB_BUILTIN (BUILT_IN_FSCANF, "fscanf", BT_FN_INT_FILEPTR_CONST_STRING_VAR, ATTR_FORMAT_SCANF_2_3)
-DEF_LIB_BUILTIN (BUILT_IN_FWRITE, "fwrite", BT_FN_SIZE_CONST_PTR_SIZE_SIZE_FILEPTR, ATTR_NOTHROW_NONNULL_1_4)
-DEF_EXT_LIB_BUILTIN (BUILT_IN_FWRITE_UNLOCKED, "fwrite_unlocked", BT_FN_SIZE_CONST_PTR_SIZE_SIZE_FILEPTR, ATTR_NOTHROW_NONNULL_1_4)
+DEF_LIB_BUILTIN (BUILT_IN_FWRITE, "fwrite", BT_FN_SIZE_CONST_PTR_SIZE_SIZE_FILEPTR, ATTR_NONNULL_1_4)
+DEF_EXT_LIB_BUILTIN (BUILT_IN_FWRITE_UNLOCKED, "fwrite_unlocked", BT_FN_SIZE_CONST_PTR_SIZE_SIZE_FILEPTR, ATTR_NONNULL_1_4)
DEF_LIB_BUILTIN (BUILT_IN_PRINTF, "printf", BT_FN_INT_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_1_2)
DEF_EXT_LIB_BUILTIN (BUILT_IN_PRINTF_UNLOCKED, "printf_unlocked", BT_FN_INT_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_1_2)
-DEF_LIB_BUILTIN (BUILT_IN_PUTCHAR, "putchar", BT_FN_INT_INT, ATTR_NOTHROW_LIST)
-DEF_EXT_LIB_BUILTIN (BUILT_IN_PUTCHAR_UNLOCKED, "putchar_unlocked", BT_FN_INT_INT, ATTR_NOTHROW_LIST)
-DEF_LIB_BUILTIN (BUILT_IN_PUTS, "puts", BT_FN_INT_CONST_STRING, ATTR_NOTHROW_NONNULL_1)
-DEF_EXT_LIB_BUILTIN (BUILT_IN_PUTS_UNLOCKED, "puts_unlocked", BT_FN_INT_CONST_STRING, ATTR_NOTHROW_NONNULL_1)
+DEF_LIB_BUILTIN (BUILT_IN_PUTCHAR, "putchar", BT_FN_INT_INT, ATTR_NULL)
+DEF_EXT_LIB_BUILTIN (BUILT_IN_PUTCHAR_UNLOCKED, "putchar_unlocked", BT_FN_INT_INT, ATTR_NULL)
+DEF_LIB_BUILTIN (BUILT_IN_PUTS, "puts", BT_FN_INT_CONST_STRING, ATTR_NONNULL_1)
+DEF_EXT_LIB_BUILTIN (BUILT_IN_PUTS_UNLOCKED, "puts_unlocked", BT_FN_INT_CONST_STRING, ATTR_NONNULL_1)
DEF_LIB_BUILTIN (BUILT_IN_SCANF, "scanf", BT_FN_INT_CONST_STRING_VAR, ATTR_FORMAT_SCANF_1_2)
DEF_C99_BUILTIN (BUILT_IN_SNPRINTF, "snprintf", BT_FN_INT_STRING_SIZE_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_3_4)
DEF_LIB_BUILTIN (BUILT_IN_SPRINTF, "sprintf", BT_FN_INT_STRING_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_2_3)
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 3a2f5763b13..7502a07195b 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -1549,7 +1549,7 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
= composite_type (newtype, oldtype);
/* Lay the type out, unless already done. */
- if (oldtype != TREE_TYPE (newdecl))
+ if (!comptypes (oldtype, TREE_TYPE (newdecl)))
{
if (TREE_TYPE (newdecl) != error_mark_node)
layout_type (TREE_TYPE (newdecl));
@@ -1586,6 +1586,10 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
make_var_volatile (newdecl);
}
+ /* Merge deprecatedness. */
+ if (TREE_DEPRECATED (newdecl))
+ TREE_DEPRECATED (olddecl) = 1;
+
/* Keep source location of definition rather than declaration. */
if (DECL_INITIAL (newdecl) == 0 && DECL_INITIAL (olddecl) != 0)
DECL_SOURCE_LOCATION (newdecl) = DECL_SOURCE_LOCATION (olddecl);
@@ -2986,6 +2990,15 @@ start_decl (struct c_declarator *declarator, struct c_declspecs *declspecs,
error ("elements of array %qD have incomplete type", decl);
initialized = 0;
}
+ else if (C_DECL_VARIABLE_SIZE (decl))
+ {
+ /* Although C99 is unclear about whether incomplete arrays
+ of VLAs themselves count as VLAs, it does not make
+ sense to permit them to be initialized given that
+ ordinary VLAs may not be initialized. */
+ error ("variable-sized object may not be initialized");
+ initialized = 0;
+ }
}
if (initialized)
@@ -3416,9 +3429,14 @@ build_compound_literal (tree type, tree init)
/* We do not use start_decl here because we have a type, not a declarator;
and do not use finish_decl because the decl should be stored inside
the COMPOUND_LITERAL_EXPR rather than added elsewhere as a DECL_EXPR. */
- tree decl = build_decl (VAR_DECL, NULL_TREE, type);
+ tree decl;
tree complit;
tree stmt;
+
+ if (type == error_mark_node)
+ return error_mark_node;
+
+ decl = build_decl (VAR_DECL, NULL_TREE, type);
DECL_EXTERNAL (decl) = 0;
TREE_PUBLIC (decl) = 0;
TREE_STATIC (decl) = (current_scope == file_scope);
@@ -6306,7 +6324,7 @@ c_expand_body (tree fndecl)
|| DECL_INITIAL (fndecl) == error_mark_node)
return;
- tree_rest_of_compilation (fndecl, false);
+ tree_rest_of_compilation (fndecl);
if (DECL_STATIC_CONSTRUCTOR (fndecl)
&& targetm.have_ctors_dtors)
diff --git a/gcc/c-parse.in b/gcc/c-parse.in
index 6fcf66739f5..87dfc100748 100644
--- a/gcc/c-parse.in
+++ b/gcc/c-parse.in
@@ -677,6 +677,11 @@ primary:
| '(' typename ')' '{'
{ start_init (NULL_TREE, NULL, 0);
$<ttype>$ = groktypename ($2);
+ if (C_TYPE_VARIABLE_SIZE ($<ttype>$))
+ {
+ error ("compound literal has variable size");
+ $<ttype>$ = error_mark_node;
+ }
really_start_incremental_init ($<ttype>$); }
initlist_maybe_comma '}' %prec UNARY
{ struct c_expr init = pop_init_level (0);
diff --git a/gcc/c-tree.h b/gcc/c-tree.h
index 76981a7ea7c..f6e195fa101 100644
--- a/gcc/c-tree.h
+++ b/gcc/c-tree.h
@@ -428,7 +428,6 @@ extern struct c_expr c_expr_sizeof_expr (struct c_expr);
extern struct c_expr c_expr_sizeof_type (struct c_type_name *);
extern struct c_expr parser_build_binary_op (enum tree_code, struct c_expr,
struct c_expr);
-extern void readonly_error (tree, const char *);
extern tree build_conditional_expr (tree, tree, tree);
extern tree build_compound_expr (tree, tree);
extern tree c_cast_expr (struct c_type_name *, tree);
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index 7d36e7bdde1..70d39389fa8 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -44,6 +44,17 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "tree-iterator.h"
#include "tree-gimple.h"
+/* Places where an lvalue, or modifiable lvalue, may be required.
+ Used to select diagnostic messages in lvalue_or_else and
+ readonly_error. */
+enum lvalue_use {
+ lv_assign,
+ lv_increment,
+ lv_decrement,
+ lv_addressof,
+ lv_asm
+};
+
/* The level of nesting inside "__alignof__". */
int in_alignof;
@@ -89,7 +100,8 @@ static void add_pending_init (tree, tree);
static void set_nonincremental_init (void);
static void set_nonincremental_init_from_string (tree);
static tree find_init_member (tree);
-static int lvalue_or_else (tree, const char *);
+static int lvalue_or_else (tree, enum lvalue_use);
+static void readonly_error (tree, enum lvalue_use);
/* Do `exp = require_complete_type (exp);' to make sure exp
does not have an incomplete type. (That includes void types.) */
@@ -1466,8 +1478,7 @@ build_component_ref (tree datum, tree component)
if (!field)
{
- error ("%s has no member named %qs",
- code == RECORD_TYPE ? "structure" : "union",
+ error ("%qT has no member named %qs", type,
IDENTIFIER_POINTER (component));
return error_mark_node;
}
@@ -2546,8 +2557,8 @@ build_unary_op (enum tree_code code, tree xarg, int flag)
/* Complain about anything else that is not a true lvalue. */
if (!lvalue_or_else (arg, ((code == PREINCREMENT_EXPR
|| code == POSTINCREMENT_EXPR)
- ? "invalid lvalue in increment"
- : "invalid lvalue in decrement")))
+ ? lv_increment
+ : lv_decrement)))
return error_mark_node;
/* Report a read-only lvalue. */
@@ -2555,7 +2566,7 @@ build_unary_op (enum tree_code code, tree xarg, int flag)
readonly_error (arg,
((code == PREINCREMENT_EXPR
|| code == POSTINCREMENT_EXPR)
- ? "increment" : "decrement"));
+ ? lv_increment : lv_decrement));
if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
val = boolean_increment (code, arg);
@@ -2592,7 +2603,7 @@ build_unary_op (enum tree_code code, tree xarg, int flag)
/* Anything not already handled and not a true memory reference
or a non-lvalue array is an error. */
else if (typecode != FUNCTION_TYPE && !flag
- && !lvalue_or_else (arg, "invalid lvalue in unary %<&%>"))
+ && !lvalue_or_else (arg, lv_addressof))
return error_mark_node;
/* Ordinary case; arg is a COMPONENT_REF or a decl. */
@@ -2683,38 +2694,73 @@ lvalue_p (tree ref)
}
/* Return nonzero if REF is an lvalue valid for this language;
- otherwise, print an error message and return zero. */
+ otherwise, print an error message and return zero. USE says
+ how the lvalue is being used and so selects the error message. */
static int
-lvalue_or_else (tree ref, const char *msgid)
+lvalue_or_else (tree ref, enum lvalue_use use)
{
int win = lvalue_p (ref);
- if (! win)
- error ("%s", msgid);
+ if (!win)
+ {
+ switch (use)
+ {
+ case lv_assign:
+ error ("invalid lvalue in assignment");
+ break;
+ case lv_increment:
+ error ("invalid lvalue in increment");
+ break;
+ case lv_decrement:
+ error ("invalid lvalue in decrement");
+ break;
+ case lv_addressof:
+ error ("invalid lvalue in unary %<&%>");
+ break;
+ case lv_asm:
+ error ("invalid lvalue in asm statement");
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ }
return win;
}
-/* Warn about storing in something that is `const'. */
+/* Give an error for storing in something that is 'const'. */
-void
-readonly_error (tree arg, const char *msgid)
+static void
+readonly_error (tree arg, enum lvalue_use use)
{
+ gcc_assert (use == lv_assign || use == lv_increment || use == lv_decrement);
+ /* Using this macro rather than (for example) arrays of messages
+ ensures that all the format strings are checked at compile
+ time. */
+#define READONLY_MSG(A, I, D) (use == lv_assign \
+ ? (A) \
+ : (use == lv_increment ? (I) : (D)))
if (TREE_CODE (arg) == COMPONENT_REF)
{
if (TYPE_READONLY (TREE_TYPE (TREE_OPERAND (arg, 0))))
- readonly_error (TREE_OPERAND (arg, 0), msgid);
+ readonly_error (TREE_OPERAND (arg, 0), use);
else
- error ("%s of read-only member %qs", _(msgid),
+ error (READONLY_MSG (N_("assignment of read-only member %qs"),
+ N_("increment of read-only member %qs"),
+ N_("decrement of read-only member %qs")),
IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (arg, 1))));
}
else if (TREE_CODE (arg) == VAR_DECL)
- error ("%s of read-only variable %qs", _(msgid),
+ error (READONLY_MSG (N_("assignment of read-only variable %qs"),
+ N_("increment of read-only variable %qs"),
+ N_("decrement of read-only variable %qs")),
IDENTIFIER_POINTER (DECL_NAME (arg)));
else
- error ("%s of read-only location", _(msgid));
+ error (READONLY_MSG (N_("assignment of read-only location"),
+ N_("increment of read-only location"),
+ N_("decrement of read-only location")));
}
/* Mark EXP saying that we need to be able to take the
@@ -3282,16 +3328,16 @@ build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
newrhs = build_binary_op (modifycode, lhs, rhs, 1);
}
- if (!lvalue_or_else (lhs, "invalid lvalue in assignment"))
+ if (!lvalue_or_else (lhs, lv_assign))
return error_mark_node;
- /* Warn about storing in something that is `const'. */
+ /* Give an error for storing in something that is 'const'. */
if (TREE_READONLY (lhs) || TYPE_READONLY (lhstype)
|| ((TREE_CODE (lhstype) == RECORD_TYPE
|| TREE_CODE (lhstype) == UNION_TYPE)
&& C_TYPE_FIELDS_READONLY (lhstype)))
- readonly_error (lhs, "assignment");
+ readonly_error (lhs, lv_assign);
/* If storing into a structure or union member,
it has probably been given type `int'.
@@ -6248,7 +6294,7 @@ build_asm_expr (tree string, tree outputs, tree inputs, tree clobbers,
tree output = TREE_VALUE (tail);
STRIP_NOPS (output);
TREE_VALUE (tail) = output;
- lvalue_or_else (output, "invalid lvalue in asm statement");
+ lvalue_or_else (output, lv_asm);
constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tail)));
diff --git a/gcc/cfg.c b/gcc/cfg.c
index c8f1de51ae4..0669bed74c5 100644
--- a/gcc/cfg.c
+++ b/gcc/cfg.c
@@ -144,34 +144,20 @@ clear_edges (void)
{
basic_block bb;
edge e;
+ edge_iterator ei;
FOR_EACH_BB (bb)
{
- edge e = bb->succ;
-
- while (e)
- {
- edge next = e->succ_next;
-
- free_edge (e);
- e = next;
- }
-
- bb->succ = NULL;
- bb->pred = NULL;
- }
-
- e = ENTRY_BLOCK_PTR->succ;
- while (e)
- {
- edge next = e->succ_next;
-
- free_edge (e);
- e = next;
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ free_edge (e);
+ VEC_truncate (edge, bb->succs, 0);
+ VEC_truncate (edge, bb->preds, 0);
}
- EXIT_BLOCK_PTR->pred = NULL;
- ENTRY_BLOCK_PTR->succ = NULL;
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
+ free_edge (e);
+ VEC_truncate (edge, EXIT_BLOCK_PTR->preds, 0);
+ VEC_truncate (edge, ENTRY_BLOCK_PTR->succs, 0);
gcc_assert (!n_edges);
}
@@ -284,15 +270,13 @@ unchecked_make_edge (basic_block src, basic_block dst, int flags)
e = ggc_alloc_cleared (sizeof (*e));
n_edges++;
- e->succ_next = src->succ;
- e->pred_next = dst->pred;
+ VEC_safe_insert (edge, src->succs, 0, e);
+ VEC_safe_insert (edge, dst->preds, 0, e);
+
e->src = src;
e->dest = dst;
e->flags = flags;
- src->succ = e;
- dst->pred = e;
-
return e;
}
@@ -304,6 +288,7 @@ cached_make_edge (sbitmap *edge_cache, basic_block src, basic_block dst, int fla
{
int use_edge_cache;
edge e;
+ edge_iterator ei;
/* Don't bother with edge cache for ENTRY or EXIT, if there aren't that
many edges to them, or we didn't allocate memory for it. */
@@ -324,7 +309,7 @@ cached_make_edge (sbitmap *edge_cache, basic_block src, basic_block dst, int fla
/* Fall through. */
case 0:
- for (e = src->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, src->succs)
if (e->dest == dst)
{
e->flags |= flags;
@@ -368,30 +353,42 @@ make_single_succ_edge (basic_block src, basic_block dest, int flags)
void
remove_edge (edge e)
{
- edge last_pred = NULL;
- edge last_succ = NULL;
edge tmp;
basic_block src, dest;
+ bool found = false;
+ edge_iterator ei;
src = e->src;
dest = e->dest;
- for (tmp = src->succ; tmp && tmp != e; tmp = tmp->succ_next)
- last_succ = tmp;
- gcc_assert (tmp);
- if (last_succ)
- last_succ->succ_next = e->succ_next;
- else
- src->succ = e->succ_next;
+ for (ei = ei_start (src->succs); (tmp = ei_safe_edge (ei)); )
+ {
+ if (tmp == e)
+ {
+ VEC_ordered_remove (edge, src->succs, ei.index);
+ found = true;
+ break;
+ }
+ else
+ ei_next (&ei);
+ }
- for (tmp = dest->pred; tmp && tmp != e; tmp = tmp->pred_next)
- last_pred = tmp;
+ gcc_assert (found);
- gcc_assert (tmp);
- if (last_pred)
- last_pred->pred_next = e->pred_next;
- else
- dest->pred = e->pred_next;
+ found = false;
+ for (ei = ei_start (dest->preds); (tmp = ei_safe_edge (ei)); )
+ {
+ if (tmp == e)
+ {
+ VEC_ordered_remove (edge, dest->preds, ei.index);
+ found = true;
+ break;
+ }
+ else
+ ei_next (&ei);
+ }
+
+ gcc_assert (found);
free_edge (e);
}
@@ -401,16 +398,27 @@ remove_edge (edge e)
void
redirect_edge_succ (edge e, basic_block new_succ)
{
- edge *pe;
+ edge tmp;
+ edge_iterator ei;
+ bool found = false;
/* Disconnect the edge from the old successor block. */
- for (pe = &e->dest->pred; *pe != e; pe = &(*pe)->pred_next)
- continue;
- *pe = (*pe)->pred_next;
+ for (ei = ei_start (e->dest->preds); (tmp = ei_safe_edge (ei)); )
+ {
+ if (tmp == e)
+ {
+ VEC_ordered_remove (edge, e->dest->preds, ei.index);
+ found = true;
+ break;
+ }
+ else
+ ei_next (&ei);
+ }
+
+ gcc_assert (found);
/* Reconnect the edge to the new successor block. */
- e->pred_next = new_succ->pred;
- new_succ->pred = e;
+ VEC_safe_insert (edge, new_succ->preds, 0, e);
e->dest = new_succ;
}
@@ -420,9 +428,10 @@ edge
redirect_edge_succ_nodup (edge e, basic_block new_succ)
{
edge s;
+ edge_iterator ei;
/* Check whether the edge is already present. */
- for (s = e->src->succ; s; s = s->succ_next)
+ FOR_EACH_EDGE (s, ei, e->src->succs)
if (s->dest == new_succ && s != e)
break;
@@ -447,17 +456,27 @@ redirect_edge_succ_nodup (edge e, basic_block new_succ)
void
redirect_edge_pred (edge e, basic_block new_pred)
{
- edge *pe;
+ edge tmp;
+ edge_iterator ei;
+ bool found = false;
/* Disconnect the edge from the old predecessor block. */
- for (pe = &e->src->succ; *pe != e; pe = &(*pe)->succ_next)
- continue;
+ for (ei = ei_start (e->src->succs); (tmp = ei_safe_edge (ei)); )
+ {
+ if (tmp == e)
+ {
+ VEC_ordered_remove (edge, e->src->succs, ei.index);
+ found = true;
+ break;
+ }
+ else
+ ei_next (&ei);
+ }
- *pe = (*pe)->succ_next;
+ gcc_assert (found);
/* Reconnect the edge to the new predecessor block. */
- e->succ_next = new_pred->succ;
- new_pred->succ = e;
+ VEC_safe_insert (edge, new_pred->succs, 0, e);
e->src = new_pred;
}
@@ -482,35 +501,37 @@ check_bb_profile (basic_block bb, FILE * file)
edge e;
int sum = 0;
gcov_type lsum;
+ edge_iterator ei;
if (profile_status == PROFILE_ABSENT)
return;
if (bb != EXIT_BLOCK_PTR)
{
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
sum += e->probability;
- if (bb->succ && abs (sum - REG_BR_PROB_BASE) > 100)
+ if (EDGE_COUNT (bb->succs) && abs (sum - REG_BR_PROB_BASE) > 100)
fprintf (file, "Invalid sum of outgoing probabilities %.1f%%\n",
sum * 100.0 / REG_BR_PROB_BASE);
lsum = 0;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
lsum += e->count;
- if (bb->succ && (lsum - bb->count > 100 || lsum - bb->count < -100))
+ if (EDGE_COUNT (bb->succs)
+ && (lsum - bb->count > 100 || lsum - bb->count < -100))
fprintf (file, "Invalid sum of outgoing counts %i, should be %i\n",
(int) lsum, (int) bb->count);
}
if (bb != ENTRY_BLOCK_PTR)
{
sum = 0;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
sum += EDGE_FREQUENCY (e);
if (abs (sum - bb->frequency) > 100)
fprintf (file,
"Invalid sum of incoming frequencies %i, should be %i\n",
sum, bb->frequency);
lsum = 0;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
lsum += e->count;
if (lsum - bb->count > 100 || lsum - bb->count < -100)
fprintf (file, "Invalid sum of incoming counts %i, should be %i\n",
@@ -577,6 +598,7 @@ dump_flow_info (FILE *file)
FOR_EACH_BB (bb)
{
edge e;
+ edge_iterator ei;
fprintf (file, "\nBasic block %d ", bb->index);
fprintf (file, "prev %d, next %d, ",
@@ -591,11 +613,11 @@ dump_flow_info (FILE *file)
fprintf (file, ".\n");
fprintf (file, "Predecessors: ");
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
dump_edge_info (file, e, 0);
fprintf (file, "\nSuccessors: ");
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
dump_edge_info (file, e, 1);
fprintf (file, "\nRegisters live at start:");
@@ -788,8 +810,9 @@ alloc_aux_for_edges (int size)
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
{
edge e;
+ edge_iterator ei;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
alloc_aux_for_edge (e, size);
}
}
@@ -805,7 +828,8 @@ clear_aux_for_edges (void)
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
{
- for (e = bb->succ; e; e = e->succ_next)
+ edge_iterator ei;
+ FOR_EACH_EDGE (e, ei, bb->succs)
e->aux = NULL;
}
}
@@ -843,6 +867,7 @@ static void
dump_cfg_bb_info (FILE *file, basic_block bb)
{
unsigned i;
+ edge_iterator ei;
bool first = true;
static const char * const bb_bitnames[] =
{
@@ -867,11 +892,11 @@ dump_cfg_bb_info (FILE *file, basic_block bb)
fprintf (file, "\n");
fprintf (file, "Predecessors: ");
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
dump_edge_info (file, e, 0);
fprintf (file, "\nSuccessors: ");
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
dump_edge_info (file, e, 1);
fprintf (file, "\n\n");
}
@@ -902,6 +927,7 @@ update_bb_profile_for_threading (basic_block bb, int edge_frequency,
{
edge c;
int prob;
+ edge_iterator ei;
bb->count -= count;
if (bb->count < 0)
@@ -935,12 +961,14 @@ update_bb_profile_for_threading (basic_block bb, int edge_frequency,
fprintf (dump_file, "Edge frequencies of bb %i has been reset, "
"frequency of block should end up being 0, it is %i\n",
bb->index, bb->frequency);
- bb->succ->probability = REG_BR_PROB_BASE;
- for (c = bb->succ->succ_next; c; c = c->succ_next)
+ EDGE_SUCC (bb, 0)->probability = REG_BR_PROB_BASE;
+ ei = ei_start (bb->succs);
+ ei_next (&ei);
+ for (; (c = ei_safe_edge (ei)); ei_next (&ei))
c->probability = 0;
}
else
- for (c = bb->succ; c; c = c->succ_next)
+ FOR_EACH_EDGE (c, ei, bb->succs)
c->probability = ((c->probability * REG_BR_PROB_BASE) / (double) prob);
if (bb != taken_edge->src)
diff --git a/gcc/cfganal.c b/gcc/cfganal.c
index 01f5f7d04b6..30aa5c40db3 100644
--- a/gcc/cfganal.c
+++ b/gcc/cfganal.c
@@ -85,7 +85,7 @@ forwarder_block_p (basic_block bb)
rtx insn;
if (bb == EXIT_BLOCK_PTR || bb == ENTRY_BLOCK_PTR
- || !bb->succ || bb->succ->succ_next)
+ || EDGE_COUNT (bb->succs) != 1)
return false;
for (insn = BB_HEAD (bb); insn != BB_END (bb); insn = NEXT_INSN (insn))
@@ -105,15 +105,16 @@ can_fallthru (basic_block src, basic_block target)
rtx insn = BB_END (src);
rtx insn2;
edge e;
+ edge_iterator ei;
if (target == EXIT_BLOCK_PTR)
return true;
if (src->next_bb != target)
return 0;
- for (e = src->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, src->succs)
if (e->dest == EXIT_BLOCK_PTR
&& e->flags & EDGE_FALLTHRU)
- return 0;
+ return 0;
insn2 = BB_HEAD (target);
if (insn2 && !active_insn_p (insn2))
@@ -130,13 +131,14 @@ bool
could_fall_through (basic_block src, basic_block target)
{
edge e;
+ edge_iterator ei;
if (target == EXIT_BLOCK_PTR)
return true;
- for (e = src->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, src->succs)
if (e->dest == EXIT_BLOCK_PTR
&& e->flags & EDGE_FALLTHRU)
- return 0;
+ return 0;
return true;
}
@@ -153,7 +155,7 @@ could_fall_through (basic_block src, basic_block target)
bool
mark_dfs_back_edges (void)
{
- edge *stack;
+ edge_iterator *stack;
int *pre;
int *post;
int sp;
@@ -167,7 +169,7 @@ mark_dfs_back_edges (void)
post = xcalloc (last_basic_block, sizeof (int));
/* Allocate stack for back-tracking up CFG. */
- stack = xmalloc ((n_basic_blocks + 1) * sizeof (edge));
+ stack = xmalloc ((n_basic_blocks + 1) * sizeof (edge_iterator));
sp = 0;
/* Allocate bitmap to track nodes that have been visited. */
@@ -177,19 +179,19 @@ mark_dfs_back_edges (void)
sbitmap_zero (visited);
/* Push the first edge on to the stack. */
- stack[sp++] = ENTRY_BLOCK_PTR->succ;
+ stack[sp++] = ei_start (ENTRY_BLOCK_PTR->succs);
while (sp)
{
- edge e;
+ edge_iterator ei;
basic_block src;
basic_block dest;
/* Look at the edge on the top of the stack. */
- e = stack[sp - 1];
- src = e->src;
- dest = e->dest;
- e->flags &= ~EDGE_DFS_BACK;
+ ei = stack[sp - 1];
+ src = ei_edge (ei)->src;
+ dest = ei_edge (ei)->dest;
+ ei_edge (ei)->flags &= ~EDGE_DFS_BACK;
/* Check if the edge destination has been visited yet. */
if (dest != EXIT_BLOCK_PTR && ! TEST_BIT (visited, dest->index))
@@ -198,11 +200,11 @@ mark_dfs_back_edges (void)
SET_BIT (visited, dest->index);
pre[dest->index] = prenum++;
- if (dest->succ)
+ if (EDGE_COUNT (dest->succs) > 0)
{
/* Since the DEST node has been visited for the first
time, check its successors. */
- stack[sp++] = dest->succ;
+ stack[sp++] = ei_start (dest->succs);
}
else
post[dest->index] = postnum++;
@@ -212,13 +214,13 @@ mark_dfs_back_edges (void)
if (dest != EXIT_BLOCK_PTR && src != ENTRY_BLOCK_PTR
&& pre[src->index] >= pre[dest->index]
&& post[dest->index] == 0)
- e->flags |= EDGE_DFS_BACK, found = true;
+ ei_edge (ei)->flags |= EDGE_DFS_BACK, found = true;
- if (! e->succ_next && src != ENTRY_BLOCK_PTR)
+ if (ei_one_before_end_p (ei) && src != ENTRY_BLOCK_PTR)
post[src->index] = postnum++;
- if (e->succ_next)
- stack[sp - 1] = e->succ_next;
+ if (!ei_one_before_end_p (ei))
+ ei_next (&stack[sp - 1]);
else
sp--;
}
@@ -242,8 +244,9 @@ set_edge_can_fallthru_flag (void)
FOR_EACH_BB (bb)
{
edge e;
+ edge_iterator ei;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
e->flags &= ~EDGE_CAN_FALLTHRU;
@@ -254,15 +257,15 @@ set_edge_can_fallthru_flag (void)
/* If the BB ends with an invertible condjump all (2) edges are
CAN_FALLTHRU edges. */
- if (!bb->succ || !bb->succ->succ_next || bb->succ->succ_next->succ_next)
+ if (EDGE_COUNT (bb->succs) != 2)
continue;
if (!any_condjump_p (BB_END (bb)))
continue;
if (!invert_jump (BB_END (bb), JUMP_LABEL (BB_END (bb)), 0))
continue;
invert_jump (BB_END (bb), JUMP_LABEL (BB_END (bb)), 0);
- bb->succ->flags |= EDGE_CAN_FALLTHRU;
- bb->succ->succ_next->flags |= EDGE_CAN_FALLTHRU;
+ EDGE_SUCC (bb, 0)->flags |= EDGE_CAN_FALLTHRU;
+ EDGE_SUCC (bb, 1)->flags |= EDGE_CAN_FALLTHRU;
}
}
@@ -274,6 +277,7 @@ void
find_unreachable_blocks (void)
{
edge e;
+ edge_iterator ei;
basic_block *tos, *worklist, bb;
tos = worklist = xmalloc (sizeof (basic_block) * n_basic_blocks);
@@ -287,7 +291,7 @@ find_unreachable_blocks (void)
be only one. It isn't inconceivable that we might one day directly
support Fortran alternate entry points. */
- for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
{
*tos++ = e->dest;
@@ -301,7 +305,7 @@ find_unreachable_blocks (void)
{
basic_block b = *--tos;
- for (e = b->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, b->succs)
if (!(e->dest->flags & BB_REACHABLE))
{
*tos++ = e->dest;
@@ -333,6 +337,7 @@ create_edge_list (void)
int num_edges;
int block_count;
basic_block bb;
+ edge_iterator ei;
block_count = n_basic_blocks + 2; /* Include the entry and exit blocks. */
@@ -342,8 +347,7 @@ create_edge_list (void)
edges on each basic block. */
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
{
- for (e = bb->succ; e; e = e->succ_next)
- num_edges++;
+ num_edges += EDGE_COUNT (bb->succs);
}
elist = xmalloc (sizeof (struct edge_list));
@@ -355,7 +359,7 @@ create_edge_list (void)
/* Follow successors of blocks, and register these edges. */
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
elist->index_to_edge[num_edges++] = e;
return elist;
@@ -408,10 +412,11 @@ verify_edge_list (FILE *f, struct edge_list *elist)
int pred, succ, index;
edge e;
basic_block bb, p, s;
+ edge_iterator ei;
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
{
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
pred = e->src->index;
succ = e->dest->index;
@@ -439,14 +444,14 @@ verify_edge_list (FILE *f, struct edge_list *elist)
{
int found_edge = 0;
- for (e = p->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, p->succs)
if (e->dest == s)
{
found_edge = 1;
break;
}
- for (e = s->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, s->preds)
if (e->src == p)
{
found_edge = 1;
@@ -471,8 +476,9 @@ edge
find_edge (basic_block pred, basic_block succ)
{
edge e;
+ edge_iterator ei;
- for (e = pred->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, pred->succs)
if (e->dest == succ)
return e;
@@ -537,14 +543,14 @@ static void
remove_fake_predecessors (basic_block bb)
{
edge e;
+ edge_iterator ei;
- for (e = bb->pred; e;)
+ for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
{
- edge tmp = e;
-
- e = e->pred_next;
- if ((tmp->flags & EDGE_FAKE) == EDGE_FAKE)
- remove_edge (tmp);
+ if ((e->flags & EDGE_FAKE) == EDGE_FAKE)
+ remove_edge (e);
+ else
+ ei_next (&ei);
}
}
@@ -580,7 +586,7 @@ add_noreturn_fake_exit_edges (void)
basic_block bb;
FOR_EACH_BB (bb)
- if (bb->succ == NULL)
+ if (EDGE_COUNT (bb->succs) == 0)
make_single_succ_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
}
@@ -626,13 +632,13 @@ connect_infinite_loops_to_exit (void)
void
flow_reverse_top_sort_order_compute (int *rts_order)
{
- edge *stack;
+ edge_iterator *stack;
int sp;
int postnum = 0;
sbitmap visited;
/* Allocate stack for back-tracking up CFG. */
- stack = xmalloc ((n_basic_blocks + 1) * sizeof (edge));
+ stack = xmalloc ((n_basic_blocks + 1) * sizeof (edge_iterator));
sp = 0;
/* Allocate bitmap to track nodes that have been visited. */
@@ -642,18 +648,18 @@ flow_reverse_top_sort_order_compute (int *rts_order)
sbitmap_zero (visited);
/* Push the first edge on to the stack. */
- stack[sp++] = ENTRY_BLOCK_PTR->succ;
+ stack[sp++] = ei_start (ENTRY_BLOCK_PTR->succs);
while (sp)
{
- edge e;
+ edge_iterator ei;
basic_block src;
basic_block dest;
/* Look at the edge on the top of the stack. */
- e = stack[sp - 1];
- src = e->src;
- dest = e->dest;
+ ei = stack[sp - 1];
+ src = ei_edge (ei)->src;
+ dest = ei_edge (ei)->dest;
/* Check if the edge destination has been visited yet. */
if (dest != EXIT_BLOCK_PTR && ! TEST_BIT (visited, dest->index))
@@ -661,20 +667,20 @@ flow_reverse_top_sort_order_compute (int *rts_order)
/* Mark that we have visited the destination. */
SET_BIT (visited, dest->index);
- if (dest->succ)
+ if (EDGE_COUNT (dest->succs) > 0)
/* Since the DEST node has been visited for the first
time, check its successors. */
- stack[sp++] = dest->succ;
+ stack[sp++] = ei_start (dest->succs);
else
rts_order[postnum++] = dest->index;
}
else
{
- if (! e->succ_next && src != ENTRY_BLOCK_PTR)
+ if (ei_one_before_end_p (ei) && src != ENTRY_BLOCK_PTR)
rts_order[postnum++] = src->index;
- if (e->succ_next)
- stack[sp - 1] = e->succ_next;
+ if (!ei_one_before_end_p (ei))
+ ei_next (&stack[sp - 1]);
else
sp--;
}
@@ -694,14 +700,14 @@ flow_reverse_top_sort_order_compute (int *rts_order)
int
flow_depth_first_order_compute (int *dfs_order, int *rc_order)
{
- edge *stack;
+ edge_iterator *stack;
int sp;
int dfsnum = 0;
int rcnum = n_basic_blocks - 1;
sbitmap visited;
/* Allocate stack for back-tracking up CFG. */
- stack = xmalloc ((n_basic_blocks + 1) * sizeof (edge));
+ stack = xmalloc ((n_basic_blocks + 1) * sizeof (edge_iterator));
sp = 0;
/* Allocate bitmap to track nodes that have been visited. */
@@ -711,18 +717,18 @@ flow_depth_first_order_compute (int *dfs_order, int *rc_order)
sbitmap_zero (visited);
/* Push the first edge on to the stack. */
- stack[sp++] = ENTRY_BLOCK_PTR->succ;
+ stack[sp++] = ei_start (ENTRY_BLOCK_PTR->succs);
while (sp)
{
- edge e;
+ edge_iterator ei;
basic_block src;
basic_block dest;
/* Look at the edge on the top of the stack. */
- e = stack[sp - 1];
- src = e->src;
- dest = e->dest;
+ ei = stack[sp - 1];
+ src = ei_edge (ei)->src;
+ dest = ei_edge (ei)->dest;
/* Check if the edge destination has been visited yet. */
if (dest != EXIT_BLOCK_PTR && ! TEST_BIT (visited, dest->index))
@@ -735,10 +741,10 @@ flow_depth_first_order_compute (int *dfs_order, int *rc_order)
dfsnum++;
- if (dest->succ)
+ if (EDGE_COUNT (dest->succs) > 0)
/* Since the DEST node has been visited for the first
time, check its successors. */
- stack[sp++] = dest->succ;
+ stack[sp++] = ei_start (dest->succs);
else if (rc_order)
/* There are no successors for the DEST node so assign
its reverse completion number. */
@@ -746,14 +752,14 @@ flow_depth_first_order_compute (int *dfs_order, int *rc_order)
}
else
{
- if (! e->succ_next && src != ENTRY_BLOCK_PTR
+ if (ei_one_before_end_p (ei) && src != ENTRY_BLOCK_PTR
&& rc_order)
/* There are no more successors for the SRC node
so assign its reverse completion number. */
rc_order[rcnum--] = src->index;
- if (e->succ_next)
- stack[sp - 1] = e->succ_next;
+ if (!ei_one_before_end_p (ei))
+ ei_next (&stack[sp - 1]);
else
sp--;
}
@@ -789,8 +795,7 @@ struct dfst_node
void
flow_preorder_transversal_compute (int *pot_order)
{
- edge e;
- edge *stack;
+ edge_iterator *stack, ei;
int i;
int max_successors;
int sp;
@@ -808,10 +813,7 @@ flow_preorder_transversal_compute (int *pot_order)
FOR_EACH_BB (bb)
{
- max_successors = 0;
- for (e = bb->succ; e; e = e->succ_next)
- max_successors++;
-
+ max_successors = EDGE_COUNT (bb->succs);
dfst[bb->index].node
= (max_successors
? xcalloc (max_successors, sizeof (struct dfst_node *)) : NULL);
@@ -824,7 +826,7 @@ flow_preorder_transversal_compute (int *pot_order)
sbitmap_zero (visited);
/* Push the first edge on to the stack. */
- stack[sp++] = ENTRY_BLOCK_PTR->succ;
+ stack[sp++] = ei_start (ENTRY_BLOCK_PTR->succs);
while (sp)
{
@@ -832,9 +834,9 @@ flow_preorder_transversal_compute (int *pot_order)
basic_block dest;
/* Look at the edge on the top of the stack. */
- e = stack[sp - 1];
- src = e->src;
- dest = e->dest;
+ ei = stack[sp - 1];
+ src = ei_edge (ei)->src;
+ dest = ei_edge (ei)->dest;
/* Check if the edge destination has been visited yet. */
if (dest != EXIT_BLOCK_PTR && ! TEST_BIT (visited, dest->index))
@@ -850,14 +852,14 @@ flow_preorder_transversal_compute (int *pot_order)
dfst[dest->index].up = &dfst[src->index];
}
- if (dest->succ)
+ if (EDGE_COUNT (dest->succs) > 0)
/* Since the DEST node has been visited for the first
time, check its successors. */
- stack[sp++] = dest->succ;
+ stack[sp++] = ei_start (dest->succs);
}
- else if (e->succ_next)
- stack[sp - 1] = e->succ_next;
+ else if (! ei_one_before_end_p (ei))
+ ei_next (&stack[sp - 1]);
else
sp--;
}
@@ -960,13 +962,14 @@ flow_dfs_compute_reverse_execute (depth_first_search_ds data)
{
basic_block bb;
edge e;
+ edge_iterator ei;
while (data->sp > 0)
{
bb = data->stack[--data->sp];
/* Perform depth-first search on adjacent vertices. */
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (!TEST_BIT (data->visited_blocks,
e->src->index - (INVALID_BLOCK + 1)))
flow_dfs_compute_reverse_add_bb (data, e->src);
@@ -1007,10 +1010,11 @@ dfs_enumerate_from (basic_block bb, int reverse,
while (sp)
{
edge e;
+ edge_iterator ei;
lbb = st[--sp];
if (reverse)
{
- for (e = lbb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, lbb->preds)
if (!(e->src->flags & BB_VISITED) && predicate (e->src, data))
{
gcc_assert (tv != rslt_max);
@@ -1020,7 +1024,7 @@ dfs_enumerate_from (basic_block bb, int reverse,
}
else
{
- for (e = lbb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, lbb->succs)
if (!(e->dest->flags & BB_VISITED) && predicate (e->dest, data))
{
gcc_assert (tv != rslt_max);
@@ -1056,6 +1060,7 @@ static void
compute_dominance_frontiers_1 (bitmap *frontiers, basic_block bb, sbitmap done)
{
edge e;
+ edge_iterator ei;
basic_block c;
SET_BIT (done, bb->index);
@@ -1072,7 +1077,7 @@ compute_dominance_frontiers_1 (bitmap *frontiers, basic_block bb, sbitmap done)
}
/* Find blocks conforming to rule (1) above. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->dest == EXIT_BLOCK_PTR)
continue;
@@ -1106,7 +1111,7 @@ compute_dominance_frontiers (bitmap *frontiers)
sbitmap_zero (done);
- compute_dominance_frontiers_1 (frontiers, ENTRY_BLOCK_PTR->succ->dest, done);
+ compute_dominance_frontiers_1 (frontiers, EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest, done);
sbitmap_free (done);
diff --git a/gcc/cfgbuild.c b/gcc/cfgbuild.c
index 453e65cf495..f5bf3e839cd 100644
--- a/gcc/cfgbuild.c
+++ b/gcc/cfgbuild.c
@@ -251,8 +251,9 @@ make_edges (basic_block min, basic_block max, int update_p)
FOR_BB_BETWEEN (bb, min, max->next_bb, next_bb)
{
edge e;
+ edge_iterator ei;
- for (e = bb->succ; e ; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->dest != EXIT_BLOCK_PTR)
SET_BIT (edge_cache[bb->index], e->dest->index);
}
@@ -270,6 +271,7 @@ make_edges (basic_block min, basic_block max, int update_p)
enum rtx_code code;
int force_fallthru = 0;
edge e;
+ edge_iterator ei;
if (LABEL_P (BB_HEAD (bb))
&& LABEL_ALT_ENTRY_P (BB_HEAD (bb)))
@@ -388,7 +390,7 @@ make_edges (basic_block min, basic_block max, int update_p)
/* Find out if we can drop through to the next block. */
insn = NEXT_INSN (insn);
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->dest == EXIT_BLOCK_PTR && e->flags & EDGE_FALLTHRU)
{
insn = 0;
@@ -640,8 +642,9 @@ static void
compute_outgoing_frequencies (basic_block b)
{
edge e, f;
+ edge_iterator ei;
- if (b->succ && b->succ->succ_next && !b->succ->succ_next->succ_next)
+ if (EDGE_COUNT (b->succs) == 2)
{
rtx note = find_reg_note (BB_END (b), REG_BR_PROB, NULL);
int probability;
@@ -660,16 +663,16 @@ compute_outgoing_frequencies (basic_block b)
}
}
- if (b->succ && !b->succ->succ_next)
+ if (EDGE_COUNT (b->succs) == 1)
{
- e = b->succ;
+ e = EDGE_SUCC (b, 0);
e->probability = REG_BR_PROB_BASE;
e->count = b->count;
return;
}
guess_outgoing_edge_probabilities (b);
if (b->count)
- for (e = b->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, b->succs)
e->count = ((b->count * e->probability + REG_BR_PROB_BASE / 2)
/ REG_BR_PROB_BASE);
}
@@ -709,6 +712,7 @@ find_many_sub_basic_blocks (sbitmap blocks)
FOR_BB_BETWEEN (bb, min, max->next_bb, next_bb)
{
edge e;
+ edge_iterator ei;
if (STATE (bb) == BLOCK_ORIGINAL)
continue;
@@ -716,7 +720,7 @@ find_many_sub_basic_blocks (sbitmap blocks)
{
bb->count = 0;
bb->frequency = 0;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
bb->count += e->count;
bb->frequency += EDGE_FREQUENCY (e);
@@ -751,12 +755,13 @@ find_sub_basic_blocks (basic_block bb)
FOR_BB_BETWEEN (b, min, max->next_bb, next_bb)
{
edge e;
+ edge_iterator ei;
if (b != min)
{
b->count = 0;
b->frequency = 0;
- for (e = b->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, b->preds)
{
b->count += e->count;
b->frequency += EDGE_FREQUENCY (e);
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index f9d06075caa..eccaab4605e 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -124,9 +124,7 @@ try_simplify_condjump (basic_block cbranch_block)
rtx cbranch_insn;
/* Verify that there are exactly two successors. */
- if (!cbranch_block->succ
- || !cbranch_block->succ->succ_next
- || cbranch_block->succ->succ_next->succ_next)
+ if (EDGE_COUNT (cbranch_block->succs) != 2)
return false;
/* Verify that we've got a normal conditional branch at the end
@@ -142,11 +140,11 @@ try_simplify_condjump (basic_block cbranch_block)
be the last block in the function, and must contain just the
unconditional jump. */
jump_block = cbranch_fallthru_edge->dest;
- if (jump_block->pred->pred_next
+ if (EDGE_COUNT (jump_block->preds) >= 2
|| jump_block->next_bb == EXIT_BLOCK_PTR
|| !FORWARDER_BLOCK_P (jump_block))
return false;
- jump_dest_block = jump_block->succ->dest;
+ jump_dest_block = EDGE_SUCC (jump_block, 0)->dest;
/* If we are partitioning hot/cold basic blocks, we don't want to
mess up unconditional or indirect jumps that cross between hot
@@ -290,9 +288,9 @@ thread_jump (int mode, edge e, basic_block b)
/* At the moment, we do handle only conditional jumps, but later we may
want to extend this code to tablejumps and others. */
- if (!e->src->succ->succ_next || e->src->succ->succ_next->succ_next)
+ if (EDGE_COUNT (e->src->succs) != 2)
return NULL;
- if (!b->succ || !b->succ->succ_next || b->succ->succ_next->succ_next)
+ if (EDGE_COUNT (b->succs) != 2)
{
BB_SET_FLAG (b, BB_NONTHREADABLE_BLOCK);
return NULL;
@@ -421,7 +419,8 @@ static bool
try_forward_edges (int mode, basic_block b)
{
bool changed = false;
- edge e, next, *threaded_edges = NULL;
+ edge_iterator ei;
+ edge e, *threaded_edges = NULL;
/* If we are partitioning hot/cold basic blocks, we don't want to
mess up unconditional or indirect jumps that cross between hot
@@ -437,7 +436,7 @@ try_forward_edges (int mode, basic_block b)
&& find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX))
return false;
- for (e = b->succ; e; e = next)
+ for (ei = ei_start (b->succs); (e = ei_safe_edge (ei)); )
{
basic_block target, first;
int counter;
@@ -445,15 +444,16 @@ try_forward_edges (int mode, basic_block b)
int nthreaded_edges = 0;
bool may_thread = first_pass | (b->flags & BB_DIRTY);
- next = e->succ_next;
-
/* Skip complex edges because we don't know how to update them.
Still handle fallthru edges, as we can succeed to forward fallthru
edge to the same place as the branch edge of conditional branch
and turn conditional branch to an unconditional branch. */
if (e->flags & EDGE_COMPLEX)
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
target = first = e->dest;
counter = 0;
@@ -480,13 +480,13 @@ try_forward_edges (int mode, basic_block b)
may_thread |= target->flags & BB_DIRTY;
if (FORWARDER_BLOCK_P (target)
- && !(target->succ->flags & EDGE_CROSSING)
- && target->succ->dest != EXIT_BLOCK_PTR)
+ && !(EDGE_SUCC (target, 0)->flags & EDGE_CROSSING)
+ && EDGE_SUCC (target, 0)->dest != EXIT_BLOCK_PTR)
{
/* Bypass trivial infinite loops. */
- if (target == target->succ->dest)
+ if (target == EDGE_SUCC (target, 0)->dest)
counter = n_basic_blocks;
- new_target = target->succ->dest;
+ new_target = EDGE_SUCC (target, 0)->dest;
}
/* Allow to thread only over one edge at time to simplify updating
@@ -538,7 +538,7 @@ try_forward_edges (int mode, basic_block b)
it must appear before the JUMP_INSN. */
if ((mode & CLEANUP_PRE_LOOP) && optimize)
{
- rtx insn = (target->succ->flags & EDGE_FALLTHRU
+ rtx insn = (EDGE_SUCC (target, 0)->flags & EDGE_FALLTHRU
? BB_HEAD (target) : prev_nonnote_insn (BB_END (target)));
if (!NOTE_P (insn))
@@ -597,6 +597,7 @@ try_forward_edges (int mode, basic_block b)
fprintf (dump_file,
"Forwarding edge %i->%i to %i failed.\n",
b->index, e->dest->index, target->index);
+ ei_next (&ei);
continue;
}
@@ -614,7 +615,7 @@ try_forward_edges (int mode, basic_block b)
{
edge t;
- if (first->succ->succ_next)
+ if (EDGE_COUNT (first->succs) > 1)
{
gcc_assert (n < nthreaded_edges);
t = threaded_edges [n++];
@@ -638,7 +639,7 @@ try_forward_edges (int mode, basic_block b)
if (n < nthreaded_edges
&& first == threaded_edges [n]->src)
n++;
- t = first->succ;
+ t = EDGE_SUCC (first, 0);
}
t->count -= edge_count;
@@ -649,7 +650,9 @@ try_forward_edges (int mode, basic_block b)
while (first != target);
changed = true;
+ continue;
}
+ ei_next (&ei);
}
if (threaded_edges)
@@ -837,6 +840,7 @@ merge_blocks_move (edge e, basic_block b, basic_block c, int mode)
edge tmp_edge, b_fallthru_edge;
bool c_has_outgoing_fallthru;
bool b_has_incoming_fallthru;
+ edge_iterator ei;
/* Avoid overactive code motion, as the forwarder blocks should be
eliminated by edge redirection instead. One exception might have
@@ -849,13 +853,13 @@ merge_blocks_move (edge e, basic_block b, basic_block c, int mode)
and loop notes. This is done by squeezing out all the notes
and leaving them there to lie. Not ideal, but functional. */
- for (tmp_edge = c->succ; tmp_edge; tmp_edge = tmp_edge->succ_next)
+ FOR_EACH_EDGE (tmp_edge, ei, c->succs)
if (tmp_edge->flags & EDGE_FALLTHRU)
break;
c_has_outgoing_fallthru = (tmp_edge != NULL);
- for (tmp_edge = b->pred; tmp_edge; tmp_edge = tmp_edge->pred_next)
+ FOR_EACH_EDGE (tmp_edge, ei, b->preds)
if (tmp_edge->flags & EDGE_FALLTHRU)
break;
@@ -1214,21 +1218,20 @@ outgoing_edges_match (int mode, basic_block bb1, basic_block bb2)
int nehedges1 = 0, nehedges2 = 0;
edge fallthru1 = 0, fallthru2 = 0;
edge e1, e2;
+ edge_iterator ei;
/* If BB1 has only one successor, we may be looking at either an
unconditional jump, or a fake edge to exit. */
- if (bb1->succ && !bb1->succ->succ_next
- && (bb1->succ->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0
+ if (EDGE_COUNT (bb1->succs) == 1
+ && (EDGE_SUCC (bb1, 0)->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0
&& (!JUMP_P (BB_END (bb1)) || simplejump_p (BB_END (bb1))))
- return (bb2->succ && !bb2->succ->succ_next
- && (bb2->succ->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0
+ return (EDGE_COUNT (bb2->succs) == 1
+ && (EDGE_SUCC (bb2, 0)->flags & (EDGE_COMPLEX | EDGE_FAKE)) == 0
&& (!JUMP_P (BB_END (bb2)) || simplejump_p (BB_END (bb2))));
/* Match conditional jumps - this may get tricky when fallthru and branch
edges are crossed. */
- if (bb1->succ
- && bb1->succ->succ_next
- && !bb1->succ->succ_next->succ_next
+ if (EDGE_COUNT (bb1->succs) == 2
&& any_condjump_p (BB_END (bb1))
&& onlyjump_p (BB_END (bb1)))
{
@@ -1237,9 +1240,7 @@ outgoing_edges_match (int mode, basic_block bb1, basic_block bb2)
rtx set1, set2, cond1, cond2;
enum rtx_code code1, code2;
- if (!bb2->succ
- || !bb2->succ->succ_next
- || bb2->succ->succ_next->succ_next
+ if (EDGE_COUNT (bb2->succs) != 2
|| !any_condjump_p (BB_END (bb2))
|| !onlyjump_p (BB_END (bb2)))
return false;
@@ -1252,10 +1253,10 @@ outgoing_edges_match (int mode, basic_block bb1, basic_block bb2)
/* Get around possible forwarders on fallthru edges. Other cases
should be optimized out already. */
if (FORWARDER_BLOCK_P (f1->dest))
- f1 = f1->dest->succ;
+ f1 = EDGE_SUCC (f1->dest, 0);
if (FORWARDER_BLOCK_P (f2->dest))
- f2 = f2->dest->succ;
+ f2 = EDGE_SUCC (f2->dest, 0);
/* To simplify use of this function, return false if there are
unneeded forwarder blocks. These will get eliminated later
@@ -1425,9 +1426,13 @@ outgoing_edges_match (int mode, basic_block bb1, basic_block bb2)
/* Search the outgoing edges, ensure that the counts do match, find possible
fallthru and exception handling edges since these needs more
validation. */
- for (e1 = bb1->succ, e2 = bb2->succ; e1 && e2;
- e1 = e1->succ_next, e2 = e2->succ_next)
+ if (EDGE_COUNT (bb1->succs) != EDGE_COUNT (bb2->succs))
+ return false;
+
+ FOR_EACH_EDGE (e1, ei, bb1->succs)
{
+ e2 = EDGE_SUCC (bb2, ei.index);
+
if (e1->flags & EDGE_EH)
nehedges1++;
@@ -1441,8 +1446,7 @@ outgoing_edges_match (int mode, basic_block bb1, basic_block bb2)
}
/* If number of edges of various types does not match, fail. */
- if (e1 || e2
- || nehedges1 != nehedges2
+ if (nehedges1 != nehedges2
|| (fallthru1 != 0) != (fallthru2 != 0))
return false;
@@ -1450,9 +1454,9 @@ outgoing_edges_match (int mode, basic_block bb1, basic_block bb2)
if (fallthru1)
{
basic_block d1 = (forwarder_block_p (fallthru1->dest)
- ? fallthru1->dest->succ->dest: fallthru1->dest);
+ ? EDGE_SUCC (fallthru1->dest, 0)->dest: fallthru1->dest);
basic_block d2 = (forwarder_block_p (fallthru2->dest)
- ? fallthru2->dest->succ->dest: fallthru2->dest);
+ ? EDGE_SUCC (fallthru2->dest, 0)->dest: fallthru2->dest);
if (d1 != d2)
return false;
@@ -1487,6 +1491,7 @@ try_crossjump_to_edge (int mode, edge e1, edge e2)
basic_block redirect_to, redirect_from, to_remove;
rtx newpos1, newpos2;
edge s;
+ edge_iterator ei;
newpos1 = newpos2 = NULL_RTX;
@@ -1506,15 +1511,13 @@ try_crossjump_to_edge (int mode, edge e1, edge e2)
about multiple entry or chained forwarders, as they will be optimized
away. We do this to look past the unconditional jump following a
conditional jump that is required due to the current CFG shape. */
- if (src1->pred
- && !src1->pred->pred_next
+ if (EDGE_COUNT (src1->preds) == 1
&& FORWARDER_BLOCK_P (src1))
- e1 = src1->pred, src1 = e1->src;
+ e1 = EDGE_PRED (src1, 0), src1 = e1->src;
- if (src2->pred
- && !src2->pred->pred_next
+ if (EDGE_COUNT (src2->preds) == 1
&& FORWARDER_BLOCK_P (src2))
- e2 = src2->pred, src2 = e2->src;
+ e2 = EDGE_PRED (src2, 0), src2 = e2->src;
/* Nothing to do if we reach ENTRY, or a common source block. */
if (src1 == ENTRY_BLOCK_PTR || src2 == ENTRY_BLOCK_PTR)
@@ -1524,16 +1527,16 @@ try_crossjump_to_edge (int mode, edge e1, edge e2)
/* Seeing more than 1 forwarder blocks would confuse us later... */
if (FORWARDER_BLOCK_P (e1->dest)
- && FORWARDER_BLOCK_P (e1->dest->succ->dest))
+ && FORWARDER_BLOCK_P (EDGE_SUCC (e1->dest, 0)->dest))
return false;
if (FORWARDER_BLOCK_P (e2->dest)
- && FORWARDER_BLOCK_P (e2->dest->succ->dest))
+ && FORWARDER_BLOCK_P (EDGE_SUCC (e2->dest, 0)->dest))
return false;
/* Likewise with dead code (possibly newly created by the other optimizations
of cfg_cleanup). */
- if (!src1->pred || !src2->pred)
+ if (EDGE_COUNT (src1->preds) == 0 || EDGE_COUNT (src2->preds) == 0)
return false;
/* Look for the common insn sequence, part the first ... */
@@ -1606,19 +1609,20 @@ try_crossjump_to_edge (int mode, edge e1, edge e2)
redirect_to->flags |= BB_DIRTY;
/* Recompute the frequencies and counts of outgoing edges. */
- for (s = redirect_to->succ; s; s = s->succ_next)
+ FOR_EACH_EDGE (s, ei, redirect_to->succs)
{
edge s2;
+ edge_iterator ei;
basic_block d = s->dest;
if (FORWARDER_BLOCK_P (d))
- d = d->succ->dest;
+ d = EDGE_SUCC (d, 0)->dest;
- for (s2 = src1->succ; ; s2 = s2->succ_next)
+ FOR_EACH_EDGE (s2, ei, src1->succs)
{
basic_block d2 = s2->dest;
if (FORWARDER_BLOCK_P (d2))
- d2 = d2->succ->dest;
+ d2 = EDGE_SUCC (d2, 0)->dest;
if (d == d2)
break;
}
@@ -1630,16 +1634,16 @@ try_crossjump_to_edge (int mode, edge e1, edge e2)
into infinite loop. */
if (FORWARDER_BLOCK_P (s->dest))
{
- s->dest->succ->count += s2->count;
+ EDGE_SUCC (s->dest, 0)->count += s2->count;
s->dest->count += s2->count;
s->dest->frequency += EDGE_FREQUENCY (s);
}
if (FORWARDER_BLOCK_P (s2->dest))
{
- s2->dest->succ->count -= s2->count;
- if (s2->dest->succ->count < 0)
- s2->dest->succ->count = 0;
+ EDGE_SUCC (s2->dest, 0)->count -= s2->count;
+ if (EDGE_SUCC (s2->dest, 0)->count < 0)
+ EDGE_SUCC (s2->dest, 0)->count = 0;
s2->dest->count -= s2->count;
s2->dest->frequency -= EDGE_FREQUENCY (s);
if (s2->dest->frequency < 0)
@@ -1669,9 +1673,9 @@ try_crossjump_to_edge (int mode, edge e1, edge e2)
newpos1 = NEXT_INSN (newpos1);
redirect_from = split_block (src1, PREV_INSN (newpos1))->src;
- to_remove = redirect_from->succ->dest;
+ to_remove = EDGE_SUCC (redirect_from, 0)->dest;
- redirect_edge_and_branch_force (redirect_from->succ, redirect_to);
+ redirect_edge_and_branch_force (EDGE_SUCC (redirect_from, 0), redirect_to);
delete_basic_block (to_remove);
update_forwarder_flag (redirect_from);
@@ -1686,12 +1690,14 @@ try_crossjump_to_edge (int mode, edge e1, edge e2)
static bool
try_crossjump_bb (int mode, basic_block bb)
{
- edge e, e2, nexte2, nexte, fallthru;
+ edge e, e2, fallthru;
bool changed;
- int n = 0, max;
+ unsigned max, ix, ix2;
+ basic_block ev, ev2;
+ edge_iterator ei;
/* Nothing to do if there is not at least two incoming edges. */
- if (!bb->pred || !bb->pred->pred_next)
+ if (EDGE_COUNT (bb->preds) < 2)
return false;
/* If we are partitioning hot/cold basic blocks, we don't want to
@@ -1705,8 +1711,8 @@ try_crossjump_bb (int mode, basic_block bb)
bb-reorder.c:partition_hot_cold_basic_blocks for complete details. */
if (flag_reorder_blocks_and_partition
- && (BB_PARTITION (bb->pred->src) != BB_PARTITION (bb->pred->pred_next->src)
- || (bb->pred->flags & EDGE_CROSSING)))
+ && (BB_PARTITION (EDGE_PRED (bb, 0)->src) != BB_PARTITION (EDGE_PRED (bb, 1)->src)
+ || (EDGE_PRED (bb, 0)->flags & EDGE_CROSSING)))
return false;
/* It is always cheapest to redirect a block that ends in a branch to
@@ -1714,18 +1720,21 @@ try_crossjump_bb (int mode, basic_block bb)
program. We'll try that combination first. */
fallthru = NULL;
max = PARAM_VALUE (PARAM_MAX_CROSSJUMP_EDGES);
- for (e = bb->pred; e ; e = e->pred_next, n++)
+
+ if (EDGE_COUNT (bb->preds) > max)
+ return false;
+
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
if (e->flags & EDGE_FALLTHRU)
- fallthru = e;
- if (n > max)
- return false;
+ fallthru = e;
}
changed = false;
- for (e = bb->pred; e; e = nexte)
+ for (ix = 0, ev = bb; ix < EDGE_COUNT (ev->preds); )
{
- nexte = e->pred_next;
+ e = EDGE_PRED (ev, ix);
+ ix++;
/* As noted above, first try with the fallthru predecessor. */
if (fallthru)
@@ -1744,7 +1753,8 @@ try_crossjump_bb (int mode, basic_block bb)
if (try_crossjump_to_edge (mode, e, fallthru))
{
changed = true;
- nexte = bb->pred;
+ ix = 0;
+ ev = bb;
continue;
}
}
@@ -1761,12 +1771,13 @@ try_crossjump_bb (int mode, basic_block bb)
can eliminate redundant checks of crossjump(A,B) by arbitrarily
choosing to do the check from the block for which the edge
in question is the first successor of A. */
- if (e->src->succ != e)
+ if (EDGE_SUCC (e->src, 0) != e)
continue;
- for (e2 = bb->pred; e2; e2 = nexte2)
+ for (ix2 = 0, ev2 = bb; ix2 < EDGE_COUNT (ev2->preds); )
{
- nexte2 = e2->pred_next;
+ e2 = EDGE_PRED (ev2, ix2);
+ ix2++;
if (e2 == e)
continue;
@@ -1792,7 +1803,8 @@ try_crossjump_bb (int mode, basic_block bb)
if (try_crossjump_to_edge (mode, e, e2))
{
changed = true;
- nexte = bb->pred;
+ ev2 = bb;
+ ix = 0;
break;
}
}
@@ -1844,7 +1856,7 @@ try_optimize_cfg (int mode)
bool changed_here = false;
/* Delete trivially dead basic blocks. */
- while (b->pred == NULL)
+ while (EDGE_COUNT (b->preds) == 0)
{
c = b->prev_bb;
if (dump_file)
@@ -1858,9 +1870,9 @@ try_optimize_cfg (int mode)
}
/* Remove code labels no longer used. */
- if (b->pred->pred_next == NULL
- && (b->pred->flags & EDGE_FALLTHRU)
- && !(b->pred->flags & EDGE_COMPLEX)
+ if (EDGE_COUNT (b->preds) == 1
+ && (EDGE_PRED (b, 0)->flags & EDGE_FALLTHRU)
+ && !(EDGE_PRED (b, 0)->flags & EDGE_COMPLEX)
&& LABEL_P (BB_HEAD (b))
/* If the previous block ends with a branch to this
block, we can't delete the label. Normally this
@@ -1868,10 +1880,10 @@ try_optimize_cfg (int mode)
if CASE_DROPS_THRU, this can be a tablejump with
some element going to the same place as the
default (fallthru). */
- && (b->pred->src == ENTRY_BLOCK_PTR
- || !JUMP_P (BB_END (b->pred->src))
+ && (EDGE_PRED (b, 0)->src == ENTRY_BLOCK_PTR
+ || !JUMP_P (BB_END (EDGE_PRED (b, 0)->src))
|| ! label_is_jump_target_p (BB_HEAD (b),
- BB_END (b->pred->src))))
+ BB_END (EDGE_PRED (b, 0)->src))))
{
rtx label = BB_HEAD (b);
@@ -1892,13 +1904,13 @@ try_optimize_cfg (int mode)
/* If we fall through an empty block, we can remove it. */
if (!(mode & CLEANUP_CFGLAYOUT)
- && b->pred->pred_next == NULL
- && (b->pred->flags & EDGE_FALLTHRU)
+ && EDGE_COUNT (b->preds) == 1
+ && (EDGE_PRED (b, 0)->flags & EDGE_FALLTHRU)
&& !LABEL_P (BB_HEAD (b))
&& FORWARDER_BLOCK_P (b)
/* Note that forwarder_block_p true ensures that
there is a successor for this block. */
- && (b->succ->flags & EDGE_FALLTHRU)
+ && (EDGE_SUCC (b, 0)->flags & EDGE_FALLTHRU)
&& n_basic_blocks > 1)
{
if (dump_file)
@@ -1907,17 +1919,17 @@ try_optimize_cfg (int mode)
b->index);
c = b->prev_bb == ENTRY_BLOCK_PTR ? b->next_bb : b->prev_bb;
- redirect_edge_succ_nodup (b->pred, b->succ->dest);
+ redirect_edge_succ_nodup (EDGE_PRED (b, 0), EDGE_SUCC (b, 0)->dest);
delete_basic_block (b);
changed = true;
b = c;
}
- if ((s = b->succ) != NULL
- && s->succ_next == NULL
+ if (EDGE_COUNT (b->succs) == 1
+ && (s = EDGE_SUCC (b, 0))
&& !(s->flags & EDGE_COMPLEX)
&& (c = s->dest) != EXIT_BLOCK_PTR
- && c->pred->pred_next == NULL
+ && EDGE_COUNT (c->preds) == 1
&& b != c)
{
/* When not in cfg_layout mode use code aware of reordering
@@ -1959,12 +1971,11 @@ try_optimize_cfg (int mode)
non-trivial jump instruction without side-effects, we
can either delete the jump entirely, or replace it
with a simple unconditional jump. */
- if (b->succ
- && ! b->succ->succ_next
- && b->succ->dest != EXIT_BLOCK_PTR
+ if (EDGE_COUNT (b->succs) == 1
+ && EDGE_SUCC (b, 0)->dest != EXIT_BLOCK_PTR
&& onlyjump_p (BB_END (b))
&& !find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX)
- && try_redirect_by_replacing_jump (b->succ, b->succ->dest,
+ && try_redirect_by_replacing_jump (EDGE_SUCC (b, 0), EDGE_SUCC (b, 0)->dest,
(mode & CLEANUP_CFGLAYOUT) != 0))
{
update_forwarder_flag (b);
@@ -2049,12 +2060,11 @@ merge_seq_blocks (void)
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))
+ if (EDGE_COUNT (bb->succs) == 1
+ && can_merge_blocks_p (bb, EDGE_SUCC (bb, 0)->dest))
{
/* Merge the blocks and retry. */
- merge_blocks (bb, bb->succ->dest);
+ merge_blocks (bb, EDGE_SUCC (bb, 0)->dest);
changed = true;
continue;
}
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index 5d6c56e9bbb..ee0d534ac55 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -924,6 +924,7 @@ expand_gimple_tailcall (basic_block bb, tree stmt, bool *can_fallthru)
{
rtx last = get_last_insn ();
edge e;
+ edge_iterator ei;
int probability;
gcov_type count;
@@ -948,13 +949,11 @@ expand_gimple_tailcall (basic_block bb, tree stmt, bool *can_fallthru)
all edges here, or redirecting the existing fallthru edge to
the exit block. */
- e = bb->succ;
probability = 0;
count = 0;
- while (e)
- {
- edge next = e->succ_next;
+ for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
+ {
if (!(e->flags & (EDGE_ABNORMAL | EDGE_EH)))
{
if (e->dest != EXIT_BLOCK_PTR)
@@ -970,8 +969,8 @@ expand_gimple_tailcall (basic_block bb, tree stmt, bool *can_fallthru)
probability += e->probability;
remove_edge (e);
}
-
- e = next;
+ else
+ ei_next (&ei);
}
/* This is somewhat ugly: the call_expr expander often emits instructions
@@ -1020,6 +1019,7 @@ expand_gimple_basic_block (basic_block bb, FILE * dump_file)
tree stmt = NULL;
rtx note, last;
edge e;
+ edge_iterator ei;
if (dump_file)
{
@@ -1050,11 +1050,8 @@ expand_gimple_basic_block (basic_block bb, FILE * dump_file)
NOTE_BASIC_BLOCK (note) = bb;
- e = bb->succ;
- while (e)
+ for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
{
- edge next = e->succ_next;
-
/* Clear EDGE_EXECUTABLE. This flag is never used in the backend. */
e->flags &= ~EDGE_EXECUTABLE;
@@ -1063,8 +1060,8 @@ expand_gimple_basic_block (basic_block bb, FILE * dump_file)
rediscover them. In the future we should get this fixed properly. */
if (e->flags & EDGE_ABNORMAL)
remove_edge (e);
-
- e = next;
+ else
+ ei_next (&ei);
}
for (; !bsi_end_p (bsi); bsi_next (&bsi))
@@ -1129,8 +1126,9 @@ construct_init_block (void)
{
basic_block init_block, first_block;
edge e = NULL, e2;
+ edge_iterator ei;
- for (e2 = ENTRY_BLOCK_PTR->succ; e2; e2 = e2->succ_next)
+ FOR_EACH_EDGE (e2, ei, ENTRY_BLOCK_PTR->succs)
{
/* Clear EDGE_EXECUTABLE. This flag is never used in the backend.
@@ -1173,7 +1171,9 @@ construct_exit_block (void)
rtx head = get_last_insn ();
rtx end;
basic_block exit_block;
- edge e, e2, next;
+ edge e, e2;
+ unsigned ix;
+ edge_iterator ei;
/* Make sure the locus is set to the end of the function, so that
epilogue line numbers and warnings are set properly. */
@@ -1199,16 +1199,21 @@ construct_exit_block (void)
EXIT_BLOCK_PTR->prev_bb);
exit_block->frequency = EXIT_BLOCK_PTR->frequency;
exit_block->count = EXIT_BLOCK_PTR->count;
- for (e = EXIT_BLOCK_PTR->pred; e; e = next)
+
+ ix = 0;
+ while (ix < EDGE_COUNT (EXIT_BLOCK_PTR->preds))
{
- next = e->pred_next;
+ e = EDGE_I (EXIT_BLOCK_PTR->preds, ix);
if (!(e->flags & EDGE_ABNORMAL))
- redirect_edge_succ (e, exit_block);
+ redirect_edge_succ (e, exit_block);
+ else
+ ix++;
}
+
e = make_edge (exit_block, EXIT_BLOCK_PTR, EDGE_FALLTHRU);
e->probability = REG_BR_PROB_BASE;
e->count = EXIT_BLOCK_PTR->count;
- for (e2 = EXIT_BLOCK_PTR->pred; e2; e2 = e2->pred_next)
+ FOR_EACH_EDGE (e2, ei, EXIT_BLOCK_PTR->preds)
if (e2 != e)
{
e->count -= e2->count;
diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c
index 970dcbedda6..e6a624c3550 100644
--- a/gcc/cfghooks.c
+++ b/gcc/cfghooks.c
@@ -106,6 +106,7 @@ verify_flow_info (void)
{
int n_fallthru = 0;
edge e;
+ edge_iterator ei;
if (bb->count < 0)
{
@@ -119,7 +120,7 @@ verify_flow_info (void)
bb->index, bb->frequency);
err = 1;
}
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (last_visited [e->dest->index + 2] == bb)
{
@@ -165,7 +166,7 @@ verify_flow_info (void)
err = 1;
}
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
if (e->dest != bb)
{
@@ -184,11 +185,12 @@ verify_flow_info (void)
/* Complete edge checksumming for ENTRY and EXIT. */
{
edge e;
+ edge_iterator ei;
- for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
edge_checksum[e->dest->index + 2] += (size_t) e;
- for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
edge_checksum[e->dest->index + 2] -= (size_t) e;
}
@@ -221,6 +223,7 @@ void
dump_bb (basic_block bb, FILE *outf, int indent)
{
edge e;
+ edge_iterator ei;
char *s_indent;
s_indent = alloca ((size_t) indent + 1);
@@ -245,12 +248,12 @@ dump_bb (basic_block bb, FILE *outf, int indent)
putc ('\n', outf);
fprintf (outf, ";;%s pred: ", s_indent);
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
dump_edge_info (outf, e, 0);
putc ('\n', outf);
fprintf (outf, ";;%s succ: ", s_indent);
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
dump_edge_info (outf, e, 1);
putc ('\n', outf);
@@ -360,13 +363,13 @@ delete_basic_block (basic_block bb)
/* Remove the edges into and out of this block. Note that there may
indeed be edges in, if we are removing an unreachable loop. */
- while (bb->pred != NULL)
- remove_edge (bb->pred);
- while (bb->succ != NULL)
- remove_edge (bb->succ);
+ while (EDGE_COUNT (bb->preds) != 0)
+ remove_edge (EDGE_PRED (bb, 0));
+ while (EDGE_COUNT (bb->succs) != 0)
+ remove_edge (EDGE_SUCC (bb, 0));
- bb->pred = NULL;
- bb->succ = NULL;
+ VEC_truncate (edge, bb->preds, 0);
+ VEC_truncate (edge, bb->succs, 0);
if (dom_computed[CDI_DOMINATORS])
delete_from_dominance_info (CDI_DOMINATORS, bb);
@@ -393,11 +396,11 @@ split_edge (edge e)
ret = cfg_hooks->split_edge (e);
ret->count = count;
ret->frequency = freq;
- ret->succ->probability = REG_BR_PROB_BASE;
- ret->succ->count = count;
+ EDGE_SUCC (ret, 0)->probability = REG_BR_PROB_BASE;
+ EDGE_SUCC (ret, 0)->count = count;
if (dom_computed[CDI_DOMINATORS])
- set_immediate_dominator (CDI_DOMINATORS, ret, ret->pred->src);
+ set_immediate_dominator (CDI_DOMINATORS, ret, EDGE_PRED (ret, 0)->src);
if (dom_computed[CDI_DOMINATORS] >= DOM_NO_FAST_QUERY)
{
@@ -410,21 +413,22 @@ split_edge (edge e)
ret, provided that all other predecessors of e->dest are
dominated by e->dest. */
- if (get_immediate_dominator (CDI_DOMINATORS, ret->succ->dest)
- == ret->pred->src)
+ if (get_immediate_dominator (CDI_DOMINATORS, EDGE_SUCC (ret, 0)->dest)
+ == EDGE_PRED (ret, 0)->src)
{
- for (f = ret->succ->dest->pred; f; f = f->pred_next)
+ edge_iterator ei;
+ FOR_EACH_EDGE (f, ei, EDGE_SUCC (ret, 0)->dest->preds)
{
- if (f == ret->succ)
+ if (f == EDGE_SUCC (ret, 0))
continue;
if (!dominated_by_p (CDI_DOMINATORS, f->src,
- ret->succ->dest))
+ EDGE_SUCC (ret, 0)->dest))
break;
}
if (!f)
- set_immediate_dominator (CDI_DOMINATORS, ret->succ->dest, ret);
+ set_immediate_dominator (CDI_DOMINATORS, EDGE_SUCC (ret, 0)->dest, ret);
}
};
@@ -500,6 +504,7 @@ void
merge_blocks (basic_block a, basic_block b)
{
edge e;
+ edge_iterator ei;
if (!cfg_hooks->merge_blocks)
internal_error ("%s does not support merge_blocks.", cfg_hooks->name);
@@ -510,17 +515,18 @@ merge_blocks (basic_block a, basic_block b)
partway though the merge of blocks for conditional_execution we'll
be merging a TEST block with THEN and ELSE successors. Free the
whole lot of them and hope the caller knows what they're doing. */
- while (a->succ)
- remove_edge (a->succ);
+
+ while (EDGE_COUNT (a->succs) != 0)
+ remove_edge (EDGE_SUCC (a, 0));
/* Adjust the edges out of B for the new owner. */
- for (e = b->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, b->succs)
e->src = a;
- a->succ = b->succ;
+ a->succs = b->succs;
a->flags |= b->flags;
/* B hasn't quite yet ceased to exist. Attempt to prevent mishap. */
- b->pred = b->succ = NULL;
+ b->preds = b->succs = NULL;
a->global_live_at_end = b->global_live_at_end;
if (dom_computed[CDI_DOMINATORS])
@@ -542,7 +548,8 @@ edge
make_forwarder_block (basic_block bb, bool (*redirect_edge_p) (edge),
void (*new_bb_cbk) (basic_block))
{
- edge e, next_e, fallthru;
+ edge e, fallthru;
+ edge_iterator ei;
basic_block dummy, jump;
if (!cfg_hooks->make_forwarder_block)
@@ -554,11 +561,13 @@ make_forwarder_block (basic_block bb, bool (*redirect_edge_p) (edge),
bb = fallthru->dest;
/* Redirect back edges we want to keep. */
- for (e = dummy->pred; e; e = next_e)
+ for (ei = ei_start (dummy->preds); (e = ei_safe_edge (ei)); )
{
- next_e = e->pred_next;
if (redirect_edge_p (e))
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
dummy->frequency -= EDGE_FREQUENCY (e);
dummy->count -= e->count;
@@ -630,12 +639,14 @@ tidy_fallthru_edges (void)
merge the flags for the duplicate edges. So we do not want to
check that the edge is not a FALLTHRU edge. */
- if ((s = b->succ) != NULL
- && ! (s->flags & EDGE_COMPLEX)
- && s->succ_next == NULL
- && s->dest == c
- && !find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX))
- tidy_fallthru_edge (s);
+ if (EDGE_COUNT (b->succs) == 1)
+ {
+ s = EDGE_SUCC (b, 0);
+ if (! (s->flags & EDGE_COMPLEX)
+ && s->dest == c
+ && !find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX))
+ tidy_fallthru_edge (s);
+ }
}
}
@@ -645,6 +656,7 @@ bool
can_duplicate_block_p (basic_block bb)
{
edge e;
+ edge_iterator ei;
if (!cfg_hooks->can_duplicate_block_p)
internal_error ("%s does not support can_duplicate_block_p.",
@@ -655,7 +667,7 @@ can_duplicate_block_p (basic_block bb)
/* 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)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->dest == EXIT_BLOCK_PTR && e->flags & EDGE_FALLTHRU)
return false;
@@ -671,6 +683,7 @@ duplicate_block (basic_block bb, edge e)
edge s, n;
basic_block new_bb;
gcov_type new_count = e ? e->count : 0;
+ edge_iterator ei;
if (!cfg_hooks->duplicate_block)
internal_error ("%s does not support duplicate_block.",
@@ -678,7 +691,7 @@ duplicate_block (basic_block bb, edge e)
if (bb->count < new_count)
new_count = bb->count;
- gcc_assert (bb->pred);
+
#ifdef ENABLE_CHECKING
gcc_assert (can_duplicate_block_p (bb));
#endif
@@ -687,7 +700,7 @@ duplicate_block (basic_block bb, edge e)
new_bb->loop_depth = bb->loop_depth;
new_bb->flags = bb->flags;
- for (s = bb->succ; s; s = s->succ_next)
+ FOR_EACH_EDGE (s, ei, bb->succs)
{
/* Since we are creating edges from a new block to successors
of another block (which therefore are known to be disjoint), there
diff --git a/gcc/cfglayout.c b/gcc/cfglayout.c
index bc7cec93f0a..2d88a376b2e 100644
--- a/gcc/cfglayout.c
+++ b/gcc/cfglayout.c
@@ -632,14 +632,16 @@ fixup_reorder_chain (void)
rtx bb_end_insn;
basic_block nb;
basic_block old_bb;
+ edge_iterator ei;
- if (bb->succ == NULL)
+ if (EDGE_COUNT (bb->succs) == 0)
continue;
/* Find the old fallthru edge, and another non-EH edge for
a taken jump. */
e_taken = e_fall = NULL;
- for (e = bb->succ; e ; e = e->succ_next)
+
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->flags & EDGE_FALLTHRU)
e_fall = e;
else if (! (e->flags & EDGE_EH))
@@ -790,11 +792,11 @@ fixup_reorder_chain (void)
/* Make sure new bb is tagged for correct section (same as
fall-thru source, since you cannot fall-throu across
section boundaries). */
- BB_COPY_PARTITION (e_fall->src, bb->pred->src);
+ BB_COPY_PARTITION (e_fall->src, EDGE_PRED (bb, 0)->src);
if (flag_reorder_blocks_and_partition
&& targetm.have_named_sections)
{
- if (BB_PARTITION (bb->pred->src) == BB_COLD_PARTITION)
+ if (BB_PARTITION (EDGE_PRED (bb, 0)->src) == BB_COLD_PARTITION)
{
rtx new_note;
rtx note = BB_HEAD (e_fall->src);
@@ -810,7 +812,7 @@ fixup_reorder_chain (void)
}
if (JUMP_P (BB_END (bb))
&& !any_condjump_p (BB_END (bb))
- && (bb->succ->flags & EDGE_CROSSING))
+ && (EDGE_SUCC (bb, 0)->flags & EDGE_CROSSING))
REG_NOTES (BB_END (bb)) = gen_rtx_EXPR_LIST
(REG_CROSSING_JUMP, NULL_RTX, REG_NOTES (BB_END (bb)));
}
@@ -860,8 +862,12 @@ fixup_reorder_chain (void)
FOR_EACH_BB (bb)
{
edge e;
- for (e = bb->succ; e && !(e->flags & EDGE_FALLTHRU); e = e->succ_next)
- continue;
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ if (e->flags & EDGE_FALLTHRU)
+ break;
+
if (e && !can_fallthru (e->src, e->dest))
force_nonfallthru (e);
}
@@ -916,6 +922,7 @@ static void
fixup_fallthru_exit_predecessor (void)
{
edge e;
+ edge_iterator ei;
basic_block bb = NULL;
/* This transformation is not valid before reload, because we might
@@ -923,7 +930,7 @@ fixup_fallthru_exit_predecessor (void)
value. */
gcc_assert (reload_completed);
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
if (e->flags & EDGE_FALLTHRU)
bb = e->src;
@@ -1225,7 +1232,8 @@ can_copy_bbs_p (basic_block *bbs, unsigned n)
for (i = 0; i < n; i++)
{
/* In case we should redirect abnormal edge during duplication, fail. */
- for (e = bbs[i]->succ; e; e = e->succ_next)
+ edge_iterator ei;
+ FOR_EACH_EDGE (e, ei, bbs[i]->succs)
if ((e->flags & EDGE_ABNORMAL)
&& e->dest->rbi->duplicated)
{
@@ -1307,10 +1315,11 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
new_edges[j] = NULL;
for (i = 0; i < n; i++)
{
+ edge_iterator ei;
new_bb = new_bbs[i];
bb = bbs[i];
- for (e = new_bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, new_bb->succs)
{
for (j = 0; j < n_edges; j++)
if (edges[j] && edges[j]->src == bb && edges[j]->dest == e->dest)
diff --git a/gcc/cfgloop.c b/gcc/cfgloop.c
index 01b9a4612de..a38af1643ae 100644
--- a/gcc/cfgloop.c
+++ b/gcc/cfgloop.c
@@ -64,9 +64,10 @@ flow_loops_cfg_dump (const struct loops *loops, FILE *file)
FOR_EACH_BB (bb)
{
edge succ;
+ edge_iterator ei;
fprintf (file, ";; %d succs { ", bb->index);
- for (succ = bb->succ; succ; succ = succ->succ_next)
+ FOR_EACH_EDGE (succ, ei, bb->succs)
fprintf (file, "%d ", succ->dest->index);
fprintf (file, "}\n");
}
@@ -242,10 +243,11 @@ static void
flow_loop_entry_edges_find (struct loop *loop)
{
edge e;
+ edge_iterator ei;
int num_entries;
num_entries = 0;
- for (e = loop->header->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, loop->header->preds)
{
if (flow_loop_outside_edge_p (loop, e))
num_entries++;
@@ -256,7 +258,7 @@ flow_loop_entry_edges_find (struct loop *loop)
loop->entry_edges = xmalloc (num_entries * sizeof (edge *));
num_entries = 0;
- for (e = loop->header->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, loop->header->preds)
{
if (flow_loop_outside_edge_p (loop, e))
loop->entry_edges[num_entries++] = e;
@@ -284,8 +286,9 @@ flow_loop_exit_edges_find (struct loop *loop)
bbs = get_loop_body (loop);
for (i = 0; i < loop->num_nodes; i++)
{
+ edge_iterator ei;
node = bbs[i];
- for (e = node->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, node->succs)
{
basic_block dest = e->dest;
@@ -306,8 +309,9 @@ flow_loop_exit_edges_find (struct loop *loop)
num_exits = 0;
for (i = 0; i < loop->num_nodes; i++)
{
+ edge_iterator ei;
node = bbs[i];
- for (e = node->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, node->succs)
{
basic_block dest = e->dest;
@@ -348,10 +352,11 @@ flow_loop_nodes_find (basic_block header, struct loop *loop)
{
basic_block node;
edge e;
+ edge_iterator ei;
node = stack[--sp];
- for (e = node->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, node->preds)
{
basic_block ancestor = e->src;
@@ -390,9 +395,10 @@ mark_single_exit_loops (struct loops *loops)
FOR_EACH_BB (bb)
{
+ edge_iterator ei;
if (bb->loop_father == loops->tree_root)
continue;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->dest == EXIT_BLOCK_PTR)
continue;
@@ -407,7 +413,7 @@ mark_single_exit_loops (struct loops *loops)
/* If we have already seen an exit, mark this by the edge that
surely does not occur as any exit. */
if (loop->single_exit)
- loop->single_exit = ENTRY_BLOCK_PTR->succ;
+ loop->single_exit = EDGE_SUCC (ENTRY_BLOCK_PTR, 0);
else
loop->single_exit = e;
}
@@ -420,7 +426,7 @@ mark_single_exit_loops (struct loops *loops)
if (!loop)
continue;
- if (loop->single_exit == ENTRY_BLOCK_PTR->succ)
+ if (loop->single_exit == EDGE_SUCC (ENTRY_BLOCK_PTR, 0))
loop->single_exit = NULL;
}
@@ -448,9 +454,10 @@ flow_loop_pre_header_scan (struct loop *loop)
/* Count number of edges along trace from loop header to
root of pre-header extended basic block. Usually this is
only one or two edges. */
- for (num = 1; ebb->pred->src != ENTRY_BLOCK_PTR && ! ebb->pred->pred_next;
+ for (num = 1;
+ EDGE_PRED (ebb, 0)->src != ENTRY_BLOCK_PTR && EDGE_COUNT (ebb->preds) == 1;
num++)
- ebb = ebb->pred->src;
+ ebb = EDGE_PRED (ebb, 0)->src;
loop->pre_header_edges = xmalloc (num * sizeof (edge));
loop->num_pre_header_edges = num;
@@ -458,7 +465,7 @@ flow_loop_pre_header_scan (struct loop *loop)
/* Store edges in order that they are followed. The source of the first edge
is the root node of the pre-header extended basic block and the
destination of the last last edge is the loop header. */
- for (e = loop->entry_edges[0]; num; e = e->src->pred)
+ for (e = loop->entry_edges[0]; num; e = EDGE_PRED (e->src, 0))
loop->pre_header_edges[--num] = e;
}
@@ -470,11 +477,12 @@ flow_loop_pre_header_find (basic_block header)
{
basic_block pre_header;
edge e;
+ edge_iterator ei;
/* If block p is a predecessor of the header and is the only block
that the header does not dominate, then it is the pre-header. */
pre_header = NULL;
- for (e = header->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, header->preds)
{
basic_block node = e->src;
@@ -630,9 +638,9 @@ update_latch_info (basic_block jump)
{
alloc_aux_for_block (jump, sizeof (int));
HEADER_BLOCK (jump) = 0;
- alloc_aux_for_edge (jump->pred, sizeof (int));
- LATCH_EDGE (jump->pred) = 0;
- set_immediate_dominator (CDI_DOMINATORS, jump, jump->pred->src);
+ alloc_aux_for_edge (EDGE_PRED (jump, 0), sizeof (int));
+ LATCH_EDGE (EDGE_PRED (jump, 0)) = 0;
+ set_immediate_dominator (CDI_DOMINATORS, jump, EDGE_PRED (jump, 0)->src);
}
/* A callback for make_forwarder block, to redirect all edges except for
@@ -670,10 +678,11 @@ canonicalize_loop_headers (void)
/* Split blocks so that each loop has only single latch. */
FOR_EACH_BB (header)
{
+ edge_iterator ei;
int num_latches = 0;
int have_abnormal_edge = 0;
- for (e = header->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, header->preds)
{
basic_block latch = e->src;
@@ -693,16 +702,16 @@ canonicalize_loop_headers (void)
HEADER_BLOCK (header) = num_latches;
}
- if (HEADER_BLOCK (ENTRY_BLOCK_PTR->succ->dest))
+ if (HEADER_BLOCK (EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest))
{
basic_block bb;
/* We could not redirect edges freely here. On the other hand,
we can simply split the edge from entry block. */
- bb = split_edge (ENTRY_BLOCK_PTR->succ);
+ bb = split_edge (EDGE_SUCC (ENTRY_BLOCK_PTR, 0));
- alloc_aux_for_edge (bb->succ, sizeof (int));
- LATCH_EDGE (bb->succ) = 0;
+ alloc_aux_for_edge (EDGE_SUCC (bb, 0), sizeof (int));
+ LATCH_EDGE (EDGE_SUCC (bb, 0)) = 0;
alloc_aux_for_block (bb, sizeof (int));
HEADER_BLOCK (bb) = 0;
}
@@ -711,6 +720,7 @@ canonicalize_loop_headers (void)
{
int max_freq, is_heavy;
edge heavy, tmp_edge;
+ edge_iterator ei;
if (HEADER_BLOCK (header) <= 1)
continue;
@@ -719,11 +729,11 @@ canonicalize_loop_headers (void)
is_heavy = 1;
heavy = NULL;
max_freq = 0;
- for (e = header->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, header->preds)
if (LATCH_EDGE (e) &&
EDGE_FREQUENCY (e) > max_freq)
max_freq = EDGE_FREQUENCY (e);
- for (e = header->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, header->preds)
if (LATCH_EDGE (e) &&
EDGE_FREQUENCY (e) >= max_freq / HEAVY_EDGE_RATIO)
{
@@ -817,19 +827,20 @@ flow_loops_find (struct loops *loops, int flags)
num_loops = 0;
FOR_EACH_BB (header)
{
+ edge_iterator ei;
int more_latches = 0;
header->loop_depth = 0;
/* If we have an abnormal predecessor, do not consider the
loop (not worth the problems). */
- for (e = header->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, header->preds)
if (e->flags & EDGE_ABNORMAL)
break;
if (e)
continue;
- for (e = header->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, header->preds)
{
basic_block latch = e->src;
@@ -893,6 +904,7 @@ flow_loops_find (struct loops *loops, int flags)
for (b = 0; b < n_basic_blocks; b++)
{
struct loop *loop;
+ edge_iterator ei;
/* Search the nodes of the CFG in reverse completion order
so that we can find outer loops first. */
@@ -908,7 +920,7 @@ flow_loops_find (struct loops *loops, int flags)
num_loops++;
/* Look for the latch for this header block. */
- for (e = header->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, header->preds)
{
basic_block latch = e->src;
@@ -1096,6 +1108,7 @@ get_loop_body_in_bfs_order (const struct loop *loop)
while (i < loop->num_nodes)
{
edge e;
+ edge_iterator ei;
if (!bitmap_bit_p (visited, bb->index))
{
@@ -1104,7 +1117,7 @@ get_loop_body_in_bfs_order (const struct loop *loop)
blocks[i++] = bb;
}
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (flow_bb_inside_loop_p (loop, e->dest))
{
@@ -1132,20 +1145,21 @@ get_loop_exit_edges (const struct loop *loop, unsigned int *n_edges)
edge *edges, e;
unsigned i, n;
basic_block * body;
+ edge_iterator ei;
gcc_assert (loop->latch != EXIT_BLOCK_PTR);
body = get_loop_body (loop);
n = 0;
for (i = 0; i < loop->num_nodes; i++)
- for (e = body[i]->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, body[i]->succs)
if (!flow_bb_inside_loop_p (loop, e->dest))
n++;
edges = xmalloc (n * sizeof (edge));
*n_edges = n;
n = 0;
for (i = 0; i < loop->num_nodes; i++)
- for (e = body[i]->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, body[i]->succs)
if (!flow_bb_inside_loop_p (loop, e->dest))
edges[n++] = e;
free (body);
@@ -1166,7 +1180,7 @@ num_loop_branches (const struct loop *loop)
body = get_loop_body (loop);
n = 0;
for (i = 0; i < loop->num_nodes; i++)
- if (body[i]->succ && body[i]->succ->succ_next)
+ if (EDGE_COUNT (body[i]->succs) >= 2)
n++;
free (body);
@@ -1317,21 +1331,19 @@ verify_loop_structure (struct loops *loops)
continue;
if ((loops->state & LOOPS_HAVE_PREHEADERS)
- && (!loop->header->pred->pred_next
- || loop->header->pred->pred_next->pred_next))
+ && EDGE_COUNT (loop->header->preds) != 2)
{
error ("Loop %d's header does not have exactly 2 entries.", i);
err = 1;
}
if (loops->state & LOOPS_HAVE_SIMPLE_LATCHES)
{
- if (!loop->latch->succ
- || loop->latch->succ->succ_next)
+ if (EDGE_COUNT (loop->latch->succs) != 1)
{
error ("Loop %d's latch does not have exactly 1 successor.", i);
err = 1;
}
- if (loop->latch->succ->dest != loop->header)
+ if (EDGE_SUCC (loop->latch, 0)->dest != loop->header)
{
error ("Loop %d's latch does not have header as successor.", i);
err = 1;
@@ -1362,11 +1374,12 @@ verify_loop_structure (struct loops *loops)
irreds = sbitmap_alloc (last_basic_block);
FOR_EACH_BB (bb)
{
+ edge_iterator ei;
if (bb->flags & BB_IRREDUCIBLE_LOOP)
SET_BIT (irreds, bb->index);
else
RESET_BIT (irreds, bb->index);
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->flags & EDGE_IRREDUCIBLE_LOOP)
e->flags |= EDGE_ALL_FLAGS + 1;
}
@@ -1377,6 +1390,8 @@ verify_loop_structure (struct loops *loops)
/* Compare. */
FOR_EACH_BB (bb)
{
+ edge_iterator ei;
+
if ((bb->flags & BB_IRREDUCIBLE_LOOP)
&& !TEST_BIT (irreds, bb->index))
{
@@ -1389,7 +1404,7 @@ verify_loop_structure (struct loops *loops)
error ("Basic block %d should not be marked irreducible.", bb->index);
err = 1;
}
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if ((e->flags & EDGE_IRREDUCIBLE_LOOP)
&& !(e->flags & (EDGE_ALL_FLAGS + 1)))
@@ -1417,9 +1432,10 @@ verify_loop_structure (struct loops *loops)
memset (sizes, 0, sizeof (unsigned) * loops->num);
FOR_EACH_BB (bb)
{
+ edge_iterator ei;
if (bb->loop_father == loops->tree_root)
continue;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->dest == EXIT_BLOCK_PTR)
continue;
@@ -1482,9 +1498,11 @@ edge
loop_latch_edge (const struct loop *loop)
{
edge e;
+ edge_iterator ei;
- for (e = loop->header->pred; e->src != loop->latch; e = e->pred_next)
- continue;
+ FOR_EACH_EDGE (e, ei, loop->header->preds)
+ if (e->src == loop->latch)
+ break;
return e;
}
@@ -1494,9 +1512,11 @@ edge
loop_preheader_edge (const struct loop *loop)
{
edge e;
+ edge_iterator ei;
- for (e = loop->header->pred; e->src == loop->latch; e = e->pred_next)
- continue;
+ FOR_EACH_EDGE (e, ei, loop->header->preds)
+ if (e->src != loop->latch)
+ break;
return e;
}
diff --git a/gcc/cfgloopanal.c b/gcc/cfgloopanal.c
index 4c50bbe959c..87c85e329d8 100644
--- a/gcc/cfgloopanal.c
+++ b/gcc/cfgloopanal.c
@@ -267,6 +267,7 @@ mark_irreducible_loops (struct loops *loops)
{
basic_block act;
edge e;
+ edge_iterator ei;
int i, src, dest;
struct graph *g;
int *queue1 = xmalloc ((last_basic_block + loops->num) * sizeof (int));
@@ -278,7 +279,7 @@ mark_irreducible_loops (struct loops *loops)
FOR_BB_BETWEEN (act, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
{
act->flags &= ~BB_IRREDUCIBLE_LOOP;
- for (e = act->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, act->succs)
e->flags &= ~EDGE_IRREDUCIBLE_LOOP;
}
@@ -286,7 +287,7 @@ mark_irreducible_loops (struct loops *loops)
g = new_graph (last_basic_block + loops->num);
FOR_BB_BETWEEN (act, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
- for (e = act->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, act->succs)
{
/* Ignore edges to exit. */
if (e->dest == EXIT_BLOCK_PTR)
@@ -415,6 +416,7 @@ unsigned
expected_loop_iterations (const struct loop *loop)
{
edge e;
+ edge_iterator ei;
if (loop->header->count)
{
@@ -423,7 +425,7 @@ expected_loop_iterations (const struct loop *loop)
count_in = 0;
count_latch = 0;
- for (e = loop->header->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, loop->header->preds)
if (e->src == loop->latch)
count_latch = e->count;
else
@@ -444,7 +446,7 @@ expected_loop_iterations (const struct loop *loop)
freq_in = 0;
freq_latch = 0;
- for (e = loop->header->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, loop->header->preds)
if (e->src == loop->latch)
freq_latch = EDGE_FREQUENCY (e);
else
diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c
index 24b2399ddb8..e5ec7bddaab 100644
--- a/gcc/cfgloopmanip.c
+++ b/gcc/cfgloopmanip.c
@@ -96,7 +96,7 @@ remove_bbs (basic_block *bbs, int nbbs)
static int
find_path (edge e, basic_block **bbs)
{
- gcc_assert (!e->dest->pred->pred_next);
+ gcc_assert (EDGE_COUNT (e->dest->preds) <= 1);
/* Find bbs in the path. */
*bbs = xcalloc (n_basic_blocks, sizeof (basic_block));
@@ -115,9 +115,10 @@ static bool
fix_bb_placement (struct loops *loops, basic_block bb)
{
edge e;
+ edge_iterator ei;
struct loop *loop = loops->tree_root, *act;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->dest == EXIT_BLOCK_PTR)
continue;
@@ -180,6 +181,7 @@ fix_bb_placements (struct loops *loops, basic_block from)
while (qbeg != qend)
{
+ edge_iterator ei;
from = *qbeg;
qbeg++;
if (qbeg == qtop)
@@ -200,7 +202,7 @@ fix_bb_placements (struct loops *loops, basic_block from)
}
/* Something has changed, insert predecessors into queue. */
- for (e = from->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, from->preds)
{
basic_block pred = e->src;
struct loop *nca;
@@ -262,10 +264,11 @@ fix_irreducible_loops (basic_block from)
while (stack_top)
{
+ edge_iterator ei;
bb = stack[--stack_top];
RESET_BIT (on_stack, bb->index);
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (e->flags & EDGE_IRREDUCIBLE_LOOP)
break;
if (e)
@@ -276,13 +279,10 @@ fix_irreducible_loops (basic_block from)
edges = get_loop_exit_edges (bb->loop_father, &n_edges);
else
{
- n_edges = 0;
- for (e = bb->succ; e; e = e->succ_next)
- n_edges++;
+ n_edges = EDGE_COUNT (bb->succs);
edges = xmalloc (n_edges * sizeof (edge));
- n_edges = 0;
- for (e = bb->succ; e; e = e->succ_next)
- edges[n_edges++] = e;
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ edges[ei.index] = e;
}
for (i = 0; i < n_edges; i++)
@@ -329,8 +329,8 @@ remove_path (struct loops *loops, edge e)
e, but we only have basic block dominators. This is easy to
fix -- when e->dest has exactly one predecessor, this corresponds
to blocks dominated by e->dest, if not, split the edge. */
- if (e->dest->pred->pred_next)
- e = loop_split_edge_with (e, NULL_RTX)->pred;
+ if (EDGE_COUNT (e->dest->preds) > 1)
+ e = EDGE_PRED (loop_split_edge_with (e, NULL_RTX), 0);
/* It may happen that by removing path we remove one or more loops
we belong to. In this case first unloop the loops, then proceed
@@ -354,8 +354,9 @@ remove_path (struct loops *loops, edge e)
SET_BIT (seen, rem_bbs[i]->index);
for (i = 0; i < nrem; i++)
{
+ edge_iterator ei;
bb = rem_bbs[i];
- for (ae = rem_bbs[i]->succ; ae; ae = ae->succ_next)
+ FOR_EACH_EDGE (ae, ei, rem_bbs[i]->succs)
if (ae->dest != EXIT_BLOCK_PTR && !TEST_BIT (seen, ae->dest->index))
{
SET_BIT (seen, ae->dest->index);
@@ -457,9 +458,10 @@ scale_bbs_frequencies (basic_block *bbs, int nbbs, int num, int den)
for (i = 0; i < nbbs; i++)
{
+ edge_iterator ei;
bbs[i]->frequency = (bbs[i]->frequency * num) / den;
bbs[i]->count = RDIV (bbs[i]->count * num, den);
- for (e = bbs[i]->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bbs[i]->succs)
e->count = (e->count * num) /den;
}
}
@@ -498,14 +500,15 @@ loopify (struct loops *loops, edge latch_edge, edge header_edge,
int freq, prob, tot_prob;
gcov_type cnt;
edge e;
+ edge_iterator ei;
loop->header = header_edge->dest;
loop->latch = latch_edge->src;
freq = EDGE_FREQUENCY (header_edge);
cnt = header_edge->count;
- prob = switch_bb->succ->probability;
- tot_prob = prob + switch_bb->succ->succ_next->probability;
+ prob = EDGE_SUCC (switch_bb, 0)->probability;
+ tot_prob = prob + EDGE_SUCC (switch_bb, 1)->probability;
if (tot_prob == 0)
tot_prob = 1;
@@ -537,7 +540,7 @@ loopify (struct loops *loops, edge latch_edge, edge header_edge,
/* Fix frequencies. */
switch_bb->frequency = freq;
switch_bb->count = cnt;
- for (e = switch_bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, switch_bb->succs)
e->count = (switch_bb->count * e->probability) / REG_BR_PROB_BASE;
scale_loop_frequencies (loop, prob, tot_prob);
scale_loop_frequencies (succ_bb->loop_father, tot_prob - prob, tot_prob);
@@ -617,7 +620,7 @@ unloop (struct loops *loops, struct loop *loop)
loops->parray[loop->num] = NULL;
flow_loop_free (loop);
- remove_edge (latch->succ);
+ remove_edge (EDGE_SUCC (latch, 0));
fix_bb_placements (loops, latch);
/* If the loop was inside an irreducible region, we would have to somehow
@@ -642,11 +645,12 @@ fix_loop_placement (struct loop *loop)
basic_block *body;
unsigned i;
edge e;
+ edge_iterator ei;
struct loop *father = loop->pred[0], *act;
body = get_loop_body (loop);
for (i = 0; i < loop->num_nodes; i++)
- for (e = body[i]->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, body[i]->succs)
if (!flow_bb_inside_loop_p (loop, e->dest))
{
act = find_common_loop (loop, e->dest->loop_father);
@@ -772,16 +776,16 @@ loop_delete_branch_edge (edge e, int really_delete)
int irr;
edge snd;
- gcc_assert (src->succ->succ_next);
+ gcc_assert (EDGE_COUNT (src->succs) > 1);
/* Cannot handle more than two exit edges. */
- if (src->succ->succ_next->succ_next)
+ if (EDGE_COUNT (src->succs) > 2)
return false;
/* And it must be just a simple branch. */
if (!any_condjump_p (BB_END (src)))
return false;
- snd = e == src->succ ? src->succ->succ_next : src->succ;
+ snd = e == EDGE_SUCC (src, 0) ? EDGE_SUCC (src, 1) : EDGE_SUCC (src, 0);
newdest = snd->dest;
if (newdest == EXIT_BLOCK_PTR)
return false;
@@ -795,8 +799,8 @@ loop_delete_branch_edge (edge e, int really_delete)
if (!redirect_edge_and_branch (e, newdest))
return false;
- src->succ->flags &= ~EDGE_IRREDUCIBLE_LOOP;
- src->succ->flags |= irr;
+ EDGE_SUCC (src, 0)->flags &= ~EDGE_IRREDUCIBLE_LOOP;
+ EDGE_SUCC (src, 0)->flags |= irr;
return true;
}
@@ -1003,11 +1007,12 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops,
new_bbs[i]->rbi->duplicated = 1;
for (i = 0; i < n; i++)
{
+ edge_iterator ei;
new_bb = new_bbs[i];
if (new_bb->loop_father == target)
new_bb->flags |= BB_IRREDUCIBLE_LOOP;
- for (ae = new_bb->succ; ae; ae = ae->succ_next)
+ FOR_EACH_EDGE (ae, ei, new_bb->succs)
if (ae->dest->rbi->duplicated
&& (ae->src->loop_father == target
|| ae->dest->loop_father == target))
@@ -1113,10 +1118,10 @@ mfb_keep_just (edge e)
static void
mfb_update_loops (basic_block jump)
{
- struct loop *loop = jump->succ->dest->loop_father;
+ struct loop *loop = EDGE_SUCC (jump, 0)->dest->loop_father;
if (dom_computed[CDI_DOMINATORS])
- set_immediate_dominator (CDI_DOMINATORS, jump, jump->pred->src);
+ set_immediate_dominator (CDI_DOMINATORS, jump, EDGE_PRED (jump, 0)->src);
add_bb_to_loop (jump, loop);
loop->latch = jump;
}
@@ -1134,10 +1139,11 @@ create_preheader (struct loop *loop, int flags)
struct loop *cloop, *ploop;
int nentry = 0;
bool irred = false;
+ edge_iterator ei;
cloop = loop->outer;
- for (e = loop->header->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, loop->header->preds)
{
if (e->src == loop->latch)
continue;
@@ -1147,9 +1153,11 @@ create_preheader (struct loop *loop, int flags)
gcc_assert (nentry);
if (nentry == 1)
{
- for (e = loop->header->pred; e->src == loop->latch; e = e->pred_next);
- if (!(flags & CP_SIMPLE_PREHEADERS)
- || !e->src->succ->succ_next)
+ FOR_EACH_EDGE (e, ei, loop->header->preds)
+ if (e->src != loop->latch)
+ break;
+
+ if (!(flags & CP_SIMPLE_PREHEADERS) || EDGE_COUNT (e->src->succs) == 1)
return NULL;
}
@@ -1167,7 +1175,7 @@ create_preheader (struct loop *loop, int flags)
/* Reorganize blocks so that the preheader is not stuck in the middle of the
loop. */
- for (e = dummy->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, dummy->preds)
if (e->src != loop->latch)
break;
move_block_after (dummy, e->src);
@@ -1178,7 +1186,7 @@ create_preheader (struct loop *loop, int flags)
if (irred)
{
dummy->flags |= BB_IRREDUCIBLE_LOOP;
- dummy->succ->flags |= EDGE_IRREDUCIBLE_LOOP;
+ EDGE_SUCC (dummy, 0)->flags |= EDGE_IRREDUCIBLE_LOOP;
}
if (dump_file)
@@ -1210,13 +1218,14 @@ force_single_succ_latches (struct loops *loops)
for (i = 1; i < loops->num; i++)
{
+ edge_iterator ei;
loop = loops->parray[i];
- if (loop->latch != loop->header
- && !loop->latch->succ->succ_next)
+ if (loop->latch != loop->header && EDGE_COUNT (loop->latch->succs) == 1)
continue;
- for (e = loop->header->pred; e->src != loop->latch; e = e->pred_next)
- continue;
+ FOR_EACH_EDGE (e, ei, loop->header->preds)
+ if (e->src == loop->latch)
+ break;
loop_split_edge_with (e, NULL_RTX);
}
@@ -1245,7 +1254,7 @@ loop_split_edge_with (edge e, rtx insns)
add_bb_to_loop (new_bb, loop_c);
new_bb->flags = insns ? BB_SUPERBLOCK : 0;
- new_e = new_bb->succ;
+ new_e = EDGE_SUCC (new_bb, 0);
if (e->flags & EDGE_IRREDUCIBLE_LOOP)
{
new_bb->flags |= BB_IRREDUCIBLE_LOOP;
@@ -1323,9 +1332,9 @@ create_loop_notes (void)
&& onlyjump_p (insn))
{
pbb = BLOCK_FOR_INSN (insn);
- gcc_assert (pbb && pbb->succ && !pbb->succ->succ_next);
+ gcc_assert (pbb && EDGE_COUNT (pbb->succs) == 1);
- if (!flow_bb_inside_loop_p (loop, pbb->succ->dest))
+ if (!flow_bb_inside_loop_p (loop, EDGE_SUCC (pbb, 0)->dest))
insn = BB_HEAD (first[loop->num]);
}
else
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 8664f049901..67b55f4b79a 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -459,6 +459,7 @@ rtl_split_block (basic_block bb, void *insnp)
basic_block new_bb;
rtx insn = insnp;
edge e;
+ edge_iterator ei;
if (!insn)
{
@@ -482,9 +483,9 @@ rtl_split_block (basic_block bb, void *insnp)
BB_END (bb) = insn;
/* Redirect the outgoing edges. */
- new_bb->succ = bb->succ;
- bb->succ = NULL;
- for (e = new_bb->succ; e; e = e->succ_next)
+ new_bb->succs = bb->succs;
+ bb->succs = NULL;
+ FOR_EACH_EDGE (e, ei, new_bb->succs)
e->src = new_bb;
if (bb->global_live_at_start)
@@ -625,10 +626,12 @@ rtl_can_merge_blocks (basic_block a,basic_block b)
return false;
/* There must be exactly one edge in between the blocks. */
- return (a->succ && !a->succ->succ_next && a->succ->dest == b
- && !b->pred->pred_next && a != b
+ return (EDGE_COUNT (a->succs) == 1
+ && EDGE_SUCC (a, 0)->dest == b
+ && EDGE_COUNT (b->preds) == 1
+ && a != b
/* Must be simple edge. */
- && !(a->succ->flags & EDGE_COMPLEX)
+ && !(EDGE_SUCC (a, 0)->flags & EDGE_COMPLEX)
&& a->next_bb == b
&& a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
/* If the jump insn has side effects,
@@ -668,7 +671,7 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
edge tmp;
rtx set;
int fallthru = 0;
-
+ edge_iterator ei;
/* If we are partitioning hot/cold basic blocks, we don't want to
mess up unconditional or indirect jumps that cross between hot
@@ -686,7 +689,7 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
return NULL;
/* Verify that all targets will be TARGET. */
- for (tmp = src->succ; tmp; tmp = tmp->succ_next)
+ FOR_EACH_EDGE (tmp, ei, src->succs)
if (tmp->dest != target && tmp != e)
break;
@@ -768,7 +771,7 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
rtx target_label = block_label (target);
rtx barrier, label, table;
- emit_jump_insn_after (gen_jump (target_label), insn);
+ emit_jump_insn_after_noloc (gen_jump (target_label), insn);
JUMP_LABEL (BB_END (src)) = target_label;
LABEL_NUSES (target_label)++;
if (dump_file)
@@ -814,9 +817,10 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
}
/* Keep only one edge out and set proper flags. */
- while (src->succ->succ_next)
- remove_edge (src->succ);
- e = src->succ;
+ while (EDGE_COUNT (src->succs) > 1)
+ remove_edge (e);
+
+ e = EDGE_SUCC (src, 0);
if (fallthru)
e->flags = EDGE_FALLTHRU;
else
@@ -1040,28 +1044,37 @@ force_nonfallthru_and_redirect (edge e, basic_block target)
if (e->src == ENTRY_BLOCK_PTR)
{
/* We can't redirect the entry block. Create an empty block
- at the start of the function which we use to add the new
- jump. */
- edge *pe1;
- basic_block bb
- = create_basic_block (BB_HEAD (e->dest), NULL, ENTRY_BLOCK_PTR);
-
+ at the start of the function which we use to add the new
+ jump. */
+ edge tmp;
+ edge_iterator ei;
+ bool found = false;
+
+ basic_block bb = create_basic_block (BB_HEAD (e->dest), NULL, ENTRY_BLOCK_PTR);
+
/* Change the existing edge's source to be the new block, and add
a new edge from the entry block to the new block. */
e->src = bb;
- for (pe1 = &ENTRY_BLOCK_PTR->succ; *pe1; pe1 = &(*pe1)->succ_next)
- if (*pe1 == e)
- {
- *pe1 = e->succ_next;
- break;
- }
- e->succ_next = 0;
- bb->succ = e;
+ for (ei = ei_start (ENTRY_BLOCK_PTR->succs); (tmp = ei_safe_edge (ei)); )
+ {
+ if (tmp == e)
+ {
+ VEC_ordered_remove (edge, ENTRY_BLOCK_PTR->succs, ei.index);
+ found = true;
+ break;
+ }
+ else
+ ei_next (&ei);
+ }
+
+ gcc_assert (found);
+
+ VEC_safe_insert (edge, bb->succs, 0, e);
make_single_succ_edge (ENTRY_BLOCK_PTR, bb, EDGE_FALLTHRU);
}
}
- if (e->src->succ->succ_next || abnormal_edge_flags)
+ if (EDGE_COUNT (e->src->succs) >= 2 || abnormal_edge_flags)
{
/* Create the new structures. */
@@ -1113,7 +1126,7 @@ force_nonfallthru_and_redirect (edge e, basic_block target)
}
if (JUMP_P (BB_END (jump_block))
&& !any_condjump_p (BB_END (jump_block))
- && (jump_block->succ->flags & EDGE_CROSSING))
+ && (EDGE_SUCC (jump_block, 0)->flags & EDGE_CROSSING))
REG_NOTES (BB_END (jump_block)) = gen_rtx_EXPR_LIST
(REG_CROSSING_JUMP, NULL_RTX,
REG_NOTES (BB_END (jump_block)));
@@ -1137,7 +1150,7 @@ force_nonfallthru_and_redirect (edge e, basic_block target)
if (target == EXIT_BLOCK_PTR)
{
#ifdef HAVE_return
- emit_jump_insn_after (gen_return (), BB_END (jump_block));
+ emit_jump_insn_after_noloc (gen_return (), BB_END (jump_block));
#else
gcc_unreachable ();
#endif
@@ -1145,7 +1158,7 @@ force_nonfallthru_and_redirect (edge e, basic_block target)
else
{
rtx label = block_label (target);
- emit_jump_insn_after (gen_jump (label), BB_END (jump_block));
+ emit_jump_insn_after_noloc (gen_jump (label), BB_END (jump_block));
JUMP_LABEL (BB_END (jump_block)) = label;
LABEL_NUSES (label)++;
}
@@ -1193,6 +1206,12 @@ rtl_tidy_fallthru_edge (edge e)
{
rtx q;
basic_block b = e->src, c = b->next_bb;
+ edge e2;
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e2, ei, b->succs)
+ if (e == e2)
+ break;
/* ??? In a late-running flow pass, other folks may have deleted basic
blocks by nopping out blocks, leaving multiple BARRIERs between here
@@ -1215,7 +1234,7 @@ rtl_tidy_fallthru_edge (edge e)
if (JUMP_P (q)
&& onlyjump_p (q)
&& (any_uncondjump_p (q)
- || (b->succ == e && e->succ_next == NULL)))
+ || (EDGE_SUCC (b, 0) == e && ei.index == EDGE_COUNT (b->succs) - 1)))
{
#ifdef HAVE_cc0
/* If this was a conditional jump, we need to also delete
@@ -1303,8 +1322,9 @@ rtl_split_edge (edge edge_in)
if ((edge_in->flags & EDGE_FALLTHRU) == 0)
{
edge e;
+ edge_iterator ei;
- for (e = edge_in->dest->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, edge_in->dest->preds)
if (e->flags & EDGE_FALLTHRU)
break;
@@ -1518,7 +1538,8 @@ commit_one_edge_insertion (edge e, int watch_calls)
/* Special case -- avoid inserting code between call and storing
its return value. */
- if (watch_calls && (e->flags & EDGE_FALLTHRU) && !e->dest->pred->pred_next
+ if (watch_calls && (e->flags & EDGE_FALLTHRU)
+ && EDGE_COUNT (e->dest->preds) == 1
&& e->src != ENTRY_BLOCK_PTR
&& CALL_P (BB_END (e->src)))
{
@@ -1538,7 +1559,7 @@ commit_one_edge_insertion (edge e, int watch_calls)
{
/* Figure out where to put these things. If the destination has
one predecessor, insert there. Except for the exit block. */
- if (e->dest->pred->pred_next == NULL && e->dest != EXIT_BLOCK_PTR)
+ if (EDGE_COUNT (e->dest->preds) == 1 && e->dest != EXIT_BLOCK_PTR)
{
bb = e->dest;
@@ -1564,7 +1585,7 @@ commit_one_edge_insertion (edge e, int watch_calls)
/* If the source has one successor and the edge is not abnormal,
insert there. Except for the entry block. */
else if ((e->flags & EDGE_ABNORMAL) == 0
- && e->src->succ->succ_next == NULL
+ && EDGE_COUNT (e->src->succs) == 1
&& e->src != ENTRY_BLOCK_PTR)
{
bb = e->src;
@@ -1619,7 +1640,7 @@ commit_one_edge_insertion (edge e, int watch_calls)
NOTE_BASIC_BLOCK (new_note) = bb;
if (JUMP_P (BB_END (bb))
&& !any_condjump_p (BB_END (bb))
- && (bb->succ->flags & EDGE_CROSSING))
+ && (EDGE_SUCC (bb, 0)->flags & EDGE_CROSSING))
REG_NOTES (BB_END (bb)) = gen_rtx_EXPR_LIST
(REG_CROSSING_JUMP, NULL_RTX, REG_NOTES (BB_END (bb)));
if (after == bb_note)
@@ -1632,11 +1653,11 @@ commit_one_edge_insertion (edge e, int watch_calls)
if (before)
{
- emit_insn_before (insns, before);
+ emit_insn_before_noloc (insns, before);
last = prev_nonnote_insn (before);
}
else
- last = emit_insn_after (insns, after);
+ last = emit_insn_after_noloc (insns, after);
if (returnjump_p (last))
{
@@ -1645,9 +1666,9 @@ commit_one_edge_insertion (edge e, int watch_calls)
for the (single) epilogue, which already has a fallthru edge
to EXIT. */
- e = bb->succ;
+ e = EDGE_SUCC (bb, 0);
gcc_assert (e->dest == EXIT_BLOCK_PTR
- && !e->succ_next && (e->flags & EDGE_FALLTHRU));
+ && EDGE_COUNT (bb->succs) == 1 && (e->flags & EDGE_FALLTHRU));
e->flags &= ~EDGE_FALLTHRU;
emit_barrier_after (last);
@@ -1677,17 +1698,15 @@ commit_edge_insertions (void)
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
{
- edge e, next;
+ edge e;
+ edge_iterator ei;
- for (e = bb->succ; e; e = next)
- {
- next = e->succ_next;
- if (e->insns.r)
- {
- changed = true;
- commit_one_edge_insertion (e, false);
- }
- }
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ if (e->insns.r)
+ {
+ changed = true;
+ commit_one_edge_insertion (e, false);
+ }
}
if (!changed)
@@ -1724,17 +1743,15 @@ commit_edge_insertions_watch_calls (void)
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
{
- edge e, next;
+ edge e;
+ edge_iterator ei;
- for (e = bb->succ; e; e = next)
- {
- next = e->succ_next;
- if (e->insns.r)
- {
- changed = true;
- commit_one_edge_insertion (e, true);
- }
- }
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ if (e->insns.r)
+ {
+ changed = true;
+ commit_one_edge_insertion (e, true);
+ }
}
if (!changed)
@@ -1963,10 +1980,11 @@ rtl_verify_flow_info_1 (void)
int n_fallthru = 0, n_eh = 0, n_call = 0, n_abnormal = 0, n_branch = 0;
edge e, fallthru = NULL;
rtx note;
+ edge_iterator ei;
if (INSN_P (BB_END (bb))
&& (note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX))
- && bb->succ && bb->succ->succ_next
+ && EDGE_COUNT (bb->succs) >= 2
&& any_condjump_p (BB_END (bb)))
{
if (INTVAL (XEXP (note, 0)) != BRANCH_EDGE (bb)->probability
@@ -1977,7 +1995,7 @@ rtl_verify_flow_info_1 (void)
err = 1;
}
}
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->flags & EDGE_FALLTHRU)
{
@@ -2144,7 +2162,9 @@ rtl_verify_flow_info (void)
FOR_EACH_BB_REVERSE (bb)
{
edge e;
- for (e = bb->succ; e; e = e->succ_next)
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->flags & EDGE_FALLTHRU)
break;
if (!e)
@@ -2258,9 +2278,11 @@ rtl_verify_flow_info (void)
bool
purge_dead_edges (basic_block bb)
{
- edge e, next;
+ edge e;
rtx insn = BB_END (bb), note;
bool purged = false;
+ bool found;
+ edge_iterator ei;
/* If this instruction cannot trap, remove REG_EH_REGION notes. */
if (NONJUMP_INSN_P (insn)
@@ -2275,23 +2297,31 @@ purge_dead_edges (basic_block bb)
}
/* Cleanup abnormal edges caused by exceptions or non-local gotos. */
- for (e = bb->succ; e; e = next)
+ for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
{
- next = e->succ_next;
if (e->flags & EDGE_EH)
{
if (can_throw_internal (BB_END (bb)))
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
}
else if (e->flags & EDGE_ABNORMAL_CALL)
{
if (CALL_P (BB_END (bb))
&& (! (note = find_reg_note (insn, REG_EH_REGION, NULL))
|| INTVAL (XEXP (note, 0)) >= 0))
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
}
else
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
remove_edge (e);
bb->flags |= BB_DIRTY;
@@ -2302,6 +2332,7 @@ purge_dead_edges (basic_block bb)
{
rtx note;
edge b,f;
+ edge_iterator ei;
/* We do care only about conditional jumps and simplejumps. */
if (!any_condjump_p (insn)
@@ -2320,10 +2351,8 @@ purge_dead_edges (basic_block bb)
remove_note (insn, note);
}
- for (e = bb->succ; e; e = next)
+ for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
{
- next = e->succ_next;
-
/* Avoid abnormal flags to leak from computed jumps turned
into simplejumps. */
@@ -2333,22 +2362,32 @@ purge_dead_edges (basic_block bb)
if ((e->flags & EDGE_FALLTHRU) && any_condjump_p (insn))
/* A conditional jump can fall through into the next
block, so we should keep the edge. */
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
else if (e->dest != EXIT_BLOCK_PTR
&& BB_HEAD (e->dest) == JUMP_LABEL (insn))
/* If the destination block is the target of the jump,
keep the edge. */
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
else if (e->dest == EXIT_BLOCK_PTR && returnjump_p (insn))
/* If the destination block is the exit block, and this
instruction is a return, then keep the edge. */
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
/* Keep the edges that correspond to exceptions thrown by
this instruction and rematerialize the EDGE_ABNORMAL
flag we just cleared above. */
{
e->flags |= EDGE_ABNORMAL;
+ ei_next (&ei);
continue;
}
@@ -2358,7 +2397,7 @@ purge_dead_edges (basic_block bb)
remove_edge (e);
}
- if (!bb->succ || !purged)
+ if (EDGE_COUNT (bb->succs) == 0 || !purged)
return purged;
if (dump_file)
@@ -2368,10 +2407,10 @@ purge_dead_edges (basic_block bb)
return purged;
/* Redistribute probabilities. */
- if (!bb->succ->succ_next)
+ if (EDGE_COUNT (bb->succs) == 1)
{
- bb->succ->probability = REG_BR_PROB_BASE;
- bb->succ->count = bb->count;
+ EDGE_SUCC (bb, 0)->probability = REG_BR_PROB_BASE;
+ EDGE_SUCC (bb, 0)->count = bb->count;
}
else
{
@@ -2395,8 +2434,8 @@ purge_dead_edges (basic_block bb)
from non-local gotos and the like. If there were, we shouldn't
have created the sibcall in the first place. Second, there
should of course never have been a fallthru edge. */
- gcc_assert (bb->succ && !bb->succ->succ_next);
- gcc_assert (bb->succ->flags == (EDGE_SIBCALL | EDGE_ABNORMAL));
+ gcc_assert (EDGE_COUNT (bb->succs) == 1);
+ gcc_assert (EDGE_SUCC (bb, 0)->flags == (EDGE_SIBCALL | EDGE_ABNORMAL));
return 0;
}
@@ -2406,28 +2445,33 @@ purge_dead_edges (basic_block bb)
as these are only created by conditional branches. If we find such an
edge we know that there used to be a jump here and can then safely
remove all non-fallthru edges. */
- for (e = bb->succ; e && (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU));
- e = e->succ_next)
- ;
+ found = false;
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ if (! (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU)))
+ {
+ found = true;
+ break;
+ }
- if (!e)
+ if (!found)
return purged;
- for (e = bb->succ; e; e = next)
+ for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
{
- next = e->succ_next;
if (!(e->flags & EDGE_FALLTHRU))
{
bb->flags |= BB_DIRTY;
remove_edge (e);
purged = true;
}
+ else
+ ei_next (&ei);
}
- gcc_assert (bb->succ && !bb->succ->succ_next);
+ gcc_assert (EDGE_COUNT (bb->succs) == 1);
- bb->succ->probability = REG_BR_PROB_BASE;
- bb->succ->count = bb->count;
+ EDGE_SUCC (bb, 0)->probability = REG_BR_PROB_BASE;
+ EDGE_SUCC (bb, 0)->count = bb->count;
if (dump_file)
fprintf (dump_file, "Purged non-fallthru edges from bb %i\n",
@@ -2543,10 +2587,28 @@ cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
}
/* In case we are redirecting fallthru edge to the branch edge
of conditional jump, remove it. */
- if (src->succ->succ_next
- && !src->succ->succ_next->succ_next)
+ if (EDGE_COUNT (src->succs) == 2)
{
- edge s = e->succ_next ? e->succ_next : src->succ;
+ bool found = false;
+ unsigned ix = 0;
+ edge tmp, s;
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (tmp, ei, src->succs)
+ if (e == tmp)
+ {
+ found = true;
+ ix = ei.index;
+ break;
+ }
+
+ gcc_assert (found);
+
+ if (EDGE_COUNT (src->succs) > (ix + 1))
+ s = EDGE_SUCC (src, ix + 1);
+ else
+ s = EDGE_SUCC (src, 0);
+
if (s->dest == dest
&& any_condjump_p (BB_END (src))
&& onlyjump_p (BB_END (src)))
@@ -2680,10 +2742,12 @@ cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
return false;
/* There must be exactly one edge in between the blocks. */
- return (a->succ && !a->succ->succ_next && a->succ->dest == b
- && !b->pred->pred_next && a != b
+ return (EDGE_COUNT (a->succs) == 1
+ && EDGE_SUCC (a, 0)->dest == b
+ && EDGE_COUNT (b->preds) == 1
+ && a != b
/* Must be simple edge. */
- && !(a->succ->flags & EDGE_COMPLEX)
+ && !(EDGE_SUCC (a, 0)->flags & EDGE_COMPLEX)
&& a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
/* If the jump insn has side effects,
we can't kill the edge. */
@@ -2707,7 +2771,7 @@ cfg_layout_merge_blocks (basic_block a, basic_block b)
/* We should have fallthru edge in a, or we can do dummy redirection to get
it cleaned up. */
if (JUMP_P (BB_END (a)))
- try_redirect_by_replacing_jump (a->succ, b, true);
+ try_redirect_by_replacing_jump (EDGE_SUCC (a, 0), b, true);
gcc_assert (!JUMP_P (BB_END (a)));
/* Possible line number notes should appear in between. */
@@ -2715,7 +2779,7 @@ cfg_layout_merge_blocks (basic_block a, basic_block b)
{
rtx first = BB_END (a), last;
- last = emit_insn_after (b->rbi->header, BB_END (a));
+ last = emit_insn_after_noloc (b->rbi->header, BB_END (a));
delete_insn_chain (NEXT_INSN (first), last);
b->rbi->header = NULL;
}
@@ -2725,7 +2789,7 @@ cfg_layout_merge_blocks (basic_block a, basic_block b)
{
rtx first = unlink_insn_chain (BB_HEAD (b), BB_END (b));
- emit_insn_after (first, BB_END (a));
+ emit_insn_after_noloc (first, BB_END (a));
/* Skip possible DELETED_LABEL insn. */
if (!NOTE_INSN_BASIC_BLOCK_P (first))
first = NEXT_INSN (first);
@@ -2906,8 +2970,9 @@ rtl_flow_call_edges_add (sbitmap blocks)
if (need_fake_edge_p (insn))
{
edge e;
+ edge_iterator ei;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->dest == EXIT_BLOCK_PTR)
{
insert_insn_on_edge (gen_rtx_USE (VOIDmode, const0_rtx), e);
@@ -2955,8 +3020,11 @@ rtl_flow_call_edges_add (sbitmap blocks)
#ifdef ENABLE_CHECKING
if (split_at_insn == BB_END (bb))
- for (e = bb->succ; e; e = e->succ_next)
- gcc_assert (e->dest != EXIT_BLOCK_PTR);
+ {
+ edge_iterator ei;
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ gcc_assert (e->dest != EXIT_BLOCK_PTR);
+ }
#endif
/* Note that the following may create a new basic block
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index a5c42b4d16f..5d0a32faad6 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -2923,7 +2923,7 @@ cgraph_build_static_cdtor (char which, tree body, int priority)
/* ??? We will get called LATE in the compilation process. */
if (cgraph_global_info_ready)
- tree_rest_of_compilation (decl, false);
+ tree_rest_of_compilation (decl);
else
cgraph_finalize_function (decl, 0);
diff --git a/gcc/combine.c b/gcc/combine.c
index ad5ec6483a3..559ee153136 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -1176,6 +1176,8 @@ can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED, rtx succ,
/* Don't substitute into an incremented register. */
|| FIND_REG_INC_NOTE (i3, dest)
|| (succ && FIND_REG_INC_NOTE (succ, dest))
+ /* Don't substitute into a non-local goto, this confuses CFG. */
+ || (JUMP_P (i3) && find_reg_note (i3, REG_NON_LOCAL_GOTO, NULL_RTX))
#if 0
/* Don't combine the end of a libcall into anything. */
/* ??? This gives worse code, and appears to be unnecessary, since no
@@ -7336,6 +7338,7 @@ force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask,
in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
which is equal to STORE_FLAG_VALUE. */
if ((mask & ~STORE_FLAG_VALUE) == 0 && XEXP (x, 1) == const0_rtx
+ && GET_MODE (XEXP (x, 0)) == mode
&& exact_log2 (nonzero_bits (XEXP (x, 0), mode)) >= 0
&& (nonzero_bits (XEXP (x, 0), mode)
== (unsigned HOST_WIDE_INT) STORE_FLAG_VALUE))
diff --git a/gcc/common.opt b/gcc/common.opt
index 5739c1b8c2a..f39cde12ac1 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -407,11 +407,11 @@ Common Report Var(flag_gcse_lm) Init(1)
Perform enhanced load motion during global common subexpression elimination
fgcse-sm
-Common Report Var(flag_gcse_sm) Init(1)
+Common Report Var(flag_gcse_sm) Init(0)
Perform store motion after global common subexpression elimination
fgcse-las
-Common Report Var(flag_gcse_las) Init(1)
+Common Report Var(flag_gcse_las) Init(0)
Perform redundant load after store elimination in global common subexpression
elimination
@@ -936,7 +936,7 @@ Common Report Var(flag_value_profile_transformations)
Use expression value profiles in optimizations
fweb
-Common Report Var(flag_web) VarExists
+Common Report Var(flag_web) Init(0)
Construct webs and split unrelated uses of single variable
fwrapv
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index 114170b8b47..b1de390bc53 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -5924,11 +5924,6 @@ alpha_sa_mask (unsigned long *imaskP, unsigned long *fmaskP)
break;
imask |= 1UL << regno;
}
-
- /* Glibc likes to use $31 as an unwind stopper for crt0. To
- avoid hackery in unwind-dw2.c, we need to actively store a
- zero in the prologue of _Unwind_RaiseException et al. */
- imask |= 1UL << 31;
}
/* If any register spilled, then spill the return address also. */
@@ -6451,14 +6446,6 @@ alpha_expand_prologue (void)
reg_offset += 8;
}
- /* Store a zero if requested for unwinding. */
- if (imask & (1UL << 31))
- {
- emit_frame_store_1 (const0_rtx, sa_reg, sa_bias, reg_offset,
- gen_rtx_REG (Pmode, 31));
- reg_offset += 8;
- }
-
for (i = 0; i < 31; i++)
if (fmask & (1UL << i))
{
@@ -6876,9 +6863,6 @@ alpha_expand_epilogue (void)
reg_offset += 8;
}
- if (imask & (1UL << 31))
- reg_offset += 8;
-
for (i = 0; i < 31; ++i)
if (fmask & (1UL << i))
{
diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h
index 35d6f4ac3a1..fe3cedcb520 100644
--- a/gcc/config/alpha/alpha.h
+++ b/gcc/config/alpha/alpha.h
@@ -1183,6 +1183,7 @@ do { \
#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, 26)
#define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (26)
#define DWARF_ALT_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (64)
+#define DWARF_ZERO_REG 31
/* Describe how we implement __builtin_eh_return. */
#define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N) + 16 : INVALID_REGNUM)
diff --git a/gcc/config/alpha/qrnnd.asm b/gcc/config/alpha/qrnnd.asm
index d6373ec1bff..da9c4bc8338 100644
--- a/gcc/config/alpha/qrnnd.asm
+++ b/gcc/config/alpha/qrnnd.asm
@@ -26,6 +26,10 @@
# Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
# MA 02111-1307, USA.
+#ifdef __ELF__
+.section .note.GNU-stack,""
+#endif
+
.set noreorder
.set noat
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index a8934c3e475..193e6e1224a 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -3018,7 +3018,7 @@ thumb_find_work_register (int live_regs_mask)
return LAST_ARG_REGNUM;
/* Look for a pushed register. */
- for (reg = 0; reg < LAST_LO_REGNUM; reg++)
+ for (reg = LAST_LO_REGNUM; reg >=0; reg--)
if (live_regs_mask & (1 << reg))
return reg;
@@ -8733,7 +8733,7 @@ thumb_compute_save_reg_mask (void)
}
if (flag_pic && !TARGET_SINGLE_PIC_BASE)
- mask |= PIC_OFFSET_TABLE_REGNUM;
+ mask |= (1 << PIC_OFFSET_TABLE_REGNUM);
if (TARGET_SINGLE_PIC_BASE)
mask &= ~(1 << arm_pic_register);
diff --git a/gcc/config/arm/symbian.h b/gcc/config/arm/symbian.h
index a900d76f76b..2a588ed780a 100644
--- a/gcc/config/arm/symbian.h
+++ b/gcc/config/arm/symbian.h
@@ -45,10 +45,13 @@
"%{!fshort-wchar:%{!fno-short-wchar:-fshort-wchar}} "
#define CC1PLUS_SPEC CC1_SPEC
-/* Symbian OS does not use crt0.o, unlike the generic unknown-elf
+/* Symbian OS does not use crt*.o, unlike the generic unknown-elf
configuration. */
#undef STARTFILE_SPEC
-#define STARTFILE_SPEC "crti%O%s crtbegin%O%s"
+#define STARTFILE_SPEC ""
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC ""
/* Do not link with any libraries by default. On Symbian OS, the user
must supply all required libraries on the command line. */
diff --git a/gcc/config/arm/t-symbian b/gcc/config/arm/t-symbian
index abaf7bd4ce7..34a58ce9f11 100644
--- a/gcc/config/arm/t-symbian
+++ b/gcc/config/arm/t-symbian
@@ -22,3 +22,6 @@ MULTILIB_DIRNAMES = softfp
# There is no C library to link against on Symbian OS -- at least when
# building GCC.
SHLIB_LC =
+
+# Symbian OS provides its own startup code.
+EXTRA_MULTILIB_PARTS=
diff --git a/gcc/config/cris/cris.md b/gcc/config/cris/cris.md
index 6092d241b73..1e925dbf4ba 100644
--- a/gcc/config/cris/cris.md
+++ b/gcc/config/cris/cris.md
@@ -4904,9 +4904,10 @@
rtx otherop
= rtx_equal_p (operands[2], operands[0]) ? operands[3] : operands[2];
- /* Make sure we have canonical RTX so we match the insn pattern - a
- register or MULT in the first operand, not a constant. */
- if (CONSTANT_P (otherop))
+ /* Make sure we have canonical RTX so we match the insn pattern -
+ not a constant in the first operand. We also require the order
+ (plus reg mem) to match the final pattern. */
+ if (CONSTANT_P (otherop) || MEM_P (otherop))
{
operands[7] = operands[1];
operands[8] = otherop;
@@ -4954,9 +4955,10 @@
rtx otherop
= rtx_equal_p (operands[2], operands[0]) ? operands[3] : operands[2];
- /* Make sure we have canonical RTX so we match the insn pattern - a
- register or MULT in the first operand, not a constant. */
- if (CONSTANT_P (otherop))
+ /* Make sure we have canonical RTX so we match the insn pattern -
+ not a constant in the first operand. We also require the order
+ (plus reg mem) to match the final pattern. */
+ if (CONSTANT_P (otherop) || MEM_P (otherop))
{
operands[7] = operands[1];
operands[8] = otherop;
diff --git a/gcc/config/frv/frv.c b/gcc/config/frv/frv.c
index b4021c7706f..9862013ec45 100644
--- a/gcc/config/frv/frv.c
+++ b/gcc/config/frv/frv.c
@@ -6715,7 +6715,7 @@ frv_ifcvt_modify_tests (ce_if_block_t *ce_info, rtx *p_true, rtx *p_false)
while (multiple_test_bb != test_bb)
{
bb[num_bb++] = multiple_test_bb;
- multiple_test_bb = multiple_test_bb->pred->src;
+ multiple_test_bb = EDGE_PRED (multiple_test_bb, 0)->src;
}
}
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index de8411eb663..540d390d50c 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -362,7 +362,7 @@ struct processor_costs athlon_cost = {
5, /* MMX or SSE register to integer */
64, /* size of prefetch block */
6, /* number of parallel prefetches */
- 2, /* Branch cost */
+ 5, /* Branch cost */
4, /* cost of FADD and FSUB insns. */
4, /* cost of FMUL instruction. */
24, /* cost of FDIV instruction. */
@@ -406,7 +406,7 @@ struct processor_costs k8_cost = {
5, /* MMX or SSE register to integer */
64, /* size of prefetch block */
6, /* number of parallel prefetches */
- 2, /* Branch cost */
+ 5, /* Branch cost */
4, /* cost of FADD and FSUB insns. */
4, /* cost of FMUL instruction. */
19, /* cost of FDIV instruction. */
@@ -14909,46 +14909,49 @@ static void
ix86_pad_returns (void)
{
edge e;
+ edge_iterator ei;
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
- {
- basic_block bb = e->src;
- rtx ret = BB_END (bb);
- rtx prev;
- bool replace = false;
-
- if (GET_CODE (ret) != JUMP_INSN || GET_CODE (PATTERN (ret)) != RETURN
- || !maybe_hot_bb_p (bb))
- continue;
- for (prev = PREV_INSN (ret); prev; prev = PREV_INSN (prev))
- if (active_insn_p (prev) || GET_CODE (prev) == CODE_LABEL)
- break;
- if (prev && GET_CODE (prev) == CODE_LABEL)
- {
- edge e;
- for (e = bb->pred; e; e = e->pred_next)
- if (EDGE_FREQUENCY (e) && e->src->index >= 0
- && !(e->flags & EDGE_FALLTHRU))
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
+ {
+ basic_block bb = e->src;
+ rtx ret = BB_END (bb);
+ rtx prev;
+ bool replace = false;
+
+ if (GET_CODE (ret) != JUMP_INSN || GET_CODE (PATTERN (ret)) != RETURN
+ || !maybe_hot_bb_p (bb))
+ continue;
+ for (prev = PREV_INSN (ret); prev; prev = PREV_INSN (prev))
+ if (active_insn_p (prev) || GET_CODE (prev) == CODE_LABEL)
+ break;
+ if (prev && GET_CODE (prev) == CODE_LABEL)
+ {
+ edge e;
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, bb->preds)
+ if (EDGE_FREQUENCY (e) && e->src->index >= 0
+ && !(e->flags & EDGE_FALLTHRU))
+ replace = true;
+ }
+ if (!replace)
+ {
+ prev = prev_active_insn (ret);
+ if (prev
+ && ((GET_CODE (prev) == JUMP_INSN && any_condjump_p (prev))
+ || GET_CODE (prev) == CALL_INSN))
replace = true;
- }
- if (!replace)
- {
- prev = prev_active_insn (ret);
- if (prev
- && ((GET_CODE (prev) == JUMP_INSN && any_condjump_p (prev))
- || GET_CODE (prev) == CALL_INSN))
- replace = true;
- /* Empty functions get branch mispredict even when the jump destination
- is not visible to us. */
- if (!prev && cfun->function_frequency > FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
- replace = true;
- }
- if (replace)
- {
- emit_insn_before (gen_return_internal_long (), ret);
- delete_insn (ret);
- }
- }
+ /* Empty functions get branch mispredict even when the jump destination
+ is not visible to us. */
+ if (!prev && cfun->function_frequency > FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
+ replace = true;
+ }
+ if (replace)
+ {
+ emit_insn_before (gen_return_internal_long (), ret);
+ delete_insn (ret);
+ }
+ }
}
/* Implement machine specific optimizations. We implement padding of returns
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index 871c52de502..b51cc7a9408 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -2033,8 +2033,9 @@ ia64_expand_prologue (void)
if (optimize)
{
edge e;
+ edge_iterator ei;
- for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
if ((e->flags & EDGE_FAKE) == 0
&& (e->flags & EDGE_FALLTHRU) != 0)
break;
diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h
index 04d92d442b6..13b673c49df 100644
--- a/gcc/config/rs6000/linux64.h
+++ b/gcc/config/rs6000/linux64.h
@@ -57,7 +57,9 @@ extern int dot_symbols;
#define DOT_SYMBOLS dot_symbols
#endif
-#undef PROCESSOR_DEFAULT64
+#undef PROCESSOR_DEFAULT
+#define PROCESSOR_DEFAULT PROCESSOR_POWER4
+#undef PROCESSOR_DEFAULT64
#define PROCESSOR_DEFAULT64 PROCESSOR_POWER4
#undef TARGET_RELOCATABLE
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 39ace238fa3..f12f7b35941 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -3189,6 +3189,7 @@ legitimate_indexed_address_p (rtx x, int strict)
if (GET_CODE (x) != PLUS)
return false;
+
op0 = XEXP (x, 0);
op1 = XEXP (x, 1);
@@ -3805,6 +3806,14 @@ rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
int
rs6000_legitimate_address (enum machine_mode mode, rtx x, int reg_ok_strict)
{
+ /* If this is an unaligned stvx/ldvx type address, discard the outer AND. */
+ if (TARGET_ALTIVEC
+ && ALTIVEC_VECTOR_MODE (mode)
+ && GET_CODE (x) == AND
+ && GET_CODE (XEXP (x, 1)) == CONST_INT
+ && INTVAL (XEXP (x, 1)) == -16)
+ x = XEXP (x, 0);
+
if (RS6000_SYMBOL_REF_TLS_P (x))
return 0;
if (legitimate_indirect_address_p (x, reg_ok_strict))
@@ -10559,6 +10568,11 @@ print_operand (FILE *file, rtx x, int code)
/* Fall through. Must be [reg+reg]. */
}
+ if (TARGET_ALTIVEC
+ && GET_CODE (tmp) == AND
+ && GET_CODE (XEXP (tmp, 1)) == CONST_INT
+ && INTVAL (XEXP (tmp, 1)) == -16)
+ tmp = XEXP (tmp, 0);
if (GET_CODE (tmp) == REG)
fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
else if (GET_CODE (tmp) == PLUS && GET_CODE (XEXP (tmp, 1)) == REG)
@@ -13541,7 +13555,7 @@ rs6000_emit_prologue (void)
&& DEFAULT_ABI != ABI_AIX
&& flag_pic
&& ! info->lr_save_p
- && EXIT_BLOCK_PTR->pred != NULL);
+ && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0);
if (save_LR_around_toc_setup)
{
rtx lr = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
diff --git a/gcc/config/s390/s390-protos.h b/gcc/config/s390/s390-protos.h
index 359e20cd87b..8846f25c310 100644
--- a/gcc/config/s390/s390-protos.h
+++ b/gcc/config/s390/s390-protos.h
@@ -23,8 +23,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
extern void optimization_options (int, int);
extern void override_options (void);
-extern HOST_WIDE_INT s390_arg_frame_offset (void);
-extern HOST_WIDE_INT s390_return_address_offset (void);
+extern bool s390_can_eliminate (int, int);
+extern HOST_WIDE_INT s390_initial_elimination_offset (int, int);
extern void s390_emit_prologue (void);
extern void s390_emit_epilogue (bool);
extern void s390_function_profiler (FILE *, int);
@@ -84,6 +84,9 @@ extern bool s390_expand_addcc (enum rtx_code, rtx, rtx, rtx, rtx, rtx);
extern rtx s390_return_addr_rtx (int, rtx);
extern rtx s390_back_chain_rtx (void);
extern rtx s390_emit_call (rtx, rtx, rtx, rtx);
+extern void s390_expand_logical_operator (enum rtx_code,
+ enum machine_mode, rtx *);
+extern bool s390_logical_operator_ok_p (rtx *);
extern bool s390_output_addr_const_extra (FILE*, rtx);
extern void print_operand_address (FILE *, rtx);
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 7556b322669..411b06f7f32 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -67,7 +67,6 @@ static void s390_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
HOST_WIDE_INT, tree);
static enum attr_type s390_safe_attr_type (rtx);
-static int s390_adjust_cost (rtx, rtx, rtx, int);
static int s390_adjust_priority (rtx, int);
static int s390_issue_rate (void);
static int s390_first_cycle_multipass_dfa_lookahead (void);
@@ -121,8 +120,6 @@ static bool s390_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode mode,
#undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
#define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_tree_hwi_hwi_tree_true
-#undef TARGET_SCHED_ADJUST_COST
-#define TARGET_SCHED_ADJUST_COST s390_adjust_cost
#undef TARGET_SCHED_ADJUST_PRIORITY
#define TARGET_SCHED_ADJUST_PRIORITY s390_adjust_priority
#undef TARGET_SCHED_ISSUE_RATE
@@ -257,6 +254,9 @@ struct machine_function GTY(())
/* Literal pool base register. */
rtx base_reg;
+ /* True if we may need to perform branch splitting. */
+ bool split_branches_pending_p;
+
/* Some local-dynamic TLS symbol name. */
const char *some_ld_name;
};
@@ -292,11 +292,13 @@ static void find_constant_pool_ref (rtx, rtx *);
static void replace_constant_pool_ref (rtx *, rtx, rtx);
static rtx find_ltrel_base (rtx);
static void replace_ltrel_base (rtx *);
-static void s390_optimize_prologue (bool);
+static void s390_optimize_prologue (void);
static int find_unused_clobbered_reg (void);
static void s390_frame_area (int *, int *);
-static void s390_register_info (int, int);
-static void s390_frame_info (int, int);
+static void s390_register_info (int []);
+static void s390_frame_info (void);
+static void s390_init_frame_layout (void);
+static void s390_update_frame_layout (void);
static rtx save_fpr (rtx, int, int);
static rtx restore_fpr (rtx, int, int);
static rtx save_gprs (rtx, int, int, int);
@@ -1057,6 +1059,76 @@ s390_split_ok_p (rtx dst, rtx src, enum machine_mode mode, int first_subword)
return true;
}
+/* Expand logical operator CODE in mode MODE with operands OPERANDS. */
+
+void
+s390_expand_logical_operator (enum rtx_code code, enum machine_mode mode,
+ rtx *operands)
+{
+ enum machine_mode wmode = mode;
+ rtx dst = operands[0];
+ rtx src1 = operands[1];
+ rtx src2 = operands[2];
+ rtx op, clob, tem;
+
+ /* If we cannot handle the operation directly, use a temp register. */
+ if (!s390_logical_operator_ok_p (operands))
+ dst = gen_reg_rtx (mode);
+
+ /* QImode and HImode patterns make sense only if we have a destination
+ in memory. Otherwise perform the operation in SImode. */
+ if ((mode == QImode || mode == HImode) && GET_CODE (dst) != MEM)
+ wmode = SImode;
+
+ /* Widen operands if required. */
+ if (mode != wmode)
+ {
+ if (GET_CODE (dst) == SUBREG
+ && (tem = simplify_subreg (wmode, dst, mode, 0)) != 0)
+ dst = tem;
+ else if (REG_P (dst))
+ dst = gen_rtx_SUBREG (wmode, dst, 0);
+ else
+ dst = gen_reg_rtx (wmode);
+
+ if (GET_CODE (src1) == SUBREG
+ && (tem = simplify_subreg (wmode, src1, mode, 0)) != 0)
+ src1 = tem;
+ else if (GET_MODE (src1) != VOIDmode)
+ src1 = gen_rtx_SUBREG (wmode, force_reg (mode, src1), 0);
+
+ if (GET_CODE (src2) == SUBREG
+ && (tem = simplify_subreg (wmode, src2, mode, 0)) != 0)
+ src2 = tem;
+ else if (GET_MODE (src2) != VOIDmode)
+ src2 = gen_rtx_SUBREG (wmode, force_reg (mode, src2), 0);
+ }
+
+ /* Emit the instruction. */
+ op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_ee (code, wmode, src1, src2));
+ clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, CC_REGNUM));
+ emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
+
+ /* Fix up the destination if needed. */
+ if (dst != operands[0])
+ emit_move_insn (operands[0], gen_lowpart (mode, dst));
+}
+
+/* Check whether OPERANDS are OK for a logical operation (AND, IOR, XOR). */
+
+bool
+s390_logical_operator_ok_p (rtx *operands)
+{
+ /* If the destination operand is in memory, it needs to coincide
+ with one of the source operands. After reload, it has to be
+ the first source operand. */
+ if (GET_CODE (operands[0]) == MEM)
+ return rtx_equal_p (operands[0], operands[1])
+ || (!reload_completed && rtx_equal_p (operands[0], operands[2]));
+
+ return true;
+}
+
/* Change optimizations to be performed, depending on the
optimization level.
@@ -2065,12 +2137,6 @@ legitimate_reload_constant_p (register rtx op)
enum reg_class
s390_preferred_reload_class (rtx op, enum reg_class class)
{
- /* This can happen if a floating point constant is being
- reloaded into an integer register. Leave well alone. */
- if (GET_MODE_CLASS (GET_MODE (op)) == MODE_FLOAT
- && class != FP_REGS)
- return class;
-
switch (GET_CODE (op))
{
/* Constants we cannot reload must be forced into the
@@ -2114,7 +2180,17 @@ s390_secondary_input_reload_class (enum reg_class class ATTRIBUTE_UNUSED,
enum machine_mode mode, rtx in)
{
if (s390_plus_operand (in, mode))
- return ADDR_REGS;
+ {
+ /* ??? Reload sometimes pushes a PLUS reload with a too-large constant.
+ Until reload is fixed, we need to force_const_mem while emitting the
+ secondary reload insn -- thus we need to make sure here that we do
+ have a literal pool for the current function. */
+ if (CONSTANT_P (XEXP (in, 1))
+ && !legitimate_reload_constant_p (XEXP (in, 1)))
+ current_function_uses_const_pool = true;
+
+ return ADDR_REGS;
+ }
return NO_REGS;
}
@@ -2196,6 +2272,10 @@ s390_expand_plus_operand (register rtx target, register rtx src,
}
if (true_regnum (sum2) < 1 || true_regnum (sum2) > 15)
{
+ /* ??? See comment in s390_secondary_input_reload_class. */
+ if (CONSTANT_P (sum2) && !legitimate_reload_constant_p (sum2))
+ sum2 = force_const_mem (Pmode, sum2);
+
emit_move_insn (scratch, sum2);
sum2 = scratch;
}
@@ -4167,41 +4247,6 @@ s390_agen_dep_p (rtx dep_insn, rtx insn)
return 0;
}
-/* Return the modified cost of the dependency of instruction INSN
- on instruction DEP_INSN through the link LINK. COST is the
- default cost of that dependency.
-
- Data dependencies are all handled without delay. However, if a
- register is modified and subsequently used as base or index
- register of a memory reference, at least 4 cycles need to pass
- between setting and using the register to avoid pipeline stalls.
- An exception is the LA instruction. An address generated by LA can
- be used by introducing only a one cycle stall on the pipeline. */
-
-static int
-s390_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
-{
- /* If the dependence is an anti-dependence, there is no cost. For an
- output dependence, there is sometimes a cost, but it doesn't seem
- worth handling those few cases. */
-
- if (REG_NOTE_KIND (link) != 0)
- return 0;
-
- /* If we can't recognize the insns, we can't really do anything. */
- if (recog_memoized (insn) < 0 || recog_memoized (dep_insn) < 0)
- return cost;
-
- /* Operand forward in case of lr, load and la. */
- if (s390_tune == PROCESSOR_2084_Z990
- && cost == 1
- && (s390_safe_attr_type (dep_insn) == TYPE_LA
- || s390_safe_attr_type (dep_insn) == TYPE_LR
- || s390_safe_attr_type (dep_insn) == TYPE_LOAD))
- return 0;
- return cost;
-}
-
/* A C statement (sans semicolon) to update the integer scheduling priority
INSN_PRIORITY (INSN). Increase the priority to execute the INSN earlier,
reduce the priority to execute INSN later. Do not define this macro if
@@ -4226,6 +4271,7 @@ s390_adjust_priority (rtx insn ATTRIBUTE_UNUSED, int priority)
priority = priority << 3;
break;
case TYPE_STORE:
+ case TYPE_STM:
priority = priority << 1;
break;
default:
@@ -4924,7 +4970,7 @@ s390_mainpool_start (void)
}
}
- if (!pool->pool_insn)
+ if (!pool->pool_insn && pool->size > 0)
abort ();
if (pool->size >= 4096)
@@ -4947,13 +4993,17 @@ s390_mainpool_start (void)
static void
s390_mainpool_finish (struct constant_pool *pool)
{
- rtx base_reg = SET_DEST (PATTERN (pool->pool_insn));
+ rtx base_reg = cfun->machine->base_reg;
rtx insn;
/* If the pool is empty, we're done. */
if (pool->size == 0)
{
- remove_insn (pool->pool_insn);
+ /* We don't actually need a base register after all. */
+ cfun->machine->base_reg = NULL_RTX;
+
+ if (pool->pool_insn)
+ remove_insn (pool->pool_insn);
s390_free_pool (pool);
return;
}
@@ -5466,20 +5516,16 @@ s390_output_pool_entry (rtx exp, enum machine_mode mode, unsigned int align)
/* Rework the prologue/epilogue to avoid saving/restoring
- registers unnecessarily. BASE_USED specifies whether
- the literal pool base register needs to be saved. */
+ registers unnecessarily. */
static void
-s390_optimize_prologue (bool base_used)
+s390_optimize_prologue (void)
{
rtx insn, new_insn, next_insn;
/* Do a final recompute of the frame-related data. */
- s390_register_info (base_used, cfun_frame_layout.save_return_addr_p);
- regs_ever_live[BASE_REGNUM] = base_used;
- regs_ever_live[RETURN_REGNUM] = cfun_frame_layout.save_return_addr_p;
- regs_ever_live[STACK_POINTER_REGNUM] = cfun_frame_layout.frame_size > 0;
+ s390_update_frame_layout ();
/* If all special registers are in fact used, there's nothing we
can do, so no point in walking the insn list. */
@@ -5538,10 +5584,13 @@ s390_optimize_prologue (bool base_used)
if (GET_CODE (PATTERN (insn)) == SET
&& GET_CODE (SET_SRC (PATTERN (insn))) == REG
- && REGNO (SET_SRC (PATTERN (insn))) == BASE_REGNUM
+ && (REGNO (SET_SRC (PATTERN (insn))) == BASE_REGNUM
+ || (!TARGET_CPU_ZARCH
+ && REGNO (SET_SRC (PATTERN (insn))) == RETURN_REGNUM))
&& GET_CODE (SET_DEST (PATTERN (insn))) == MEM)
{
set = PATTERN (insn);
+ first = REGNO (SET_SRC (set));
offset = const0_rtx;
base = eliminate_constant_term (XEXP (SET_DEST (set), 0), &offset);
off = INTVAL (offset);
@@ -5555,7 +5604,7 @@ s390_optimize_prologue (bool base_used)
{
new_insn = save_gprs (base,
off + (cfun_frame_layout.first_save_gpr
- - BASE_REGNUM) * UNITS_PER_WORD,
+ - first) * UNITS_PER_WORD,
cfun_frame_layout.first_save_gpr,
cfun_frame_layout.last_save_gpr);
new_insn = emit_insn_before (new_insn, insn);
@@ -5601,10 +5650,13 @@ s390_optimize_prologue (bool base_used)
if (GET_CODE (PATTERN (insn)) == SET
&& GET_CODE (SET_DEST (PATTERN (insn))) == REG
- && REGNO (SET_DEST (PATTERN (insn))) == BASE_REGNUM
+ && (REGNO (SET_DEST (PATTERN (insn))) == BASE_REGNUM
+ || (!TARGET_CPU_ZARCH
+ && REGNO (SET_DEST (PATTERN (insn))) == RETURN_REGNUM))
&& GET_CODE (SET_SRC (PATTERN (insn))) == MEM)
{
set = PATTERN (insn);
+ first = REGNO (SET_DEST (set));
offset = const0_rtx;
base = eliminate_constant_term (XEXP (SET_SRC (set), 0), &offset);
off = INTVAL (offset);
@@ -5618,7 +5670,7 @@ s390_optimize_prologue (bool base_used)
{
new_insn = restore_gprs (base,
off + (cfun_frame_layout.first_restore_gpr
- - BASE_REGNUM) * UNITS_PER_WORD,
+ - first) * UNITS_PER_WORD,
cfun_frame_layout.first_restore_gpr,
cfun_frame_layout.last_restore_gpr);
new_insn = emit_insn_before (new_insn, insn);
@@ -5636,7 +5688,6 @@ s390_optimize_prologue (bool base_used)
static void
s390_reorg (void)
{
- bool base_used = false;
bool pool_overflow = false;
/* Make sure all splits have been performed; splits after
@@ -5709,19 +5760,17 @@ s390_reorg (void)
/* If we made it up to here, both conditions are satisfied.
Finish up literal pool related changes. */
- if ((pool_overflow || pool->size > 0)
- && REGNO (cfun->machine->base_reg) == BASE_REGNUM)
- base_used = true;
-
if (pool_overflow)
s390_chunkify_finish (pool);
else
s390_mainpool_finish (pool);
+ /* We're done splitting branches. */
+ cfun->machine->split_branches_pending_p = false;
break;
}
- s390_optimize_prologue (base_used);
+ s390_optimize_prologue ();
}
@@ -5835,14 +5884,12 @@ s390_frame_area (int *area_bottom, int *area_top)
*area_top = t;
}
-/* Fill cfun->machine with info about register usage of current
- function. BASE_USED and RETURN_ADDR_USED specify whether we assume the
- base and return address register will need to be saved. */
+/* Fill cfun->machine with info about register usage of current function.
+ Return in LIVE_REGS which GPRs are currently considered live. */
static void
-s390_register_info (int base_used, int return_addr_used)
+s390_register_info (int live_regs[])
{
- int live_regs[16];
int i, j;
/* fprs 8 - 15 are call saved for 64 Bit ABI. */
@@ -5866,17 +5913,24 @@ s390_register_info (int base_used, int return_addr_used)
live_regs[i] = regs_ever_live[i] && !global_regs[i];
if (flag_pic)
- live_regs[PIC_OFFSET_TABLE_REGNUM] =
- regs_ever_live[PIC_OFFSET_TABLE_REGNUM];
-
- live_regs[BASE_REGNUM] = base_used;
- live_regs[RETURN_REGNUM] = return_addr_used;
- live_regs[STACK_POINTER_REGNUM] = (!current_function_is_leaf
- || TARGET_TPF_PROFILING
- || cfun_save_high_fprs_p
- || get_frame_size () > 0
- || current_function_calls_alloca
- || current_function_stdarg);
+ live_regs[PIC_OFFSET_TABLE_REGNUM]
+ = regs_ever_live[PIC_OFFSET_TABLE_REGNUM];
+
+ live_regs[BASE_REGNUM]
+ = cfun->machine->base_reg
+ && REGNO (cfun->machine->base_reg) == BASE_REGNUM;
+
+ live_regs[RETURN_REGNUM]
+ = cfun->machine->split_branches_pending_p
+ || cfun_frame_layout.save_return_addr_p;
+
+ live_regs[STACK_POINTER_REGNUM]
+ = !current_function_is_leaf
+ || TARGET_TPF_PROFILING
+ || cfun_save_high_fprs_p
+ || get_frame_size () > 0
+ || current_function_calls_alloca
+ || current_function_stdarg;
for (i = 6; i < 16; i++)
if (live_regs[i])
@@ -5924,19 +5978,14 @@ s390_register_info (int base_used, int return_addr_used)
cfun_set_fpr_bit (i);
}
-/* Fill cfun->machine with info about frame of current
- function. BASE_USED and RETURN_ADDR_USED specify whether we assume the
- base and return address register will need to be saved. */
+/* Fill cfun->machine with info about frame of current function. */
static void
-s390_frame_info (int base_used, int return_addr_used)
+s390_frame_info (void)
{
int i;
cfun_frame_layout.frame_size = get_frame_size ();
-
- s390_register_info (base_used, return_addr_used);
-
if (!TARGET_64BIT && cfun_frame_layout.frame_size > 0x7fff0000)
fatal_error ("Total size of local variables exceeds architecture limit.");
@@ -6040,37 +6089,136 @@ s390_frame_info (int base_used, int return_addr_used)
}
}
-/* Return offset between argument pointer and frame pointer
- initially after prologue. */
+/* Generate frame layout. Fills in register and frame data for the current
+ function in cfun->machine. This routine can be called multiple times;
+ it will re-do the complete frame layout every time. */
-HOST_WIDE_INT
-s390_arg_frame_offset (void)
+static void
+s390_init_frame_layout (void)
+{
+ HOST_WIDE_INT frame_size;
+ int base_used;
+ int live_regs[16];
+
+ /* If return address register is explicitly used, we need to save it. */
+ if (regs_ever_live[RETURN_REGNUM]
+ || !current_function_is_leaf
+ || TARGET_TPF_PROFILING
+ || current_function_stdarg
+ || current_function_calls_eh_return)
+ cfun_frame_layout.save_return_addr_p = true;
+
+ /* On S/390 machines, we may need to perform branch splitting, which
+ will require both base and return address register. We have no
+ choice but to assume we're going to need them until right at the
+ end of the machine dependent reorg phase. */
+ if (!TARGET_CPU_ZARCH)
+ cfun->machine->split_branches_pending_p = true;
+
+ do
+ {
+ frame_size = cfun_frame_layout.frame_size;
+
+ /* Try to predict whether we'll need the base register. */
+ base_used = cfun->machine->split_branches_pending_p
+ || current_function_uses_const_pool
+ || (!DISP_IN_RANGE (-frame_size)
+ && !CONST_OK_FOR_CONSTRAINT_P (-frame_size, 'K', "K"));
+
+ /* Decide which register to use as literal pool base. In small
+ leaf functions, try to use an unused call-clobbered register
+ as base register to avoid save/restore overhead. */
+ if (!base_used)
+ cfun->machine->base_reg = NULL_RTX;
+ else if (current_function_is_leaf && !regs_ever_live[5])
+ cfun->machine->base_reg = gen_rtx_REG (Pmode, 5);
+ else
+ cfun->machine->base_reg = gen_rtx_REG (Pmode, BASE_REGNUM);
+
+ s390_register_info (live_regs);
+ s390_frame_info ();
+ }
+ while (frame_size != cfun_frame_layout.frame_size);
+}
+
+/* Update frame layout. Recompute actual register save data based on
+ current info and update regs_ever_live for the special registers.
+ May be called multiple times, but may never cause *more* registers
+ to be saved than s390_init_frame_layout allocated room for. */
+
+static void
+s390_update_frame_layout (void)
+{
+ int live_regs[16];
+
+ s390_register_info (live_regs);
+
+ regs_ever_live[BASE_REGNUM] = live_regs[BASE_REGNUM];
+ regs_ever_live[RETURN_REGNUM] = live_regs[RETURN_REGNUM];
+ regs_ever_live[STACK_POINTER_REGNUM] = live_regs[STACK_POINTER_REGNUM];
+
+ if (cfun->machine->base_reg)
+ regs_ever_live[REGNO (cfun->machine->base_reg)] = 1;
+}
+
+/* Return true if register FROM can be eliminated via register TO. */
+
+bool
+s390_can_eliminate (int from, int to)
{
- /* See the comment in s390_emit_prologue about the assumptions we make
- whether or not the base and return address register need to be saved. */
- int return_addr_used = !current_function_is_leaf
- || TARGET_TPF_PROFILING
- || regs_ever_live[RETURN_REGNUM]
- || cfun_frame_layout.save_return_addr_p;
+ gcc_assert (to == STACK_POINTER_REGNUM
+ || to == HARD_FRAME_POINTER_REGNUM);
+
+ gcc_assert (from == FRAME_POINTER_REGNUM
+ || from == ARG_POINTER_REGNUM
+ || from == RETURN_ADDRESS_POINTER_REGNUM);
- s390_frame_info (1, !TARGET_CPU_ZARCH || return_addr_used);
+ /* Make sure we actually saved the return address. */
+ if (from == RETURN_ADDRESS_POINTER_REGNUM)
+ if (!current_function_calls_eh_return
+ && !current_function_stdarg
+ && !cfun_frame_layout.save_return_addr_p)
+ return false;
- return cfun_frame_layout.frame_size + STACK_POINTER_OFFSET;
+ return true;
}
-/* Return offset between return address pointer (location of r14
- on the stack) and frame pointer initially after prologue. */
+/* Return offset between register FROM and TO initially after prolog. */
HOST_WIDE_INT
-s390_return_address_offset (void)
+s390_initial_elimination_offset (int from, int to)
{
- s390_frame_info (1, 1);
+ HOST_WIDE_INT offset;
+ int index;
- if (cfun_frame_layout.last_save_gpr < RETURN_REGNUM)
- abort ();
+ /* ??? Why are we called for non-eliminable pairs? */
+ if (!s390_can_eliminate (from, to))
+ return 0;
+
+ switch (from)
+ {
+ case FRAME_POINTER_REGNUM:
+ offset = 0;
+ break;
+
+ case ARG_POINTER_REGNUM:
+ s390_init_frame_layout ();
+ offset = cfun_frame_layout.frame_size + STACK_POINTER_OFFSET;
+ break;
+
+ case RETURN_ADDRESS_POINTER_REGNUM:
+ s390_init_frame_layout ();
+ index = RETURN_REGNUM - cfun_frame_layout.first_save_gpr;
+ gcc_assert (index >= 0);
+ offset = cfun_frame_layout.frame_size + cfun_frame_layout.gprs_offset;
+ offset += index * UNITS_PER_WORD;
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
- return (cfun_frame_layout.frame_size + cfun_frame_layout.gprs_offset
- + (RETURN_REGNUM - cfun_frame_layout.first_save_gpr) * UNITS_PER_WORD);
+ return offset;
}
/* Emit insn to save fpr REGNUM at offset OFFSET relative
@@ -6259,41 +6407,9 @@ s390_emit_prologue (void)
int offset;
int next_fpr = 0;
- /* At this point, we decide whether we'll need to save/restore the
- return address register. This decision is final on zSeries machines;
- on S/390 it can still be overridden in s390_split_branches. */
-
- if (!current_function_is_leaf
- || TARGET_TPF_PROFILING
- || regs_ever_live[RETURN_REGNUM])
- cfun_frame_layout.save_return_addr_p = 1;
-
- /* Decide which register to use as literal pool base. In small leaf
- functions, try to use an unused call-clobbered register as base
- register to avoid save/restore overhead. */
-
- if (current_function_is_leaf && !regs_ever_live[5])
- cfun->machine->base_reg = gen_rtx_REG (Pmode, 5);
- else
- cfun->machine->base_reg = gen_rtx_REG (Pmode, BASE_REGNUM);
-
- regs_ever_live[REGNO (cfun->machine->base_reg)] = 1;
-
- /* Compute frame info. Note that at this point, we assume the base
- register and -on S/390- the return register always need to be saved.
- This is done because the usage of these registers might change even
- after the prologue was emitted. If it turns out later that we really
- don't need them, the prologue/epilogue code is modified again. */
-
- s390_frame_info (1, !TARGET_CPU_ZARCH
- || cfun_frame_layout.save_return_addr_p);
-
- /* We need to update regs_ever_live to avoid data-flow problems. */
+ /* Complete frame layout. */
- regs_ever_live[BASE_REGNUM] = 1;
- regs_ever_live[RETURN_REGNUM] = (!TARGET_CPU_ZARCH
- || cfun_frame_layout.save_return_addr_p);
- regs_ever_live[STACK_POINTER_REGNUM] = cfun_frame_layout.frame_size > 0;
+ s390_update_frame_layout ();
/* Annotate all constant pool references to let the scheduler know
they implicitly use the base register. */
@@ -6326,7 +6442,8 @@ s390_emit_prologue (void)
/* Dummy insn to mark literal pool slot. */
- emit_insn (gen_main_pool (cfun->machine->base_reg));
+ if (cfun->machine->base_reg)
+ emit_insn (gen_main_pool (cfun->machine->base_reg));
offset = cfun_frame_layout.f0_offset;
diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h
index 5b083aadbe6..9814561e052 100644
--- a/gcc/config/s390/s390.h
+++ b/gcc/config/s390/s390.h
@@ -652,26 +652,11 @@ extern int current_function_outgoing_args_size;
{ RETURN_ADDRESS_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
{ RETURN_ADDRESS_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}}
-#define CAN_ELIMINATE(FROM, TO) (1)
-
-#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
-{ if ((FROM) == FRAME_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM) \
- { (OFFSET) = 0; } \
- else if ((FROM) == FRAME_POINTER_REGNUM \
- && (TO) == HARD_FRAME_POINTER_REGNUM) \
- { (OFFSET) = 0; } \
- else if ((FROM) == ARG_POINTER_REGNUM \
- && (TO) == HARD_FRAME_POINTER_REGNUM) \
- { (OFFSET) = s390_arg_frame_offset (); } \
- else if ((FROM) == ARG_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM) \
- { (OFFSET) = s390_arg_frame_offset (); } \
- else if ((FROM) == RETURN_ADDRESS_POINTER_REGNUM \
- && ((TO) == STACK_POINTER_REGNUM \
- || (TO) == HARD_FRAME_POINTER_REGNUM)) \
- { (OFFSET) = s390_return_address_offset (); } \
- else \
- abort(); \
-}
+#define CAN_ELIMINATE(FROM, TO) \
+ s390_can_eliminate ((FROM), (TO))
+
+#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
+ (OFFSET) = s390_initial_elimination_offset ((FROM), (TO))
/* Stack arguments. */
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index e5e0aabf3dc..86d13b8a871 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -827,14 +827,6 @@
/* Handle symbolic constants. */
if (TARGET_64BIT && SYMBOLIC_CONST (operands[1]))
emit_symbolic_move (operands);
-
- /* During and after reload, we need to force constants
- to the literal pool ourselves, if necessary. */
- if ((reload_in_progress || reload_completed)
- && CONSTANT_P (operands[1])
- && (!legitimate_reload_constant_p (operands[1])
- || FP_REG_P (operands[0])))
- operands[1] = force_const_mem (DImode, operands[1]);
})
(define_insn "*movdi_larl"
@@ -1011,27 +1003,6 @@
/* Handle symbolic constants. */
if (!TARGET_64BIT && SYMBOLIC_CONST (operands[1]))
emit_symbolic_move (operands);
-
- /* expr.c tries to load an effective address using
- force_reg. This fails because we don't have a
- generic load_address pattern. Convert the move
- to a proper arithmetic operation instead, unless
- it is guaranteed to be OK. */
- if (GET_CODE (operands[1]) == PLUS
- && !legitimate_la_operand_p (operands[1]))
- {
- operands[1] = force_operand (operands[1], operands[0]);
- if (operands[1] == operands[0])
- DONE;
- }
-
- /* During and after reload, we need to force constants
- to the literal pool ourselves, if necessary. */
- if ((reload_in_progress || reload_completed)
- && CONSTANT_P (operands[1])
- && (!legitimate_reload_constant_p (operands[1])
- || FP_REG_P (operands[0])))
- operands[1] = force_const_mem (SImode, operands[1]);
})
(define_insn "*movsi_larl"
@@ -1321,13 +1292,7 @@
[(set (match_operand:DF 0 "nonimmediate_operand" "")
(match_operand:DF 1 "general_operand" ""))]
""
-{
- /* During and after reload, we need to force constants
- to the literal pool ourselves, if necessary. */
- if ((reload_in_progress || reload_completed)
- && CONSTANT_P (operands[1]))
- operands[1] = force_const_mem (DFmode, operands[1]);
-})
+ "")
(define_insn "*movdf_64"
[(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,f,R,T,d,d,m,?Q")
@@ -1421,19 +1386,7 @@
; movsf instruction pattern(s).
;
-(define_expand "movsf"
- [(set (match_operand:SF 0 "nonimmediate_operand" "")
- (match_operand:SF 1 "general_operand" ""))]
- ""
-{
- /* During and after reload, we need to force constants
- to the literal pool ourselves, if necessary. */
- if ((reload_in_progress || reload_completed)
- && CONSTANT_P (operands[1]))
- operands[1] = force_const_mem (SFmode, operands[1]);
-})
-
-(define_insn "*movsf"
+(define_insn "movsf"
[(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,f,R,T,d,d,d,R,T,?Q")
(match_operand:SF 1 "general_operand" "f,R,T,f,f,d,R,T,d,d,?Q"))]
""
@@ -5054,41 +5007,33 @@
ng\t%0,%2"
[(set_attr "op_type" "RRE,RXY")])
-(define_insn "anddi3"
- [(set (match_operand:DI 0 "register_operand" "=d,d,d,d,d,d,d,d")
- (and:DI (match_operand:DI 1 "nonimmediate_operand" "d,o,0,0,0,0,0,0")
- (match_operand:DI 2 "general_operand"
- "M,M,N0HDF,N1HDF,N2HDF,N3HDF,d,m")))
- (clobber (reg:CC 33))]
- "TARGET_64BIT"
- "@
- #
- #
- nihh\t%0,%j2
- nihl\t%0,%j2
- nilh\t%0,%j2
- nill\t%0,%j2
- ngr\t%0,%2
- ng\t%0,%2"
- [(set_attr "op_type" "RRE,RXE,RI,RI,RI,RI,RRE,RXY")])
-
-(define_insn "*anddi3_ss"
- [(set (match_operand:DI 0 "s_operand" "=Q")
- (and:DI (match_dup 0)
- (match_operand:DI 1 "s_imm_operand" "Q")))
+(define_insn "*anddi3"
+ [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,d,Q")
+ (and:DI (match_operand:DI 1 "nonimmediate_operand"
+ "%d,o,0,0,0,0,0,0,0")
+ (match_operand:DI 2 "general_operand"
+ "M,M,N0HDF,N1HDF,N2HDF,N3HDF,d,m,Q")))
(clobber (reg:CC 33))]
- ""
- "nc\t%O0(8,%R0),%1"
- [(set_attr "op_type" "SS")])
+ "TARGET_64BIT && s390_logical_operator_ok_p (operands)"
+ "@
+ #
+ #
+ nihh\t%0,%j2
+ nihl\t%0,%j2
+ nilh\t%0,%j2
+ nill\t%0,%j2
+ ngr\t%0,%2
+ ng\t%0,%2
+ nc\t%O0(8,%R0),%2"
+ [(set_attr "op_type" "RRE,RXE,RI,RI,RI,RI,RRE,RXY,SS")])
-(define_insn "*anddi3_ss_inv"
- [(set (match_operand:DI 0 "s_operand" "=Q")
- (and:DI (match_operand:DI 1 "s_imm_operand" "Q")
- (match_dup 0)))
+(define_expand "anddi3"
+ [(set (match_operand:DI 0 "nonimmediate_operand" "")
+ (and:DI (match_operand:DI 1 "nonimmediate_operand" "")
+ (match_operand:DI 2 "general_operand" "")))
(clobber (reg:CC 33))]
- ""
- "nc\t%O0(8,%R0),%1"
- [(set_attr "op_type" "SS")])
+ "TARGET_64BIT"
+ "s390_expand_logical_operator (AND, DImode, operands); DONE;")
;
; andsi3 instruction pattern(s).
@@ -5123,21 +5068,12 @@
ny\t%0,%2"
[(set_attr "op_type" "RR,RX,RXY")])
-(define_expand "andsi3"
- [(parallel
- [(set (match_operand:SI 0 "register_operand" "")
- (and:SI (match_operand:SI 1 "nonimmediate_operand" "")
- (match_operand:SI 2 "general_operand" "")))
- (clobber (reg:CC 33))])]
- ""
- "")
-
(define_insn "*andsi3_zarch"
- [(set (match_operand:SI 0 "register_operand" "=d,d,d,d,d,d,d")
- (and:SI (match_operand:SI 1 "nonimmediate_operand" "d,o,0,0,0,0,0")
- (match_operand:SI 2 "general_operand" "M,M,N0HSF,N1HSF,d,R,T")))
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,Q")
+ (and:SI (match_operand:SI 1 "nonimmediate_operand" "%d,o,0,0,0,0,0,0")
+ (match_operand:SI 2 "general_operand" "M,M,N0HSF,N1HSF,d,R,T,Q")))
(clobber (reg:CC 33))]
- "TARGET_ZARCH"
+ "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
"@
#
#
@@ -5145,127 +5081,102 @@
nill\t%0,%j2
nr\t%0,%2
n\t%0,%2
- ny\t%0,%2"
- [(set_attr "op_type" "RRE,RXE,RI,RI,RR,RX,RXY")])
+ ny\t%0,%2
+ nc\t%O0(4,%R0),%2"
+ [(set_attr "op_type" "RRE,RXE,RI,RI,RR,RX,RXY,SS")])
(define_insn "*andsi3_esa"
- [(set (match_operand:SI 0 "register_operand" "=d,d")
- (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
- (match_operand:SI 2 "general_operand" "d,R")))
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,Q")
+ (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0")
+ (match_operand:SI 2 "general_operand" "d,R,Q")))
(clobber (reg:CC 33))]
- "!TARGET_ZARCH"
+ "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
"@
nr\t%0,%2
- n\t%0,%2"
- [(set_attr "op_type" "RR,RX")])
-
-(define_insn "*andsi3_ss"
- [(set (match_operand:SI 0 "s_operand" "=Q")
- (and:SI (match_dup 0)
- (match_operand:SI 1 "s_imm_operand" "Q")))
- (clobber (reg:CC 33))]
- ""
- "nc\t%O0(4,%R0),%1"
- [(set_attr "op_type" "SS")])
+ n\t%0,%2
+ nc\t%O0(4,%R0),%2"
+ [(set_attr "op_type" "RR,RX,SS")])
-(define_insn "*andsi3_ss_inv"
- [(set (match_operand:SI 0 "s_operand" "=Q")
- (and:SI (match_operand:SI 1 "s_imm_operand" "Q")
- (match_dup 0)))
+(define_expand "andsi3"
+ [(set (match_operand:SI 0 "nonimmediate_operand" "")
+ (and:SI (match_operand:SI 1 "nonimmediate_operand" "")
+ (match_operand:SI 2 "general_operand" "")))
(clobber (reg:CC 33))]
""
- "nc\t%O0(4,%R0),%1"
- [(set_attr "op_type" "SS")])
+ "s390_expand_logical_operator (AND, SImode, operands); DONE;")
;
; andhi3 instruction pattern(s).
;
-(define_insn "*andhi3_ni"
- [(set (match_operand:HI 0 "register_operand" "=d,d")
- (and:HI (match_operand:HI 1 "register_operand" "%0,0")
- (match_operand:HI 2 "nonmemory_operand" "d,n")))
+(define_insn "*andhi3_zarch"
+ [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,Q")
+ (and:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0")
+ (match_operand:HI 2 "general_operand" "d,n,Q")))
(clobber (reg:CC 33))]
- "TARGET_ZARCH"
+ "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
"@
nr\t%0,%2
- nill\t%0,%x2"
- [(set_attr "op_type" "RR,RI")])
-
-(define_insn "andhi3"
- [(set (match_operand:HI 0 "register_operand" "=d")
- (and:HI (match_operand:HI 1 "register_operand" "%0")
- (match_operand:HI 2 "nonmemory_operand" "d")))
- (clobber (reg:CC 33))]
- ""
- "nr\t%0,%2"
- [(set_attr "op_type" "RR")])
-
-(define_insn "*andhi3_ss"
- [(set (match_operand:HI 0 "s_operand" "=Q")
- (and:HI (match_dup 0)
- (match_operand:HI 1 "s_imm_operand" "Q")))
+ nill\t%0,%x2
+ nc\t%O0(2,%R0),%2"
+ [(set_attr "op_type" "RR,RI,SS")])
+
+(define_insn "*andhi3_esa"
+ [(set (match_operand:HI 0 "nonimmediate_operand" "=d,Q")
+ (and:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0")
+ (match_operand:HI 2 "general_operand" "d,Q")))
(clobber (reg:CC 33))]
- ""
- "nc\t%O0(2,%R0),%1"
- [(set_attr "op_type" "SS")])
+ "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
+ "@
+ nr\t%0,%2
+ nc\t%O0(2,%R0),%2"
+ [(set_attr "op_type" "RR,SS")])
-(define_insn "*andhi3_ss_inv"
- [(set (match_operand:HI 0 "s_operand" "=Q")
- (and:HI (match_operand:HI 1 "s_imm_operand" "Q")
- (match_dup 0)))
+(define_expand "andhi3"
+ [(set (match_operand:HI 0 "nonimmediate_operand" "")
+ (and:HI (match_operand:HI 1 "nonimmediate_operand" "")
+ (match_operand:HI 2 "general_operand" "")))
(clobber (reg:CC 33))]
""
- "nc\t%O0(2,%R0),%1"
- [(set_attr "op_type" "SS")])
+ "s390_expand_logical_operator (AND, HImode, operands); DONE;")
;
; andqi3 instruction pattern(s).
;
-(define_insn "*andqi3_ni"
- [(set (match_operand:QI 0 "register_operand" "=d,d")
- (and:QI (match_operand:QI 1 "register_operand" "%0,0")
- (match_operand:QI 2 "nonmemory_operand" "d,n")))
+(define_insn "*andqi3_zarch"
+ [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,Q,S,Q")
+ (and:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0,0,0")
+ (match_operand:QI 2 "general_operand" "d,n,n,n,Q")))
(clobber (reg:CC 33))]
- "TARGET_ZARCH"
+ "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
"@
nr\t%0,%2
- nill\t%0,%b2"
- [(set_attr "op_type" "RR,RI")])
-
-(define_insn "andqi3"
- [(set (match_operand:QI 0 "register_operand" "=d")
- (and:QI (match_operand:QI 1 "register_operand" "%0")
- (match_operand:QI 2 "nonmemory_operand" "d")))
- (clobber (reg:CC 33))]
- ""
- "nr\t%0,%2"
- [(set_attr "op_type" "RR")])
-
-(define_insn "*andqi3_ss"
- [(set (match_operand:QI 0 "s_operand" "=Q,S,Q")
- (and:QI (match_dup 0)
- (match_operand:QI 1 "s_imm_operand" "n,n,Q")))
+ nill\t%0,%b2
+ ni\t%0,%b2
+ niy\t%0,%b2
+ nc\t%O0(1,%R0),%2"
+ [(set_attr "op_type" "RR,RI,SI,SIY,SS")])
+
+(define_insn "*andqi3_esa"
+ [(set (match_operand:QI 0 "nonimmediate_operand" "=d,Q,Q")
+ (and:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0")
+ (match_operand:QI 2 "general_operand" "d,n,Q")))
(clobber (reg:CC 33))]
- ""
+ "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
"@
- ni\t%0,%b1
- niy\t%0,%b1
- nc\t%O0(1,%R0),%1"
- [(set_attr "op_type" "SI,SIY,SS")])
+ nr\t%0,%2
+ ni\t%0,%b2
+ nc\t%O0(1,%R0),%2"
+ [(set_attr "op_type" "RR,SI,SS")])
-(define_insn "*andqi3_ss_inv"
- [(set (match_operand:QI 0 "s_operand" "=Q,S,Q")
- (and:QI (match_operand:QI 1 "s_imm_operand" "n,n,Q")
- (match_dup 0)))
+(define_expand "andqi3"
+ [(set (match_operand:QI 0 "nonimmediate_operand" "")
+ (and:QI (match_operand:QI 1 "nonimmediate_operand" "")
+ (match_operand:QI 2 "general_operand" "")))
(clobber (reg:CC 33))]
""
- "@
- ni\t%0,%b1
- niy\t%0,%b1
- nc\t%O0(1,%R0),%1"
- [(set_attr "op_type" "SI,SIY,SS")])
+ "s390_expand_logical_operator (AND, QImode, operands); DONE;")
;;
@@ -5301,38 +5212,30 @@
og\t%0,%2"
[(set_attr "op_type" "RRE,RXY")])
-(define_insn "iordi3"
- [(set (match_operand:DI 0 "register_operand" "=d,d,d,d,d,d")
- (ior:DI (match_operand:DI 1 "nonimmediate_operand" "0,0,0,0,0,0")
- (match_operand:DI 2 "general_operand" "N0HD0,N1HD0,N2HD0,N3HD0,d,m")))
+(define_insn "*iordi3"
+ [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,Q")
+ (ior:DI (match_operand:DI 1 "nonimmediate_operand" "0,0,0,0,0,0,0")
+ (match_operand:DI 2 "general_operand"
+ "N0HD0,N1HD0,N2HD0,N3HD0,d,m,Q")))
(clobber (reg:CC 33))]
- "TARGET_64BIT"
+ "TARGET_64BIT && s390_logical_operator_ok_p (operands)"
"@
oihh\t%0,%i2
oihl\t%0,%i2
oilh\t%0,%i2
oill\t%0,%i2
ogr\t%0,%2
- og\t%0,%2"
- [(set_attr "op_type" "RI,RI,RI,RI,RRE,RXY")])
+ og\t%0,%2
+ oc\t%O0(8,%R0),%2"
+ [(set_attr "op_type" "RI,RI,RI,RI,RRE,RXY,SS")])
-(define_insn "*iordi3_ss"
- [(set (match_operand:DI 0 "s_operand" "=Q")
- (ior:DI (match_dup 0)
- (match_operand:DI 1 "s_imm_operand" "Q")))
- (clobber (reg:CC 33))]
- ""
- "oc\t%O0(8,%R0),%1"
- [(set_attr "op_type" "SS")])
-
-(define_insn "*iordi3_ss_inv"
- [(set (match_operand:DI 0 "s_operand" "=Q")
- (ior:DI (match_operand:DI 1 "s_imm_operand" "Q")
- (match_dup 0)))
+(define_expand "iordi3"
+ [(set (match_operand:DI 0 "nonimmediate_operand" "")
+ (ior:DI (match_operand:DI 1 "nonimmediate_operand" "")
+ (match_operand:DI 2 "general_operand" "")))
(clobber (reg:CC 33))]
- ""
- "oc\t%O0(8,%R0),%1"
- [(set_attr "op_type" "SS")])
+ "TARGET_64BIT"
+ "s390_expand_logical_operator (IOR, DImode, operands); DONE;")
;
; iorsi3 instruction pattern(s).
@@ -5365,147 +5268,113 @@
oy\t%0,%2"
[(set_attr "op_type" "RR,RX,RXY")])
-(define_expand "iorsi3"
- [(parallel
- [(set (match_operand:SI 0 "register_operand" "")
- (ior:SI (match_operand:SI 1 "nonimmediate_operand" "")
- (match_operand:SI 2 "general_operand" "")))
- (clobber (reg:CC 33))])]
- ""
- "")
-
-(define_insn "iorsi3_zarch"
- [(set (match_operand:SI 0 "register_operand" "=d,d,d,d,d")
- (ior:SI (match_operand:SI 1 "nonimmediate_operand" "0,0,0,0,0")
- (match_operand:SI 2 "general_operand" "N0HS0,N1HS0,d,R,T")))
+(define_insn "*iorsi3_zarch"
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,Q")
+ (ior:SI (match_operand:SI 1 "nonimmediate_operand" "0,0,0,0,0,0")
+ (match_operand:SI 2 "general_operand" "N0HS0,N1HS0,d,R,T,Q")))
(clobber (reg:CC 33))]
- "TARGET_ZARCH"
+ "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
"@
oilh\t%0,%i2
oill\t%0,%i2
or\t%0,%2
o\t%0,%2
- oy\t%0,%2"
- [(set_attr "op_type" "RI,RI,RR,RX,RXY")])
-
-(define_insn "iorsi3_esa"
- [(set (match_operand:SI 0 "register_operand" "=d,d")
- (ior:SI (match_operand:SI 1 "nonimmediate_operand" "0,0")
- (match_operand:SI 2 "general_operand" "d,R")))
+ oy\t%0,%2
+ oc\t%O0(4,%R0),%2"
+ [(set_attr "op_type" "RI,RI,RR,RX,RXY,SS")])
+
+(define_insn "*iorsi3_esa"
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,Q")
+ (ior:SI (match_operand:SI 1 "nonimmediate_operand" "0,0,0")
+ (match_operand:SI 2 "general_operand" "d,R,Q")))
(clobber (reg:CC 33))]
- "!TARGET_ZARCH"
+ "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
"@
or\t%0,%2
- o\t%0,%2"
- [(set_attr "op_type" "RR,RX")])
-
-(define_insn "*iorsi3_ss"
- [(set (match_operand:SI 0 "s_operand" "=Q")
- (ior:SI (match_dup 0)
- (match_operand:SI 1 "s_imm_operand" "Q")))
- (clobber (reg:CC 33))]
- ""
- "oc\t%O0(4,%R0),%1"
- [(set_attr "op_type" "SS")])
+ o\t%0,%2
+ oc\t%O0(4,%R0),%2"
+ [(set_attr "op_type" "RR,RX,SS")])
-(define_insn "*iorsi3_ss_inv"
- [(set (match_operand:SI 0 "s_operand" "=Q")
- (ior:SI (match_operand:SI 1 "s_imm_operand" "Q")
- (match_dup 0)))
+(define_expand "iorsi3"
+ [(set (match_operand:SI 0 "nonimmediate_operand" "")
+ (ior:SI (match_operand:SI 1 "nonimmediate_operand" "")
+ (match_operand:SI 2 "general_operand" "")))
(clobber (reg:CC 33))]
""
- "oc\t%O0(4,%R0),%1"
- [(set_attr "op_type" "SS")])
+ "s390_expand_logical_operator (IOR, SImode, operands); DONE;")
;
; iorhi3 instruction pattern(s).
;
-(define_insn "*iorhi3_oi"
- [(set (match_operand:HI 0 "register_operand" "=d,d")
- (ior:HI (match_operand:HI 1 "register_operand" "%0,0")
- (match_operand:HI 2 "nonmemory_operand" "d,n")))
+(define_insn "*iorhi3_zarch"
+ [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,Q")
+ (ior:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0")
+ (match_operand:HI 2 "general_operand" "d,n,Q")))
(clobber (reg:CC 33))]
- "TARGET_ZARCH"
+ "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
"@
or\t%0,%2
- oill\t%0,%x2"
- [(set_attr "op_type" "RR,RI")])
-
-(define_insn "iorhi3"
- [(set (match_operand:HI 0 "register_operand" "=d")
- (ior:HI (match_operand:HI 1 "register_operand" "%0")
- (match_operand:HI 2 "nonmemory_operand" "d")))
- (clobber (reg:CC 33))]
- ""
- "or\t%0,%2"
- [(set_attr "op_type" "RR")])
-
-(define_insn "*iorhi3_ss"
- [(set (match_operand:HI 0 "s_operand" "=Q")
- (ior:HI (match_dup 0)
- (match_operand:HI 1 "s_imm_operand" "Q")))
+ oill\t%0,%x2
+ oc\t%O0(2,%R0),%2"
+ [(set_attr "op_type" "RR,RI,SS")])
+
+(define_insn "*iorhi3_esa"
+ [(set (match_operand:HI 0 "nonimmediate_operand" "=d,Q")
+ (ior:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0")
+ (match_operand:HI 2 "general_operand" "d,Q")))
(clobber (reg:CC 33))]
- ""
- "oc\t%O0(2,%R0),%1"
- [(set_attr "op_type" "SS")])
+ "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
+ "@
+ or\t%0,%2
+ oc\t%O0(2,%R0),%2"
+ [(set_attr "op_type" "RR,SS")])
-(define_insn "*iorhi3_ss_inv"
- [(set (match_operand:HI 0 "s_operand" "=Q")
- (ior:HI (match_operand:HI 1 "s_imm_operand" "Q")
- (match_dup 0)))
+(define_expand "iorhi3"
+ [(set (match_operand:HI 0 "nonimmediate_operand" "")
+ (ior:HI (match_operand:HI 1 "nonimmediate_operand" "")
+ (match_operand:HI 2 "general_operand" "")))
(clobber (reg:CC 33))]
""
- "oc\t%O0(2,%R0),%1"
- [(set_attr "op_type" "SS")])
+ "s390_expand_logical_operator (IOR, HImode, operands); DONE;")
;
; iorqi3 instruction pattern(s).
;
-(define_insn "*iorqi3_oi"
- [(set (match_operand:QI 0 "register_operand" "=d,d")
- (ior:QI (match_operand:QI 1 "register_operand" "%0,0")
- (match_operand:QI 2 "nonmemory_operand" "d,n")))
+(define_insn "*iorqi3_zarch"
+ [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,Q,S,Q")
+ (ior:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0,0,0")
+ (match_operand:QI 2 "general_operand" "d,n,n,n,Q")))
(clobber (reg:CC 33))]
- "TARGET_ZARCH"
+ "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
"@
or\t%0,%2
- oill\t%0,%b2"
- [(set_attr "op_type" "RR,RI")])
-
-(define_insn "iorqi3"
- [(set (match_operand:QI 0 "register_operand" "=d")
- (ior:QI (match_operand:QI 1 "register_operand" "%0")
- (match_operand:QI 2 "nonmemory_operand" "d")))
+ oill\t%0,%b2
+ oi\t%0,%b2
+ oiy\t%0,%b2
+ oc\t%O0(1,%R0),%2"
+ [(set_attr "op_type" "RR,RI,SI,SIY,SS")])
+
+(define_insn "*iorqi3_esa"
+ [(set (match_operand:QI 0 "nonimmediate_operand" "=d,Q,Q")
+ (ior:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0")
+ (match_operand:QI 2 "general_operand" "d,n,Q")))
(clobber (reg:CC 33))]
- ""
- "or\t%0,%2"
- [(set_attr "op_type" "RR")])
-
-(define_insn "*iorqi3_ss"
- [(set (match_operand:QI 0 "s_operand" "=Q,S,Q")
- (ior:QI (match_dup 0)
- (match_operand:QI 1 "s_imm_operand" "n,n,Q")))
- (clobber (reg:CC 33))]
- ""
+ "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
"@
- oi\t%0,%b1
- oiy\t%0,%b1
- oc\t%O0(1,%R0),%1"
- [(set_attr "op_type" "SI,SIY,SS")])
+ or\t%0,%2
+ oi\t%0,%b2
+ oc\t%O0(1,%R0),%2"
+ [(set_attr "op_type" "RR,SI,SS")])
-(define_insn "*iorqi3_ss_inv"
- [(set (match_operand:QI 0 "s_operand" "=Q,S,Q")
- (ior:QI (match_operand:QI 1 "s_imm_operand" "n,n,Q")
- (match_dup 0)))
+(define_expand "iorqi3"
+ [(set (match_operand:QI 0 "nonimmediate_operand" "")
+ (ior:QI (match_operand:QI 1 "nonimmediate_operand" "")
+ (match_operand:QI 2 "general_operand" "")))
(clobber (reg:CC 33))]
""
- "@
- oi\t%0,%b1
- oiy\t%0,%b1
- oc\t%O0(1,%R0),%1"
- [(set_attr "op_type" "SI,SIY,SS")])
+ "s390_expand_logical_operator (IOR, QImode, operands); DONE;")
;;
@@ -5541,34 +5410,25 @@
xr\t%0,%2"
[(set_attr "op_type" "RRE,RXY")])
-(define_insn "xordi3"
- [(set (match_operand:DI 0 "register_operand" "=d,d")
- (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0")
- (match_operand:DI 2 "general_operand" "d,m")))
+(define_insn "*xordi3"
+ [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,Q")
+ (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0")
+ (match_operand:DI 2 "general_operand" "d,m,Q")))
(clobber (reg:CC 33))]
- "TARGET_64BIT"
+ "TARGET_64BIT && s390_logical_operator_ok_p (operands)"
"@
xgr\t%0,%2
- xg\t%0,%2"
- [(set_attr "op_type" "RRE,RXY")])
+ xg\t%0,%2
+ xc\t%O0(8,%R0),%2"
+ [(set_attr "op_type" "RRE,RXY,SS")])
-(define_insn "*xordi3_ss"
- [(set (match_operand:DI 0 "s_operand" "=Q")
- (xor:DI (match_dup 0)
- (match_operand:DI 1 "s_imm_operand" "Q")))
- (clobber (reg:CC 33))]
- ""
- "xc\t%O0(8,%R0),%1"
- [(set_attr "op_type" "SS")])
-
-(define_insn "*xordi3_ss_inv"
- [(set (match_operand:DI 0 "s_operand" "=Q")
- (xor:DI (match_operand:DI 1 "s_imm_operand" "Q")
- (match_dup 0)))
+(define_expand "xordi3"
+ [(set (match_operand:DI 0 "nonimmediate_operand" "")
+ (xor:DI (match_operand:DI 1 "nonimmediate_operand" "")
+ (match_operand:DI 2 "general_operand" "")))
(clobber (reg:CC 33))]
- ""
- "xc\t%O0(8,%R0),%1"
- [(set_attr "op_type" "SS")])
+ "TARGET_64BIT"
+ "s390_expand_logical_operator (XOR, DImode, operands); DONE;")
;
; xorsi3 instruction pattern(s).
@@ -5601,103 +5461,74 @@
xy\t%0,%2"
[(set_attr "op_type" "RR,RX,RXY")])
-(define_insn "xorsi3"
- [(set (match_operand:SI 0 "register_operand" "=d,d,d")
- (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0")
- (match_operand:SI 2 "general_operand" "d,R,T")))
+(define_insn "*xorsi3"
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,Q")
+ (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0")
+ (match_operand:SI 2 "general_operand" "d,R,T,Q")))
(clobber (reg:CC 33))]
- ""
+ "s390_logical_operator_ok_p (operands)"
"@
xr\t%0,%2
x\t%0,%2
- xy\t%0,%2"
- [(set_attr "op_type" "RR,RX,RXY")])
-
-(define_insn "*xorsi3_ss"
- [(set (match_operand:SI 0 "s_operand" "=Q")
- (xor:SI (match_dup 0)
- (match_operand:SI 1 "s_imm_operand" "Q")))
+ xy\t%0,%2
+ xc\t%O0(4,%R0),%2"
+ [(set_attr "op_type" "RR,RX,RXY,SS")])
+
+(define_expand "xorsi3"
+ [(set (match_operand:SI 0 "nonimmediate_operand" "")
+ (xor:SI (match_operand:SI 1 "nonimmediate_operand" "")
+ (match_operand:SI 2 "general_operand" "")))
(clobber (reg:CC 33))]
""
- "xc\t%O0(4,%R0),%1"
- [(set_attr "op_type" "SS")])
-
-(define_insn "*xorsi3_ss_inv"
- [(set (match_operand:SI 0 "s_operand" "=Q")
- (xor:SI (match_operand:SI 1 "s_imm_operand" "Q")
- (match_dup 0)))
- (clobber (reg:CC 33))]
- ""
- "xc\t%O0(4,%R0),%1"
- [(set_attr "op_type" "SS")])
+ "s390_expand_logical_operator (XOR, SImode, operands); DONE;")
;
; xorhi3 instruction pattern(s).
;
-(define_insn "xorhi3"
- [(set (match_operand:HI 0 "register_operand" "=d")
- (xor:HI (match_operand:HI 1 "register_operand" "%0")
- (match_operand:HI 2 "nonmemory_operand" "d")))
+(define_insn "*xorhi3"
+ [(set (match_operand:HI 0 "nonimmediate_operand" "=d,Q")
+ (xor:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0")
+ (match_operand:HI 2 "general_operand" "d,Q")))
(clobber (reg:CC 33))]
- ""
- "xr\t%0,%2"
- [(set_attr "op_type" "RR")])
-
-(define_insn "*xorhi3_ss"
- [(set (match_operand:HI 0 "s_operand" "=Q")
- (xor:HI (match_dup 0)
- (match_operand:HI 1 "s_imm_operand" "Q")))
- (clobber (reg:CC 33))]
- ""
- "xc\t%O0(2,%R0),%1"
- [(set_attr "op_type" "SS")])
+ "s390_logical_operator_ok_p (operands)"
+ "@
+ xr\t%0,%2
+ xc\t%O0(2,%R0),%2"
+ [(set_attr "op_type" "RR,SS")])
-(define_insn "*xorhi3_ss_inv"
- [(set (match_operand:HI 0 "s_operand" "=Q")
- (xor:HI (match_operand:HI 1 "s_imm_operand" "Q")
- (match_dup 0)))
+(define_expand "xorhi3"
+ [(set (match_operand:HI 0 "nonimmediate_operand" "")
+ (xor:HI (match_operand:HI 1 "nonimmediate_operand" "")
+ (match_operand:HI 2 "general_operand" "")))
(clobber (reg:CC 33))]
""
- "xc\t%O0(2,%R0),%1"
- [(set_attr "op_type" "SS")])
+ "s390_expand_logical_operator (XOR, HImode, operands); DONE;")
;
; xorqi3 instruction pattern(s).
;
-(define_insn "xorqi3"
- [(set (match_operand:QI 0 "register_operand" "=d")
- (xor:QI (match_operand:QI 1 "register_operand" "%0")
- (match_operand:QI 2 "nonmemory_operand" "d")))
+(define_insn "*xorqi3"
+ [(set (match_operand:QI 0 "nonimmediate_operand" "=d,Q,S,Q")
+ (xor:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0,0,0")
+ (match_operand:QI 2 "general_operand" "d,n,n,Q")))
(clobber (reg:CC 33))]
- ""
- "xr\t%0,%2"
- [(set_attr "op_type" "RR")])
-
-(define_insn "*xorqi3_ss"
- [(set (match_operand:QI 0 "s_operand" "=Q,S,Q")
- (xor:QI (match_dup 0)
- (match_operand:QI 1 "s_imm_operand" "n,n,Q")))
- (clobber (reg:CC 33))]
- ""
+ "s390_logical_operator_ok_p (operands)"
"@
- xi\t%0,%b1
- xiy\t%0,%b1
- xc\t%O0(1,%R0),%1"
- [(set_attr "op_type" "SI,SIY,SS")])
+ xr\t%0,%2
+ xi\t%0,%b2
+ xiy\t%0,%b2
+ xc\t%O0(1,%R0),%2"
+ [(set_attr "op_type" "RR,SI,SIY,SS")])
-(define_insn "*xorqi3_ss_inv"
- [(set (match_operand:QI 0 "s_operand" "=Q,S,Q")
- (xor:QI (match_operand:QI 1 "s_imm_operand" "n,n,Q")
- (match_dup 0)))
+(define_expand "xorqi3"
+ [(set (match_operand:QI 0 "nonimmediate_operand" "")
+ (xor:QI (match_operand:QI 1 "nonimmediate_operand" "")
+ (match_operand:QI 2 "general_operand" "")))
(clobber (reg:CC 33))]
""
- "@
- xi\t%0,%b1
- xiy\t%0,%b1
- xc\t%O0(1,%R0),%1"
- [(set_attr "op_type" "SI,SIY,SS")])
+ "s390_expand_logical_operator (XOR, QImode, operands); DONE;")
;;
@@ -7405,7 +7236,10 @@
(unspec_volatile [(const_int 0)] UNSPECV_MAIN_POOL))]
"GET_MODE (operands[0]) == Pmode"
"* abort ();"
- [(set_attr "op_type" "NN")])
+ [(set_attr "op_type" "NN")
+ (set (attr "type")
+ (if_then_else (ne (symbol_ref "TARGET_CPU_ZARCH") (const_int 0))
+ (const_string "larl") (const_string "la")))])
(define_insn "reload_base_31"
[(set (match_operand 0 "register_operand" "=a")
diff --git a/gcc/config/sh/sh-protos.h b/gcc/config/sh/sh-protos.h
index a3a19f64d60..039f8cb8913 100644
--- a/gcc/config/sh/sh-protos.h
+++ b/gcc/config/sh/sh-protos.h
@@ -143,6 +143,7 @@ extern rtx sh_get_pr_initial_val (void);
extern rtx sh_function_arg (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
extern void sh_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
extern int sh_pass_in_reg_p (CUMULATIVE_ARGS *, enum machine_mode, tree);
+extern void sh_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree, signed int, enum machine_mode);
extern const char *sh_pch_valid_p (const void *data_p, size_t sz);
extern bool sh_promote_prototypes (tree);
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 0e98ee3ef45..349d981ccc9 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -40,6 +40,7 @@ Boston, MA 02111-1307, USA. */
#include "recog.h"
#include "c-pragma.h"
#include "integrate.h"
+#include "dwarf2.h"
#include "tm_p.h"
#include "target.h"
#include "target-def.h"
@@ -285,6 +286,7 @@ static bool sh_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
tree, bool);
static bool sh_callee_copies (CUMULATIVE_ARGS *, enum machine_mode,
tree, bool);
+static int sh_dwarf_calling_convention (tree);
/* Initialize the GCC target structure. */
@@ -454,6 +456,9 @@ static bool sh_callee_copies (CUMULATIVE_ARGS *, enum machine_mode,
#undef TARGET_PCH_VALID_P
#define TARGET_PCH_VALID_P sh_pch_valid_p
+#undef TARGET_DWARF_CALLING_CONVENTION
+#define TARGET_DWARF_CALLING_CONVENTION sh_dwarf_calling_convention
+
/* Return regmode weight for insn. */
#define INSN_REGMODE_WEIGHT(INSN, MODE) regmode_weight[((MODE) == SImode) ? 0 : 1][INSN_UID (INSN)]
@@ -9402,6 +9407,17 @@ sh_vector_mode_supported_p (enum machine_mode mode)
return false;
}
+/* Implements target hook dwarf_calling_convention. Return an enum
+ of dwarf_calling_convention. */
+int
+sh_dwarf_calling_convention (tree func)
+{
+ if (sh_attr_renesas_p (func))
+ return DW_CC_renesas_sh;
+
+ return DW_CC_normal;
+}
+
static void
sh_init_builtins (void)
{
@@ -10035,4 +10051,76 @@ sh_fsca_int2sf (void)
return sh_fsca_int2sf_rtx;
}
+
+/* Initialize the CUMULATIVE_ARGS structure. */
+
+void
+sh_init_cumulative_args (CUMULATIVE_ARGS * pcum,
+ tree fntype,
+ rtx libname ATTRIBUTE_UNUSED,
+ tree fndecl,
+ signed int n_named_args,
+ enum machine_mode mode)
+{
+ pcum->arg_count [(int) SH_ARG_FLOAT] = 0;
+ pcum->free_single_fp_reg = 0;
+ pcum->stack_regs = 0;
+ pcum->byref_regs = 0;
+ pcum->byref = 0;
+ pcum->outgoing = (n_named_args == -1) ? 0 : 1;
+
+ /* XXX - Should we check TARGET_HITACHI here ??? */
+ pcum->renesas_abi = sh_attr_renesas_p (fntype) ? 1 : 0;
+
+ if (fntype)
+ {
+ pcum->force_mem = ((TARGET_HITACHI || pcum->renesas_abi)
+ && aggregate_value_p (TREE_TYPE (fntype), fndecl));
+ pcum->prototype_p = TYPE_ARG_TYPES (fntype) ? TRUE : FALSE;
+ pcum->arg_count [(int) SH_ARG_INT]
+ = TARGET_SH5 && aggregate_value_p (TREE_TYPE (fntype), fndecl);
+
+ pcum->call_cookie
+ = CALL_COOKIE_RET_TRAMP (TARGET_SHCOMPACT
+ && pcum->arg_count [(int) SH_ARG_INT] == 0
+ && (TYPE_MODE (TREE_TYPE (fntype)) == BLKmode
+ ? int_size_in_bytes (TREE_TYPE (fntype))
+ : GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (fntype)))) > 4
+ && (BASE_RETURN_VALUE_REG (TYPE_MODE (TREE_TYPE (fntype)))
+ == FIRST_RET_REG));
+ }
+ else
+ {
+ pcum->arg_count [(int) SH_ARG_INT] = 0;
+ pcum->prototype_p = FALSE;
+ if (mode != VOIDmode)
+ {
+ pcum->call_cookie =
+ CALL_COOKIE_RET_TRAMP (TARGET_SHCOMPACT
+ && GET_MODE_SIZE (mode) > 4
+ && BASE_RETURN_VALUE_REG (mode) == FIRST_RET_REG);
+
+ /* If the default ABI is the Renesas ABI then all library
+ calls must assume that the library will be using the
+ Renesas ABI. So if the function would return its result
+ in memory then we must force the address of this memory
+ block onto the stack. Ideally we would like to call
+ targetm.calls.return_in_memory() here but we do not have
+ the TYPE or the FNDECL available so we synthesize the
+ contents of that function as best we can. */
+ pcum->force_mem =
+ (TARGET_DEFAULT & HITACHI_BIT)
+ && (mode == BLKmode
+ || (GET_MODE_SIZE (mode) > 4
+ && !(mode == DFmode
+ && TARGET_FPU_DOUBLE)));
+ }
+ else
+ {
+ pcum->call_cookie = 0;
+ pcum->force_mem = FALSE;
+ }
+ }
+}
+
#include "gt-sh.h"
diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h
index 8184e81ffed..f6b9b06e3ec 100644
--- a/gcc/config/sh/sh.h
+++ b/gcc/config/sh/sh.h
@@ -2091,48 +2091,10 @@ struct sh_args {
For TARGET_HITACHI, the structure value pointer is passed in memory. */
#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
- do { \
- (CUM).arg_count[(int) SH_ARG_INT] = 0; \
- (CUM).arg_count[(int) SH_ARG_FLOAT] = 0; \
- (CUM).renesas_abi = sh_attr_renesas_p (FNTYPE) ? 1 : 0; \
- (CUM).force_mem \
- = ((TARGET_HITACHI || (CUM).renesas_abi) && (FNTYPE) \
- && aggregate_value_p (TREE_TYPE (FNTYPE), (FNDECL))); \
- (CUM).prototype_p = (FNTYPE) && TYPE_ARG_TYPES (FNTYPE); \
- (CUM).arg_count[(int) SH_ARG_INT] \
- = (TARGET_SH5 && (FNTYPE) \
- && aggregate_value_p (TREE_TYPE (FNTYPE), (FNDECL))); \
- (CUM).free_single_fp_reg = 0; \
- (CUM).outgoing = 1; \
- (CUM).stack_regs = 0; \
- (CUM).byref_regs = 0; \
- (CUM).byref = 0; \
- (CUM).call_cookie \
- = (CALL_COOKIE_RET_TRAMP \
- (TARGET_SHCOMPACT && (FNTYPE) \
- && (CUM).arg_count[(int) SH_ARG_INT] == 0 \
- && (TYPE_MODE (TREE_TYPE (FNTYPE)) == BLKmode \
- ? int_size_in_bytes (TREE_TYPE (FNTYPE)) \
- : GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (FNTYPE)))) > 4 \
- && (BASE_RETURN_VALUE_REG (TYPE_MODE (TREE_TYPE \
- (FNTYPE))) \
- == FIRST_RET_REG))); \
- } while (0)
+ sh_init_cumulative_args (& (CUM), (FNTYPE), (LIBNAME), (FNDECL), (N_NAMED_ARGS), VOIDmode)
#define INIT_CUMULATIVE_LIBCALL_ARGS(CUM, MODE, LIBNAME) \
- do { \
- INIT_CUMULATIVE_ARGS ((CUM), NULL_TREE, (LIBNAME), 0, 0); \
- (CUM).call_cookie \
- = (CALL_COOKIE_RET_TRAMP \
- (TARGET_SHCOMPACT && GET_MODE_SIZE (MODE) > 4 \
- && BASE_RETURN_VALUE_REG (MODE) == FIRST_RET_REG)); \
- } while (0)
-
-#define INIT_CUMULATIVE_INCOMING_ARGS(CUM, FNTYPE, LIBNAME) \
- do { \
- INIT_CUMULATIVE_ARGS ((CUM), (FNTYPE), (LIBNAME), 0, 0); \
- (CUM).outgoing = 0; \
- } while (0)
+ sh_init_cumulative_args (& (CUM), NULL_TREE, (LIBNAME), NULL_TREE, 0, (MODE))
#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
sh_function_arg_advance (&(CUM), (MODE), (TYPE), (NAMED))
diff --git a/gcc/config/sparc/sparc-protos.h b/gcc/config/sparc/sparc-protos.h
index 71599c96223..e181f8f73bb 100644
--- a/gcc/config/sparc/sparc-protos.h
+++ b/gcc/config/sparc/sparc-protos.h
@@ -47,6 +47,7 @@ extern void order_regs_for_local_alloc (void);
extern HOST_WIDE_INT sparc_compute_frame_size (HOST_WIDE_INT, int);
extern void sparc_expand_prologue (void);
extern void sparc_expand_epilogue (void);
+extern bool sparc_can_use_return_insn_p (void);
extern int check_pic (int);
extern int short_branch (int, int);
extern void sparc_profile_hook (int);
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 63d3f01cdca..aa1fa0905b1 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -270,8 +270,20 @@ struct machine_function GTY(())
{
/* Some local-dynamic TLS symbol name. */
const char *some_ld_name;
+
+ /* True if the current function is leaf and uses only leaf regs,
+ so that the SPARC leaf function optimization can be applied.
+ Private version of current_function_uses_only_leaf_regs, see
+ sparc_expand_prologue for the rationale. */
+ int leaf_function_p;
+
+ /* True if the data calculated by sparc_expand_prologue are valid. */
+ bool prologue_data_valid_p;
};
+#define sparc_leaf_function_p cfun->machine->leaf_function_p
+#define sparc_prologue_data_valid_p cfun->machine->prologue_data_valid_p
+
/* Register we pretend to think the frame pointer is allocated to.
Normally, this is %fp, but if we are in a leaf procedure, this
is %sp+"something". We record "something" separately as it may
@@ -452,9 +464,6 @@ enum processor_type sparc_cpu;
#undef TARGET_GIMPLIFY_VA_ARG_EXPR
#define TARGET_GIMPLIFY_VA_ARG_EXPR sparc_gimplify_va_arg
-#undef TARGET_LATE_RTL_PROLOGUE_EPILOGUE
-#define TARGET_LATE_RTL_PROLOGUE_EPILOGUE true
-
#ifdef SUBTARGET_INSERT_ATTRIBUTES
#undef TARGET_INSERT_ATTRIBUTES
#define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
@@ -3154,7 +3163,6 @@ eligible_for_restore_insn (rtx trial, bool return_p)
int
eligible_for_return_delay (rtx trial)
{
- int leaf_function_p = current_function_uses_only_leaf_regs;
rtx pat;
if (GET_CODE (trial) != INSN || GET_CODE (PATTERN (trial)) != SET)
@@ -3174,7 +3182,7 @@ eligible_for_return_delay (rtx trial)
return 0;
/* In the case of a true leaf function, anything can go into the slot. */
- if (leaf_function_p)
+ if (sparc_leaf_function_p)
return get_attr_in_uncond_branch_delay (trial)
== IN_UNCOND_BRANCH_DELAY_TRUE;
@@ -3204,7 +3212,6 @@ eligible_for_return_delay (rtx trial)
int
eligible_for_sibcall_delay (rtx trial)
{
- int leaf_function_p = current_function_uses_only_leaf_regs;
rtx pat;
if (GET_CODE (trial) != INSN || GET_CODE (PATTERN (trial)) != SET)
@@ -3215,7 +3222,7 @@ eligible_for_sibcall_delay (rtx trial)
pat = PATTERN (trial);
- if (leaf_function_p)
+ if (sparc_leaf_function_p)
{
/* If the tail call is done using the call instruction,
we have to restore %o7 in the delay slot. */
@@ -4469,13 +4476,40 @@ emit_stack_pointer_decrement (rtx decrement)
void
sparc_expand_prologue (void)
{
- int leaf_function_p = current_function_uses_only_leaf_regs;
+ /* Compute a snapshot of current_function_uses_only_leaf_regs. Relying
+ on the final value of the flag means deferring the prologue/epilogue
+ expansion until just before the second scheduling pass, which is too
+ late to emit multiple epilogues or return insns.
+
+ Of course we are making the assumption that the value of the flag
+ will not change between now and its final value. Of the three parts
+ of the formula, only the last one can reasonably vary. Let's take a
+ closer look, after assuming that the first two ones are set to true
+ (otherwise the last value is effectively silenced).
+
+ If only_leaf_regs_used returns false, the global predicate will also
+ be false so the actual frame size calculated below will be positive.
+ As a consequence, the save_register_window insn will be emitted in
+ the instruction stream; now this insn explicitly references %fp
+ which is not a leaf register so only_leaf_regs_used will always
+ return false subsequently.
+
+ If only_leaf_regs_used returns true, we hope that the subsequent
+ optimization passes won't cause non-leaf registers to pop up. For
+ example, the regrename pass has special provisions to not rename to
+ non-leaf registers in a leaf function. */
+ sparc_leaf_function_p
+ = optimize > 0 && leaf_function_p () && only_leaf_regs_used ();
/* Need to use actual_fsize, since we are also allocating
space for our callee (and our own register save area). */
- actual_fsize = sparc_compute_frame_size (get_frame_size(), leaf_function_p);
+ actual_fsize
+ = sparc_compute_frame_size (get_frame_size(), sparc_leaf_function_p);
+
+ /* Advertise that the data calculated just above are now valid. */
+ sparc_prologue_data_valid_p = true;
- if (leaf_function_p)
+ if (sparc_leaf_function_p)
{
frame_base_reg = stack_pointer_rtx;
frame_base_offset = actual_fsize + SPARC_STACK_BIAS;
@@ -4488,7 +4522,7 @@ sparc_expand_prologue (void)
if (actual_fsize == 0)
/* do nothing. */ ;
- else if (leaf_function_p)
+ else if (sparc_leaf_function_p)
{
if (actual_fsize <= 4096)
emit_stack_pointer_increment (GEN_INT (- actual_fsize));
@@ -4542,7 +4576,9 @@ sparc_expand_prologue (void)
static void
sparc_asm_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
{
- int leaf_function_p = current_function_uses_only_leaf_regs;
+ /* Check that the assumption we made in sparc_expand_prologue is valid. */
+ if (sparc_leaf_function_p != current_function_uses_only_leaf_regs)
+ abort();
sparc_output_scratch_registers (file);
@@ -4552,12 +4588,12 @@ sparc_asm_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
/* The canonical frame address refers to the top of the frame. */
dwarf2out_def_cfa (label,
- leaf_function_p
+ sparc_leaf_function_p
? STACK_POINTER_REGNUM
: HARD_FRAME_POINTER_REGNUM,
frame_base_offset);
- if (! leaf_function_p)
+ if (! sparc_leaf_function_p)
{
/* Note the register window save. This tells the unwinder that
it needs to restore the window registers from the previous
@@ -4576,14 +4612,12 @@ sparc_asm_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
void
sparc_expand_epilogue (void)
{
- int leaf_function_p = current_function_uses_only_leaf_regs;
-
if (num_gfregs)
emit_restore_regs ();
if (actual_fsize == 0)
/* do nothing. */ ;
- else if (leaf_function_p)
+ else if (sparc_leaf_function_p)
{
if (actual_fsize <= 4096)
emit_stack_pointer_decrement (GEN_INT (- actual_fsize));
@@ -4600,6 +4634,16 @@ sparc_expand_epilogue (void)
}
}
}
+
+/* Return true if it is appropriate to emit `return' instructions in the
+ body of a function. */
+
+bool
+sparc_can_use_return_insn_p (void)
+{
+ return sparc_prologue_data_valid_p
+ && (actual_fsize == 0 || !sparc_leaf_function_p);
+}
/* This function generates the assembly code for function exit. */
@@ -4677,7 +4721,7 @@ output_restore (rtx pat)
const char *
output_return (rtx insn)
{
- if (current_function_uses_only_leaf_regs)
+ if (sparc_leaf_function_p)
{
/* This is a leaf function so we don't have to bother restoring the
register window, which frees us from dealing with the convoluted
@@ -4766,7 +4810,7 @@ output_sibcall (rtx insn, rtx call_operand)
operands[0] = call_operand;
- if (current_function_uses_only_leaf_regs)
+ if (sparc_leaf_function_p)
{
/* This is a leaf function so we don't have to bother restoring the
register window. We simply output the jump to the function and
@@ -8499,7 +8543,7 @@ sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
{
/* We will emit a regular sibcall below, so we need to instruct
output_sibcall that we are in a leaf function. */
- current_function_uses_only_leaf_regs = 1;
+ sparc_leaf_function_p = 1;
/* This will cause final.c to invoke leaf_renumber_regs so we
must behave as if we were in a not-yet-leafified function. */
@@ -8509,7 +8553,7 @@ sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
{
/* We will emit the sibcall manually below, so we will need to
manually spill non-leaf registers. */
- current_function_uses_only_leaf_regs = 0;
+ sparc_leaf_function_p = 0;
/* We really are in a leaf function. */
int_arg_first = SPARC_OUTGOING_INT_ARG_FIRST;
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
index 5cf5201e0ef..d1b93ec1ab7 100644
--- a/gcc/config/sparc/sparc.h
+++ b/gcc/config/sparc/sparc.h
@@ -1121,8 +1121,7 @@ extern int sparc_mode_class[];
/* Value should be nonzero if functions must have frame pointers.
Zero means the frame pointer need not be set up (and parms
may be accessed via the stack pointer) in functions that seem suitable.
- This is computed in `reload', in reload1.c.
- Used in flow.c, global.c, and reload1.c. */
+ Used in flow.c, global.c, ra.c and reload1.c. */
#define FRAME_POINTER_REQUIRED \
(! (leaf_function_p () && only_leaf_regs_used ()))
@@ -1594,9 +1593,10 @@ extern char leaf_reg_remap[];
is a leaf function, we guessed right! */
#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
do { \
- (OFFSET) = 0; \
if ((TO) == STACK_POINTER_REGNUM) \
(OFFSET) = sparc_compute_frame_size (get_frame_size (), 1); \
+ else \
+ (OFFSET) = 0; \
(OFFSET) += SPARC_STACK_BIAS; \
} while (0)
diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md
index a077f8c881e..182afb9a7cd 100644
--- a/gcc/config/sparc/sparc.md
+++ b/gcc/config/sparc/sparc.md
@@ -7438,7 +7438,10 @@
(clobber (reg:SI 15))]
;;- Do not use operand 1 for most machines.
"! TARGET_ARCH64 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) > 0"
- "call\t%a0, %1\n\t nop\n\tunimp\t%2"
+{
+ operands[2] = GEN_INT (INTVAL (operands[2]) & 0xfff);
+ return "call\t%a0, %1\n\t nop\n\tunimp\t%2";
+}
[(set_attr "type" "call_no_delay_slot")
(set_attr "length" "3")])
@@ -7451,7 +7454,10 @@
(clobber (reg:SI 15))]
;;- Do not use operand 1 for most machines.
"! TARGET_ARCH64 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) > 0"
- "call\t%a0, %1\n\t nop\n\tunimp\t%2"
+{
+ operands[2] = GEN_INT (INTVAL (operands[2]) & 0xfff);
+ return "call\t%a0, %1\n\t nop\n\tunimp\t%2";
+}
[(set_attr "type" "call_no_delay_slot")
(set_attr "length" "3")])
@@ -7684,6 +7690,11 @@
sparc_expand_epilogue ();
})
+(define_expand "return"
+ [(return)]
+ "sparc_can_use_return_insn_p ()"
+ "")
+
(define_insn "*return_internal"
[(return)]
""
diff --git a/gcc/config/stormy16/stormy16.c b/gcc/config/stormy16/stormy16.c
index b75703b7348..76195cad37e 100644
--- a/gcc/config/stormy16/stormy16.c
+++ b/gcc/config/stormy16/stormy16.c
@@ -1738,7 +1738,7 @@ xstormy16_asm_output_aligned_common (FILE *stream,
}
fprintf (stream, "\t.comm\t");
assemble_name (stream, name);
- fprintf (stream, ",%u,%u\n", size, align);
+ fprintf (stream, ",%u,%u\n", size, align / BITS_PER_UNIT);
}
/* Mark symbols with the "below100" attribute so that we can use the
diff --git a/gcc/configure b/gcc/configure
index f90cebc6330..1ce5ca03e12 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -15155,7 +15155,6 @@ objdir=`${PWDCMD-pwd}`
-
if test x"$SET_GCC_LIB_PATH_CMD" != x; then
# SET_GCC_LIB_PATH_CMD is "XXX=path; export XXX;". It is expanded to
#
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 4d7c8da7bc0..d81dad533db 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -3262,7 +3262,6 @@ AC_SUBST(target_cpu_default)
AC_SUBST_FILE(language_hooks)
-sinclude(../config/gcc-lib-path.m4)
TL_AC_GNU_MAKE_GCC_LIB_PATH
# Echo link setup.
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index dee8d5a1d4d..d22d49dd15a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,126 @@
+2004-10-01 Jan Hubicka <jh@suse.cz>
+
+ * semantics.c (expand_body): Update call of tree_rest_of_compilation.
+
+2004-09-30 Nathan Sidwell <nathan@codesourcery.com>
+
+ * cp-tree.h (struct lang_decl): Shrink by reordering fields and
+ turning operator_code and fixed_offset into bitfields.
+
+2004-09-29 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ * decl.c (duplicate_decls): Merge TREE_DEPRECATED.
+
+2004-09-29 Jason Merrill <jason@redhat.com>
+
+ PR tree-optimization/17697
+ * decl.c (duplicate_decls): Copy TREE_NOTHROW from newdecl to olddecl.
+
+2004-09-28 Jason Merrill <jason@redhat.com>
+
+ PR middle-end/17525
+ * class.c (build_base_field): Set TYPE_MODE.
+
+2004-09-28 Roger Sayle <roger@eyesopen.com>
+
+ PR driver/17537
+ * g++spec.c (lang_specific_driver): Unrecognized libraries, other
+ than -lc and -lm, may require linking against libstc++.
+
+2004-09-28 Kazu Hirata <kazu@cs.umass.edu>
+
+ * tree.c: Fix a comment typo.
+
+2004-09-28 Nathan Sidwell <nathan@codesourcery.com>
+
+ * class.c (VTT_TOP_LEVEL_P, VTT_MARKED_BINFO_P): Remove.
+ (struct secondary_vptr_vtt_init_data_s): New.
+ (build_vtt_inits): Adjust dfs_walkers.
+ (dfs_build_secondary_vptr_vtt_inits): Caller data is a
+ secondary_vptr_vtt_init_data_s structure. Adjust.
+ (dfs_ctor_vtable_bases_queue_p): Remove.
+ (dfs_fixup_binfo_vtbls): No need to clear BINFO_MARKED. Simplify.
+
+ * pt.c (struct get_template_base_data_s): Remove.
+ (get_template_base_r): Fold into get_template_base.
+ (get_template_base): Walk base binfos directly in inheritance
+ graph order.
+
+2004-09-27 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/17642
+ * cp-tree.h (fold_if_not_in_template): New function.
+ * call.c (build_conditional_expr): Use fold_if_not_in_template.
+ (build_cxx_call): Likewise.
+ * cvt.c (convert_to_complex): Likewise.
+ (ocp_convert): Likewise.
+ (convert): Likewise.
+ (convert_force): Likewise.
+ * decl.c (compute_array_index_type): Clear
+ processing_template_decl while folding array bounds.
+ * pt.c (convert_nontype_argument): Clear
+ processing_template_decl while processing non-type argument
+ initialization.
+ * tree.c (fold_if_not_in_template): New function.
+ * typeck.c (build_class_member_access_expr): Use
+ fold_if_not_in_template.
+ (build_array_ref): Likewise.
+ (build_binary_op): Likewise. Do not try to optimize computations
+ when processing templates.
+ (cp_pointer_int_sum): Use fold_if_not_in_template.
+ (pointer_diff): Likewise.
+ (build_unary_op): Likewise.
+ (build_reinterpret_cast): Likewise.
+ (get_delta_difference): Likewise.
+ (expand_ptrmemfunc_cst): Likewise.
+ (dubious_conversion_warnings): Likewise.
+
+2004-09-27 Matt Austern <austern@apple.com>
+
+ * cp/parser.c (struct cp_token): New one-bit field , implicit_extern_c
+ (cp_lexer_get_preprocessor_token): Set implicit_extern_c for
+ tokens that come from headers that are implicitly extern "C".
+ (struct cp_parser): new one-bit field, implicit_extern_c.
+ (cp_parser_new): Set parser's implicit_extern_c to false.
+ (cp_parser_translation_unit): Pop lang context if we were in a
+ header that was implicitly extern "C".
+ (cp_parser_declaration_seq_opt): Push/pop lang context as
+ required by the token's and parser's implicit_extern_c.
+
+2004-09-27 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/17585
+ * cp-tree.h (shared_member_p): Declare.
+ * search.c (shared_member_p): Give it external linkage.
+ * semantics.c (finish_qualified_id_expr): Use it.
+ (finish_id_expression): Likewise.
+
+ PR c++/17585
+ * semantics.c (finish_id_expression): Do not add "this->" to
+ static member functions.
+
+2004-09-27 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/17681
+ * error.c (dump_type): Change TREE_VEC case into TREE_BINFO.
+
+ * class.c (struct count_depth_data): Remove.
+ (dfs_depth_post, dfs_depth_q): Remove.
+ (find_final_overrider): Use number of vbase classes as depth
+ bound.
+
+ * cp-tree.h (types_overlap_p): Remove.
+ * search.c (struct overlap_info): Remove.
+ (dfs_check_overlap, dfs_no_overlap_yet, types_overlap_p): Remove.
+
+ * pt.c (GTB_VIA_VIRTUAL, GTB_IGNORE_TYPE): Remove.
+ (get_template_base_recursive): Remove. Replace with ...
+ (get_template_base_r): ... this.
+ (struct get_template_base_data_s): New.
+ (get_template_base): Use get_template_base_r via dfs_walk. Always
+ return NULL on failure.
+ (unify): Remove error_mark_node check from get_template_base result.
+
2004-09-24 Paolo Bonzini <bonzini@gnu.org>
* parser.c (cp_parser_expression_stack): Clarify why it is
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index c5761ec1668..f61fa2a754d 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -3442,7 +3442,8 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
}
valid_operands:
- result = fold (build3 (COND_EXPR, result_type, arg1, arg2, arg3));
+ result = fold_if_not_in_template (build3 (COND_EXPR, result_type, arg1,
+ arg2, arg3));
/* We can't use result_type below, as fold might have returned a
throw_expr. */
@@ -4869,7 +4870,7 @@ build_cxx_call (tree fn, tree args)
/* Some built-in function calls will be evaluated at compile-time in
fold (). */
- fn = fold (fn);
+ fn = fold_if_not_in_template (fn);
if (VOID_TYPE_P (TREE_TYPE (fn)))
return fn;
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 071cd80344f..b3d5d969f33 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -188,7 +188,6 @@ static void build_vtt (tree);
static tree binfo_ctor_vtable (tree);
static tree *build_vtt_inits (tree, tree, tree *, tree *);
static tree dfs_build_secondary_vptr_vtt_inits (tree, void *);
-static tree dfs_ctor_vtable_bases_queue_p (tree, int, void *data);
static tree dfs_fixup_binfo_vtbls (tree, void *);
static int record_subobject_offset (tree, tree, splay_tree);
static int check_subobject_offset (tree, tree, splay_tree);
@@ -206,12 +205,6 @@ static int empty_base_at_nonzero_offset_p (tree, tree, splay_tree);
static tree end_of_base (tree);
static tree get_vcall_index (tree, tree);
-/* Macros for dfs walking during vtt construction. See
- dfs_ctor_vtable_bases_queue_p, dfs_build_secondary_vptr_vtt_inits
- and dfs_fixup_binfo_vtbls. */
-#define VTT_TOP_LEVEL_P(NODE) (TREE_LIST_CHECK (NODE)->common.unsigned_flag)
-#define VTT_MARKED_BINFO_P(NODE) TREE_USED (NODE)
-
/* Variables shared between class.c and call.c. */
#ifdef GATHER_STATISTICS
@@ -1801,36 +1794,6 @@ base_derived_from (tree derived, tree base)
return false;
}
-typedef struct count_depth_data {
- /* The depth of the current subobject, with "1" as the depth of the
- most derived object in the hierarchy. */
- size_t depth;
- /* The maximum depth found so far. */
- size_t max_depth;
-} count_depth_data;
-
-/* Called from find_final_overrider via dfs_walk. */
-
-static tree
-dfs_depth_post (tree binfo ATTRIBUTE_UNUSED, void *data)
-{
- count_depth_data *cd = (count_depth_data *) data;
- if (cd->depth > cd->max_depth)
- cd->max_depth = cd->depth;
- cd->depth--;
- return NULL_TREE;
-}
-
-/* Called from find_final_overrider via dfs_walk. */
-
-static tree
-dfs_depth_q (tree derived, int i, void *data)
-{
- count_depth_data *cd = (count_depth_data *) data;
- cd->depth++;
- return BINFO_BASE_BINFO (derived, i);
-}
-
typedef struct find_final_overrider_data_s {
/* The function for which we are trying to find a final overrider. */
tree fn;
@@ -1943,7 +1906,6 @@ static tree
find_final_overrider (tree derived, tree binfo, tree fn)
{
find_final_overrider_data ffod;
- count_depth_data cd;
/* Getting this right is a little tricky. This is valid:
@@ -1967,15 +1929,15 @@ find_final_overrider (tree derived, tree binfo, tree fn)
fn = THUNK_TARGET (fn);
/* Determine the depth of the hierarchy. */
- cd.depth = 0;
- cd.max_depth = 0;
- dfs_walk (derived, dfs_depth_post, dfs_depth_q, &cd);
-
ffod.fn = fn;
ffod.declaring_base = binfo;
ffod.most_derived_type = BINFO_TYPE (derived);
ffod.candidates = NULL_TREE;
- ffod.vpath_list = (tree *) xcalloc (cd.max_depth, sizeof (tree));
+ /* The virtual depth cannot be greater than the number of virtual
+ bases. */
+ ffod.vpath_list = (tree *) xcalloc
+ (VEC_length (tree, CLASSTYPE_VBASECLASSES (BINFO_TYPE (derived))),
+ sizeof (tree));
ffod.vpath = ffod.vpath_list;
dfs_walk_real (derived,
@@ -3601,6 +3563,7 @@ build_base_field (record_layout_info rli, tree binfo,
DECL_SIZE_UNIT (decl) = CLASSTYPE_SIZE_UNIT (basetype);
DECL_ALIGN (decl) = CLASSTYPE_ALIGN (basetype);
DECL_USER_ALIGN (decl) = CLASSTYPE_USER_ALIGN (basetype);
+ DECL_MODE (decl) = TYPE_MODE (basetype);
DECL_IGNORED_P (decl) = 1;
DECL_FIELD_IS_BASE (decl) = 1;
@@ -6747,6 +6710,22 @@ binfo_ctor_vtable (tree binfo)
return vt;
}
+/* Data for secondary VTT initialization. */
+typedef struct secondary_vptr_vtt_init_data_s
+{
+ /* Is this the primary VTT? */
+ bool top_level_p;
+
+ /* Current index into the VTT. */
+ tree index;
+
+ /* TREE_LIST of initializers built up. */
+ tree inits;
+
+ /* The type being constructed by this secondary VTT. */
+ tree type_being_constructed;
+} secondary_vptr_vtt_init_data;
+
/* Recursively build the VTT-initializer for BINFO (which is in the
hierarchy dominated by T). INITS points to the end of the initializer
list to date. INDEX is the VTT index where the next element will be
@@ -6756,12 +6735,13 @@ binfo_ctor_vtable (tree binfo)
vtables for the BINFO-in-T variant. */
static tree *
-build_vtt_inits (tree binfo, tree t, tree* inits, tree* index)
+build_vtt_inits (tree binfo, tree t, tree *inits, tree *index)
{
int i;
tree b;
tree init;
tree secondary_vptrs;
+ secondary_vptr_vtt_init_data data;
int top_level_p = same_type_p (TREE_TYPE (binfo), t);
/* We only need VTTs for subobjects with virtual bases. */
@@ -6797,26 +6777,21 @@ build_vtt_inits (tree binfo, tree t, tree* inits, tree* index)
/* Add secondary virtual pointers for all subobjects of BINFO with
either virtual bases or reachable along a virtual path, except
subobjects that are non-virtual primary bases. */
- secondary_vptrs = tree_cons (t, NULL_TREE, BINFO_TYPE (binfo));
- TREE_TYPE (secondary_vptrs) = *index;
- VTT_TOP_LEVEL_P (secondary_vptrs) = top_level_p;
- VTT_MARKED_BINFO_P (secondary_vptrs) = 0;
+ data.top_level_p = top_level_p;
+ data.index = *index;
+ data.inits = NULL;
+ data.type_being_constructed = BINFO_TYPE (binfo);
- dfs_walk_real (binfo,
- dfs_build_secondary_vptr_vtt_inits,
- NULL,
- dfs_ctor_vtable_bases_queue_p,
- secondary_vptrs);
- VTT_MARKED_BINFO_P (secondary_vptrs) = 1;
- dfs_walk (binfo, dfs_unmark, dfs_ctor_vtable_bases_queue_p,
- secondary_vptrs);
+ dfs_walk_real (binfo, dfs_build_secondary_vptr_vtt_inits,
+ NULL, unmarkedp, &data);
+ dfs_walk (binfo, dfs_unmark, markedp, 0);
- *index = TREE_TYPE (secondary_vptrs);
+ *index = data.index;
/* The secondary vptrs come back in reverse order. After we reverse
them, and add the INITS, the last init will be the first element
of the chain. */
- secondary_vptrs = TREE_VALUE (secondary_vptrs);
+ secondary_vptrs = data.inits;
if (secondary_vptrs)
{
*inits = nreverse (secondary_vptrs);
@@ -6824,8 +6799,9 @@ build_vtt_inits (tree binfo, tree t, tree* inits, tree* index)
gcc_assert (*inits == NULL_TREE);
}
- /* Add the secondary VTTs for virtual bases. */
if (top_level_p)
+ /* Add the secondary VTTs for virtual bases in inheritance graph
+ order. */
for (b = TYPE_BINFO (BINFO_TYPE (binfo)); b; b = TREE_CHAIN (b))
{
if (!BINFO_VIRTUAL_P (b))
@@ -6833,121 +6809,84 @@ build_vtt_inits (tree binfo, tree t, tree* inits, tree* index)
inits = build_vtt_inits (b, t, inits, index);
}
-
- if (!top_level_p)
- {
- tree data = tree_cons (t, binfo, NULL_TREE);
- VTT_TOP_LEVEL_P (data) = 0;
- VTT_MARKED_BINFO_P (data) = 0;
-
- dfs_walk (binfo, dfs_fixup_binfo_vtbls,
- dfs_ctor_vtable_bases_queue_p,
- data);
- }
+ else
+ /* Remove the ctor vtables we created. */
+ dfs_walk (binfo, dfs_fixup_binfo_vtbls, 0, binfo);
return inits;
}
/* Called from build_vtt_inits via dfs_walk. BINFO is the binfo for the base
- in most derived. DATA is a TREE_LIST who's TREE_CHAIN is the type of the
- base being constructed whilst this secondary vptr is live. The
- TREE_TOP_LEVEL flag indicates that this is the primary VTT. */
+ in most derived. DATA is a SECONDARY_VPTR_VTT_INIT_DATA structure. */
static tree
-dfs_build_secondary_vptr_vtt_inits (tree binfo, void *data)
+dfs_build_secondary_vptr_vtt_inits (tree binfo, void *data_)
{
- tree l;
- tree t;
- tree init;
- tree index;
- int top_level_p;
+ secondary_vptr_vtt_init_data *data = (secondary_vptr_vtt_init_data *)data_;
- l = (tree) data;
- t = TREE_CHAIN (l);
- top_level_p = VTT_TOP_LEVEL_P (l);
-
BINFO_MARKED (binfo) = 1;
/* We don't care about bases that don't have vtables. */
if (!TYPE_VFIELD (BINFO_TYPE (binfo)))
return NULL_TREE;
- /* We're only interested in proper subobjects of T. */
- if (same_type_p (BINFO_TYPE (binfo), t))
+ /* We're only interested in proper subobjects of the type being
+ constructed. */
+ if (same_type_p (BINFO_TYPE (binfo), data->type_being_constructed))
return NULL_TREE;
/* We're not interested in non-virtual primary bases. */
if (!BINFO_VIRTUAL_P (binfo) && BINFO_PRIMARY_P (binfo))
return NULL_TREE;
- /* If BINFO has virtual bases or is reachable via a virtual path
- from T, it'll have a secondary vptr. */
+ /* We're only interested in bases with virtual bases or reachable
+ via a virtual path from the type being constructed. */
if (!CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo))
- && !binfo_via_virtual (binfo, t))
+ && !binfo_via_virtual (binfo, data->type_being_constructed))
return NULL_TREE;
/* Record the index where this secondary vptr can be found. */
- index = TREE_TYPE (l);
- if (top_level_p)
+ if (data->top_level_p)
{
gcc_assert (!BINFO_VPTR_INDEX (binfo));
- BINFO_VPTR_INDEX (binfo) = index;
- }
- TREE_TYPE (l) = size_binop (PLUS_EXPR, index,
- TYPE_SIZE_UNIT (ptr_type_node));
+ BINFO_VPTR_INDEX (binfo) = data->index;
- /* Add the initializer for the secondary vptr itself. */
- if (top_level_p && BINFO_VIRTUAL_P (binfo))
- {
- /* It's a primary virtual base, and this is not the construction
- vtable. Find the base this is primary of in the inheritance graph,
- and use that base's vtable now. */
- while (BINFO_PRIMARY_P (binfo))
- binfo = BINFO_INHERITANCE_CHAIN (binfo);
+ if (BINFO_VIRTUAL_P (binfo))
+ {
+ /* It's a primary virtual base, and this is not a
+ construction vtable. Find the base this is primary of in
+ the inheritance graph, and use that base's vtable
+ now. */
+ while (BINFO_PRIMARY_P (binfo))
+ binfo = BINFO_INHERITANCE_CHAIN (binfo);
+ }
}
- init = binfo_ctor_vtable (binfo);
- TREE_VALUE (l) = tree_cons (NULL_TREE, init, TREE_VALUE (l));
-
- return NULL_TREE;
-}
+
+ /* Add the initializer for the secondary vptr itself. */
+ data->inits = tree_cons (NULL_TREE, binfo_ctor_vtable (binfo), data->inits);
-/* dfs_walk_real predicate for building vtables. DATA is a TREE_LIST,
- VTT_MARKED_BINFO_P indicates whether marked or unmarked bases
- should be walked. TREE_PURPOSE is the TREE_TYPE that dominates the
- hierarchy. */
+ /* Advance the vtt index. */
+ data->index = size_binop (PLUS_EXPR, data->index,
+ TYPE_SIZE_UNIT (ptr_type_node));
-static tree
-dfs_ctor_vtable_bases_queue_p (tree derived, int ix,
- void* data)
-{
- tree binfo = BINFO_BASE_BINFO (derived, ix);
-
- if (!BINFO_MARKED (binfo) == VTT_MARKED_BINFO_P ((tree) data))
- return NULL_TREE;
- return binfo;
+ return NULL_TREE;
}
-/* Called from build_vtt_inits via dfs_walk. After building constructor
- vtables and generating the sub-vtt from them, we need to restore the
- BINFO_VTABLES that were scribbled on. DATA is a TREE_LIST whose
- TREE_VALUE is the TREE_TYPE of the base whose sub vtt was generated. */
+/* Called from build_vtt_inits via dfs_walk. After building
+ constructor vtables and generating the sub-vtt from them, we need
+ to restore the BINFO_VTABLES that were scribbled on. DATA is the
+ binfo of the base whose sub vtt was generated. */
static tree
dfs_fixup_binfo_vtbls (tree binfo, void* data)
{
- BINFO_MARKED (binfo) = 0;
-
- /* We don't care about bases that don't have vtables. */
- if (!TYPE_VFIELD (BINFO_TYPE (binfo)))
- return NULL_TREE;
+ tree vtable = BINFO_VTABLE (binfo);
/* If we scribbled the construction vtable vptr into BINFO, clear it
out now. */
- if (BINFO_VTABLE (binfo)
- && TREE_CODE (BINFO_VTABLE (binfo)) == TREE_LIST
- && (TREE_PURPOSE (BINFO_VTABLE (binfo))
- == TREE_VALUE ((tree) data)))
- BINFO_VTABLE (binfo) = TREE_CHAIN (BINFO_VTABLE (binfo));
+ if (vtable && TREE_CODE (vtable) == TREE_LIST
+ && (TREE_PURPOSE (vtable) == (tree) data))
+ BINFO_VTABLE (binfo) = TREE_CHAIN (vtable);
return NULL_TREE;
}
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index c439864c1b1..5ff38b72575 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -1530,6 +1530,21 @@ struct lang_decl GTY(())
{
struct full_lang_decl
{
+ /* In an overloaded operator, this is the value of
+ DECL_OVERLOADED_OPERATOR_P. */
+ ENUM_BITFIELD (tree_code) operator_code : 8;
+
+ unsigned u3sel : 1;
+ unsigned pending_inline_p : 1;
+ unsigned spare : 3;
+
+ /* In a FUNCTION_DECL for which THUNK_P holds this is the
+ THUNK_FIXED_OFFSET. The largest object that can be
+ thunked is thus 262144, which is what is required [limits].
+ We have to store a signed value as for regular thunks this
+ is <= 0, and for covariant thunks it is >= 0. */
+ signed fixed_offset : 19;
+
/* For a non-thunk function decl, this is a tree list of
friendly classes. For a thunk function decl, it is the
thunked to function decl. */
@@ -1546,17 +1561,6 @@ struct lang_decl GTY(())
/* In a FUNCTION_DECL, this is DECL_CLONED_FUNCTION. */
tree cloned_function;
- /* In a FUNCTION_DECL for which THUNK_P holds, this is
- THUNK_FIXED_OFFSET. */
- HOST_WIDE_INT fixed_offset;
-
- /* In an overloaded operator, this is the value of
- DECL_OVERLOADED_OPERATOR_P. */
- enum tree_code operator_code;
-
- unsigned u3sel : 1;
- unsigned pending_inline_p : 1;
-
union lang_decl_u3
{
struct sorted_fields_type * GTY ((tag ("0"), reorder ("resort_sorted_fields")))
@@ -3981,7 +3985,6 @@ extern bool emit_tinfo_decl (tree);
/* in search.c */
extern bool accessible_base_p (tree, tree);
extern tree lookup_base (tree, tree, base_access, base_kind *);
-extern int types_overlap_p (tree, tree);
extern tree get_dynamic_cast_base_type (tree, tree);
extern int accessible_p (tree, tree);
extern tree lookup_field_1 (tree, tree, bool);
@@ -4024,6 +4027,7 @@ extern tree adjust_result_of_qualified_name_lookup
(tree, tree, tree);
extern tree copied_binfo (tree, tree);
extern tree original_binfo (tree, tree);
+extern int shared_member_p (tree);
/* in semantics.c */
extern void push_deferring_access_checks (deferring_kind);
@@ -4207,6 +4211,7 @@ extern tree cp_add_pending_fn_decls (void*,tree);
extern int cp_is_overload_p (tree);
extern int cp_auto_var_in_fn_p (tree,tree);
extern void cp_update_decl_after_saving (tree, void *);
+extern tree fold_if_not_in_template (tree);
/* in typeck.c */
extern int string_conv_p (tree, tree, int);
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index d93351e399e..a5d42e463e5 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -643,7 +643,7 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
/* For complex data types, we need to perform componentwise
conversion. */
else if (TREE_CODE (type) == COMPLEX_TYPE)
- return fold (convert_to_complex (type, e));
+ return fold_if_not_in_template (convert_to_complex (type, e));
else if (TREE_CODE (e) == TARGET_EXPR)
{
/* Don't build a NOP_EXPR of class type. Instead, change the
@@ -659,7 +659,7 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
/* We shouldn't be treating objects of ADDRESSABLE type as
rvalues. */
gcc_assert (!TREE_ADDRESSABLE (type));
- return fold (build1 (NOP_EXPR, type, e));
+ return fold_if_not_in_template (build_nop (type, e));
}
}
@@ -696,10 +696,10 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
if (code == BOOLEAN_TYPE)
return cp_truthvalue_conversion (e);
- return fold (convert_to_integer (type, e));
+ return fold_if_not_in_template (convert_to_integer (type, e));
}
if (POINTER_TYPE_P (type) || TYPE_PTR_TO_MEMBER_P (type))
- return fold (cp_convert_to_pointer (type, e, false));
+ return fold_if_not_in_template (cp_convert_to_pointer (type, e, false));
if (code == VECTOR_TYPE)
{
tree in_vtype = TREE_TYPE (e);
@@ -713,7 +713,7 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
error ("`%#T' used where a `%T' was expected", in_vtype, type);
return error_mark_node;
}
- return fold (convert_to_vector (type, e));
+ return fold_if_not_in_template (convert_to_vector (type, e));
}
if (code == REAL_TYPE || code == COMPLEX_TYPE)
{
@@ -729,9 +729,9 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
TREE_TYPE (e));
}
if (code == REAL_TYPE)
- return fold (convert_to_real (type, e));
+ return fold_if_not_in_template (convert_to_real (type, e));
else if (code == COMPLEX_TYPE)
- return fold (convert_to_complex (type, e));
+ return fold_if_not_in_template (convert_to_complex (type, e));
}
/* New C++ semantics: since assignment is now based on
@@ -945,7 +945,7 @@ convert (tree type, tree expr)
if (POINTER_TYPE_P (type) && POINTER_TYPE_P (intype))
{
expr = decl_constant_value (expr);
- return fold (build1 (NOP_EXPR, type, expr));
+ return fold_if_not_in_template (build_nop (type, expr));
}
return ocp_convert (type, expr, CONV_OLD_CONVERT,
@@ -963,13 +963,14 @@ convert_force (tree type, tree expr, int convtype)
enum tree_code code = TREE_CODE (type);
if (code == REFERENCE_TYPE)
- return fold (convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN,
- NULL_TREE));
+ return (fold_if_not_in_template
+ (convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN,
+ NULL_TREE)));
else if (TREE_CODE (TREE_TYPE (e)) == REFERENCE_TYPE)
e = convert_from_reference (e);
if (code == POINTER_TYPE)
- return fold (convert_to_pointer_force (type, e));
+ return fold_if_not_in_template (convert_to_pointer_force (type, e));
/* From typeck.c convert_for_assignment */
if (((TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE && TREE_CODE (e) == ADDR_EXPR
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index d3a0c8d4b21..c27d041378b 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -1719,6 +1719,12 @@ duplicate_decls (tree newdecl, tree olddecl)
TREE_READONLY (olddecl) = 1;
if (TREE_THIS_VOLATILE (newdecl))
TREE_THIS_VOLATILE (olddecl) = 1;
+ if (TREE_NOTHROW (newdecl))
+ TREE_NOTHROW (olddecl) = 1;
+
+ /* Merge deprecatedness. */
+ if (TREE_DEPRECATED (newdecl))
+ TREE_DEPRECATED (olddecl) = 1;
/* Merge the initialization information. */
if (DECL_INITIAL (newdecl) == NULL_TREE
@@ -6196,12 +6202,20 @@ compute_array_index_type (tree name, tree size)
itype = build_min (MINUS_EXPR, sizetype, size, integer_one_node);
else
{
+ HOST_WIDE_INT saved_processing_template_decl;
+
/* Compute the index of the largest element in the array. It is
- one less than the number of elements in the array. */
- itype
- = fold (cp_build_binary_op (MINUS_EXPR,
- cp_convert (ssizetype, size),
- cp_convert (ssizetype, integer_one_node)));
+ one less than the number of elements in the array. We save
+ and restore PROCESSING_TEMPLATE_DECL so that computations in
+ cp_build_binary_op will be appropriately folded. */
+ saved_processing_template_decl = processing_template_decl;
+ processing_template_decl = 0;
+ itype = cp_build_binary_op (MINUS_EXPR,
+ cp_convert (ssizetype, size),
+ cp_convert (ssizetype, integer_one_node));
+ itype = fold (itype);
+ processing_template_decl = saved_processing_template_decl;
+
if (!TREE_CONSTANT (itype))
/* A variable sized array. */
itype = variable_size (itype);
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index dd6affa3f83..2bd3dac92cb 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -272,7 +272,7 @@ dump_type (tree t, int flags)
pp_cxx_tree_identifier (cxx_pp, t);
break;
- case TREE_VEC:
+ case TREE_BINFO:
dump_type (BINFO_TYPE (t), flags);
break;
diff --git a/gcc/cp/g++spec.c b/gcc/cp/g++spec.c
index d3ab47db834..df9dd400a91 100644
--- a/gcc/cp/g++spec.c
+++ b/gcc/cp/g++spec.c
@@ -174,6 +174,9 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
}
else if (strncmp (argv[i], "-Wl,", 4) == 0)
library = (library == 0) ? 1 : library;
+ /* Unrecognized libraries (e.g. -lfoo) may require libstdc++. */
+ else if (strncmp (argv[i], "-l", 2) == 0)
+ library = (library == 0) ? 1 : library;
else if (((argv[i][2] == '\0'
&& strchr ("bBVDUoeTuIYmLiA", argv[i][1]) != NULL)
|| strcmp (argv[i], "-Tdata") == 0))
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 89a96014d49..184ae5434e4 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -55,6 +55,8 @@ typedef struct cp_token GTY (())
unsigned char flags;
/* True if this token is from a system header. */
BOOL_BITFIELD in_system_header : 1;
+ /* True if this token is from a context where it is implicitly extern "C" */
+ BOOL_BITFIELD implicit_extern_c : 1;
/* The value associated with this token, if any. */
tree value;
/* The location at which this token was found. */
@@ -418,6 +420,7 @@ static void
cp_lexer_get_preprocessor_token (cp_lexer *lexer ATTRIBUTE_UNUSED ,
cp_token *token)
{
+ static int is_extern_c = 0;
bool done;
done = false;
@@ -445,6 +448,13 @@ cp_lexer_get_preprocessor_token (cp_lexer *lexer ATTRIBUTE_UNUSED ,
token->location = input_location;
token->in_system_header = in_system_header;
+ /* On some systems, some header files are surrounded by an
+ implicit extern "C" block. Set a flag in the token if it
+ comes from such a header. */
+ is_extern_c += pending_lang_change;
+ pending_lang_change = 0;
+ token->implicit_extern_c = is_extern_c > 0;
+
/* Check to see if this token is a keyword. */
if (token->type == CPP_NAME
&& C_IS_RESERVED_WORD (token->value))
@@ -1317,6 +1327,10 @@ typedef struct cp_parser GTY(())
alternatives. */
bool in_type_id_in_expr_p;
+ /* TRUE if we are currently in a header file where declarations are
+ implicitly extern "C". */
+ bool implicit_extern_c;
+
/* TRUE if strings in expressions should be translated to the execution
character set. */
bool translate_strings_p;
@@ -2425,6 +2439,9 @@ cp_parser_new (void)
/* We are not parsing a type-id inside an expression. */
parser->in_type_id_in_expr_p = false;
+ /* Declarations aren't implicitly extern "C". */
+ parser->implicit_extern_c = false;
+
/* String literals should be translated to the execution character set. */
parser->translate_strings_p = true;
@@ -2625,6 +2642,14 @@ cp_parser_translation_unit (cp_parser* parser)
cp_lexer_destroy (parser->lexer);
parser->lexer = NULL;
+ /* This file might have been a context that's implicitly extern
+ "C". If so, pop the lang context. (Only relevant for PCH.) */
+ if (parser->implicit_extern_c)
+ {
+ pop_lang_context ();
+ parser->implicit_extern_c = false;
+ }
+
/* Finish up. */
finish_translation_unit ();
@@ -6634,6 +6659,19 @@ cp_parser_declaration_seq_opt (cp_parser* parser)
continue;
}
+ /* If we're entering or exiting a region that's implicitly
+ extern "C", modify the lang context appropriately. */
+ if (!parser->implicit_extern_c && token->implicit_extern_c)
+ {
+ push_lang_context (lang_name_c);
+ parser->implicit_extern_c = true;
+ }
+ else if (parser->implicit_extern_c && !token->implicit_extern_c)
+ {
+ pop_lang_context ();
+ parser->implicit_extern_c = false;
+ }
+
if (token->type == CPP_PRAGMA)
{
/* A top-level declaration can consist solely of a #pragma.
@@ -6644,19 +6682,6 @@ cp_parser_declaration_seq_opt (cp_parser* parser)
continue;
}
- /* The C lexer modifies PENDING_LANG_CHANGE when it wants the
- parser to enter or exit implicit `extern "C"' blocks. */
- while (pending_lang_change > 0)
- {
- push_lang_context (lang_name_c);
- --pending_lang_change;
- }
- while (pending_lang_change < 0)
- {
- pop_lang_context ();
- ++pending_lang_change;
- }
-
/* Parse the declaration itself. */
cp_parser_declaration (parser);
}
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 42f652a5b9e..ebf98cb360c 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -87,12 +87,6 @@ static htab_t local_specializations;
#define UNIFY_ALLOW_OUTER_LESS_CV_QUAL 64
#define UNIFY_ALLOW_MAX_CORRECTION 128
-#define GTB_VIA_VIRTUAL 1 /* The base class we are examining is
- virtual, or a base class of a virtual
- base. */
-#define GTB_IGNORE_TYPE 2 /* We don't need to try to unify the current
- type with the desired type. */
-
static void push_access_scope (tree);
static void pop_access_scope (tree);
static int resolve_overloaded_unification (tree, tree, tree, tree,
@@ -154,7 +148,6 @@ static tree process_partial_specialization (tree);
static void set_current_access_from_decl (tree);
static void check_default_tmpl_args (tree, tree, int, int);
static tree tsubst_call_declarator_parms (tree, tree, tsubst_flags_t, tree);
-static tree get_template_base_recursive (tree, tree, tree, tree, tree, int);
static tree get_template_base (tree, tree, tree, tree);
static int verify_class_unification (tree, tree, tree);
static tree try_class_unification (tree, tree, tree, tree);
@@ -3387,6 +3380,8 @@ convert_nontype_argument (tree type, tree expr)
switch (TREE_CODE (type))
{
+ HOST_WIDE_INT saved_processing_template_decl;
+
case INTEGER_TYPE:
case BOOLEAN_TYPE:
case ENUMERAL_TYPE:
@@ -3404,8 +3399,12 @@ convert_nontype_argument (tree type, tree expr)
return error_mark_node;
/* It's safe to call digest_init in this case; we know we're
- just converting one integral constant expression to another. */
+ just converting one integral constant expression to another.
+ */
+ saved_processing_template_decl = processing_template_decl;
+ processing_template_decl = 0;
expr = digest_init (type, expr, (tree*) 0);
+ processing_template_decl = saved_processing_template_decl;
if (TREE_CODE (expr) != INTEGER_CST)
/* Curiously, some TREE_CONSTANT integral expressions do not
@@ -9475,101 +9474,48 @@ try_class_unification (tree tparms, tree targs, tree parm, tree arg)
return arg;
}
-/* Subroutine of get_template_base. RVAL, if non-NULL, is a base we
- have already discovered to be satisfactory. ARG_BINFO is the binfo
- for the base class of ARG that we are currently examining. */
-
-static tree
-get_template_base_recursive (tree tparms,
- tree targs,
- tree parm,
- tree arg_binfo,
- tree rval,
- int flags)
-{
- tree base_binfo;
- int i;
- tree arg = BINFO_TYPE (arg_binfo);
-
- if (!(flags & GTB_IGNORE_TYPE))
- {
- tree r = try_class_unification (tparms, targs,
- parm, arg);
-
- /* If there is more than one satisfactory baseclass, then:
-
- [temp.deduct.call]
-
- If they yield more than one possible deduced A, the type
- deduction fails.
-
- applies. */
- if (r && rval && !same_type_p (r, rval))
- return error_mark_node;
- else if (r)
- rval = r;
- }
-
- /* Process base types. */
- for (i = 0; BINFO_BASE_ITERATE (arg_binfo, i, base_binfo); i++)
- {
- int this_virtual;
-
- /* Skip this base, if we've already seen it. */
- if (BINFO_MARKED (base_binfo))
- continue;
-
- this_virtual =
- (flags & GTB_VIA_VIRTUAL) || BINFO_VIRTUAL_P (base_binfo);
-
- /* When searching for a non-virtual, we cannot mark virtually
- found binfos. */
- if (! this_virtual)
- BINFO_MARKED (base_binfo) = 1;
-
- rval = get_template_base_recursive (tparms, targs,
- parm,
- base_binfo,
- rval,
- GTB_VIA_VIRTUAL * this_virtual);
-
- /* If we discovered more than one matching base class, we can
- stop now. */
- if (rval == error_mark_node)
- return error_mark_node;
- }
-
- return rval;
-}
-
/* Given a template type PARM and a class type ARG, find the unique
base type in ARG that is an instance of PARM. We do not examine
- ARG itself; only its base-classes. If there is no appropriate base
- class, return NULL_TREE. If there is more than one, return
- error_mark_node. PARM may be the type of a partial specialization,
- as well as a plain template type. Used by unify. */
+ ARG itself; only its base-classes. If there is not exactly one
+ appropriate base class, return NULL_TREE. PARM may be the type of
+ a partial specialization, as well as a plain template type. Used
+ by unify. */
static tree
get_template_base (tree tparms, tree targs, tree parm, tree arg)
{
- tree rval;
- tree arg_binfo;
+ tree rval = NULL_TREE;
+ tree binfo;
gcc_assert (IS_AGGR_TYPE_CODE (TREE_CODE (arg)));
- arg_binfo = TYPE_BINFO (complete_type (arg));
- if (!arg_binfo)
+ binfo = TYPE_BINFO (complete_type (arg));
+ if (!binfo)
/* The type could not be completed. */
return NULL_TREE;
-
- rval = get_template_base_recursive (tparms, targs,
- parm, arg_binfo,
- NULL_TREE,
- GTB_IGNORE_TYPE);
- /* Since get_template_base_recursive marks the bases classes, we
- must unmark them here. */
- dfs_walk (arg_binfo, dfs_unmark, markedp, 0);
+ /* Walk in inheritance graph order. The search order is not
+ important, and this avoids multiple walks of virtual bases. */
+ for (binfo = TREE_CHAIN (binfo); binfo; binfo = TREE_CHAIN (binfo))
+ {
+ tree r = try_class_unification (tparms, targs, parm, BINFO_TYPE (binfo));
+
+ if (r)
+ {
+ /* If there is more than one satisfactory baseclass, then:
+
+ [temp.deduct.call]
+
+ If they yield more than one possible deduced A, the type
+ deduction fails.
+
+ applies. */
+ if (rval && !same_type_p (r, rval))
+ return NULL_TREE;
+
+ rval = r;
+ }
+ }
return rval;
}
@@ -10058,10 +10004,9 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
a class of the form template-id, A can be a
pointer to a derived class pointed to by the
deduced A. */
- t = get_template_base (tparms, targs,
- parm, arg);
+ t = get_template_base (tparms, targs, parm, arg);
- if (! t || t == error_mark_node)
+ if (!t)
return 1;
}
}
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index 67b891f85e3..47d08f34c74 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -46,8 +46,6 @@ struct vbase_info
};
static int is_subobject_of_p (tree, tree);
-static tree dfs_check_overlap (tree, void *);
-static tree dfs_no_overlap_yet (tree, int, void *);
static base_kind lookup_base_r (tree, tree, base_access, bool, tree *);
static int dynamic_cast_base_recurse (tree, tree, bool, tree *);
static tree dfs_debug_unmarkedp (tree, int, void *);
@@ -58,7 +56,6 @@ static int lookup_conversions_r (tree, int, int,
tree, tree, tree, tree, tree *, tree *);
static int look_for_overrides_r (tree, tree);
static tree lookup_field_queue_p (tree, int, void *);
-static int shared_member_p (tree);
static tree lookup_field_r (tree, void *);
static tree dfs_accessible_queue_p (tree, int, void *);
static tree dfs_accessible_p (tree, void *);
@@ -1027,7 +1024,7 @@ template_self_reference_p (tree type, tree decl)
This function checks that T contains no nonstatic members. */
-static int
+int
shared_member_p (tree t)
{
if (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == TYPE_DECL \
@@ -2272,65 +2269,6 @@ lookup_conversions (tree type)
return list;
}
-struct overlap_info
-{
- tree compare_type;
- int found_overlap;
-};
-
-/* Check whether the empty class indicated by EMPTY_BINFO is also present
- at offset 0 in COMPARE_TYPE, and set found_overlap if so. */
-
-static tree
-dfs_check_overlap (tree empty_binfo, void *data)
-{
- struct overlap_info *oi = (struct overlap_info *) data;
- tree binfo;
-
- for (binfo = TYPE_BINFO (oi->compare_type);
- ;
- binfo = BINFO_BASE_BINFO (binfo, 0))
- {
- if (BINFO_TYPE (binfo) == BINFO_TYPE (empty_binfo))
- {
- oi->found_overlap = 1;
- break;
- }
- else if (!BINFO_N_BASE_BINFOS (binfo))
- break;
- }
-
- return NULL_TREE;
-}
-
-/* Trivial function to stop base traversal when we find something. */
-
-static tree
-dfs_no_overlap_yet (tree derived, int ix, void *data)
-{
- tree binfo = BINFO_BASE_BINFO (derived, ix);
- struct overlap_info *oi = (struct overlap_info *) data;
-
- return !oi->found_overlap ? binfo : NULL_TREE;
-}
-
-/* Returns nonzero if EMPTY_TYPE or any of its bases can also be found at
- offset 0 in NEXT_TYPE. Used in laying out empty base class subobjects. */
-
-int
-types_overlap_p (tree empty_type, tree next_type)
-{
- struct overlap_info oi;
-
- if (! IS_AGGR_TYPE (next_type))
- return 0;
- oi.compare_type = next_type;
- oi.found_overlap = 0;
- dfs_walk (TYPE_BINFO (empty_type), dfs_check_overlap,
- dfs_no_overlap_yet, &oi);
- return oi.found_overlap;
-}
-
/* Returns the binfo of the first direct or indirect virtual base derived
from BINFO, or NULL if binfo is not via virtual. */
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 53c4cc37f02..5bb6f3b4d59 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -1426,19 +1426,16 @@ finish_qualified_id_expr (tree qualifying_class, tree expr, bool done,
qualifying_class);
else if (BASELINK_P (expr) && !processing_template_decl)
{
- tree fn;
tree fns;
/* See if any of the functions are non-static members. */
fns = BASELINK_FUNCTIONS (expr);
if (TREE_CODE (fns) == TEMPLATE_ID_EXPR)
fns = TREE_OPERAND (fns, 0);
- for (fn = fns; fn; fn = OVL_NEXT (fn))
- if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
- break;
/* If so, the expression may be relative to the current
class. */
- if (fn && current_class_type
+ if (!shared_member_p (fns)
+ && current_class_type
&& DERIVED_FROM_P (qualifying_class, current_class_type))
expr = (build_class_member_access_expr
(maybe_dummy_object (qualifying_class, NULL),
@@ -2646,7 +2643,8 @@ finish_id_expression (tree id_expression,
mark_used (first_fn);
if (TREE_CODE (first_fn) == FUNCTION_DECL
- && DECL_FUNCTION_MEMBER_P (first_fn))
+ && DECL_FUNCTION_MEMBER_P (first_fn)
+ && !shared_member_p (decl))
{
/* A set of member functions. */
decl = maybe_dummy_object (DECL_CONTEXT (first_fn), 0);
@@ -2894,7 +2892,7 @@ expand_body (tree fn)
generating trees for a function. */
gcc_assert (function_depth == 0);
- tree_rest_of_compilation (fn, 0);
+ tree_rest_of_compilation (fn);
current_function_decl = saved_function;
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index fc3516d8e8a..a8cea232c27 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -2331,6 +2331,19 @@ stabilize_init (tree init, tree *initp)
return true;
}
+/* Like "fold", but should be used whenever we might be processing the
+ body of a template. */
+
+tree
+fold_if_not_in_template (tree expr)
+{
+ /* In the body of a template, there is never any need to call
+ "fold". We will call fold later when actually instantiating the
+ template. Integral constant expressions in templates will be
+ evaluated via fold_non_dependent_expr, as necessary. */
+ return (processing_template_decl ? expr : fold (expr));
+}
+
#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
/* Complain that some language-specific thing hanging off a tree
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 164f7a34a71..85337735f07 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -1768,8 +1768,9 @@ build_class_member_access_expr (tree object, tree member,
member_type = cp_build_qualified_type (member_type, type_quals);
}
- result = fold (build3 (COMPONENT_REF, member_type, object, member,
- NULL_TREE));
+ result = build3 (COMPONENT_REF, member_type, object, member,
+ NULL_TREE);
+ result = fold_if_not_in_template (result);
/* Mark the expression const or volatile, as appropriate. Even
though we've dealt with the type above, we still have to mark the
@@ -2272,7 +2273,7 @@ build_array_ref (tree array, tree idx)
|= (CP_TYPE_VOLATILE_P (type) | TREE_SIDE_EFFECTS (array));
TREE_THIS_VOLATILE (rval)
|= (CP_TYPE_VOLATILE_P (type) | TREE_THIS_VOLATILE (array));
- return require_complete_type (fold (rval));
+ return require_complete_type (fold_if_not_in_template (rval));
}
{
@@ -2762,6 +2763,8 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
convert it to this type. */
tree final_type = 0;
+ tree result;
+
/* Nonzero if this is an operation like MIN or MAX which can
safely be computed in short if both args are promoted shorts.
Also implies COMMON.
@@ -2782,6 +2785,9 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
/* Nonzero means set RESULT_TYPE to the common type of the args. */
int common = 0;
+ /* True if both operands have arithmetic type. */
+ bool arithmetic_types_p;
+
/* Apply default conversions. */
op0 = orig_op0;
op1 = orig_op1;
@@ -3169,14 +3175,31 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
break;
}
- if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE)
- &&
- (code1 == INTEGER_TYPE || code1 == REAL_TYPE || code1 == COMPLEX_TYPE))
+ arithmetic_types_p =
+ ((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE)
+ && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
+ || code1 == COMPLEX_TYPE));
+ /* Determine the RESULT_TYPE, if it is not already known. */
+ if (!result_type
+ && arithmetic_types_p
+ && (shorten || common || short_compare))
+ result_type = common_type (type0, type1);
+
+ if (!result_type)
{
- int none_complex = (code0 != COMPLEX_TYPE && code1 != COMPLEX_TYPE);
+ error ("invalid operands of types `%T' and `%T' to binary `%O'",
+ TREE_TYPE (orig_op0), TREE_TYPE (orig_op1), code);
+ return error_mark_node;
+ }
- if (shorten || common || short_compare)
- result_type = common_type (type0, type1);
+ /* If we're in a template, the only thing we need to know is the
+ RESULT_TYPE. */
+ if (processing_template_decl)
+ return build2 (resultcode, result_type, op0, op1);
+
+ if (arithmetic_types_p)
+ {
+ int none_complex = (code0 != COMPLEX_TYPE && code1 != COMPLEX_TYPE);
/* For certain operations (which identify themselves by shorten != 0)
if both args were extended from the same smaller type,
@@ -3419,19 +3442,11 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
}
}
- /* At this point, RESULT_TYPE must be nonzero to avoid an error message.
- If CONVERTED is zero, both args will be converted to type RESULT_TYPE.
+ /* If CONVERTED is zero, both args will be converted to type RESULT_TYPE.
Then the expression will be built.
It will be given type FINAL_TYPE if that is nonzero;
otherwise, it will be given type RESULT_TYPE. */
- if (!result_type)
- {
- error ("invalid operands of types `%T' and `%T' to binary `%O'",
- TREE_TYPE (orig_op0), TREE_TYPE (orig_op1), code);
- return error_mark_node;
- }
-
/* Issue warnings about peculiar, but valid, uses of NULL. */
if (/* It's reasonable to use pointer values as operands of &&
and ||, so NULL is no exception. */
@@ -3465,12 +3480,11 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
if (build_type == NULL_TREE)
build_type = result_type;
- {
- tree result = fold (build2 (resultcode, build_type, op0, op1));
- if (final_type != 0)
- result = cp_convert (final_type, result);
- return result;
- }
+ result = build2 (resultcode, build_type, op0, op1);
+ result = fold_if_not_in_template (result);
+ if (final_type != 0)
+ result = cp_convert (final_type, result);
+ return result;
}
/* Return a tree for the sum or difference (RESULTCODE says which)
@@ -3488,7 +3502,8 @@ cp_pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop)
pointer_int_sum() anyway. */
complete_type (TREE_TYPE (res_type));
- return pointer_int_sum (resultcode, ptrop, fold (intop));
+ return pointer_int_sum (resultcode, ptrop,
+ fold_if_not_in_template (intop));
}
/* Return a tree for the difference of pointers OP0 and OP1.
@@ -3532,7 +3547,7 @@ pointer_diff (tree op0, tree op1, tree ptrtype)
/* Do the division. */
result = build2 (EXACT_DIV_EXPR, restype, op0, cp_convert (restype, op1));
- return fold (result);
+ return fold_if_not_in_template (result);
}
/* Construct and perhaps optimize a tree representation
@@ -3782,7 +3797,10 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
if (TREE_CODE (arg) == COMPLEX_CST)
return TREE_REALPART (arg);
else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
- return fold (build1 (REALPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg));
+ {
+ arg = build1 (REALPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg);
+ return fold_if_not_in_template (arg);
+ }
else
return arg;
@@ -3790,7 +3808,10 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
if (TREE_CODE (arg) == COMPLEX_CST)
return TREE_IMAGPART (arg);
else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
- return fold (build1 (IMAGPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg));
+ {
+ arg = build1 (IMAGPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg);
+ return fold_if_not_in_template (arg);
+ }
else
return cp_convert (TREE_TYPE (arg), integer_zero_node);
@@ -4133,7 +4154,7 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
{
if (argtype == 0)
argtype = TREE_TYPE (arg);
- return fold (build1 (code, argtype, arg));
+ return fold_if_not_in_template (build1 (code, argtype, arg));
}
error ("%s", errstring);
@@ -4721,21 +4742,21 @@ build_reinterpret_cast (tree type, tree expr)
|| (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
{
expr = decl_constant_value (expr);
- return fold (build1 (NOP_EXPR, type, expr));
+ return fold_if_not_in_template (build_nop (type, expr));
}
else if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
|| (TYPE_PTROBV_P (type) && TYPE_PTROBV_P (intype)))
{
check_for_casting_away_constness (intype, type, "reinterpret_cast");
expr = decl_constant_value (expr);
- return fold (build1 (NOP_EXPR, type, expr));
+ return fold_if_not_in_template (build_nop (type, expr));
}
else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype))
|| (TYPE_PTRFN_P (intype) && TYPE_PTROBV_P (type)))
{
pedwarn ("ISO C++ forbids casting between pointer-to-function and pointer-to-object");
expr = decl_constant_value (expr);
- return fold (build1 (NOP_EXPR, type, expr));
+ return fold_if_not_in_template (build_nop (type, expr));
}
else
{
@@ -5382,7 +5403,8 @@ get_delta_difference (tree from, tree to, int force)
}
}
- return fold (convert_to_integer (ptrdiff_type_node, result));
+ return fold_if_not_in_template (convert_to_integer (ptrdiff_type_node,
+ result));
}
/* Return a constructor for the pointer-to-member-function TYPE using
@@ -5540,36 +5562,41 @@ expand_ptrmemfunc_cst (tree cst, tree *delta, tree *pfn)
fn; the call will do the opposite adjustment. */
tree orig_class = DECL_CONTEXT (fn);
tree binfo = binfo_or_else (orig_class, fn_class);
- *delta = fold (build2 (PLUS_EXPR, TREE_TYPE (*delta),
- *delta, BINFO_OFFSET (binfo)));
+ *delta = build2 (PLUS_EXPR, TREE_TYPE (*delta),
+ *delta, BINFO_OFFSET (binfo));
+ *delta = fold_if_not_in_template (*delta);
/* We set PFN to the vtable offset at which the function can be
found, plus one (unless ptrmemfunc_vbit_in_delta, in which
case delta is shifted left, and then incremented). */
*pfn = DECL_VINDEX (fn);
- *pfn = fold (build2 (MULT_EXPR, integer_type_node, *pfn,
- TYPE_SIZE_UNIT (vtable_entry_type)));
+ *pfn = build2 (MULT_EXPR, integer_type_node, *pfn,
+ TYPE_SIZE_UNIT (vtable_entry_type));
+ *pfn = fold_if_not_in_template (*pfn);
switch (TARGET_PTRMEMFUNC_VBIT_LOCATION)
{
case ptrmemfunc_vbit_in_pfn:
- *pfn = fold (build2 (PLUS_EXPR, integer_type_node, *pfn,
- integer_one_node));
+ *pfn = build2 (PLUS_EXPR, integer_type_node, *pfn,
+ integer_one_node);
+ *pfn = fold_if_not_in_template (*pfn);
break;
case ptrmemfunc_vbit_in_delta:
- *delta = fold (build2 (LSHIFT_EXPR, TREE_TYPE (*delta),
- *delta, integer_one_node));
- *delta = fold (build2 (PLUS_EXPR, TREE_TYPE (*delta),
- *delta, integer_one_node));
+ *delta = build2 (LSHIFT_EXPR, TREE_TYPE (*delta),
+ *delta, integer_one_node);
+ *delta = fold_if_not_in_template (*delta);
+ *delta = build2 (PLUS_EXPR, TREE_TYPE (*delta),
+ *delta, integer_one_node);
+ *delta = fold_if_not_in_template (*delta);
break;
default:
gcc_unreachable ();
}
- *pfn = fold (build1 (NOP_EXPR, TYPE_PTRMEMFUNC_FN_TYPE (type),
- *pfn));
+ *pfn = build_nop (TYPE_PTRMEMFUNC_FN_TYPE (type), *pfn);
+ *pfn = fold_if_not_in_template (*pfn);
}
}
@@ -5639,7 +5666,7 @@ dubious_conversion_warnings (tree type, tree expr,
overflow_warning (expr);
if (TREE_CONSTANT (expr))
- expr = fold (expr);
+ expr = fold_if_not_in_template (expr);
}
return expr;
}
diff --git a/gcc/cse.c b/gcc/cse.c
index b7da8a34978..651203d1064 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -5395,6 +5395,11 @@ cse_insn (rtx insn, rtx libcall_insn)
|| (GET_CODE (trial) == LABEL_REF
&& ! condjump_p (insn))))
{
+ /* Don't substitute non-local labels, this confuses CFG. */
+ if (GET_CODE (trial) == LABEL_REF
+ && LABEL_REF_NONLOCAL_P (trial))
+ continue;
+
SET_SRC (sets[i].rtl) = trial;
cse_jumps_altered = 1;
break;
@@ -7392,6 +7397,7 @@ cse_cc_succs (basic_block bb, rtx cc_reg, rtx cc_src, bool can_change_mode)
rtx last_insns[2];
unsigned int i;
rtx newreg;
+ edge_iterator ei;
/* We expect to have two successors. Look at both before picking
the final mode for the comparison. If we have more successors
@@ -7402,7 +7408,7 @@ cse_cc_succs (basic_block bb, rtx cc_reg, rtx cc_src, bool can_change_mode)
found_equiv = false;
mode = GET_MODE (cc_src);
insn_count = 0;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
rtx insn;
rtx end;
@@ -7410,8 +7416,7 @@ cse_cc_succs (basic_block bb, rtx cc_reg, rtx cc_src, bool can_change_mode)
if (e->flags & EDGE_COMPLEX)
continue;
- if (! e->dest->pred
- || e->dest->pred->pred_next
+ if (EDGE_COUNT (e->dest->preds) != 1
|| e->dest == EXIT_BLOCK_PTR)
continue;
diff --git a/gcc/df.c b/gcc/df.c
index 2a59ca42b2d..ee10362660d 100644
--- a/gcc/df.c
+++ b/gcc/df.c
@@ -3796,18 +3796,19 @@ hybrid_search (basic_block bb, struct dataflow *dataflow,
int changed;
int i = bb->index;
edge e;
+ edge_iterator ei;
SET_BIT (visited, bb->index);
gcc_assert (TEST_BIT (pending, bb->index));
RESET_BIT (pending, i);
-#define HS(E_ANTI, E_ANTI_NEXT, E_ANTI_BB, E_ANTI_START_BB, IN_SET, \
- E, E_NEXT, E_BB, E_START_BB, OUT_SET) \
+#define HS(E_ANTI, E_ANTI_BB, E_ANTI_START_BB, IN_SET, \
+ E, E_BB, E_START_BB, OUT_SET) \
do \
{ \
/* Calculate <conf_op> of predecessor_outs. */ \
bitmap_zero (IN_SET[i]); \
- for (e = bb->E_ANTI; e; e = e->E_ANTI_NEXT) \
+ FOR_EACH_EDGE (e, ei, bb->E_ANTI) \
{ \
if (e->E_ANTI_BB == E_ANTI_START_BB) \
continue; \
@@ -3827,7 +3828,7 @@ hybrid_search (basic_block bb, struct dataflow *dataflow,
if (!changed) \
break; \
\
- for (e = bb->E; e; e = e->E_NEXT) \
+ FOR_EACH_EDGE (e, ei, bb->E) \
{ \
if (e->E_BB == E_START_BB || e->E_BB->index == i) \
continue; \
@@ -3838,7 +3839,7 @@ hybrid_search (basic_block bb, struct dataflow *dataflow,
SET_BIT (pending, e->E_BB->index); \
} \
\
- for (e = bb->E; e; e = e->E_NEXT) \
+ FOR_EACH_EDGE (e, ei, bb->E) \
{ \
if (e->E_BB == E_START_BB || e->E_BB->index == i) \
continue; \
@@ -3852,11 +3853,11 @@ hybrid_search (basic_block bb, struct dataflow *dataflow,
} while (0)
if (dataflow->dir == DF_FORWARD)
- HS (pred, pred_next, src, ENTRY_BLOCK_PTR, dataflow->in,
- succ, succ_next, dest, EXIT_BLOCK_PTR, dataflow->out);
+ HS (preds, src, ENTRY_BLOCK_PTR, dataflow->in,
+ succs, dest, EXIT_BLOCK_PTR, dataflow->out);
else
- HS (succ, succ_next, dest, EXIT_BLOCK_PTR, dataflow->out,
- pred, pred_next, src, ENTRY_BLOCK_PTR, dataflow->in);
+ HS (succs, dest, EXIT_BLOCK_PTR, dataflow->out,
+ preds, src, ENTRY_BLOCK_PTR, dataflow->in);
}
/* This function will perform iterative bitvector dataflow described by
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index ded154fd318..713695083d2 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -3562,6 +3562,20 @@ asm ("cmoveq %1,%2,%[result]"
: "r" (test), "r"(new), "[result]"(old));
@end smallexample
+Sometimes you need to make an @code{asm} operand be a specific register,
+but there's no matching constraint letter for that register @emph{by
+itself}. To force the operand into that register, use a local variable
+for the operand and specify the register in the variable declaration.
+@xref{Explicit Reg Vars}. Then for the @code{asm} operand, use any
+register constraint letter that matches the register:
+
+@smallexample
+register int *p1 asm ("r0") = @dots{};
+register int *p2 asm ("r1") = @dots{};
+register int *result asm ("r0");
+asm ("sysint" : "=r" (result) : "0" (p1), "r" (p2));
+@end smallexample
+
Some instructions clobber specific hard registers. To describe this,
write a third colon after the input operands, followed by the names of
the clobbered hard registers (given as strings). Here is a realistic
@@ -3955,7 +3969,9 @@ very often.
@item
Local register variables in specific registers do not reserve the
-registers. The compiler's data flow analysis is capable of determining
+registers, except at the point where they are used as input or output
+operands in an @code{asm} statement and the @code{asm} statement itself is
+not deleted. The compiler's data flow analysis is capable of determining
where the specified registers contain live values, and where they are
available for other uses. Stores into local register variables may be deleted
when they appear to be dead according to dataflow analysis. References
@@ -4104,8 +4120,11 @@ the variable's value is not live.
This option does not guarantee that GCC will generate code that has
this variable in the register you specify at all times. You may not
-code an explicit reference to this register in an @code{asm} statement
-and assume it will always refer to this variable.
+code an explicit reference to this register in the @emph{assembler
+instruction template} part of an @code{asm} statement and assume it will
+always refer to this variable. However, using the variable as an
+@code{asm} @emph{operand} guarantees that the specified register is used
+for the operand.
Stores into local register variables may be deleted when they appear to be dead
according to dataflow analysis. References to local register variables may
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index fc033ecc691..8208a89061a 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -2974,6 +2974,14 @@ general register, but an alternate column needs to be used for
signal frames.
@end defmac
+@defmac DWARF_ZERO_REG
+A C expression whose value is an integer giving a DWARF 2 register
+number that is considered to always have the value zero. This should
+only be defined if the target has an architected zero register, and
+someone decided it was a good idea to use that register number to
+terminate the stack backtrace. New ports should avoid this.
+@end defmac
+
@defmac INCOMING_FRAME_SP_OFFSET
A C expression whose value is an integer giving the offset, in bytes,
from the value of the stack pointer register to the top of the stack
@@ -3739,7 +3747,7 @@ known to be passed by reference. The hook should return true if the
function argument should be copied by the callee instead of copied
by the caller.
-For any argument for which the hook returns true, if it can be
+For any argument for which the hook returns true, if it can be
determined that the argument is not modified, then a copy need
not be generated.
@@ -8053,6 +8061,12 @@ for SDB in response to the @option{-g} option.
Define this macro if GCC should produce dwarf version 2 format
debugging output in response to the @option{-g} option.
+@deftypefn {Target Hook} int TARGET_DWARF_CALLING_CONVENTION (tree @var{function})
+Define this to enable the dwarf attribute @code{DW_AT_calling_convention} to
+be emitted for each function. Instead of an integer return the enum
+value for the @code{DW_CC_} tag.
+@end deftypefn
+
To support optional call frame debugging information, you must also
define @code{INCOMING_RETURN_ADDR_RTX} and either set
@code{RTX_FRAME_RELATED_P} on the prologue insns if you use RTL for the
diff --git a/gcc/dominance.c b/gcc/dominance.c
index bbb0b21484b..680c4561c9d 100644
--- a/gcc/dominance.c
+++ b/gcc/dominance.c
@@ -206,7 +206,8 @@ calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb,
/* We call this _only_ if bb is not already visited. */
edge e;
TBB child_i, my_i = 0;
- edge *stack;
+ edge_iterator *stack;
+ edge_iterator ei, einext;
int sp;
/* Start block (ENTRY_BLOCK_PTR for forward problem, EXIT_BLOCK for backward
problem). */
@@ -214,19 +215,19 @@ calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb,
/* Ending block. */
basic_block ex_block;
- stack = xmalloc ((n_basic_blocks + 3) * sizeof (edge));
+ stack = xmalloc ((n_basic_blocks + 3) * sizeof (edge_iterator));
sp = 0;
/* Initialize our border blocks, and the first edge. */
if (reverse)
{
- e = bb->pred;
+ ei = ei_start (bb->preds);
en_block = EXIT_BLOCK_PTR;
ex_block = ENTRY_BLOCK_PTR;
}
else
{
- e = bb->succ;
+ ei = ei_start (bb->succs);
en_block = ENTRY_BLOCK_PTR;
ex_block = EXIT_BLOCK_PTR;
}
@@ -238,9 +239,9 @@ calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb,
/* This loop traverses edges e in depth first manner, and fills the
stack. */
- while (e)
+ while (!ei_end_p (ei))
{
- edge e_next;
+ e = ei_edge (ei);
/* Deduce from E the current and the next block (BB and BN), and the
next edge. */
@@ -253,22 +254,22 @@ calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb,
with the next edge out of the current node. */
if (bn == ex_block || di->dfs_order[bn->index])
{
- e = e->pred_next;
+ ei_next (&ei);
continue;
}
bb = e->dest;
- e_next = bn->pred;
+ einext = ei_start (bn->preds);
}
else
{
bn = e->dest;
if (bn == ex_block || di->dfs_order[bn->index])
{
- e = e->succ_next;
+ ei_next (&ei);
continue;
}
bb = e->src;
- e_next = bn->succ;
+ einext = ei_start (bn->succs);
}
gcc_assert (bn != en_block);
@@ -283,13 +284,13 @@ calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb,
di->dfs_parent[child_i] = my_i;
/* Save the current point in the CFG on the stack, and recurse. */
- stack[sp++] = e;
- e = e_next;
+ stack[sp++] = ei;
+ ei = einext;
}
if (!sp)
break;
- e = stack[--sp];
+ ei = stack[--sp];
/* OK. The edge-list was exhausted, meaning normally we would
end the recursion. After returning from the recursive call,
@@ -300,10 +301,7 @@ calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb,
the block not yet completed (the parent of the one above)
in e->src. This could be used e.g. for computing the number of
descendants or the tree depth. */
- if (reverse)
- e = e->pred_next;
- else
- e = e->succ_next;
+ ei_next (&ei);
}
free (stack);
}
@@ -341,7 +339,7 @@ calc_dfs_tree (struct dom_info *di, enum cdi_direction reverse)
FOR_EACH_BB_REVERSE (b)
{
- if (b->succ)
+ if (EDGE_COUNT (b->succs) > 0)
{
if (di->dfs_order[b->index] == 0)
saw_unconnected = true;
@@ -478,6 +476,8 @@ calc_idoms (struct dom_info *di, enum cdi_direction reverse)
{
TBB v, w, k, par;
basic_block en_block;
+ edge_iterator ei, einext;
+
if (reverse)
en_block = EXIT_BLOCK_PTR;
else
@@ -488,43 +488,38 @@ calc_idoms (struct dom_info *di, enum cdi_direction reverse)
while (v > 1)
{
basic_block bb = di->dfs_to_bb[v];
- edge e, e_next;
+ edge e;
par = di->dfs_parent[v];
k = v;
+
+ ei = (reverse) ? ei_start (bb->succs) : ei_start (bb->preds);
+
if (reverse)
{
- e = bb->succ;
-
/* If this block has a fake edge to exit, process that first. */
if (bitmap_bit_p (di->fake_exit_edge, bb->index))
{
- e_next = e;
+ einext = ei;
+ einext.index = 0;
goto do_fake_exit_edge;
}
}
- else
- e = bb->pred;
/* Search all direct predecessors for the smallest node with a path
to them. That way we have the smallest node with also a path to
us only over nodes behind us. In effect we search for our
semidominator. */
- for (; e ; e = e_next)
+ while (!ei_end_p (ei))
{
TBB k1;
basic_block b;
- if (reverse)
- {
- b = e->dest;
- e_next = e->succ_next;
- }
- else
- {
- b = e->src;
- e_next = e->pred_next;
- }
+ e = ei_edge (ei);
+ b = (reverse) ? e->dest : e->src;
+ einext = ei;
+ ei_next (&einext);
+
if (b == en_block)
{
do_fake_exit_edge:
@@ -539,6 +534,8 @@ calc_idoms (struct dom_info *di, enum cdi_direction reverse)
k1 = di->key[eval (di, k1)];
if (k1 < k)
k = k1;
+
+ ei = einext;
}
di->key[v] = k;
@@ -870,12 +867,13 @@ recount_dominator (enum cdi_direction dir, basic_block bb)
{
basic_block dom_bb = NULL;
edge e;
+ edge_iterator ei;
gcc_assert (dom_computed[dir]);
if (dir == CDI_DOMINATORS)
{
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
/* Ignore the predecessors that either are not reachable from
the entry block, or whose dominator was not determined yet. */
@@ -888,7 +886,7 @@ recount_dominator (enum cdi_direction dir, basic_block bb)
}
else
{
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (!dominated_by_p (dir, e->dest, bb))
dom_bb = nearest_common_dominator (dir, dom_bb, e->dest);
diff --git a/gcc/domwalk.c b/gcc/domwalk.c
index 7ac7ecf4f3e..15b1dff82db 100644
--- a/gcc/domwalk.c
+++ b/gcc/domwalk.c
@@ -201,7 +201,7 @@ walk_dominator_tree (struct dom_walk_data *walk_data, basic_block bb)
{
/* The destination block may have become unreachable, in
which case there's no point in optimizing it. */
- if (dest->pred)
+ if (EDGE_COUNT (dest->preds) > 0)
walk_dominator_tree (walk_data, dest);
}
diff --git a/gcc/dwarf2.h b/gcc/dwarf2.h
index 0e98a455fab..111ff522fe3 100644
--- a/gcc/dwarf2.h
+++ b/gcc/dwarf2.h
@@ -474,7 +474,8 @@ enum dwarf_calling_convention
{
DW_CC_normal = 0x1,
DW_CC_program = 0x2,
- DW_CC_nocall = 0x3
+ DW_CC_nocall = 0x3,
+ DW_CC_renesas_sh = 0x40
};
#define DW_CC_lo_user 0x40
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 3992c83189b..aa308489ff6 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -116,7 +116,7 @@ dwarf2out_do_frame (void)
/* Various versions of targetm.eh_frame_section. Note these must appear
outside the DWARF2_DEBUGGING_INFO || DWARF2_UNWIND_INFO macro guards. */
-/* Version of targetm.eh_frame_section for systems with named sections. */
+/* Version of targetm.eh_frame_section for systems with named sections. */
void
named_section_eh_frame_section (void)
{
@@ -142,7 +142,7 @@ named_section_eh_frame_section (void)
#endif
}
-/* Version of targetm.eh_frame_section for systems using collect2. */
+/* Version of targetm.eh_frame_section for systems using collect2. */
void
collect2_eh_frame_section (void)
{
@@ -1150,7 +1150,7 @@ struct reg_saved_in_data GTY(()) {
more efficient data structure. */
static GTY(()) struct reg_saved_in_data regs_saved_in_regs[4];
static GTY(()) size_t num_regs_saved_in_regs;
-
+
#if defined (DWARF2_DEBUGGING_INFO) || defined (DWARF2_UNWIND_INFO)
static const char *last_reg_save_label;
@@ -1253,7 +1253,7 @@ reg_saved_in (rtx reg)
unsigned int regn = REGNO (reg);
size_t i;
struct queued_reg_save *q;
-
+
for (q = queued_reg_saves; q; q = q->next)
if (q->saved_reg && regn == REGNO (q->saved_reg))
return q->reg;
@@ -1311,7 +1311,7 @@ static dw_cfa_location cfa_temp;
the intent is to save the value of SP from the previous frame.
In addition, if a register has previously been saved to a different
- register,
+ register,
Invariants / Summaries of Rules
@@ -1480,7 +1480,7 @@ dwarf2out_frame_debug_expr (rtx expr, const char *label)
{
/* Rule 1 */
/* Update the CFA rule wrt SP or FP. Make sure src is
- relative to the current CFA register.
+ relative to the current CFA register.
We used to require that dest be either SP or FP, but the
ARM copies SP to a temporary register, and from there to
@@ -1677,14 +1677,14 @@ dwarf2out_frame_debug_expr (rtx expr, const char *label)
case LO_SUM:
{
int regno;
-
+
gcc_assert (GET_CODE (XEXP (XEXP (dest, 0), 1)) == CONST_INT);
offset = INTVAL (XEXP (XEXP (dest, 0), 1));
if (GET_CODE (XEXP (dest, 0)) == MINUS)
offset = -offset;
regno = REGNO (XEXP (XEXP (dest, 0), 0));
-
+
if (cfa_store.reg == (unsigned) regno)
offset -= cfa_store.offset;
else
@@ -1700,7 +1700,7 @@ dwarf2out_frame_debug_expr (rtx expr, const char *label)
case REG:
{
int regno = REGNO (XEXP (dest, 0));
-
+
if (cfa_store.reg == (unsigned) regno)
offset = -cfa_store.offset;
else
@@ -1778,7 +1778,7 @@ dwarf2out_frame_debug (rtx insn)
if (insn == NULL_RTX)
{
size_t i;
-
+
/* Flush any queued register saves. */
flush_queued_reg_saves ();
@@ -1791,7 +1791,7 @@ dwarf2out_frame_debug (rtx insn)
cfa_store = cfa;
cfa_temp.reg = -1;
cfa_temp.offset = 0;
-
+
for (i = 0; i < num_regs_saved_in_regs; i++)
{
regs_saved_in_regs[i].orig_reg = NULL_RTX;
@@ -3930,6 +3930,7 @@ static dw_die_ref scope_die_for (tree, dw_die_ref);
static inline int local_scope_p (dw_die_ref);
static inline int class_or_namespace_scope_p (dw_die_ref);
static void add_type_attribute (dw_die_ref, tree, int, int, dw_die_ref);
+static void add_calling_convention_attribute (dw_die_ref, tree);
static const char *type_tag (tree);
static tree member_declared_type (tree);
#if 0
@@ -4809,11 +4810,11 @@ AT_string_form (dw_attr_ref a)
char label[32];
gcc_assert (a && AT_class (a) == dw_val_class_str);
-
+
node = a->dw_attr_val.v.val_str;
if (node->form)
return node->form;
-
+
len = strlen (node->str) + 1;
/* If the string is shorter or equal to the size of the reference, it is
@@ -8637,7 +8638,7 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode, bool can_use_fbreg)
case ASHIFT:
op = DW_OP_shl;
goto do_binop;
-
+
case ASHIFTRT:
op = DW_OP_shra;
goto do_binop;
@@ -9283,7 +9284,7 @@ field_byte_offset (tree decl)
if (TREE_CODE (decl) == ERROR_MARK)
return 0;
-
+
gcc_assert (TREE_CODE (decl) == FIELD_DECL);
type = field_type (decl);
@@ -9557,7 +9558,7 @@ add_const_value_attribute (dw_die_ref die, rtx rtl)
if (val < 0)
add_AT_int (die, DW_AT_const_value, val);
- else
+ else
add_AT_unsigned (die, DW_AT_const_value, (unsigned HOST_WIDE_INT) val);
}
break;
@@ -9605,30 +9606,30 @@ add_const_value_attribute (dw_die_ref die, rtx rtl)
{
rtx elt = CONST_VECTOR_ELT (rtl, i);
HOST_WIDE_INT lo, hi;
-
+
switch (GET_CODE (elt))
{
case CONST_INT:
lo = INTVAL (elt);
hi = -(lo < 0);
break;
-
+
case CONST_DOUBLE:
lo = CONST_DOUBLE_LOW (elt);
hi = CONST_DOUBLE_HIGH (elt);
break;
-
+
default:
gcc_unreachable ();
}
-
+
if (elt_size <= sizeof (HOST_WIDE_INT))
insert_int (lo, elt_size, p);
else
{
unsigned char *p0 = p;
unsigned char *p1 = p + sizeof (HOST_WIDE_INT);
-
+
gcc_assert (elt_size == 2 * sizeof (HOST_WIDE_INT));
if (WORDS_BIG_ENDIAN)
{
@@ -10621,6 +10622,20 @@ add_type_attribute (dw_die_ref object_die, tree type, int decl_const,
add_AT_die_ref (object_die, DW_AT_type, type_die);
}
+/* Given an object die, add the calling convention attribute for the
+ function call type. */
+static void
+add_calling_convention_attribute (dw_die_ref subr_die, tree type)
+{
+ enum dwarf_calling_convention value = DW_CC_normal;
+
+ value = targetm.dwarf_calling_convention (type);
+
+ /* Only add the attribute if the backend requests it. */
+ if (value)
+ add_AT_unsigned (subr_die, DW_AT_calling_convention, value);
+}
+
/* Given a tree pointer to a struct, class, union, or enum type node, return
a pointer to the (string) tag name for the given type, or zero if the type
was declared without a tag. */
@@ -11165,7 +11180,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
subr_die = old_die;
/* Clear out the declaration attribute and the formal parameters.
- Do not remove all children, because it is possible that this
+ Do not remove all children, because it is possible that this
declaration die was forced using force_decl_die(). In such
cases die that forced declaration die (e.g. TAG_imported_module)
is one of the children that we do not want to remove. */
@@ -11218,7 +11233,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
/* The first time we see a member function, it is in the context of
the class to which it belongs. We make sure of this by emitting
the class first. The next time is the definition, which is
- handled above. The two may come from the same source text.
+ handled above. The two may come from the same source text.
Note that force_decl_die() forces function declaration die. It is
later reused to represent definition. */
@@ -11917,6 +11932,7 @@ gen_subroutine_type_die (tree type, dw_die_ref context_die)
equate_type_number_to_die (type, subr_die);
add_prototyped_attribute (subr_die, type);
add_type_attribute (subr_die, return_type, 0, 0, context_die);
+ add_calling_convention_attribute (subr_die, type);
gen_formal_types_die (type, subr_die);
}
@@ -12356,7 +12372,7 @@ force_decl_die (tree decl)
save_fn = current_function_decl;
current_function_decl = NULL_TREE;
gen_subprogram_die (decl, context_die);
- current_function_decl = save_fn;
+ current_function_decl = save_fn;
break;
case VAR_DECL:
@@ -12375,14 +12391,14 @@ force_decl_die (tree decl)
default:
gcc_unreachable ();
}
-
+
/* See if we can find the die for this deci now.
If not then abort. */
if (!decl_die)
decl_die = lookup_decl_die (decl);
gcc_assert (decl_die);
}
-
+
return decl_die;
}
@@ -12696,8 +12712,8 @@ dwarf2out_type_decl (tree decl, int local)
dwarf2out_decl (decl);
}
-/* Output debug information for imported module or decl. */
-
+/* Output debug information for imported module or decl. */
+
static void
dwarf2out_imported_module_or_decl (tree decl, tree context)
{
@@ -12705,14 +12721,14 @@ dwarf2out_imported_module_or_decl (tree decl, tree context)
dw_die_ref scope_die;
unsigned file_index;
expanded_location xloc;
-
+
if (debug_info_level <= DINFO_LEVEL_TERSE)
return;
gcc_assert (decl);
/* To emit DW_TAG_imported_module or DW_TAG_imported_decl, we need two DIEs.
- We need decl DIE for reference and scope die. First, get DIE for the decl
+ We need decl DIE for reference and scope die. First, get DIE for the decl
itself. */
/* Get the scope die for decl context. Use comp_unit_die for global module
@@ -12729,8 +12745,8 @@ dwarf2out_imported_module_or_decl (tree decl, tree context)
at_import_die = force_type_die (TREE_TYPE (decl));
else
at_import_die = force_decl_die (decl);
-
- /* OK, now we have DIEs for decl as well as scope. Emit imported die. */
+
+ /* OK, now we have DIEs for decl as well as scope. Emit imported die. */
if (TREE_CODE (decl) == NAMESPACE_DECL)
imported_die = new_die (DW_TAG_imported_module, scope_die, context);
else
@@ -13440,7 +13456,7 @@ static void
prune_unused_types_prune (dw_die_ref die)
{
dw_die_ref c, p, n;
-
+
gcc_assert (die->die_mark);
p = NULL;
@@ -13568,9 +13584,9 @@ dwarf2out_finish (const char *filename)
context = DECL_CONTEXT (node->created_for);
else if (TYPE_P (node->created_for))
context = TYPE_CONTEXT (node->created_for);
-
+
gcc_assert (context && TREE_CODE (context) == FUNCTION_DECL);
-
+
origin = lookup_decl_die (context);
if (origin)
add_child_die (origin, die);
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 2572b856410..2a152c525c0 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -1485,9 +1485,7 @@ mem_expr_equal_p (tree expr1, tree expr2)
&& mem_expr_equal_p (TREE_OPERAND (expr1, 1), /* field decl */
TREE_OPERAND (expr2, 1));
- if (TREE_CODE (expr1) == INDIRECT_REF
- || TREE_CODE (expr1) == ALIGN_INDIRECT_REF
- || TREE_CODE (expr1) == MISALIGNED_INDIRECT_REF)
+ if (INDIRECT_REF_P (expr1))
return mem_expr_equal_p (TREE_OPERAND (expr1, 0),
TREE_OPERAND (expr2, 0));
@@ -1685,9 +1683,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
the size we got from the type? */
}
else if (flag_argument_noalias > 1
- && (TREE_CODE (t2) == INDIRECT_REF
- || TREE_CODE (t2) == ALIGN_INDIRECT_REF
- || TREE_CODE (t2) == MISALIGNED_INDIRECT_REF)
+ && (INDIRECT_REF_P (t2))
&& TREE_CODE (TREE_OPERAND (t2, 0)) == PARM_DECL)
{
expr = t2;
@@ -1698,9 +1694,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
/* If this is a Fortran indirect argument reference, record the
parameter decl. */
else if (flag_argument_noalias > 1
- && (TREE_CODE (t) == INDIRECT_REF
- || TREE_CODE (t) == ALIGN_INDIRECT_REF
- || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
+ && (INDIRECT_REF_P (t))
&& TREE_CODE (TREE_OPERAND (t, 0)) == PARM_DECL)
{
expr = t;
@@ -3957,7 +3951,7 @@ remove_unnecessary_notes (void)
/* Make X be output before the instruction BEFORE. */
rtx
-emit_insn_before (rtx x, rtx before)
+emit_insn_before_noloc (rtx x, rtx before)
{
rtx last = before;
rtx insn;
@@ -4004,7 +3998,7 @@ emit_insn_before (rtx x, rtx before)
and output it before the instruction BEFORE. */
rtx
-emit_jump_insn_before (rtx x, rtx before)
+emit_jump_insn_before_noloc (rtx x, rtx before)
{
rtx insn, last = NULL_RTX;
@@ -4047,7 +4041,7 @@ emit_jump_insn_before (rtx x, rtx before)
and output it before the instruction BEFORE. */
rtx
-emit_call_insn_before (rtx x, rtx before)
+emit_call_insn_before_noloc (rtx x, rtx before)
{
rtx last = NULL_RTX, insn;
@@ -4177,7 +4171,7 @@ emit_insn_after_1 (rtx first, rtx after)
/* Make X be output after the insn AFTER. */
rtx
-emit_insn_after (rtx x, rtx after)
+emit_insn_after_noloc (rtx x, rtx after)
{
rtx last = after;
@@ -4233,7 +4227,7 @@ emit_insn_after_with_line_notes (rtx x, rtx after, rtx from)
and output it after the insn AFTER. */
rtx
-emit_jump_insn_after (rtx x, rtx after)
+emit_jump_insn_after_noloc (rtx x, rtx after)
{
rtx last;
@@ -4269,7 +4263,7 @@ emit_jump_insn_after (rtx x, rtx after)
and output it after the instruction AFTER. */
rtx
-emit_call_insn_after (rtx x, rtx after)
+emit_call_insn_after_noloc (rtx x, rtx after)
{
rtx last;
@@ -4370,19 +4364,19 @@ emit_note_copy_after (rtx orig, rtx after)
return note;
}
-/* Like emit_insn_after, but set INSN_LOCATOR according to SCOPE. */
+/* Like emit_insn_after_noloc, but set INSN_LOCATOR according to SCOPE. */
rtx
emit_insn_after_setloc (rtx pattern, rtx after, int loc)
{
- rtx last = emit_insn_after (pattern, after);
+ rtx last = emit_insn_after_noloc (pattern, after);
- if (pattern == NULL_RTX)
+ if (pattern == NULL_RTX || !loc)
return last;
after = NEXT_INSN (after);
while (1)
{
- if (active_insn_p (after))
+ if (active_insn_p (after) && !INSN_LOCATOR (after))
INSN_LOCATOR (after) = loc;
if (after == last)
break;
@@ -4391,19 +4385,29 @@ emit_insn_after_setloc (rtx pattern, rtx after, int loc)
return last;
}
-/* Like emit_jump_insn_after, but set INSN_LOCATOR according to SCOPE. */
+/* Like emit_insn_after_noloc, but set INSN_LOCATOR according to AFTER. */
+rtx
+emit_insn_after (rtx pattern, rtx after)
+{
+ if (INSN_P (after))
+ return emit_insn_after_setloc (pattern, after, INSN_LOCATOR (after));
+ else
+ return emit_insn_after_noloc (pattern, after);
+}
+
+/* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to SCOPE. */
rtx
emit_jump_insn_after_setloc (rtx pattern, rtx after, int loc)
{
- rtx last = emit_jump_insn_after (pattern, after);
+ rtx last = emit_jump_insn_after_noloc (pattern, after);
- if (pattern == NULL_RTX)
+ if (pattern == NULL_RTX || !loc)
return last;
after = NEXT_INSN (after);
while (1)
{
- if (active_insn_p (after))
+ if (active_insn_p (after) && !INSN_LOCATOR (after))
INSN_LOCATOR (after) = loc;
if (after == last)
break;
@@ -4412,19 +4416,29 @@ emit_jump_insn_after_setloc (rtx pattern, rtx after, int loc)
return last;
}
-/* Like emit_call_insn_after, but set INSN_LOCATOR according to SCOPE. */
+/* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to AFTER. */
+rtx
+emit_jump_insn_after (rtx pattern, rtx after)
+{
+ if (INSN_P (after))
+ return emit_jump_insn_after_setloc (pattern, after, INSN_LOCATOR (after));
+ else
+ return emit_jump_insn_after_noloc (pattern, after);
+}
+
+/* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to SCOPE. */
rtx
emit_call_insn_after_setloc (rtx pattern, rtx after, int loc)
{
- rtx last = emit_call_insn_after (pattern, after);
+ rtx last = emit_call_insn_after_noloc (pattern, after);
- if (pattern == NULL_RTX)
+ if (pattern == NULL_RTX || !loc)
return last;
after = NEXT_INSN (after);
while (1)
{
- if (active_insn_p (after))
+ if (active_insn_p (after) && !INSN_LOCATOR (after))
INSN_LOCATOR (after) = loc;
if (after == last)
break;
@@ -4433,12 +4447,86 @@ emit_call_insn_after_setloc (rtx pattern, rtx after, int loc)
return last;
}
-/* Like emit_insn_before, but set INSN_LOCATOR according to SCOPE. */
+/* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to AFTER. */
+rtx
+emit_call_insn_after (rtx pattern, rtx after)
+{
+ if (INSN_P (after))
+ return emit_call_insn_after_setloc (pattern, after, INSN_LOCATOR (after));
+ else
+ return emit_call_insn_after_noloc (pattern, after);
+}
+
+/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to SCOPE. */
rtx
emit_insn_before_setloc (rtx pattern, rtx before, int loc)
{
rtx first = PREV_INSN (before);
- rtx last = emit_insn_before (pattern, before);
+ rtx last = emit_insn_before_noloc (pattern, before);
+
+ if (pattern == NULL_RTX || !loc)
+ return last;
+
+ first = NEXT_INSN (first);
+ while (1)
+ {
+ if (active_insn_p (first) && !INSN_LOCATOR (first))
+ INSN_LOCATOR (first) = loc;
+ if (first == last)
+ break;
+ first = NEXT_INSN (first);
+ }
+ return last;
+}
+
+/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to BEFORE. */
+rtx
+emit_insn_before (rtx pattern, rtx before)
+{
+ if (INSN_P (before))
+ return emit_insn_before_setloc (pattern, before, INSN_LOCATOR (before));
+ else
+ return emit_insn_before_noloc (pattern, before);
+}
+
+/* like emit_insn_before_noloc, but set insn_locator according to scope. */
+rtx
+emit_jump_insn_before_setloc (rtx pattern, rtx before, int loc)
+{
+ rtx first = PREV_INSN (before);
+ rtx last = emit_jump_insn_before_noloc (pattern, before);
+
+ if (pattern == NULL_RTX)
+ return last;
+
+ first = NEXT_INSN (first);
+ while (1)
+ {
+ if (active_insn_p (first) && !INSN_LOCATOR (first))
+ INSN_LOCATOR (first) = loc;
+ if (first == last)
+ break;
+ first = NEXT_INSN (first);
+ }
+ return last;
+}
+
+/* Like emit_jump_insn_before_noloc, but set INSN_LOCATOR according to BEFORE. */
+rtx
+emit_jump_insn_before (rtx pattern, rtx before)
+{
+ if (INSN_P (before))
+ return emit_jump_insn_before_setloc (pattern, before, INSN_LOCATOR (before));
+ else
+ return emit_jump_insn_before_noloc (pattern, before);
+}
+
+/* like emit_insn_before_noloc, but set insn_locator according to scope. */
+rtx
+emit_call_insn_before_setloc (rtx pattern, rtx before, int loc)
+{
+ rtx first = PREV_INSN (before);
+ rtx last = emit_call_insn_before_noloc (pattern, before);
if (pattern == NULL_RTX)
return last;
@@ -4446,7 +4534,7 @@ emit_insn_before_setloc (rtx pattern, rtx before, int loc)
first = NEXT_INSN (first);
while (1)
{
- if (active_insn_p (first))
+ if (active_insn_p (first) && !INSN_LOCATOR (first))
INSN_LOCATOR (first) = loc;
if (first == last)
break;
@@ -4454,6 +4542,17 @@ emit_insn_before_setloc (rtx pattern, rtx before, int loc)
}
return last;
}
+
+/* like emit_call_insn_before_noloc,
+ but set insn_locator according to before. */
+rtx
+emit_call_insn_before (rtx pattern, rtx before)
+{
+ if (INSN_P (before))
+ return emit_call_insn_before_setloc (pattern, before, INSN_LOCATOR (before));
+ else
+ return emit_call_insn_before_noloc (pattern, before);
+}
/* Take X and emit it at the end of the doubly-linked
INSN list.
diff --git a/gcc/except.c b/gcc/except.c
index 6b3a1e2f2ae..f6d6dd1666c 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -1449,13 +1449,16 @@ emit_to_new_bb_before (rtx seq, rtx insn)
rtx last;
basic_block bb;
edge e;
+ edge_iterator ei;
/* If there happens to be an fallthru edge (possibly created by cleanup_cfg
call), we don't want it to go into newly created landing pad or other EH
construct. */
- for (e = BLOCK_FOR_INSN (insn)->pred; e; e = e->pred_next)
+ for (ei = ei_start (BLOCK_FOR_INSN (insn)->preds); (e = ei_safe_edge (ei)); )
if (e->flags & EDGE_FALLTHRU)
force_nonfallthru (e);
+ else
+ ei_next (&ei);
last = emit_insn_before (seq, insn);
if (BARRIER_P (last))
last = PREV_INSN (last);
@@ -1623,8 +1626,8 @@ connect_post_landing_pads (void)
emit_jump (outer->post_landing_pad);
src = BLOCK_FOR_INSN (region->resume);
dest = BLOCK_FOR_INSN (outer->post_landing_pad);
- while (src->succ)
- remove_edge (src->succ);
+ while (EDGE_COUNT (src->succs) > 0)
+ remove_edge (EDGE_SUCC (src, 0));
e = make_edge (src, dest, 0);
e->probability = REG_BR_PROB_BASE;
e->count = src->count;
@@ -1991,10 +1994,10 @@ sjlj_emit_function_enter (rtx dispatch_label)
|| NOTE_LINE_NUMBER (fn_begin) == NOTE_INSN_BASIC_BLOCK))
break;
if (NOTE_LINE_NUMBER (fn_begin) == NOTE_INSN_FUNCTION_BEG)
- insert_insn_on_edge (seq, ENTRY_BLOCK_PTR->succ);
+ insert_insn_on_edge (seq, EDGE_SUCC (ENTRY_BLOCK_PTR, 0));
else
{
- rtx last = BB_END (ENTRY_BLOCK_PTR->succ->dest);
+ rtx last = BB_END (EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest);
for (; ; fn_begin = NEXT_INSN (fn_begin))
if ((NOTE_P (fn_begin)
&& NOTE_LINE_NUMBER (fn_begin) == NOTE_INSN_FUNCTION_BEG)
@@ -2018,6 +2021,7 @@ sjlj_emit_function_exit (void)
{
rtx seq;
edge e;
+ edge_iterator ei;
start_sequence ();
@@ -2031,7 +2035,7 @@ sjlj_emit_function_exit (void)
post-dominates all can_throw_internal instructions. This is
the last possible moment. */
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
if (e->flags & EDGE_FALLTHRU)
break;
if (e)
@@ -2198,16 +2202,18 @@ finish_eh_generation (void)
commit_edge_insertions ();
FOR_EACH_BB (bb)
{
- edge e, next;
+ edge e;
+ edge_iterator ei;
bool eh = false;
- for (e = bb->succ; e; e = next)
+ for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
{
- next = e->succ_next;
if (e->flags & EDGE_EH)
{
remove_edge (e);
eh = true;
}
+ else
+ ei_next (&ei);
}
if (eh)
rtl_make_eh_edge (NULL, bb, BB_END (bb));
diff --git a/gcc/expr.c b/gcc/expr.c
index 96cab626f7b..5db2c280038 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6088,7 +6088,7 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
case CONST_DECL:
/* Recurse and make the output_constant_def clause above handle this. */
return expand_expr_addr_expr_1 (DECL_INITIAL (exp), target,
- tmode, modifier);
+ tmode, modifier);
case REALPART_EXPR:
/* The real part of the complex number is always first, therefore
@@ -6126,7 +6126,7 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
result = XEXP (result, 0);
/* ??? Is this needed anymore? */
- if (!TREE_USED (exp) == 0)
+ if (DECL_P (exp) && !TREE_USED (exp) == 0)
{
assemble_external (exp);
TREE_USED (exp) = 1;
@@ -6149,13 +6149,6 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
subtarget = offset || bitpos ? NULL_RTX : target;
result = expand_expr_addr_expr_1 (inner, subtarget, tmode, modifier);
- if (tmode == VOIDmode)
- {
- tmode = GET_MODE (result);
- if (tmode == VOIDmode)
- tmode = Pmode;
- }
-
if (offset)
{
rtx tmp;
@@ -6164,6 +6157,9 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
result = force_operand (result, NULL);
tmp = expand_expr (offset, NULL, tmode, EXPAND_NORMAL);
+ result = convert_memory_address (tmode, result);
+ tmp = convert_memory_address (tmode, tmp);
+
if (modifier == EXPAND_SUM)
result = gen_rtx_PLUS (tmode, result, tmp);
else
@@ -6178,7 +6174,7 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
{
/* Someone beforehand should have rejected taking the address
of such an object. */
- gcc_assert (!(bitpos % BITS_PER_UNIT));
+ gcc_assert ((bitpos % BITS_PER_UNIT) == 0);
result = plus_constant (result, bitpos / BITS_PER_UNIT);
if (modifier < EXPAND_SUM)
@@ -6198,19 +6194,28 @@ expand_expr_addr_expr (tree exp, rtx target, enum machine_mode tmode,
enum machine_mode rmode;
rtx result;
+ /* Target mode of VOIDmode says "whatever's natural". */
+ if (tmode == VOIDmode)
+ tmode = TYPE_MODE (TREE_TYPE (exp));
+
+ /* We can get called with some Weird Things if the user does silliness
+ like "(short) &a". In that case, convert_memory_address won't do
+ the right thing, so ignore the given target mode. */
+ if (!targetm.valid_pointer_mode (tmode))
+ tmode = Pmode;
+
result = expand_expr_addr_expr_1 (TREE_OPERAND (exp, 0), target,
tmode, modifier);
/* Despite expand_expr claims concerning ignoring TMODE when not
- strictly convenient, stuff breaks if we don't honor it. */
- if (tmode == VOIDmode)
- tmode = TYPE_MODE (TREE_TYPE (exp));
+ strictly convenient, stuff breaks if we don't honor it. Note
+ that combined with the above, we only do this for pointer modes. */
rmode = GET_MODE (result);
if (rmode == VOIDmode)
rmode = tmode;
if (rmode != tmode)
result = convert_memory_address (tmode, result);
-
+
return result;
}
@@ -8053,6 +8058,10 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
OK_DEFER_POP;
return temp;
+ case VEC_COND_EXPR:
+ target = expand_vec_cond_expr (exp, target);
+ return target;
+
case MODIFY_EXPR:
{
/* If lhs is complex, expand calls in rhs before computing it.
diff --git a/gcc/final.c b/gcc/final.c
index 04787e46d1c..493f63ddfeb 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -677,6 +677,7 @@ compute_alignments (void)
rtx label = BB_HEAD (bb);
int fallthru_frequency = 0, branch_frequency = 0, has_fallthru = 0;
edge e;
+ edge_iterator ei;
if (!LABEL_P (label)
|| probably_never_executed_bb_p (bb))
@@ -684,7 +685,7 @@ compute_alignments (void)
max_log = LABEL_ALIGN (label);
max_skip = LABEL_ALIGN_MAX_SKIP;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
if (e->flags & EDGE_FALLTHRU)
has_fallthru = 1, fallthru_frequency += EDGE_FREQUENCY (e);
diff --git a/gcc/flags.h b/gcc/flags.h
index 78c6d5a8885..91e719a0807 100644
--- a/gcc/flags.h
+++ b/gcc/flags.h
@@ -240,8 +240,6 @@ extern enum graph_dump_types graph_dump_format;
and to print them when we are done. */
extern int flag_detailed_statistics;
-extern int flag_web;
-
/* Nonzero means that we defer emitting functions until they are actually
used. */
extern int flag_remove_unreachable_functions;
diff --git a/gcc/flow.c b/gcc/flow.c
index 1cabde3c874..4914d72a4a0 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -1091,6 +1091,7 @@ calculate_global_regs_live (sbitmap blocks_in, sbitmap blocks_out, int flags)
int rescan, changed;
basic_block bb;
edge e;
+ edge_iterator ei;
bb = *qhead++;
if (qhead == qend)
@@ -1100,8 +1101,8 @@ calculate_global_regs_live (sbitmap blocks_in, sbitmap blocks_out, int flags)
/* Begin by propagating live_at_start from the successor blocks. */
CLEAR_REG_SET (new_live_at_end);
- if (bb->succ)
- for (e = bb->succ; e; e = e->succ_next)
+ if (EDGE_COUNT (bb->succs) > 0)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
basic_block sb = e->dest;
@@ -1257,7 +1258,7 @@ calculate_global_regs_live (sbitmap blocks_in, sbitmap blocks_out, int flags)
/* Queue all predecessors of BB so that we may re-examine
their live_at_end. */
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
basic_block pb = e->src;
if (pb->aux == NULL)
@@ -1362,8 +1363,9 @@ initialize_uninitialized_subregs (void)
edge e;
int reg, did_something = 0;
find_regno_partial_param param;
+ edge_iterator ei;
- for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
{
basic_block bb = e->dest;
regset map = bb->global_live_at_start;
@@ -1827,19 +1829,19 @@ init_propagate_block_info (basic_block bb, regset live, regset local_set,
int i;
/* Identify the successor blocks. */
- bb_true = bb->succ->dest;
- if (bb->succ->succ_next != NULL)
+ bb_true = EDGE_SUCC (bb, 0)->dest;
+ if (EDGE_COUNT (bb->succs) > 1)
{
- bb_false = bb->succ->succ_next->dest;
+ bb_false = EDGE_SUCC (bb, 1)->dest;
- if (bb->succ->flags & EDGE_FALLTHRU)
+ if (EDGE_SUCC (bb, 0)->flags & EDGE_FALLTHRU)
{
basic_block t = bb_false;
bb_false = bb_true;
bb_true = t;
}
else
- gcc_assert (bb->succ->succ_next->flags & EDGE_FALLTHRU);
+ gcc_assert (EDGE_SUCC (bb, 1)->flags & EDGE_FALLTHRU);
}
else
{
@@ -1921,9 +1923,9 @@ init_propagate_block_info (basic_block bb, regset live, regset local_set,
&& (TYPE_RETURNS_STACK_DEPRESSED
(TREE_TYPE (current_function_decl))))
&& (flags & PROP_SCAN_DEAD_STORES)
- && (bb->succ == NULL
- || (bb->succ->succ_next == NULL
- && bb->succ->dest == EXIT_BLOCK_PTR
+ && (EDGE_COUNT (bb->succs) == 0
+ || (EDGE_COUNT (bb->succs) == 1
+ && EDGE_SUCC (bb, 0)->dest == EXIT_BLOCK_PTR
&& ! current_function_calls_eh_return)))
{
rtx insn, set;
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index e39d75ceafc..595d8c1d83e 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -209,7 +209,7 @@ force_fit_type (tree t, int overflowable,
int sign_extended_type;
gcc_assert (TREE_CODE (t) == INTEGER_CST);
-
+
low = TREE_INT_CST_LOW (t);
high = TREE_INT_CST_HIGH (t);
@@ -267,7 +267,7 @@ force_fit_type (tree t, int overflowable,
|| low != TREE_INT_CST_LOW (t) || high != TREE_INT_CST_HIGH (t))
{
t = build_int_cst_wide (TREE_TYPE (t), low, high);
-
+
if (overflowed
|| overflowable < 0
|| (overflowable > 0 && sign_extended_type))
@@ -282,7 +282,7 @@ force_fit_type (tree t, int overflowable,
TREE_CONSTANT_OVERFLOW (t) = 1;
}
}
-
+
return t;
}
@@ -1451,7 +1451,7 @@ int_const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
| TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2),
TREE_CONSTANT_OVERFLOW (arg1)
| TREE_CONSTANT_OVERFLOW (arg2));
-
+
return t;
}
@@ -1890,7 +1890,7 @@ fold_convert (tree type, tree arg)
gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
&& tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
return fold (build1 (NOP_EXPR, type, arg));
-
+
case REAL_TYPE:
if (TREE_CODE (arg) == INTEGER_CST)
{
@@ -1911,19 +1911,19 @@ fold_convert (tree type, tree arg)
case BOOLEAN_TYPE: case ENUMERAL_TYPE:
case POINTER_TYPE: case REFERENCE_TYPE:
return fold (build1 (FLOAT_EXPR, type, arg));
-
+
case REAL_TYPE:
return fold (build1 (flag_float_store ? CONVERT_EXPR : NOP_EXPR,
type, arg));
-
+
case COMPLEX_TYPE:
tem = fold (build1 (REALPART_EXPR, TREE_TYPE (orig), arg));
return fold_convert (type, tem);
-
+
default:
gcc_unreachable ();
}
-
+
case COMPLEX_TYPE:
switch (TREE_CODE (orig))
{
@@ -1937,14 +1937,14 @@ fold_convert (tree type, tree arg)
case COMPLEX_TYPE:
{
tree rpart, ipart;
-
+
if (TREE_CODE (arg) == COMPLEX_EXPR)
{
rpart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 0));
ipart = fold_convert (TREE_TYPE (type), TREE_OPERAND (arg, 1));
return fold (build2 (COMPLEX_EXPR, type, rpart, ipart));
}
-
+
arg = save_expr (arg);
rpart = fold (build1 (REALPART_EXPR, TREE_TYPE (orig), arg));
ipart = fold (build1 (IMAGPART_EXPR, TREE_TYPE (orig), arg));
@@ -1952,11 +1952,11 @@ fold_convert (tree type, tree arg)
ipart = fold_convert (TREE_TYPE (type), ipart);
return fold (build2 (COMPLEX_EXPR, type, rpart, ipart));
}
-
+
default:
gcc_unreachable ();
}
-
+
case VECTOR_TYPE:
if (integer_zerop (arg))
return build_zero_vector (type);
@@ -3310,7 +3310,7 @@ decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize,
mask = build_int_cst (unsigned_type, -1);
mask = force_fit_type (mask, 0, false, false);
-
+
mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize), 0);
@@ -3336,7 +3336,7 @@ all_ones_mask_p (tree mask, int size)
tmask = build_int_cst (lang_hooks.types.signed_type (type), -1);
tmask = force_fit_type (tmask, 0, false, false);
-
+
return
tree_int_cst_equal (mask,
const_binop (RSHIFT_EXPR,
@@ -5902,7 +5902,7 @@ static bool
reorder_operands_p (tree arg0, tree arg1)
{
if (! flag_evaluation_order)
- return true;
+ return true;
if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
return true;
return ! TREE_SIDE_EFFECTS (arg0)
@@ -5952,15 +5952,6 @@ tree_swap_operands_p (tree arg0, tree arg1, bool reorder)
if (DECL_P (arg0))
return 1;
- if (reorder && flag_evaluation_order
- && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
- return 0;
-
- if (DECL_P (arg1))
- return 0;
- if (DECL_P (arg0))
- return 1;
-
/* It is preferable to swap two SSA_NAME to ensure a canonical form
for commutative and comparison operators. Ensuring a canonical
form allows the optimizers to find additional redundancies without
@@ -10288,7 +10279,7 @@ fold_negate_const (tree arg0, tree type)
TREE_CONSTANT_OVERFLOW (arg0));
break;
}
-
+
case REAL_CST:
t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
break;
@@ -10296,7 +10287,7 @@ fold_negate_const (tree arg0, tree type)
default:
gcc_unreachable ();
}
-
+
return t;
}
@@ -10334,18 +10325,18 @@ fold_abs_const (tree arg0, tree type)
TREE_CONSTANT_OVERFLOW (arg0));
}
break;
-
+
case REAL_CST:
if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
else
t = arg0;
break;
-
+
default:
gcc_unreachable ();
}
-
+
return t;
}
@@ -10358,13 +10349,13 @@ fold_not_const (tree arg0, tree type)
tree t = NULL_TREE;
gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
-
+
t = build_int_cst_wide (type,
~ TREE_INT_CST_LOW (arg0),
~ TREE_INT_CST_HIGH (arg0));
t = force_fit_type (t, 0, TREE_OVERFLOW (arg0),
TREE_CONSTANT_OVERFLOW (arg0));
-
+
return t;
}
@@ -10630,7 +10621,7 @@ round_up (tree value, int divisor)
if (divisor == (divisor & -divisor))
{
tree t;
-
+
t = build_int_cst (TREE_TYPE (value), divisor - 1);
value = size_binop (PLUS_EXPR, value, t);
t = build_int_cst (TREE_TYPE (value), -divisor);
@@ -10674,7 +10665,7 @@ round_down (tree value, int divisor)
if (divisor == (divisor & -divisor))
{
tree t;
-
+
t = build_int_cst (TREE_TYPE (value), -divisor);
value = size_binop (BIT_AND_EXPR, value, t);
}
@@ -10701,7 +10692,7 @@ ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
tree toffset1, toffset2, tdiff, type;
enum machine_mode mode1, mode2;
int unsignedp1, unsignedp2, volatilep1, volatilep2;
-
+
core1 = get_inner_reference (e1, &bitsize1, &bitpos1, &toffset1, &mode1,
&unsignedp1, &volatilep1);
core2 = get_inner_reference (e2, &bitsize2, &bitpos2, &toffset2, &mode2,
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 5e49f6ca46b..a6c885014d6 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2004-10-01 Jan Hubicka <jh@suse.cz>
+
+ * f95-lang.c (gfc_expand_function): Update call of
+ tree_rest_of_compilation.
+ * trans-decl.c (gfc_generate_constructors): Likewise.
+
2004-09-26 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
* trans-intrinsic.c: Comment fixes.
diff --git a/gcc/fortran/f95-lang.c b/gcc/fortran/f95-lang.c
index 8edf5692bb0..dec03e8256d 100644
--- a/gcc/fortran/f95-lang.c
+++ b/gcc/fortran/f95-lang.c
@@ -196,7 +196,7 @@ tree *ridpointers = NULL;
static void
gfc_expand_function (tree fndecl)
{
- tree_rest_of_compilation (fndecl, 0);
+ tree_rest_of_compilation (fndecl);
}
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index cbe36f72c38..e4c8fa45257 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -2353,7 +2353,7 @@ gfc_generate_constructors (void)
free_after_parsing (cfun);
free_after_compilation (cfun);
- tree_rest_of_compilation (fndecl, 0);
+ tree_rest_of_compilation (fndecl);
current_function_decl = NULL_TREE;
#endif
diff --git a/gcc/function.c b/gcc/function.c
index a7613e13908..0545b05a5cd 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -4956,6 +4956,7 @@ thread_prologue_and_epilogue_insns (rtx f ATTRIBUTE_UNUSED)
#if defined (HAVE_epilogue) || defined(HAVE_return)
rtx epilogue_end = NULL_RTX;
#endif
+ edge_iterator ei;
#ifdef HAVE_prologue
if (HAVE_prologue)
@@ -4975,16 +4976,16 @@ thread_prologue_and_epilogue_insns (rtx f ATTRIBUTE_UNUSED)
/* Can't deal with multiple successors of the entry block
at the moment. Function should always have at least one
entry point. */
- gcc_assert (ENTRY_BLOCK_PTR->succ && !ENTRY_BLOCK_PTR->succ->succ_next);
+ gcc_assert (EDGE_COUNT (ENTRY_BLOCK_PTR->succs) == 1);
- insert_insn_on_edge (seq, ENTRY_BLOCK_PTR->succ);
+ insert_insn_on_edge (seq, EDGE_SUCC (ENTRY_BLOCK_PTR, 0));
inserted = 1;
}
#endif
/* If the exit block has no non-fake predecessors, we don't need
an epilogue. */
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
if ((e->flags & EDGE_FAKE) == 0)
break;
if (e == NULL)
@@ -5000,10 +5001,9 @@ thread_prologue_and_epilogue_insns (rtx f ATTRIBUTE_UNUSED)
emit (conditional) return instructions. */
basic_block last;
- edge e_next;
rtx label;
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
if (e->flags & EDGE_FALLTHRU)
break;
if (e == NULL)
@@ -5021,6 +5021,7 @@ thread_prologue_and_epilogue_insns (rtx f ATTRIBUTE_UNUSED)
if (BB_HEAD (last) == label && LABEL_P (label))
{
+ edge_iterator ei2;
rtx epilogue_line_note = NULL_RTX;
/* Locate the line number associated with the closing brace,
@@ -5034,18 +5035,23 @@ thread_prologue_and_epilogue_insns (rtx f ATTRIBUTE_UNUSED)
break;
}
- for (e = last->pred; e; e = e_next)
+ for (ei2 = ei_start (last->preds); (e = ei_safe_edge (ei2)); )
{
basic_block bb = e->src;
rtx jump;
- e_next = e->pred_next;
if (bb == ENTRY_BLOCK_PTR)
- continue;
+ {
+ ei_next (&ei2);
+ continue;
+ }
jump = BB_END (bb);
if (!JUMP_P (jump) || JUMP_LABEL (jump) != label)
- continue;
+ {
+ ei_next (&ei2);
+ continue;
+ }
/* If we have an unconditional jump, we can replace that
with a simple return instruction. */
@@ -5060,16 +5066,25 @@ thread_prologue_and_epilogue_insns (rtx f ATTRIBUTE_UNUSED)
else if (condjump_p (jump))
{
if (! redirect_jump (jump, 0, 0))
- continue;
+ {
+ ei_next (&ei2);
+ continue;
+ }
/* If this block has only one successor, it both jumps
and falls through to the fallthru block, so we can't
delete the edge. */
- if (bb->succ->succ_next == NULL)
- continue;
+ if (EDGE_COUNT (bb->succs) == 1)
+ {
+ ei_next (&ei2);
+ continue;
+ }
}
else
- continue;
+ {
+ ei_next (&ei2);
+ continue;
+ }
/* Fix up the CFG for the successful change we just made. */
redirect_edge_succ (e, EXIT_BLOCK_PTR);
@@ -5081,7 +5096,7 @@ thread_prologue_and_epilogue_insns (rtx f ATTRIBUTE_UNUSED)
emit_barrier_after (BB_END (last));
emit_return_into_block (last, epilogue_line_note);
epilogue_end = BB_END (last);
- last->succ->flags &= ~EDGE_FALLTHRU;
+ EDGE_SUCC (last, 0)->flags &= ~EDGE_FALLTHRU;
goto epilogue_done;
}
}
@@ -5091,7 +5106,7 @@ thread_prologue_and_epilogue_insns (rtx f ATTRIBUTE_UNUSED)
There really shouldn't be a mixture -- either all should have
been converted or none, however... */
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
if (e->flags & EDGE_FALLTHRU)
break;
if (e == NULL)
@@ -5152,7 +5167,7 @@ epilogue_done:
#ifdef HAVE_sibcall_epilogue
/* Emit sibling epilogues before any sibling call sites. */
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
+ for (ei = ei_start (EXIT_BLOCK_PTR->preds); (e = ei_safe_edge (ei)); )
{
basic_block bb = e->src;
rtx insn = BB_END (bb);
@@ -5161,7 +5176,10 @@ epilogue_done:
if (!CALL_P (insn)
|| ! SIBLING_CALL_P (insn))
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
start_sequence ();
emit_insn (gen_sibcall_epilogue ());
@@ -5176,6 +5194,7 @@ epilogue_done:
i = PREV_INSN (insn);
newinsn = emit_insn_before (seq, insn);
+ ei_next (&ei);
}
#endif
diff --git a/gcc/gcse.c b/gcc/gcse.c
index daac742b8c6..1370be1c349 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -3400,7 +3400,7 @@ find_implicit_sets (void)
count = 0;
FOR_EACH_BB (bb)
/* Check for more than one successor. */
- if (bb->succ && bb->succ->succ_next)
+ if (EDGE_COUNT (bb->succs) > 1)
{
cond = fis_get_condition (BB_END (bb));
@@ -3413,7 +3413,7 @@ find_implicit_sets (void)
dest = GET_CODE (cond) == EQ ? BRANCH_EDGE (bb)->dest
: FALLTHRU_EDGE (bb)->dest;
- if (dest && ! dest->pred->pred_next
+ if (dest && EDGE_COUNT (dest->preds) == 1
&& dest != EXIT_BLOCK_PTR)
{
new = gen_rtx_SET (VOIDmode, XEXP (cond, 0),
@@ -3570,9 +3570,11 @@ static int
bypass_block (basic_block bb, rtx setcc, rtx jump)
{
rtx insn, note;
- edge e, enext, edest;
+ edge e, edest;
int i, change;
int may_be_loop_header;
+ unsigned removed_p;
+ edge_iterator ei;
insn = (setcc != NULL) ? setcc : jump;
@@ -3584,7 +3586,7 @@ bypass_block (basic_block bb, rtx setcc, rtx jump)
find_used_regs (&XEXP (note, 0), NULL);
may_be_loop_header = false;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (e->flags & EDGE_DFS_BACK)
{
may_be_loop_header = true;
@@ -3592,22 +3594,32 @@ bypass_block (basic_block bb, rtx setcc, rtx jump)
}
change = 0;
- for (e = bb->pred; e; e = enext)
+ for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
{
- enext = e->pred_next;
+ removed_p = 0;
+
if (e->flags & EDGE_COMPLEX)
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
/* We can't redirect edges from new basic blocks. */
if (e->src->index >= bypass_last_basic_block)
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
/* The irreducible loops created by redirecting of edges entering the
loop from outside would decrease effectiveness of some of the following
optimizations, so prevent this. */
if (may_be_loop_header
&& !(e->flags & EDGE_DFS_BACK))
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
for (i = 0; i < reg_use_count; i++)
{
@@ -3651,9 +3663,11 @@ bypass_block (basic_block bb, rtx setcc, rtx jump)
}
else if (GET_CODE (new) == LABEL_REF)
{
+ edge_iterator ei2;
+
dest = BLOCK_FOR_INSN (XEXP (new, 0));
/* Don't bypass edges containing instructions. */
- for (edest = bb->succ; edest; edest = edest->succ_next)
+ FOR_EACH_EDGE (edest, ei2, bb->succs)
if (edest->dest == dest && edest->insns.r)
{
dest = NULL;
@@ -3670,7 +3684,9 @@ bypass_block (basic_block bb, rtx setcc, rtx jump)
if (dest && setcc && !CC0_P (SET_DEST (PATTERN (setcc))))
{
edge e2;
- for (e2 = e->src->succ; e2; e2 = e2->succ_next)
+ edge_iterator ei2;
+
+ FOR_EACH_EDGE (e2, ei2, e->src->succs)
if (e2->dest == dest)
{
dest = NULL;
@@ -3704,9 +3720,12 @@ bypass_block (basic_block bb, rtx setcc, rtx jump)
e->src->index, old_dest->index, dest->index);
}
change = 1;
+ removed_p = 1;
break;
}
}
+ if (!removed_p)
+ ei_next (&ei);
}
return change;
}
@@ -3739,7 +3758,7 @@ bypass_conditional_jumps (void)
EXIT_BLOCK_PTR, next_bb)
{
/* Check for more than one predecessor. */
- if (bb->pred && bb->pred->pred_next)
+ if (EDGE_COUNT (bb->preds) > 1)
{
setcc = NULL_RTX;
for (insn = BB_HEAD (bb);
@@ -3886,12 +3905,13 @@ compute_pre_data (void)
FOR_EACH_BB (bb)
{
edge e;
+ edge_iterator ei;
/* If the current block is the destination of an abnormal edge, we
kill all trapping expressions because we won't be able to properly
place the instruction on the edge. So make them neither
anticipatable nor transparent. This is fairly conservative. */
- for (e = bb->pred; e ; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (e->flags & EDGE_ABNORMAL)
{
sbitmap_difference (antloc[bb->index], antloc[bb->index], trapping_expr);
@@ -3931,8 +3951,9 @@ static int
pre_expr_reaches_here_p_work (basic_block occr_bb, struct expr *expr, basic_block bb, char *visited)
{
edge pred;
-
- for (pred = bb->pred; pred != NULL; pred = pred->pred_next)
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (pred, ei, bb->preds)
{
basic_block pred_bb = pred->src;
@@ -4051,7 +4072,8 @@ insert_insn_end_bb (struct expr *expr, basic_block bb, int pre)
if (JUMP_P (insn)
|| (NONJUMP_INSN_P (insn)
- && (bb->succ->succ_next || (bb->succ->flags & EDGE_ABNORMAL))))
+ && (EDGE_COUNT (bb->succs) > 1
+ || EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL)))
{
#ifdef HAVE_cc0
rtx note;
@@ -4086,13 +4108,13 @@ insert_insn_end_bb (struct expr *expr, basic_block bb, int pre)
}
#endif
/* FIXME: What if something in cc0/jump uses value set in new insn? */
- new_insn = emit_insn_before (pat, insn);
+ new_insn = emit_insn_before_noloc (pat, insn);
}
/* Likewise if the last insn is a call, as will happen in the presence
of exception handling. */
else if (CALL_P (insn)
- && (bb->succ->succ_next || (bb->succ->flags & EDGE_ABNORMAL)))
+ && (EDGE_COUNT (bb->succs) > 1 || EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL))
{
/* Keeping in mind SMALL_REGISTER_CLASSES and parameters in registers,
we search backward and place the instructions before the first
@@ -4124,10 +4146,10 @@ insert_insn_end_bb (struct expr *expr, basic_block bb, int pre)
|| NOTE_INSN_BASIC_BLOCK_P (insn))
insn = NEXT_INSN (insn);
- new_insn = emit_insn_before (pat, insn);
+ new_insn = emit_insn_before_noloc (pat, insn);
}
else
- new_insn = emit_insn_after (pat, insn);
+ new_insn = emit_insn_after_noloc (pat, insn);
while (1)
{
@@ -4810,6 +4832,7 @@ static int
hoist_expr_reaches_here_p (basic_block expr_bb, int expr_index, basic_block bb, char *visited)
{
edge pred;
+ edge_iterator ei;
int visited_allocated_locally = 0;
@@ -4819,7 +4842,7 @@ hoist_expr_reaches_here_p (basic_block expr_bb, int expr_index, basic_block bb,
visited = xcalloc (last_basic_block, 1);
}
- for (pred = bb->pred; pred != NULL; pred = pred->pred_next)
+ FOR_EACH_EDGE (pred, ei, bb->preds)
{
basic_block pred_bb = pred->src;
@@ -6167,7 +6190,7 @@ insert_insn_start_bb (rtx insn, basic_block bb)
before = NEXT_INSN (before);
}
- insn = emit_insn_after (insn, prev);
+ insn = emit_insn_after_noloc (insn, prev);
if (gcse_file)
{
@@ -6188,6 +6211,7 @@ insert_store (struct ls_expr * expr, edge e)
rtx reg, insn;
basic_block bb;
edge tmp;
+ edge_iterator ei;
/* We did all the deleted before this insert, so if we didn't delete a
store, then we haven't set the reaching reg yet either. */
@@ -6204,7 +6228,7 @@ insert_store (struct ls_expr * expr, edge e)
insert it at the start of the BB, and reset the insert bits on the other
edges so we don't try to insert it on the other edges. */
bb = e->dest;
- for (tmp = e->dest->pred; tmp ; tmp = tmp->pred_next)
+ FOR_EACH_EDGE (tmp, ei, e->dest->preds)
if (!(tmp->flags & EDGE_FAKE))
{
int index = EDGE_INDEX (edge_list, tmp->src, tmp->dest);
@@ -6218,7 +6242,7 @@ insert_store (struct ls_expr * expr, edge e)
insertion vector for these edges, and insert at the start of the BB. */
if (!tmp && bb != EXIT_BLOCK_PTR)
{
- for (tmp = e->dest->pred; tmp ; tmp = tmp->pred_next)
+ FOR_EACH_EDGE (tmp, ei, e->dest->preds)
{
int index = EDGE_INDEX (edge_list, tmp->src, tmp->dest);
RESET_BIT (pre_insert_map[index], expr->index);
@@ -6256,33 +6280,40 @@ insert_store (struct ls_expr * expr, edge e)
static void
remove_reachable_equiv_notes (basic_block bb, struct ls_expr *smexpr)
{
- edge *stack = xmalloc (sizeof (edge) * n_basic_blocks), act;
+ edge_iterator *stack, ei;
+ int sp;
+ edge act;
sbitmap visited = sbitmap_alloc (last_basic_block);
- int stack_top = 0;
rtx last, insn, note;
rtx mem = smexpr->pattern;
+ stack = xmalloc (sizeof (edge_iterator) * n_basic_blocks);
+ sp = 0;
+ ei = ei_start (bb->succs);
+
sbitmap_zero (visited);
- act = bb->succ;
+ act = (EDGE_COUNT (ei.container) > 0 ? EDGE_I (ei.container, 0) : NULL);
while (1)
{
if (!act)
{
- if (!stack_top)
+ if (!sp)
{
free (stack);
sbitmap_free (visited);
return;
}
- act = stack[--stack_top];
+ act = ei_edge (stack[--sp]);
}
bb = act->dest;
if (bb == EXIT_BLOCK_PTR
|| TEST_BIT (visited, bb->index))
{
- act = act->succ_next;
+ if (!ei_end_p (ei))
+ ei_next (&ei);
+ act = (! ei_end_p (ei)) ? ei_edge (ei) : NULL;
continue;
}
SET_BIT (visited, bb->index);
@@ -6310,12 +6341,17 @@ remove_reachable_equiv_notes (basic_block bb, struct ls_expr *smexpr)
INSN_UID (insn));
remove_note (insn, note);
}
- act = act->succ_next;
- if (bb->succ)
+
+ if (!ei_end_p (ei))
+ ei_next (&ei);
+ act = (! ei_end_p (ei)) ? ei_edge (ei) : NULL;
+
+ if (EDGE_COUNT (bb->succs) > 0)
{
if (act)
- stack[stack_top++] = act;
- act = bb->succ;
+ stack[sp++] = ei;
+ ei = ei_start (bb->succs);
+ act = (EDGE_COUNT (ei.container) > 0 ? EDGE_I (ei.container, 0) : NULL);
}
}
}
diff --git a/gcc/genopinit.c b/gcc/genopinit.c
index 0d39f67ef75..8c6c8feb292 100644
--- a/gcc/genopinit.c
+++ b/gcc/genopinit.c
@@ -171,7 +171,9 @@ static const char * const optabs[] =
"vec_extract_optab->handlers[$A].insn_code = CODE_FOR_$(vec_extract$a$)",
"vec_init_optab->handlers[$A].insn_code = CODE_FOR_$(vec_init$a$)",
"vec_realign_store_optab->handlers[$A].insn_code = CODE_FOR_$(vec_realign_store_$a$)",
- "vec_realign_load_optab->handlers[$A].insn_code = CODE_FOR_$(vec_realign_load_$a$)" };
+ "vec_realign_load_optab->handlers[$A].insn_code = CODE_FOR_$(vec_realign_load_$a$)",
+ "vcond_gen_code[$A] = CODE_FOR_$(vcond$a$)",
+ "vcondu_gen_code[$A] = CODE_FOR_$(vcondu$a$)" };
static void gen_insn (rtx);
diff --git a/gcc/ggc-page.c b/gcc/ggc-page.c
index a5eb8915a23..cba44dd0b25 100644
--- a/gcc/ggc-page.c
+++ b/gcc/ggc-page.c
@@ -458,8 +458,15 @@ static struct globals
/* Allocate pages in chunks of this size, to throttle calls to memory
allocation routines. The first page is used, the rest go onto the
free list. This cannot be larger than HOST_BITS_PER_INT for the
- in_use bitmask for page_group. */
-#define GGC_QUIRE_SIZE 16
+ in_use bitmask for page_group. Hosts that need a different value
+ can override this by defining GGC_QUIRE_SIZE explicitly. */
+#ifndef GGC_QUIRE_SIZE
+# ifdef USING_MMAP
+# define GGC_QUIRE_SIZE 256
+# else
+# define GGC_QUIRE_SIZE 16
+# endif
+#endif
/* Initial guess as to how many page table entries we might need. */
#define INITIAL_PTE_COUNT 128
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 27744bcb689..ca233617b89 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -3215,7 +3215,7 @@ gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
else
{
tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
- is_gimple_val, fb_rvalue);
+ is_gimple_asm_val, fb_rvalue);
if (tret == GS_ERROR)
ret = tret;
}
diff --git a/gcc/global.c b/gcc/global.c
index 4398e30b377..424bdad73f5 100644
--- a/gcc/global.c
+++ b/gcc/global.c
@@ -748,8 +748,9 @@ global_conflicts (void)
regs live across such edges. */
{
edge e;
+ edge_iterator ei;
- for (e = b->pred; e ; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, b->preds)
if (e->flags & EDGE_ABNORMAL)
break;
@@ -2339,12 +2340,14 @@ calculate_reg_pav (void)
sbitmap_zero (wset);
for (i = 0; i < nel; i++)
{
+ edge_iterator ei;
+
bb = bb_array [i];
changed_p = 0;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
changed_p = modify_bb_reg_pav (bb, e->src, changed_p);
if (changed_p)
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
succ = e->dest;
if (succ->index != EXIT_BLOCK && !TEST_BIT (wset, succ->index))
diff --git a/gcc/graph.c b/gcc/graph.c
index 8fa2e4fe2db..cd232db985a 100644
--- a/gcc/graph.c
+++ b/gcc/graph.c
@@ -308,6 +308,7 @@ print_rtl_graph_with_bb (const char *base, rtx rtx_first)
if ((i = end[INSN_UID (tmp_rtx)]) >= 0)
{
edge e;
+ edge_iterator ei;
bb = BASIC_BLOCK (i);
@@ -316,7 +317,7 @@ print_rtl_graph_with_bb (const char *base, rtx rtx_first)
/* Now specify the edges to all the successors of this
basic block. */
- for (e = bb->succ; e ; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->dest != EXIT_BLOCK_PTR)
{
diff --git a/gcc/hooks.c b/gcc/hooks.c
index 65224a4042a..9470a4d84c6 100644
--- a/gcc/hooks.c
+++ b/gcc/hooks.c
@@ -117,6 +117,12 @@ default_can_output_mi_thunk_no_vcall (tree a ATTRIBUTE_UNUSED,
return c == 0;
}
+int
+hook_int_tree_0 (tree a ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
+
/* ??? Used for comp_type_attributes, which ought to return bool. */
int
hook_int_tree_tree_1 (tree a ATTRIBUTE_UNUSED, tree b ATTRIBUTE_UNUSED)
@@ -245,4 +251,3 @@ hook_tree_tree_bool_null (tree t ATTRIBUTE_UNUSED, bool ignore ATTRIBUTE_UNUSED)
{
return NULL;
}
-
diff --git a/gcc/hooks.h b/gcc/hooks.h
index 4f7f08c0c1c..10966a912a2 100644
--- a/gcc/hooks.h
+++ b/gcc/hooks.h
@@ -46,6 +46,7 @@ extern void hook_void_FILEptr_constcharptr (FILE *, const char *);
extern void hook_void_tree (tree);
extern void hook_void_tree_treeptr (tree, tree *);
+extern int hook_int_tree_0 (tree);
extern int hook_int_tree_tree_1 (tree, tree);
extern int hook_int_rtx_0 (rtx);
extern int hook_int_size_t_constcharptr_int_0 (size_t, const char *, int);
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index c7c053113f4..709a6756f4c 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -65,8 +65,8 @@
#define MAX_CONDITIONAL_EXECUTE (BRANCH_COST + 1)
#endif
-#define NULL_EDGE ((struct edge_def *)NULL)
-#define NULL_BLOCK ((struct basic_block_def *)NULL)
+#define NULL_EDGE ((edge) NULL)
+#define NULL_BLOCK ((basic_block) NULL)
/* # of IF-THEN or IF-THEN-ELSE blocks we looked at */
static int num_possible_if_blocks;
@@ -126,7 +126,8 @@ mark_loop_exit_edges (void)
{
FOR_EACH_BB (bb)
{
- for (e = bb->succ; e; e = e->succ_next)
+ edge_iterator ei;
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (find_common_loop (bb->loop_father, e->dest->loop_father)
!= bb->loop_father)
@@ -249,11 +250,11 @@ static basic_block
block_fallthru (basic_block bb)
{
edge e;
+ edge_iterator ei;
- for (e = bb->succ;
- e != NULL_EDGE && (e->flags & EDGE_FALLTHRU) == 0;
- e = e->succ_next)
- ;
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ if (e->flags & EDGE_FALLTHRU)
+ break;
return (e) ? e->dest : NULL_BLOCK;
}
@@ -2226,7 +2227,7 @@ merge_if_block (struct ce_if_block * ce_info)
/* The outgoing edge for the current COMBO block should already
be correct. Verify this. */
- if (combo_bb->succ == NULL_EDGE)
+ if (EDGE_COUNT (combo_bb->succs) == 0)
{
if (find_reg_note (last, REG_NORETURN, NULL))
;
@@ -2242,11 +2243,11 @@ merge_if_block (struct ce_if_block * ce_info)
blocks taking us to our final destination. */
else if (JUMP_P (last))
;
- else if (combo_bb->succ->dest == EXIT_BLOCK_PTR
+ else if (EDGE_SUCC (combo_bb, 0)->dest == EXIT_BLOCK_PTR
&& CALL_P (last)
&& SIBLING_CALL_P (last))
;
- else if ((combo_bb->succ->flags & EDGE_EH)
+ else if ((EDGE_SUCC (combo_bb, 0)->flags & EDGE_EH)
&& can_throw_internal (last))
;
else
@@ -2259,8 +2260,7 @@ merge_if_block (struct ce_if_block * ce_info)
is more than one remaining edge, it must come from elsewhere. There
may be zero incoming edges if the THEN block didn't actually join
back up (as with a call to abort). */
- else if ((join_bb->pred == NULL
- || join_bb->pred->pred_next == NULL)
+ else if (EDGE_COUNT (join_bb->preds) < 2
&& join_bb != EXIT_BLOCK_PTR)
{
/* We can merge the JOIN. */
@@ -2277,13 +2277,13 @@ merge_if_block (struct ce_if_block * ce_info)
/* The outgoing edge for the current COMBO block should already
be correct. Verify this. */
- if (combo_bb->succ->succ_next != NULL_EDGE
- || combo_bb->succ->dest != join_bb)
+ if (EDGE_COUNT (combo_bb->succs) > 1
+ || EDGE_SUCC (combo_bb, 0)->dest != join_bb)
abort ();
/* Remove the jump and cruft from the end of the COMBO block. */
if (join_bb != EXIT_BLOCK_PTR)
- tidy_fallthru_edge (combo_bb->succ);
+ tidy_fallthru_edge (EDGE_SUCC (combo_bb, 0));
}
num_updated_if_blocks++;
@@ -2302,11 +2302,12 @@ find_if_header (basic_block test_bb, int pass)
edge else_edge;
/* The kind of block we're looking for has exactly two successors. */
- if ((then_edge = test_bb->succ) == NULL_EDGE
- || (else_edge = then_edge->succ_next) == NULL_EDGE
- || else_edge->succ_next != NULL_EDGE)
+ if (EDGE_COUNT (test_bb->succs) != 2)
return NULL;
+ then_edge = EDGE_SUCC (test_bb, 0);
+ else_edge = EDGE_SUCC (test_bb, 1);
+
/* Neither edge should be abnormal. */
if ((then_edge->flags & EDGE_COMPLEX)
|| (else_edge->flags & EDGE_COMPLEX))
@@ -2378,17 +2379,16 @@ block_jumps_and_fallthru_p (basic_block cur_bb, basic_block target_bb)
rtx insn;
rtx end;
int n_insns = 0;
+ edge_iterator ei;
if (!cur_bb || !target_bb)
return -1;
/* If no edges, obviously it doesn't jump or fallthru. */
- if (cur_bb->succ == NULL_EDGE)
+ if (EDGE_COUNT (cur_bb->succs) == 0)
return FALSE;
- for (cur_edge = cur_bb->succ;
- cur_edge != NULL_EDGE;
- cur_edge = cur_edge->succ_next)
+ FOR_EACH_EDGE (cur_edge, ei, cur_bb->succs)
{
if (cur_edge->flags & EDGE_COMPLEX)
/* Anything complex isn't what we want. */
@@ -2445,12 +2445,11 @@ find_if_block (struct ce_if_block * ce_info)
basic_block then_bb = ce_info->then_bb;
basic_block else_bb = ce_info->else_bb;
basic_block join_bb = NULL_BLOCK;
- edge then_succ = then_bb->succ;
- edge else_succ = else_bb->succ;
int then_predecessors;
int else_predecessors;
edge cur_edge;
basic_block next;
+ edge_iterator ei;
ce_info->last_test_bb = test_bb;
@@ -2458,11 +2457,10 @@ find_if_block (struct ce_if_block * ce_info)
were && tests (which jump to the else block) or || tests (which jump to
the then block). */
if (HAVE_conditional_execution && reload_completed
- && test_bb->pred != NULL_EDGE
- && test_bb->pred->pred_next == NULL_EDGE
- && test_bb->pred->flags == EDGE_FALLTHRU)
+ && EDGE_COUNT (test_bb->preds) == 1
+ && EDGE_PRED (test_bb, 0)->flags == EDGE_FALLTHRU)
{
- basic_block bb = test_bb->pred->src;
+ basic_block bb = EDGE_PRED (test_bb, 0)->src;
basic_block target_bb;
int max_insns = MAX_CONDITIONAL_EXECUTE;
int n_insns;
@@ -2495,10 +2493,10 @@ find_if_block (struct ce_if_block * ce_info)
total_insns += n_insns;
blocks++;
- if (bb->pred == NULL_EDGE || bb->pred->pred_next != NULL_EDGE)
+ if (EDGE_COUNT (bb->preds) != 1)
break;
- bb = bb->pred->src;
+ bb = EDGE_PRED (bb, 0)->src;
n_insns = block_jumps_and_fallthru_p (bb, target_bb);
}
while (n_insns >= 0 && (total_insns + n_insns) <= max_insns);
@@ -2515,9 +2513,7 @@ find_if_block (struct ce_if_block * ce_info)
/* Count the number of edges the THEN and ELSE blocks have. */
then_predecessors = 0;
- for (cur_edge = then_bb->pred;
- cur_edge != NULL_EDGE;
- cur_edge = cur_edge->pred_next)
+ FOR_EACH_EDGE (cur_edge, ei, then_bb->preds)
{
then_predecessors++;
if (cur_edge->flags & EDGE_COMPLEX)
@@ -2525,9 +2521,7 @@ find_if_block (struct ce_if_block * ce_info)
}
else_predecessors = 0;
- for (cur_edge = else_bb->pred;
- cur_edge != NULL_EDGE;
- cur_edge = cur_edge->pred_next)
+ FOR_EACH_EDGE (cur_edge, ei, else_bb->preds)
{
else_predecessors++;
if (cur_edge->flags & EDGE_COMPLEX)
@@ -2540,9 +2534,9 @@ find_if_block (struct ce_if_block * ce_info)
return FALSE;
/* The THEN block of an IF-THEN combo must have zero or one successors. */
- if (then_succ != NULL_EDGE
- && (then_succ->succ_next != NULL_EDGE
- || (then_succ->flags & EDGE_COMPLEX)
+ if (EDGE_COUNT (then_bb->succs) > 0
+ && (EDGE_COUNT (then_bb->succs) > 1
+ || (EDGE_SUCC (then_bb, 0)->flags & EDGE_COMPLEX)
|| (flow2_completed && tablejump_p (BB_END (then_bb), NULL, NULL))))
return FALSE;
@@ -2552,9 +2546,9 @@ find_if_block (struct ce_if_block * ce_info)
Check for the last insn of the THEN block being an indirect jump, which
is listed as not having any successors, but confuses the rest of the CE
code processing. ??? we should fix this in the future. */
- if (then_succ == NULL)
+ if (EDGE_COUNT (then_bb->succs) == 0)
{
- if (else_bb->pred->pred_next == NULL_EDGE)
+ if (EDGE_COUNT (else_bb->preds) == 1)
{
rtx last_insn = BB_END (then_bb);
@@ -2577,7 +2571,7 @@ find_if_block (struct ce_if_block * ce_info)
/* If the THEN block's successor is the other edge out of the TEST block,
then we have an IF-THEN combo without an ELSE. */
- else if (then_succ->dest == else_bb)
+ else if (EDGE_SUCC (then_bb, 0)->dest == else_bb)
{
join_bb = else_bb;
else_bb = NULL_BLOCK;
@@ -2586,13 +2580,12 @@ find_if_block (struct ce_if_block * ce_info)
/* If the THEN and ELSE block meet in a subsequent block, and the ELSE
has exactly one predecessor and one successor, and the outgoing edge
is not complex, then we have an IF-THEN-ELSE combo. */
- else if (else_succ != NULL_EDGE
- && then_succ->dest == else_succ->dest
- && else_bb->pred->pred_next == NULL_EDGE
- && else_succ->succ_next == NULL_EDGE
- && ! (else_succ->flags & EDGE_COMPLEX)
+ else if (EDGE_COUNT (else_bb->succs) == 1
+ && EDGE_SUCC (then_bb, 0)->dest == EDGE_SUCC (else_bb, 0)->dest
+ && EDGE_COUNT (else_bb->preds) == 1
+ && ! (EDGE_SUCC (else_bb, 0)->flags & EDGE_COMPLEX)
&& ! (flow2_completed && tablejump_p (BB_END (else_bb), NULL, NULL)))
- join_bb = else_succ->dest;
+ join_bb = EDGE_SUCC (else_bb, 0)->dest;
/* Otherwise it is not an IF-THEN or IF-THEN-ELSE combination. */
else
@@ -2726,7 +2719,7 @@ find_cond_trap (basic_block test_bb, edge then_edge, edge else_edge)
/* Delete the trap block if possible. */
remove_edge (trap_bb == then_bb ? then_edge : else_edge);
- if (trap_bb->pred == NULL)
+ if (EDGE_COUNT (trap_bb->preds) == 0)
delete_basic_block (trap_bb);
/* If the non-trap block and the test are now adjacent, merge them.
@@ -2771,7 +2764,7 @@ block_has_only_trap (basic_block bb)
return NULL_RTX;
/* The block must have no successors. */
- if (bb->succ)
+ if (EDGE_COUNT (bb->succs) > 0)
return NULL_RTX;
/* The only instruction in the THEN block must be the trap. */
@@ -2866,7 +2859,6 @@ find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge)
{
basic_block then_bb = then_edge->dest;
basic_block else_bb = else_edge->dest, new_bb;
- edge then_succ = then_bb->succ;
int then_bb_index, bb_cost;
/* If we are partitioning hot/cold basic blocks, we don't want to
@@ -2888,15 +2880,15 @@ find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge)
return FALSE;
/* THEN has one successor. */
- if (!then_succ || then_succ->succ_next != NULL)
+ if (EDGE_COUNT (then_bb->succs) != 1)
return FALSE;
/* THEN does not fall through, but is not strange either. */
- if (then_succ->flags & (EDGE_COMPLEX | EDGE_FALLTHRU))
+ if (EDGE_SUCC (then_bb, 0)->flags & (EDGE_COMPLEX | EDGE_FALLTHRU))
return FALSE;
/* THEN has one predecessor. */
- if (then_bb->pred->pred_next != NULL)
+ if (EDGE_COUNT (then_bb->preds) != 1)
return FALSE;
/* THEN must do something. */
@@ -2916,7 +2908,7 @@ find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge)
/* Registers set are dead, or are predicable. */
if (! dead_or_predicable (test_bb, then_bb, else_bb,
- then_bb->succ->dest, 1))
+ EDGE_SUCC (then_bb, 0)->dest, 1))
return FALSE;
/* Conversion went ok, including moving the insns and fixing up the
@@ -2957,7 +2949,7 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge)
{
basic_block then_bb = then_edge->dest;
basic_block else_bb = else_edge->dest;
- edge else_succ = else_bb->succ;
+ edge else_succ;
int bb_cost;
rtx note;
@@ -2980,15 +2972,17 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge)
return FALSE;
/* ELSE has one successor. */
- if (!else_succ || else_succ->succ_next != NULL)
+ if (EDGE_COUNT (else_bb->succs) != 1)
return FALSE;
+ else
+ else_succ = EDGE_SUCC (else_bb, 0);
/* ELSE outgoing edge is not complex. */
if (else_succ->flags & EDGE_COMPLEX)
return FALSE;
/* ELSE has one predecessor. */
- if (else_bb->pred->pred_next != NULL)
+ if (EDGE_COUNT (else_bb->preds) != 1)
return FALSE;
/* THEN is not EXIT. */
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 4b579bcfcaf..265f5930557 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,153 @@
+2004-10-01 Jan Hubicka <jh@suse.cz>
+
+ * java.c (java_expand_body): Update call of tree_rest_of_compilation.
+
+2004-10-01 Kazu Hirata <kazu@cs.umass.edu>
+
+ * lex.c: Fix a comment typo.
+
+2004-10-01 Kazu Hirata <kazu@cs.umass.edu>
+
+ * java-tree.h: Fix a comment typo.
+
+2004-09-30 Per Bothner <per@bothner.com>
+
+ Simplify lexer. Implement --enable-mapped-location support.
+ * jcf-parse.c (parse_class_file): Use linemap_line_start.
+ (parse_source_file_1): Pass filename as extra parameter, so we can call
+ linemap_add and set input_location here, rather than in both callers.
+ (read_class): Pass copied filename to parse_source_file_1.
+ Don't initialize wfl_operator - only needed for source compilation.
+ (read_class, jcf_parse): Call linemap_add with LC_LEAVE.
+ * lex.h: Remove a bunch of debugging macros.
+ * lex.h (struct_java_line, struct java_error): Remove types.
+ (JAVA_COLUMN_DELTA): Remove - use java_lexer.next_colums instead.
+ (struct java_lc_s): Remove prev_col field.
+ (struct java_lexer): New fields next_unicode, next_columns, and
+ avail_unicode. New position field, and maybe token_start field.
+ Don't need hit_eof field - use next_unicode == -1 instead.
+ (JAVA_INTEGERAL_RANGE_ERROR): Rename to JAVA_RANGE_ERROR.
+ (JAVA_RANGE_ERROR, JAVA_FLOAT_ANGE_ERROR): Update accordingly.
+ * parse.h: Various changes for USE_MAPPED_LOCATION.
+ (EXPR_WFL_EMIT_LINE_NOTE): XXX
+ (BUILD_EXPR_WFL, EXPR_WFL_ADD_COL): Remove no-longer-used macros.
+ (struct parser_ctxt): New file_start_location field.
+ Remove p_line, c_line fields since we no longer save lines.
+ Remove elc, lineno, and current_jcf fields - no longer used.
+ * parse.y: Updates for USE_MAPPED_LOCATION and new lexer.
+ Don't use EXPR_WFL_ADD_COL since that isn't trivial with
+ source_location and is probably not needed anymore anyway.
+ Use new expr_add_Location function.
+ (SET_EXPR_LOCATION_FROM_TOKEN): New convenience macro.
+ (java_pop_parser_context): Minor cleanup.
+ (java_parser_context_save_global, java_parser_context_restore_global,
+ java_pop_parser_context): Save/restore input_location as a unit.
+ (issue_warning_error_from_context): If USE_MAPPED_LOCATION take
+ a source_location instead of a wfl context node.
+ (check_class_interface_creation): input_filename is not addressable.
+ (create_artificial_method): Calling java_parser_context_save_global
+ and java_parser_context_restore_global is overkill. Instead,
+ temporarily set input_location from class decl.
+ (java_layout_seen_class_methods): Set input_location from method decl.
+ (fix_constructors): Make more robust if no EXPR_WITH_FILE_LOCATION.
+ (finish_loop_body): Likewise.
+ * lex.c: Updates for USE_MAPPED_LOCATION. Use build_unknwon_wfl.
+ (java_sprint_unicode): Take a character, not index in line.
+ (java_sneak_uncode): Replaced by java_peek_unicode.
+ (java_unget_unicode): No longer used.
+ (java_allocate_new_line. java_store_unicode): Removed, since we
+ no longer remember "lines".
+ (java_new_lexer): Update for new data structures.
+ (java_read_char): Move unget_value checking to java_read_unicode.
+ (java_get_unicode, java_peek_unicode, java_next_unicode): New more
+ efficient functions that are used directly when lexing.
+ (java_read_unicode_collapsing_terminators): No longer needed.
+ (java_parse_end_comment, java_parse_escape_sequence, do_java_lex):
+ Re-organize to use java_peek_unicode to avoid java_unget_unicode.
+ (java_parse_escape_sequence): Rewrite to be simpler / more efficient.
+ (do_java_lex): Lots of movings around to avoid java_unget_unicode,
+ combine switch branches, and test for common token kinds earlier.
+ (java_lex_error): Rewrite.
+ * jv-scan.c (expand_location): New function, copied from tree.c.
+ (main): Set ctxp->filename instead of setting input_filename directly.
+
+2004-09-30 Per Bothner <per@bothner.com>
+
+ More cleanup for --enable-mapped-location.
+ * class.c (push_class): If USE_MAPPED_LOCATION don't set
+ input_location here. Instead do it in give_name_to_class.
+ (build_class_ref): Set DECL_ARTIFICIAL, for the sake of dwarf2out.
+ * expr.c (expand_byte_code): Call linemap_line_start.
+ * expr.c (build_expr_wfl): If USE_MAPPED_LOCATION, change final
+ parameters to a source_location. Don't need EXPR_WFL_FILENAME_NODE.
+ (expr_add_location): New function, if USE_MAPPED_LOCATION.
+ * class.c (maybe_layout_super_class): Adjust build_expr_wfl call
+ to USE_MAPPED_LOCATION case.
+
+ * java-tree.h (JAVA_FILE_P, ZIP_FILE_P): Remove unused macros.
+ * jcf-parse.c (java_parse_file): Don't set input_filename.
+ Use IS_A_COMMAND_LINE_FILENAME_P to check for duplicate filenames.
+ Create a list of TRANSLATION_UNIT_DECL.
+ (current_file_list): Is now a TRANSLATION_UNIT_DECL chain. The
+ reason is so we can set a DECL_SOURCE_LOCATION for each file.
+ (java_parse_file): Don't set unused ZIP_FILE_P, JAVA_FILE_P..
+ Create line-map LC_ENTER/LC_LEAVE entries for archive itself.
+ (file_start_location): New static.
+ (set_source_filename): Avoid extra access to input_filename macro.
+ Concatenate new name with class's package prefix.
+ (set_source_filename, give_name_to_class): Update.
+ (give_name_to_class): Set class's "line 0" input_location here.
+ (parse_class_file): Set input_location as a unit.
+
+ * jcf-parse.c (load_class): Sanity test if missing inner class file.
+
+2004-09-29 Per Bothner <per@bothner.com>
+
+ * java-tree.h: Redefine some macros and add some declaration
+ to handle the USE_MAPPED_LOCATION case.
+ * parse.h (EXPR_WFL_QUALIFICATION): Use operand 1, not 2.
+ * java-tree.h (EXPR_WFL_FILENAME_NODE): Use operand 2, not 1.
+ * java-tree.def (EXPR_WITH_FILE_LOCATION): Only need two operands in
+ USE_MAPPED_LOCATION case, since EXPR_WFL_FILENAME_NODE is gone.
+
+ * check-init.c (check_init): Handle USE_MAPPED_LOCATION case.
+ * decl.c (finish_method, java_add_stmt): Likewise.
+ * java-gimplify.c (java-gimplify.c): Likewise.
+ * jcf-write.c (generate_bytecode_insns): Likewise.
+ * lang.c (java_post_options): Likewise - call linemap_add.
+
+2004-09-29 Andrew Haley <aph@redhat.com>
+
+ PR java/17007
+ * parse.y (patch_binop): Don't mess with the TREE_SIDE_EFFECTS of the
+ result of TRUNC_MOD_EXPR.
+ (patch_unaryop): Likewise for CONVERT_EXPR, which may throw.
+ * decl.c (java_init_decl_processing): Mark
+ soft_lookupinterfacemethod_node and soft_instanceof_node pure.
+
+2004-09-28 Tom Tromey <tromey@redhat.com>
+
+ PR java/15710:
+ * class.c (add_miranda_methods): Load superinterface if not
+ already loaded.
+
+2004-09-28 Andrew Haley <aph@redhat.com>
+
+ PR java/17586
+ * jcf-parse.c (load_class): Don't try to read a class that we've
+ already read.
+
+2004-09-28 Andrew Haley <aph@redhat.com>
+
+ * jcf-parse.c (load_class): Back out previous broken patch.
+
+2004-09-28 Andrew Haley <aph@redhat.com>
+
+ PR java/17586
+ * jcf-parse.c (load_class): Don't try to read a class that we've
+ already read.
+ Check that we really did read the right class.
+
2004-09-25 Tom Tromey <tromey@redhat.com>
PR java/17500:
diff --git a/gcc/java/check-init.c b/gcc/java/check-init.c
index 3ec8d648821..be0485198eb 100644
--- a/gcc/java/check-init.c
+++ b/gcc/java/check-init.c
@@ -879,8 +879,12 @@ check_init (tree exp, words before)
if (IS_EMPTY_STMT (body))
break;
wfl = exp;
+#ifdef USE_MAPPED_LOCATION
+ input_location = EXPR_LOCATION (exp);
+#else
input_filename = EXPR_WFL_FILENAME (exp);
input_line = EXPR_WFL_LINENO (exp);
+#endif
check_init (body, before);
input_location = saved_location;
wfl = saved_wfl;
diff --git a/gcc/java/class.c b/gcc/java/class.c
index 7a67e8f3e59..6a417a7ff1b 100644
--- a/gcc/java/class.c
+++ b/gcc/java/class.c
@@ -428,10 +428,12 @@ push_class (tree class_type, tree class_name)
{
tree decl, signature;
location_t saved_loc = input_location;
+#ifndef USE_MAPPED_LOCATION
tree source_name = identifier_subst (class_name, "", '.', '/', ".java");
- CLASS_P (class_type) = 1;
input_filename = IDENTIFIER_POINTER (source_name);
input_line = 0;
+#endif
+ CLASS_P (class_type) = 1;
decl = build_decl (TYPE_DECL, class_name, class_type);
/* dbxout needs a DECL_SIZE if in gstabs mode */
@@ -1037,6 +1039,7 @@ build_class_ref (tree type)
TREE_STATIC (decl) = 1;
TREE_PUBLIC (decl) = 1;
DECL_EXTERNAL (decl) = 1;
+ DECL_ARTIFICIAL (decl) = 1;
make_decl_rtl (decl);
pushdecl_top_level (decl);
}
@@ -1996,9 +1999,14 @@ maybe_layout_super_class (tree super_class, tree this_class)
if (this_class)
{
tree this_decl = TYPE_NAME (this_class);
+#ifdef USE_MAPPED_LOCATION
+ this_wrap = build_expr_wfl (this_class,
+ DECL_SOURCE_LOCATION (this_decl));
+#else
this_wrap = build_expr_wfl (this_class,
DECL_SOURCE_FILE (this_decl),
DECL_SOURCE_LINE (this_decl), 0);
+#endif
}
super_class = do_resolve_class (NULL_TREE, /* FIXME? */
super_class, NULL_TREE, this_wrap);
@@ -2124,6 +2132,8 @@ add_miranda_methods (tree base_class, tree search_class)
tree elt = BINFO_TYPE (base_binfo);
/* Ensure that interface methods are seen in declared order. */
+ if (!CLASS_LOADED_P (elt))
+ load_class (elt, 1);
layout_class_methods (elt);
/* All base classes will have been laid out at this point, so the order
diff --git a/gcc/java/decl.c b/gcc/java/decl.c
index f6c03a5bb7a..b0a25dc97b9 100644
--- a/gcc/java/decl.c
+++ b/gcc/java/decl.c
@@ -986,6 +986,7 @@ java_init_decl_processing (void)
= builtin_function ("_Jv_IsInstanceOf",
build_function_type (boolean_type_node, t),
0, NOT_BUILT_IN, NULL, NULL_TREE);
+ DECL_IS_PURE (soft_instanceof_node) = 1;
t = tree_cons (NULL_TREE, object_ptr_type_node,
tree_cons (NULL_TREE, object_ptr_type_node, endlink));
soft_checkarraystore_node
@@ -1000,6 +1001,7 @@ java_init_decl_processing (void)
build_function_type (ptr_type_node, t),
0, NOT_BUILT_IN, NULL, NULL_TREE);
+ DECL_IS_PURE (soft_lookupinterfacemethod_node) = 1;
t = tree_cons (NULL_TREE, object_ptr_type_node,
tree_cons (NULL_TREE, ptr_type_node,
tree_cons (NULL_TREE, ptr_type_node,
@@ -1952,8 +1954,12 @@ finish_method (tree fndecl)
cfun = DECL_STRUCT_FUNCTION (fndecl);
else
allocate_struct_function (fndecl);
+#ifdef USE_MAPPED_LOCATION
+ cfun->function_end_locus = DECL_FUNCTION_LAST_LINE (fndecl);
+#else
cfun->function_end_locus.file = DECL_SOURCE_FILE (fndecl);
cfun->function_end_locus.line = DECL_FUNCTION_LAST_LINE (fndecl);
+#endif
/* Defer inlining and expansion to the cgraph optimizers. */
cgraph_finalize_function (fndecl, false);
@@ -1964,7 +1970,7 @@ finish_method (tree fndecl)
void
java_expand_body (tree fndecl)
{
- tree_rest_of_compilation (fndecl, 0);
+ tree_rest_of_compilation (fndecl);
}
/* We pessimistically marked all methods and fields external until we
@@ -2021,7 +2027,7 @@ tree
java_add_stmt (tree stmt)
{
if (input_filename)
- annotate_with_locus (stmt, input_location);
+ SET_EXPR_LOCATION (stmt, input_location);
return current_binding_level->stmts
= add_stmt_to_compound (current_binding_level->stmts,
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index 7cfc874e36f..3d878b523cf 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -2695,7 +2695,12 @@ expand_byte_code (JCF *jcf, tree method)
linenumber_pointer += 4;
if (pc == PC)
{
- input_location.line = GET_u2 (linenumber_pointer - 2);
+ int line = GET_u2 (linenumber_pointer - 2);
+#ifdef USE_MAPPED_LOCATION
+ input_location = linemap_line_start (&line_table, line, 1);
+#else
+ input_location.line = line;
+#endif
if (!(instruction_bits[PC] & BCODE_HAS_MULTI_LINENUMBERS))
break;
}
@@ -3225,21 +3230,33 @@ force_evaluation_order (tree node)
recursively more than one file (Java is one of them). */
tree
-build_expr_wfl (tree node, const char *file, int line, int col)
+build_expr_wfl (tree node,
+#ifdef USE_MAPPED_LOCATION
+ source_location location
+#else
+ const char *file, int line, int col
+#endif
+)
{
+ tree wfl;
+#ifdef USE_MAPPED_LOCATION
+ wfl = make_node (EXPR_WITH_FILE_LOCATION);
+ SET_EXPR_LOCATION (wfl, location);
+#else
+ wfl = make_node (EXPR_WITH_FILE_LOCATION);
+
static const char *last_file = 0;
static tree last_filenode = NULL_TREE;
- tree wfl = make_node (EXPR_WITH_FILE_LOCATION);
- EXPR_WFL_NODE (wfl) = node;
EXPR_WFL_SET_LINECOL (wfl, line, col);
if (file != last_file)
{
last_file = file;
last_filenode = file ? get_identifier (file) : NULL_TREE;
}
-
EXPR_WFL_FILENAME_NODE (wfl) = last_filenode;
+#endif
+ EXPR_WFL_NODE (wfl) = node;
if (node)
{
if (IS_NON_TYPE_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (node))))
@@ -3250,6 +3267,42 @@ build_expr_wfl (tree node, const char *file, int line, int col)
return wfl;
}
+#ifdef USE_MAPPED_LOCATION
+tree
+expr_add_location (tree node, source_location location, bool statement)
+{
+ tree wfl;
+#if 0
+ /* FIXME. This optimization causes failures in code that expects an
+ EXPR_WITH_FILE_LOCATION. E.g. in resolve_qualified_expression_name. */
+ if (node && ! (statement && flag_emit_class_files))
+ {
+ source_location node_loc = EXPR_LOCATION (node);
+ if (node_loc == location || location == UNKNOWN_LOCATION)
+ return node;
+ if (node_loc == UNKNOWN_LOCATION
+ && IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (node))))
+ {
+ SET_EXPR_LOCATION (node, location);
+ return node;
+ }
+ }
+#endif
+ wfl = make_node (EXPR_WITH_FILE_LOCATION);
+ SET_EXPR_LOCATION (wfl, location);
+ EXPR_WFL_NODE (wfl) = node;
+ if (statement && debug_info_level != DINFO_LEVEL_NONE)
+ EXPR_WFL_EMIT_LINE_NOTE (wfl) = 1;
+ if (node)
+ {
+ if (IS_NON_TYPE_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (node))))
+ TREE_SIDE_EFFECTS (wfl) = TREE_SIDE_EFFECTS (node);
+ TREE_TYPE (wfl) = TREE_TYPE (node);
+ }
+
+ return wfl;
+}
+#endif
/* Build a node to represent empty statements and blocks. */
diff --git a/gcc/java/java-gimplify.c b/gcc/java/java-gimplify.c
index 664eb9a6478..c8130a717a8 100644
--- a/gcc/java/java-gimplify.c
+++ b/gcc/java/java-gimplify.c
@@ -69,10 +69,14 @@ java_gimplify_expr (tree *expr_p, tree *pre_p ATTRIBUTE_UNUSED,
break;
case EXPR_WITH_FILE_LOCATION:
+#ifdef USE_MAPPED_LOCATION
+ input_location = EXPR_LOCATION (*expr_p);
+#else
input_location.file = EXPR_WFL_FILENAME (*expr_p);
input_location.line = EXPR_WFL_LINENO (*expr_p);
+#endif
*expr_p = EXPR_WFL_NODE (*expr_p);
- annotate_with_locus (*expr_p, input_location);
+ SET_EXPR_LOCATION (*expr_p, input_location);
break;
case CASE_EXPR:
diff --git a/gcc/java/java-tree.def b/gcc/java/java-tree.def
index 2f2b9f467eb..1cdbc573067 100644
--- a/gcc/java/java-tree.def
+++ b/gcc/java/java-tree.def
@@ -97,8 +97,13 @@ DEFTREECODE (JAVA_EXC_OBJ_EXPR, "java_exc_obj_expr", tcc_expression, 0)
(EXPR_WFL_LINENO); and column number (EXPR_WFL_COLNO). It is
expanded as the contained node (EXPR_WFL_NODE); a line note should
be emitted first if EXPR_WFL_EMIT_LINE_NOTE. */
+#ifdef USE_MAPPED_LOCATION
+DEFTREECODE (EXPR_WITH_FILE_LOCATION, "expr_with_file_location",
+ tcc_expression, 2)
+#else
DEFTREECODE (EXPR_WITH_FILE_LOCATION, "expr_with_file_location",
tcc_expression, 3)
+#endif
/*
Local variables:
diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h
index 1b707c68efb..991eb0376b8 100644
--- a/gcc/java/java-tree.h
+++ b/gcc/java/java-tree.h
@@ -52,17 +52,15 @@ struct JCF;
COMPOUND_ASSIGN_P (in EXPR (binop_*))
LOCAL_CLASS_P (in RECORD_TYPE)
BLOCK_IS_IMPLICIT (in BLOCK)
- JAVA_FILE_P (in TREE_LIST in current_file_list)
2: RETURN_MAP_ADJUSTED (in TREE_VEC).
QUALIFIED_P (in IDENTIFIER_NODE)
PRIMARY_P (in EXPR_WITH_FILE_LOCATION)
MODIFY_EXPR_FROM_INITIALIZATION_P (in MODIFY_EXPR)
CLASS_METHOD_CHECKED_P (in RECORD_TYPE)
- CLASS_FILE_P (in TREE_LIST in current_file_list)
+ CLASS_FILE_P (in a TRANSLATION_UNIT_DECL in current_file_list)
3: IS_AN_IMPORT_ON_DEMAND_P (in IDENTIFIER_NODE)
RESOLVE_PACKAGE_NAME_P (in EXPR_WITH_FILE_LOCATION)
SWITCH_HAS_DEFAULT (in SWITCH_EXPR)
- ZIP_FILE_P (in TREE_LIST in current_file_list)
HAS_FINALIZER (in RECORD_TYPE)
4: IS_A_COMMAND_LINE_FILENAME_P (in IDENTIFIER_NODE)
RESOLVE_TYPE_NAME_P (in EXPR_WITH_FILE_LOCATION)
@@ -756,7 +754,7 @@ union lang_tree_node
/* Number of local variable slots needed for the arguments of this function. */
#define DECL_ARG_SLOT_COUNT(DECL) \
(DECL_LANG_SPECIFIC(DECL)->u.f.arg_slot_count)
-/* Line number of end of function. */
+/* Source location of end of function. */
#define DECL_FUNCTION_LAST_LINE(DECL) (DECL_LANG_SPECIFIC(DECL)->u.f.last_line)
/* Information on declaration location */
#define DECL_FUNCTION_WFL(DECL) (DECL_LANG_SPECIFIC(DECL)->u.f.wfl)
@@ -958,7 +956,9 @@ struct lang_decl_func GTY(())
int max_locals;
int max_stack;
int arg_slot_count;
- int last_line; /* End line number for a function decl */
+ /* A temporary lie for the sake of ggc. Actually, last_line is
+ only a source_location if USE_MAPPED_LOCATION. FIXME. */
+ source_location last_line; /* End line number for a function decl */
tree wfl; /* Information on the original location */
tree throws_list; /* Exception specified by `throws' */
tree function_decl_body; /* Hold all function's statements */
@@ -1378,9 +1378,7 @@ extern tree builtin_function (const char *, tree, int, enum built_in_class,
#define METHOD_INVISIBLE(DECL) \
(DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (DECL))->u.f.invisible)
-#define JAVA_FILE_P(NODE) TREE_LANG_FLAG_2 (NODE)
#define CLASS_FILE_P(NODE) TREE_LANG_FLAG_3 (NODE)
-#define ZIP_FILE_P(NODE) TREE_LANG_FLAG_4 (NODE)
/* Other predicates on method decls */
@@ -1824,19 +1822,29 @@ enum
#undef EXPR_WFL_NODE
#define EXPR_WFL_NODE(NODE) \
TREE_OPERAND (EXPR_WITH_FILE_LOCATION_CHECK (NODE), 0)
+#ifdef USE_MAPPED_LOCATION
+#define EXPR_WFL_LINECOL(NODE) ((NODE)->exp.locus)
+#define EXPR_WFL_FILENAME(NODE) EXPR_FILENAME (NODE)
+#define EXPR_WFL_LINENO(NODE) EXPR_LINENO (NODE)
+extern tree build_expr_wfl PARAMS ((tree, source_location));
+extern tree expr_add_location PARAMS ((tree, source_location, bool));
+#define build_unknown_wfl(NODE) build_expr_wfl(NODE, UNKNOWN_LOCATION)
+#else
+#define EXPR_WFL_LINECOL(NODE) (EXPR_CHECK (NODE)->exp.complexity)
+#define EXPR_WFL_LINENO(NODE) (EXPR_WFL_LINECOL (NODE) >> 12)
+#define EXPR_WFL_COLNO(NODE) (EXPR_WFL_LINECOL (NODE) & 0xfff)
#undef EXPR_WFL_FILENAME_NODE
#define EXPR_WFL_FILENAME_NODE(NODE) \
- TREE_OPERAND (EXPR_WITH_FILE_LOCATION_CHECK (NODE), 1)
+ TREE_OPERAND (EXPR_WITH_FILE_LOCATION_CHECK (NODE), 2)
#define EXPR_WFL_FILENAME(NODE) \
IDENTIFIER_POINTER (EXPR_WFL_FILENAME_NODE (NODE))
/* ??? Java uses this in all expressions. */
-#define EXPR_WFL_LINECOL(NODE) (EXPR_CHECK (NODE)->exp.complexity)
-#define EXPR_WFL_LINENO(NODE) (EXPR_WFL_LINECOL (NODE) >> 12)
-#define EXPR_WFL_COLNO(NODE) (EXPR_WFL_LINECOL (NODE) & 0xfff)
#define EXPR_WFL_SET_LINECOL(NODE, LINE, COL) \
(EXPR_WFL_LINECOL(NODE) = ((LINE) << 12) | ((COL) & 0xfff))
extern tree build_expr_wfl PARAMS ((tree, const char *, int, int));
+#define build_unknown_wfl(NODE) build_expr_wfl(NODE, NULL, 0, 0)
+#endif
extern void java_genericize PARAMS ((tree));
extern int java_gimplify_expr PARAMS ((tree *, tree *, tree *));
diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c
index bc733e84f53..74f45de7a0b 100644
--- a/gcc/java/jcf-parse.c
+++ b/gcc/java/jcf-parse.c
@@ -80,9 +80,12 @@ static GTY(()) tree parse_roots[3];
/* The METHOD_DECL for the current method. */
#define current_method parse_roots[1]
-/* A list of file names. */
+/* A list of TRANSLATION_UNIT_DECLs for the files to be compiled. */
#define current_file_list parse_roots[2]
+/* Line 0 in current file, if compiling from bytecode. */
+static location_t file_start_location;
+
/* The Java archive that provides main_class; the main input file. */
static GTY(()) struct JCF * main_jcf;
@@ -95,7 +98,7 @@ static char *compute_class_name (struct ZipDirectory *zdir);
static int classify_zip_file (struct ZipDirectory *zdir);
static void parse_zip_file_entries (void);
static void process_zip_dir (FILE *);
-static void parse_source_file_1 (tree, FILE *);
+static void parse_source_file_1 (tree, const char *, FILE *);
static void parse_source_file_2 (void);
static void parse_source_file_3 (void);
static void parse_class_file (void);
@@ -128,21 +131,48 @@ set_source_filename (JCF *jcf, int index)
{
tree sfname_id = get_name_constant (jcf, index);
const char *sfname = IDENTIFIER_POINTER (sfname_id);
- if (input_filename != NULL)
+ const char *old_filename = input_filename;
+ int new_len = IDENTIFIER_LENGTH (sfname_id);
+ if (old_filename != NULL)
{
- int old_len = strlen (input_filename);
- int new_len = IDENTIFIER_LENGTH (sfname_id);
+ int old_len = strlen (old_filename);
/* Use the current input_filename (derived from the class name)
if it has a directory prefix, but otherwise matches sfname. */
if (old_len > new_len
- && strcmp (sfname, input_filename + old_len - new_len) == 0
- && (input_filename[old_len - new_len - 1] == '/'
- || input_filename[old_len - new_len - 1] == '\\'))
+ && strcmp (sfname, old_filename + old_len - new_len) == 0
+ && (old_filename[old_len - new_len - 1] == '/'
+ || old_filename[old_len - new_len - 1] == '\\'))
return;
}
+ if (strchr (sfname, '/') == NULL && strchr (sfname, '\\') == NULL)
+ {
+ const char *class_name
+ = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class)));
+ char *dot = strrchr (class_name, '.');
+ if (dot != NULL)
+ {
+ int i = dot - class_name;
+ /* Concatenate current package prefix with new sfname. */
+ char *buf = xmalloc (i+new_len+3);
+ /* Replace '.' by DIR_SEPARATOR. */
+ for (; i >= 0; i--)
+ {
+ if (buf[i] == '.')
+ buf[i] = DIR_SEPARATOR;
+ }
+ sfname_id = get_identifier (buf);
+ sfname = IDENTIFIER_POINTER (sfname_id);
+ }
+ }
+
+#ifdef USE_MAPPED_LOCATION
+ line_table.maps[line_table.used-1].to_file = sfname;
+#else
input_filename = sfname;
- DECL_SOURCE_FILE (TYPE_NAME (current_class)) = sfname;
- if (current_class == main_class) main_input_filename = input_filename;
+ DECL_SOURCE_LOCATION (TYPE_NAME (current_class)) = input_location;
+ file_start_location = input_location;
+#endif
+ if (current_class == main_class) main_input_filename = sfname;
}
#define HANDLE_SOURCEFILE(INDEX) set_source_filename (jcf, INDEX)
@@ -414,10 +444,22 @@ give_name_to_class (JCF *jcf, int i)
tree class_name = unmangle_classname ((const char *) JPOOL_UTF_DATA (jcf, j),
JPOOL_UTF_LENGTH (jcf, j));
this_class = lookup_class (class_name);
- input_filename = DECL_SOURCE_FILE (TYPE_NAME (this_class));
- input_line = 0;
+#ifdef USE_MAPPED_LOCATION
+ {
+ tree source_name = identifier_subst (class_name, "", '.', '/', ".java");
+ const char *sfname = IDENTIFIER_POINTER (source_name);
+ linemap_add (&line_table, LC_ENTER, false, sfname, 0);
+ input_location = linemap_line_start (&line_table, 0, 1);
+ file_start_location = input_location;
+ DECL_SOURCE_LOCATION (TYPE_NAME (this_class)) = input_location;
+ if (main_input_filename == NULL && jcf == main_jcf)
+ main_input_filename = sfname;
+ }
+#else
+ input_location = DECL_SOURCE_LOCATION (TYPE_NAME (this_class));
if (main_input_filename == NULL && jcf == main_jcf)
main_input_filename = input_filename;
+#endif
jcf->cpool.data[i].t = this_class;
JPOOL_TAG (jcf, i) = CONSTANT_ResolvedClass;
@@ -502,27 +544,27 @@ read_class (tree name)
java_push_parser_context ();
given_file = get_identifier (filename);
+ filename = IDENTIFIER_POINTER (given_file);
real_file = get_identifier (lrealpath (filename));
generate = IS_A_COMMAND_LINE_FILENAME_P (given_file);
- if (wfl_operator == NULL_TREE)
- wfl_operator = build_expr_wfl (NULL_TREE, NULL, 0, 0);
- EXPR_WFL_FILENAME_NODE (wfl_operator) = given_file;
- input_filename = ggc_strdup (filename);
output_class = current_class = NULL_TREE;
current_function_decl = NULL_TREE;
if (! HAS_BEEN_ALREADY_PARSED_P (real_file))
{
- if (! (finput = fopen (input_filename, "r")))
- fatal_error ("can't reopen %s: %m", input_filename);
+ if (! (finput = fopen (filename, "r")))
+ fatal_error ("can't reopen %s: %m", filename);
- parse_source_file_1 (real_file, finput);
+ parse_source_file_1 (real_file, filename, finput);
parse_source_file_2 ();
parse_source_file_3 ();
if (fclose (finput))
fatal_error ("can't close %s: %m", input_filename);
+#ifdef USE_MAPPED_LOCATION
+ linemap_add (&line_table, LC_LEAVE, false, NULL, 0);
+#endif
}
JCF_FINISH (current_jcf);
java_pop_parser_context (generate);
@@ -535,7 +577,7 @@ read_class (tree name)
java_parser_context_save_global ();
java_push_parser_context ();
output_class = current_class = class;
- input_filename = current_jcf->filename;
+ ctxp->save_location = input_location;
if (JCF_SEEN_IN_ZIP (current_jcf))
read_zip_member(current_jcf,
current_jcf->zipd, current_jcf->zipd->zipf);
@@ -567,6 +609,7 @@ load_class (tree class_or_name, int verbose)
{
tree name, saved;
int class_loaded;
+ tree class_decl;
/* class_or_name can be the name of the class we want to load */
if (TREE_CODE (class_or_name) == IDENTIFIER_NODE)
@@ -577,12 +620,12 @@ load_class (tree class_or_name, int verbose)
name = TYPE_NAME (TREE_PURPOSE (class_or_name));
/* Or it's a type in the making */
else
- {
- /* If the class is from source code, then it must already be loaded. */
- if (CLASS_FROM_SOURCE_P (class_or_name))
- return;
- name = DECL_NAME (TYPE_NAME (class_or_name));
- }
+ name = DECL_NAME (TYPE_NAME (class_or_name));
+
+ /* If the class is from source code, then it must already be loaded. */
+ class_decl = IDENTIFIER_CLASS_VALUE (name);
+ if (class_decl && CLASS_FROM_SOURCE_P (TREE_TYPE (class_decl)))
+ return;
saved = name;
while (1)
@@ -601,6 +644,11 @@ load_class (tree class_or_name, int verbose)
*separator = '\0';
name = get_identifier (IDENTIFIER_POINTER (name));
*separator = c;
+
+ /* Otherwise we might get infinite recursion, if say we have
+ String.class but not String$CaseInsensitiveComparator.class. */
+ if (current_jcf && current_jcf->java_source == 0)
+ break;
}
/* Otherwise, we failed, we bail. */
else
@@ -662,6 +710,9 @@ jcf_parse (JCF* jcf)
code = jcf_parse_final_attributes (jcf);
if (code != 0)
fatal_error ("error while parsing final attributes");
+#ifdef USE_MAPPED_LOCATION
+ linemap_add (&line_table, LC_LEAVE, false, NULL, 0);
+#endif
/* The fields of class_type_node are already in correct order. */
if (current_class != class_type_node && current_class != object_type_node)
@@ -706,8 +757,7 @@ parse_class_file (void)
java_layout_seen_class_methods ();
- input_filename = DECL_SOURCE_FILE (TYPE_NAME (current_class));
- input_line = 0;
+ input_location = DECL_SOURCE_LOCATION (TYPE_NAME (current_class));
(*debug_hooks->start_source_file) (input_line, input_filename);
/* Currently we always have to emit calls to _Jv_InitClass when
@@ -757,10 +807,11 @@ parse_class_file (void)
continue;
}
- input_line = 0;
+ input_location = file_start_location;
if (DECL_LINENUMBERS_OFFSET (method))
{
int i;
+ int min_line = 0;
unsigned char *ptr;
JCF_SEEK (jcf, DECL_LINENUMBERS_OFFSET (method));
linenumber_count = i = JCF_readu2 (jcf);
@@ -771,9 +822,16 @@ parse_class_file (void)
int line = GET_u2 (ptr);
/* Set initial input_line to smallest linenumber.
* Needs to be set before init_function_start. */
- if (input_line == 0 || line < input_line)
- input_line = line;
- }
+ if (min_line == 0 || line < min_line)
+ min_line = line;
+ }
+#ifdef USE_MAPPED_LOCATION
+ if (min_line != 0)
+ input_location = linemap_line_start (&line_table, min_line, 1);
+#else
+ if (min_line != 0)
+ input_line = min_line;
+#endif
}
else
{
@@ -798,22 +856,20 @@ parse_class_file (void)
finish_class ();
- (*debug_hooks->end_source_file) (save_location.line);
+ (*debug_hooks->end_source_file) (LOCATION_LINE (save_location));
input_location = save_location;
}
/* Parse a source file, as pointed by the current value of INPUT_FILENAME. */
static void
-parse_source_file_1 (tree real_file, FILE *finput)
+parse_source_file_1 (tree real_file, const char *filename, FILE *finput)
{
int save_error_count = java_error_count;
/* Mark the file as parsed. */
HAS_BEEN_ALREADY_PARSED_P (real_file) = 1;
- jcf_dependency_add_file (input_filename, 0);
-
lang_init_source (1); /* Error msgs have no method prototypes */
/* There's no point in trying to find the current encoding unless we
@@ -827,6 +883,18 @@ parse_source_file_1 (tree real_file, FILE *finput)
if (current_encoding == NULL || *current_encoding == '\0')
current_encoding = DEFAULT_ENCODING;
+#ifdef USE_MAPPED_LOCATION
+ linemap_add (&line_table, LC_ENTER, false, filename, 0);
+ input_location = linemap_line_start (&line_table, 0, 125);
+#else
+ input_filename = filename;
+ input_line = 0;
+#endif
+ ctxp->file_start_location = input_location;
+ ctxp->filename = filename;
+
+ jcf_dependency_add_file (input_filename, 0);
+
/* Initialize the parser */
java_init_lex (finput, current_encoding);
java_parse_abort_on_error ();
@@ -894,6 +962,7 @@ void
java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
{
int filename_count = 0;
+ location_t save_location = input_location;
char *list, *next;
tree node;
FILE *finput = NULL;
@@ -902,7 +971,7 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
if (flag_filelist_file)
{
int avail = 2000;
- finput = fopen (input_filename, "r");
+ finput = fopen (main_input_filename, "r");
if (finput == NULL)
fatal_error ("can't open %s: %m", input_filename);
list = xmalloc(avail);
@@ -934,7 +1003,7 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
finput = NULL;
}
else
- list = input_filename ? xstrdup (input_filename) : 0;
+ list = (char *) main_input_filename;
while (list)
{
@@ -976,51 +1045,32 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
if (list[0])
{
- char *value;
- tree id;
- int twice = 0;
-
- int len = strlen (list);
-
- obstack_grow0 (&temporary_obstack, list, len);
- value = obstack_finish (&temporary_obstack);
+ node = get_identifier (list);
filename_count++;
- /* Exclude file that we see twice on the command line. For
- all files except {Class,Error,Object,RuntimeException,String,
- Throwable}.java we can rely on maybe_get_identifier. For
- these files, we need to do a linear search of
- current_file_list. This search happens only for these
- files, presumably only when we're recompiling libgcj. */
+ /* Exclude file that we see twice on the command line. */
- if ((id = maybe_get_identifier (value)))
- {
- if (predefined_filename_p (id))
- {
- tree c;
- for (c = current_file_list; c; c = TREE_CHAIN (c))
- if (TREE_VALUE (c) == id)
- twice = 1;
- }
- else
- twice = 1;
- }
-
- if (twice)
+ if (IS_A_COMMAND_LINE_FILENAME_P (node))
{
location_t warn_loc;
- warn_loc.file = value;
+#ifdef USE_MAPPED_LOCATION
+ linemap_add (&line_table, LC_RENAME, 0,
+ IDENTIFIER_POINTER (node), 0);
+ warn_loc = linemap_line_start (&line_table, 0, 1);
+#else
+ warn_loc.file = IDENTIFIER_POINTER (node);
warn_loc.line = 0;
+#endif
warning ("%Hsource file seen twice on command line and "
"will be compiled only once", &warn_loc);
}
else
{
- node = get_identifier (value);
+ tree file_decl = build_decl (TRANSLATION_UNIT_DECL, node, NULL);
+ TREE_CHAIN (file_decl) = current_file_list;
+ current_file_list = file_decl;
IS_A_COMMAND_LINE_FILENAME_P (node) = 1;
- current_file_list = tree_cons (NULL_TREE, node,
- current_file_list);
}
}
list = next;
@@ -1036,7 +1086,7 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
/* Only one resource file may be compiled at a time. */
assert (TREE_CHAIN (current_file_list) == NULL);
- resource_filename = IDENTIFIER_POINTER (TREE_VALUE (current_file_list));
+ resource_filename = IDENTIFIER_POINTER (DECL_NAME (current_file_list));
compile_resource_file (resource_name, resource_filename);
goto finish;
@@ -1048,27 +1098,27 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
{
unsigned char magic_string[4];
uint32 magic = 0;
- tree name = TREE_VALUE (node);
+ tree name = DECL_NAME (node);
tree real_file;
+ const char *filename = IDENTIFIER_POINTER (name);
/* Skip already parsed files */
- real_file = get_identifier (lrealpath (IDENTIFIER_POINTER (name)));
+ real_file = get_identifier (lrealpath (filename));
if (HAS_BEEN_ALREADY_PARSED_P (real_file))
continue;
-
+
/* Close previous descriptor, if any */
if (finput && fclose (finput))
fatal_error ("can't close input file %s: %m", main_input_filename);
- finput = fopen (IDENTIFIER_POINTER (name), "rb");
+ finput = fopen (filename, "rb");
if (finput == NULL)
- fatal_error ("can't open %s: %m", IDENTIFIER_POINTER (name));
+ fatal_error ("can't open %s: %m", filename);
#ifdef IO_BUFFER_SIZE
setvbuf (finput, xmalloc (IO_BUFFER_SIZE),
_IOFBF, IO_BUFFER_SIZE);
#endif
- input_filename = IDENTIFIER_POINTER (name);
/* Figure what kind of file we're dealing with */
if (fread (magic_string, 1, 4, finput) == 4)
@@ -1084,22 +1134,29 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
current_jcf->read_state = finput;
current_jcf->filbuf = jcf_filbuf_from_stdio;
jcf_parse (current_jcf);
+ DECL_SOURCE_LOCATION (node) = file_start_location;
TYPE_JCF (current_class) = current_jcf;
CLASS_FROM_CURRENTLY_COMPILED_P (current_class) = 1;
- TREE_PURPOSE (node) = current_class;
+ TREE_TYPE (node) = current_class;
}
else if (magic == (JCF_u4)ZIPMAGIC)
{
- ZIP_FILE_P (node) = 1;
main_jcf = ggc_alloc (sizeof (JCF));
JCF_ZERO (main_jcf);
main_jcf->read_state = finput;
main_jcf->filbuf = jcf_filbuf_from_stdio;
- if (open_in_zip (main_jcf, input_filename, NULL, 0) < 0)
- fatal_error ("bad zip/jar file %s", IDENTIFIER_POINTER (name));
+#ifdef USE_MAPPED_LOCATION
+ linemap_add (&line_table, LC_ENTER, false, filename, 0);
+ input_location = linemap_line_start (&line_table, 0, 1);
+#endif
+ if (open_in_zip (main_jcf, filename, NULL, 0) < 0)
+ fatal_error ("bad zip/jar file %s", filename);
localToFile = SeenZipFiles;
/* Register all the classes defined there. */
process_zip_dir (main_jcf->read_state);
+#ifdef USE_MAPPED_LOCATION
+ linemap_add (&line_table, LC_LEAVE, false, NULL, 0);
+#endif
parse_zip_file_entries ();
/*
for (each entry)
@@ -1108,34 +1165,36 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
}
else
{
- JAVA_FILE_P (node) = 1;
java_push_parser_context ();
java_parser_context_save_global ();
- parse_source_file_1 (real_file, finput);
+ parse_source_file_1 (real_file, filename, finput);
java_parser_context_restore_global ();
java_pop_parser_context (1);
+#ifdef USE_MAPPED_LOCATION
+ linemap_add (&line_table, LC_LEAVE, false, NULL, 0);
+#endif
}
}
for (ctxp = ctxp_for_generation; ctxp; ctxp = ctxp->next)
{
- input_filename = ctxp->filename;
+ input_location = ctxp->file_start_location;
parse_source_file_2 ();
}
for (ctxp = ctxp_for_generation; ctxp; ctxp = ctxp->next)
{
- input_filename = ctxp->filename;
+ input_location = ctxp->file_start_location;
parse_source_file_3 ();
}
for (node = current_file_list; node; node = TREE_CHAIN (node))
{
- input_filename = IDENTIFIER_POINTER (TREE_VALUE (node));
+ input_location = DECL_SOURCE_LOCATION (node);
if (CLASS_FILE_P (node))
{
- output_class = current_class = TREE_PURPOSE (node);
+ output_class = current_class = TREE_TYPE (node);
current_jcf = TYPE_JCF (current_class);
layout_class (current_class);
load_inner_classes (current_class);
@@ -1143,7 +1202,7 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
JCF_FINISH (current_jcf);
}
}
- input_filename = main_input_filename;
+ input_location = save_location;
java_expand_classes ();
if (java_report_errors () || flag_syntax_only)
@@ -1243,7 +1302,6 @@ parse_zip_file_entries (void)
if (TYPE_SIZE (current_class) != error_mark_node)
{
- input_filename = current_jcf->filename;
parse_class_file ();
FREE (current_jcf->buffer); /* No longer necessary */
/* Note: there is a way to free this buffer right after a
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c
index 5137eecf292..5f842ae7a33 100644
--- a/gcc/java/jcf-write.c
+++ b/gcc/java/jcf-write.c
@@ -1479,8 +1479,12 @@ generate_bytecode_insns (tree exp, int target, struct jcf_partial *state)
tree body = EXPR_WFL_NODE (exp);
if (IS_EMPTY_STMT (body))
break;
+#ifdef USE_MAPPED_LOCATION
+ input_location = EXPR_LOCATION (exp);
+#else
input_filename = EXPR_WFL_FILENAME (exp);
input_line = EXPR_WFL_LINENO (exp);
+#endif
if (EXPR_WFL_EMIT_LINE_NOTE (exp) && input_line > 0
&& debug_info_level > DINFO_LEVEL_NONE)
put_linenumber (input_line, state);
diff --git a/gcc/java/jv-scan.c b/gcc/java/jv-scan.c
index 77320e606c3..9892605142f 100644
--- a/gcc/java/jv-scan.c
+++ b/gcc/java/jv-scan.c
@@ -59,6 +59,8 @@ FILE *finput, *out;
/* Executable name. */
char *exec_name;
+struct line_maps line_table;
+
/* Flags matching command line options. */
int flag_find_main = 0;
int flag_dump_class = 0;
@@ -129,6 +131,29 @@ version (void)
exit (0);
}
+#ifdef USE_MAPPED_LOCATION
+/* FIXME - this is the same as the function in tree.c, which is awkward.
+ Probably the cleanest solution is to move the function to line-map.c.
+ This is difficult as long as we still support --disable-mapped-location,
+ since whether expanded_location has a column fields depends on
+ USE_MAPPED_LOCATION. */
+
+expanded_location
+expand_location (source_location loc)
+{
+ expanded_location xloc;
+ if (loc == 0) { xloc.file = NULL; xloc.line = 0; xloc.column = 0; }
+ else
+ {
+ const struct line_map *map = linemap_lookup (&line_table, loc);
+ xloc.file = map->to_file;
+ xloc.line = SOURCE_LINE (map, loc);
+ xloc.column = SOURCE_COLUMN (map, loc);
+ };
+ return xloc;
+}
+#endif
+
/* jc1-lite main entry point */
int
main (int argc, char **argv)
@@ -198,8 +223,8 @@ main (int argc, char **argv)
for ( i = optind; i < argc; i++ )
if (argv [i])
{
- input_filename = argv [i];
- if ( (finput = fopen (argv [i], "r")) )
+ char *filename = argv[i];
+ if ( (finput = fopen (filename, "r")) )
{
/* There's no point in trying to find the current encoding
unless we are going to do something intelligent with it
@@ -213,6 +238,7 @@ main (int argc, char **argv)
encoding = DEFAULT_ENCODING;
java_init_lex (finput, encoding);
+ ctxp->filename = filename;
yyparse ();
report ();
if (ftell (out) != ft)
diff --git a/gcc/java/lang.c b/gcc/java/lang.c
index d1c69770787..3e4ba4933fc 100644
--- a/gcc/java/lang.c
+++ b/gcc/java/lang.c
@@ -668,6 +668,10 @@ java_post_options (const char **pfilename)
}
}
}
+#ifdef USE_MAPPED_LOCATION
+ linemap_add (&line_table, LC_ENTER, false, filename, 0);
+ linemap_add (&line_table, LC_RENAME, false, "<built-in>", 0);
+#endif
/* Initialize the compiler back end. */
return false;
diff --git a/gcc/java/lex.c b/gcc/java/lex.c
index aa3efcc0670..7ac2d9fb5f3 100644
--- a/gcc/java/lex.c
+++ b/gcc/java/lex.c
@@ -43,7 +43,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
#endif
/* Function declarations. */
-static char *java_sprint_unicode (struct java_line *, int);
+static char *java_sprint_unicode (int);
static void java_unicode_2_utf8 (unicode_t);
static void java_lex_error (const char *, int);
#ifndef JC1_LITE
@@ -52,21 +52,17 @@ static int java_lex (YYSTYPE *);
static int java_is_eol (FILE *, int);
static tree build_wfl_node (tree);
#endif
-static void java_store_unicode (struct java_line *, unicode_t, int);
static int java_parse_escape_sequence (void);
static int java_start_char_p (unicode_t);
static int java_part_char_p (unicode_t);
static int java_space_char_p (unicode_t);
static void java_parse_doc_section (int);
static void java_parse_end_comment (int);
+static int java_read_char (java_lexer *);
static int java_get_unicode (void);
+static int java_peek_unicode (void);
+static void java_next_unicode (void);
static int java_read_unicode (java_lexer *, int *);
-static int java_read_unicode_collapsing_terminators (java_lexer *, int *);
-static void java_store_unicode (struct java_line *, unicode_t, int);
-static int java_read_char (java_lexer *);
-static void java_allocate_new_line (void);
-static void java_unget_unicode (void);
-static unicode_t java_sneak_unicode (void);
#ifndef JC1_LITE
static int utf8_cmp (const unsigned char *, int, const char *);
#endif
@@ -102,8 +98,8 @@ java_init_lex (FILE *finput, const char *encoding)
if (!java_lang_imported)
{
- tree node = build_tree_list
- (build_expr_wfl (java_lang_id, NULL, 0, 0), NULL_TREE);
+ tree node = build_tree_list (build_unknown_wfl (java_lang_id),
+ NULL_TREE);
read_import_dir (TREE_PURPOSE (node));
TREE_CHAIN (node) = ctxp->import_demand_list;
ctxp->import_demand_list = node;
@@ -111,111 +107,52 @@ java_init_lex (FILE *finput, const char *encoding)
}
if (!wfl_operator)
- wfl_operator = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0);
+ {
+#ifdef USE_MAPPED_LOCATION
+ wfl_operator = build_expr_wfl (NULL_TREE, input_location);
+#else
+ wfl_operator = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0);
+#endif
+ }
if (!label_id)
label_id = get_identifier ("$L");
if (!wfl_append)
- wfl_append = build_expr_wfl (get_identifier ("append"), NULL, 0, 0);
+ wfl_append = build_unknown_wfl (get_identifier ("append"));
if (!wfl_string_buffer)
wfl_string_buffer =
- build_expr_wfl (get_identifier (flag_emit_class_files
+ build_unknown_wfl (get_identifier (flag_emit_class_files
? "java.lang.StringBuffer"
- : "gnu.gcj.runtime.StringBuffer"),
- NULL, 0, 0);
+ : "gnu.gcj.runtime.StringBuffer"));
if (!wfl_to_string)
- wfl_to_string = build_expr_wfl (get_identifier ("toString"), NULL, 0, 0);
+ wfl_to_string = build_unknown_wfl (get_identifier ("toString"));
CPC_INITIALIZER_LIST (ctxp) = CPC_STATIC_INITIALIZER_LIST (ctxp) =
CPC_INSTANCE_INITIALIZER_LIST (ctxp) = NULL_TREE;
memset (ctxp->modifier_ctx, 0, sizeof (ctxp->modifier_ctx));
- current_jcf = ggc_alloc_cleared (sizeof (JCF));
ctxp->current_parsed_class = NULL;
ctxp->package = NULL_TREE;
#endif
- ctxp->filename = input_filename;
- ctxp->lineno = input_line = 0;
- ctxp->p_line = NULL;
- ctxp->c_line = NULL;
+ ctxp->save_location = input_location;
ctxp->java_error_flag = 0;
ctxp->lexer = java_new_lexer (finput, encoding);
}
static char *
-java_sprint_unicode (struct java_line *line, int i)
+java_sprint_unicode (int c)
{
static char buffer [10];
- if (line->unicode_escape_p [i] || line->line [i] > 128)
- sprintf (buffer, "\\u%04x", line->line [i]);
+ if (c < ' ' || c >= 127)
+ sprintf (buffer, "\\u%04x", c);
else
{
- buffer [0] = line->line [i];
+ buffer [0] = c;
buffer [1] = '\0';
}
return buffer;
}
-static unicode_t
-java_sneak_unicode (void)
-{
- return (ctxp->c_line->line [ctxp->c_line->current]);
-}
-
-static void
-java_unget_unicode (void)
-{
- if (!ctxp->c_line->current)
- /* Can't unget unicode. */
- abort ();
-
- ctxp->c_line->current--;
- ctxp->c_line->char_col -= JAVA_COLUMN_DELTA (0);
-}
-
-static void
-java_allocate_new_line (void)
-{
- unicode_t ahead = (ctxp->c_line ? ctxp->c_line->ahead[0] : '\0');
- char ahead_escape_p = (ctxp->c_line ?
- ctxp->c_line->unicode_escape_ahead_p : 0);
-
- if (ctxp->c_line && !ctxp->c_line->white_space_only)
- {
- if (ctxp->p_line)
- {
- free (ctxp->p_line->unicode_escape_p);
- free (ctxp->p_line->line);
- free (ctxp->p_line);
- }
- ctxp->p_line = ctxp->c_line;
- ctxp->c_line = NULL; /* Reallocated. */
- }
-
- if (!ctxp->c_line)
- {
- ctxp->c_line = xmalloc (sizeof (struct java_line));
- ctxp->c_line->max = JAVA_LINE_MAX;
- ctxp->c_line->line = xmalloc (sizeof (unicode_t)*ctxp->c_line->max);
- ctxp->c_line->unicode_escape_p =
- xmalloc (sizeof (char)*ctxp->c_line->max);
- ctxp->c_line->white_space_only = 0;
- }
-
- ctxp->c_line->line [0] = ctxp->c_line->size = 0;
- ctxp->c_line->char_col = ctxp->c_line->current = 0;
- if (ahead)
- {
- ctxp->c_line->line [ctxp->c_line->size] = ahead;
- ctxp->c_line->unicode_escape_p [ctxp->c_line->size] = ahead_escape_p;
- ctxp->c_line->size++;
- }
- ctxp->c_line->ahead [0] = 0;
- ctxp->c_line->unicode_escape_ahead_p = 0;
- ctxp->c_line->lineno = ++input_line;
- ctxp->c_line->white_space_only = 1;
-}
-
/* Create a new lexer object. */
java_lexer *
@@ -227,8 +164,20 @@ java_new_lexer (FILE *finput, const char *encoding)
lex->finput = finput;
lex->bs_count = 0;
lex->unget_value = 0;
- lex->hit_eof = 0;
+ lex->next_unicode = 0;
+ lex->avail_unicode = 0;
+ lex->next_columns = 1;
lex->encoding = encoding;
+ lex->position.line = 1;
+ lex->position.col = 1;
+#ifndef JC1_LITE
+#ifdef USE_MAPPED_LOCATION
+ input_location
+ = linemap_line_start (&line_table, 1, 120);
+#else
+ input_line = 1;
+#endif
+#endif
#ifdef HAVE_ICONV
lex->handle = iconv_open ("UCS-2", encoding);
@@ -322,13 +271,6 @@ java_destroy_lexer (java_lexer *lex)
static int
java_read_char (java_lexer *lex)
{
- if (lex->unget_value)
- {
- unicode_t r = lex->unget_value;
- lex->unget_value = 0;
- return r;
- }
-
#ifdef HAVE_ICONV
if (! lex->use_fallback)
{
@@ -513,26 +455,19 @@ java_read_char (java_lexer *lex)
return UEOF;
}
-static void
-java_store_unicode (struct java_line *l, unicode_t c, int unicode_escape_p)
-{
- if (l->size == l->max)
- {
- l->max += JAVA_LINE_MAX;
- l->line = xrealloc (l->line, sizeof (unicode_t)*l->max);
- l->unicode_escape_p = xrealloc (l->unicode_escape_p,
- sizeof (char)*l->max);
- }
- l->line [l->size] = c;
- l->unicode_escape_p [l->size++] = unicode_escape_p;
-}
-
static int
java_read_unicode (java_lexer *lex, int *unicode_escape_p)
{
int c;
- c = java_read_char (lex);
+ if (lex->unget_value)
+ {
+ c = lex->unget_value;
+ lex->unget_value = 0;
+ }
+ else
+ c = java_read_char (lex);
+
*unicode_escape_p = 0;
if (c != '\\')
@@ -589,72 +524,111 @@ java_read_unicode (java_lexer *lex, int *unicode_escape_p)
return (unicode_t) '\\';
}
+/* Get the next Unicode character (post-Unicode-escape-handling).
+ Move the current position to just after returned character. */
+
+static int
+java_get_unicode (void)
+{
+ int next = java_peek_unicode ();
+ java_next_unicode ();
+ return next;
+}
+
+/* Return the next Unicode character (post-Unicode-escape-handling).
+ Do not move the current position, which remains just before
+ the returned character. */
+
static int
-java_read_unicode_collapsing_terminators (java_lexer *lex,
- int *unicode_escape_p)
+java_peek_unicode (void)
{
- int c = java_read_unicode (lex, unicode_escape_p);
+ int unicode_escape_p;
+ java_lexer *lex = ctxp->lexer;
+ if (lex->avail_unicode)
+ return lex->next_unicode;
+ int next;
- if (c == '\r')
+ next = java_read_unicode (lex, &unicode_escape_p);
+
+ if (next == '\r')
{
- /* We have to read ahead to see if we got \r\n. In that case we
- return a single line terminator. */
+ /* We have to read ahead to see if we got \r\n.
+ In that case we return a single line terminator. */
int dummy;
- c = java_read_unicode (lex, &dummy);
- if (c != '\n' && c != UEOF)
- lex->unget_value = c;
+ next = java_read_unicode (lex, &dummy);
+ if (next != '\n' && next != UEOF)
+ lex->unget_value = next;
/* In either case we must return a newline. */
- c = '\n';
+ next = '\n';
}
- return c;
-}
+ lex->next_unicode = next;
+ lex->avail_unicode = 1;
-static int
-java_get_unicode (void)
-{
- /* It's time to read a line when... */
- if (!ctxp->c_line || ctxp->c_line->current == ctxp->c_line->size)
+ if (next == UEOF)
{
- int c;
- int found_chars = 0;
+ lex->next_columns = 0;
+ return next;
+ }
- if (ctxp->lexer->hit_eof)
- return UEOF;
+ if (next == '\n')
+ {
+ lex->next_columns = 1 - lex->position.col;
+ }
+ else if (next == '\t')
+ {
+ int cur_col = lex->position.col;
+ lex->next_columns = ((cur_col + 7) & ~7) + 1 - cur_col;
+
+ }
+ else
+ {
+ lex->next_columns = 1;
+ }
+ if (unicode_escape_p)
+ lex->next_columns = 6;
+ return next;
+}
- java_allocate_new_line ();
- if (ctxp->c_line->line[0] != '\n')
- {
- for (;;)
- {
- int unicode_escape_p;
- c = java_read_unicode_collapsing_terminators (ctxp->lexer,
- &unicode_escape_p);
- if (c != UEOF)
- {
- found_chars = 1;
- java_store_unicode (ctxp->c_line, c, unicode_escape_p);
- if (ctxp->c_line->white_space_only
- && !JAVA_WHITE_SPACE_P (c)
- && c != '\n')
- ctxp->c_line->white_space_only = 0;
- }
- if ((c == '\n') || (c == UEOF))
- break;
- }
+/* Move forward one Unicode character (post-Unicode-escape-handling).
+ Only allowed after java_peek_unicode. The combination java_peek_unicode
+ followed by java_next_unicode is equivalent to java_get_unicode. */
- if (c == UEOF && ! found_chars)
- {
- ctxp->lexer->hit_eof = 1;
- return UEOF;
- }
- }
+static void java_next_unicode (void)
+{
+ struct java_lexer *lex = ctxp->lexer;
+ lex->position.col += lex->next_columns;
+ if (lex->next_unicode == '\n')
+ {
+ lex->position.line++;
+#ifndef JC1_LITE
+#ifdef USE_MAPPED_LOCATION
+ input_location
+ = linemap_line_start (&line_table, lex->position.line, 120);
+#else
+ input_line = lex->position.line;
+#endif
+#endif
}
- ctxp->c_line->char_col += JAVA_COLUMN_DELTA (0);
- JAVA_LEX_CHAR (ctxp->c_line->line [ctxp->c_line->current]);
- return ctxp->c_line->line [ctxp->c_line->current++];
+ lex->avail_unicode = 0;
}
+#if 0
+/* The inverse of java_next_unicode.
+ Not currently used, but could be if it would be cleaner or faster.
+ java_peek_unicode == java_get_unicode + java_unget_unicode.
+ java_get_unicode == java_peek_unicode + java_next_unicode.
+*/
+static void java_unget_unicode ()
+{
+ struct java_lexer *lex = ctxp->lexer;
+ if (lex->avail_unicode)
+ fatal_error ("internal error - bad unget");
+ lex->avail_unicode = 1;
+ lex->position.col -= lex->next_columns;
+}
+#endif
+
/* Parse the end of a C style comment.
* C is the first character following the '/' and '*'. */
static void
@@ -668,15 +642,16 @@ java_parse_end_comment (int c)
java_lex_error ("Comment not terminated at end of input", 0);
return;
case '*':
- switch (c = java_get_unicode ())
+ switch (c = java_peek_unicode ())
{
case UEOF:
java_lex_error ("Comment not terminated at end of input", 0);
return;
case '/':
+ java_next_unicode ();
return;
case '*': /* Reparse only '*'. */
- java_unget_unicode ();
+ ;
}
}
}
@@ -832,7 +807,6 @@ java_space_char_p (unicode_t c)
static int
java_parse_escape_sequence (void)
{
- unicode_t char_lit;
int c;
switch (c = java_get_unicode ())
@@ -856,33 +830,31 @@ java_parse_escape_sequence (void)
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7':
{
- int octal_escape[3];
- int octal_escape_index = 0;
- int max = 3;
- int i, shift;
+ int more = 3;
+ unicode_t char_lit = 0;
- for (; octal_escape_index < max && RANGE (c, '0', '7');
- c = java_get_unicode ())
+ if (c > '3')
{
- if (octal_escape_index == 0 && c > '3')
- {
- /* According to the grammar, `\477' has a well-defined
- meaning -- it is `\47' followed by `7'. */
- --max;
- }
- octal_escape [octal_escape_index++] = c;
+ /* According to the grammar, `\477' has a well-defined
+ meaning -- it is `\47' followed by `7'. */
+ --more;
+ }
+ char_lit = 0;
+ for (;;)
+ {
+ char_lit = 8 * char_lit + c - '0';
+ if (--more == 0)
+ break;
+ c = java_peek_unicode ();
+ if (! RANGE (c, '0', '7'))
+ break;
+ java_next_unicode ();
}
-
- java_unget_unicode ();
-
- for (char_lit=0, i = 0, shift = 3*(octal_escape_index-1);
- i < octal_escape_index; i++, shift -= 3)
- char_lit |= (octal_escape [i] - '0') << shift;
return char_lit;
}
default:
- java_lex_error ("Invalid character in escape sequence", 0);
+ java_lex_error ("Invalid character in escape sequence", -1);
return JAVA_CHAR_ERROR;
}
}
@@ -932,10 +904,10 @@ java_perform_atof (YYSTYPE *java_lval, char *literal_token, int fflag,
}
if (! really_zero)
{
- int i = ctxp->c_line->current;
- ctxp->c_line->current = number_beginning;
+ int save_col = ctxp->lexer->position.col;
+ ctxp->lexer->position.col = number_beginning;
java_lex_error ("Floating point literal underflow", 0);
- ctxp->c_line->current = i;
+ ctxp->lexer->position.col = save_col;
}
}
@@ -953,89 +925,32 @@ do_java_lex (YYSTYPE *java_lval)
#endif
{
int c;
- unicode_t first_unicode;
- int ascii_index, all_ascii;
char *string;
/* Translation of the Unicode escape in the raw stream of Unicode
characters. Takes care of line terminator. */
step1:
/* Skip white spaces: SP, TAB and FF or ULT. */
- for (c = java_get_unicode ();
- c == '\n' || JAVA_WHITE_SPACE_P (c); c = java_get_unicode ())
- if (c == '\n')
- {
- ctxp->elc.line = ctxp->c_line->lineno;
- ctxp->elc.col = ctxp->c_line->char_col-2;
- }
-
- ctxp->elc.col = (ctxp->elc.col < 0 ? 0 : ctxp->elc.col);
-
- if (c == 0x1a) /* CTRL-Z. */
+ for (;;)
{
- if ((c = java_get_unicode ()) == UEOF)
- return 0; /* Ok here. */
- else
- java_unget_unicode (); /* Caught later, at the end of the
- function. */
+ c = java_peek_unicode ();
+ if (c != '\n' && ! JAVA_WHITE_SPACE_P (c))
+ break;
+ java_next_unicode ();
}
+
/* Handle EOF here. */
if (c == UEOF) /* Should probably do something here... */
return 0;
- /* Take care of eventual comments. */
- if (c == '/')
- {
- switch (c = java_get_unicode ())
- {
- case '/':
- for (;;)
- {
- c = java_get_unicode ();
- if (c == UEOF)
- {
- /* It is ok to end a `//' comment with EOF, unless
- we're being pedantic. */
- if (pedantic)
- java_lex_error ("Comment not terminated at end of input",
- 0);
- return 0;
- }
- if (c == '\n') /* ULT */
- goto step1;
- }
- break;
-
- case '*':
- if ((c = java_get_unicode ()) == '*')
- {
- c = java_get_unicode ();
- if (c == '/')
- {
- /* Empty documentation comment. We have to reset
- the deprecation marker as only the most recent
- doc comment applies. */
- ctxp->deprecated = 0;
- }
- else
- java_parse_doc_section (c);
- }
- else
- java_parse_end_comment ((c = java_get_unicode ()));
- goto step1;
- break;
- default:
- java_unget_unicode ();
- c = '/';
- break;
- }
- }
-
- ctxp->elc.line = ctxp->c_line->lineno;
- ctxp->elc.prev_col = ctxp->elc.col;
- ctxp->elc.col = ctxp->c_line->char_col - JAVA_COLUMN_DELTA (-1);
- if (ctxp->elc.col < 0)
- abort ();
+#ifndef JC1_LITE
+#ifdef USE_MAPPED_LOCATION
+ LINEMAP_POSITION_FOR_COLUMN (input_location, &line_table,
+ ctxp->lexer->position.col);
+#else
+ ctxp->lexer->token_start = ctxp->lexer->position;
+#endif
+#endif
/* Numeric literals. */
if (JAVA_ASCII_DIGIT (c) || (c == '.'))
@@ -1047,62 +962,54 @@ do_java_lex (YYSTYPE *java_lval)
/* End borrowed section. */
char literal_token [256];
int literal_index = 0, radix = 10, long_suffix = 0, overflow = 0, bytes;
- int found_hex_digits = 0, found_non_octal_digits = 0;
+ int found_hex_digits = 0, found_non_octal_digits = -1;
int i;
#ifndef JC1_LITE
- int number_beginning = ctxp->c_line->current;
+ int number_beginning = ctxp->lexer->position.col;
tree value;
#endif
-
- /* We might have a . separator instead of a FP like .[0-9]*. */
- if (c == '.')
- {
- unicode_t peep = java_sneak_unicode ();
-
- if (!JAVA_ASCII_DIGIT (peep))
- {
- JAVA_LEX_SEP('.');
- BUILD_OPERATOR (DOT_TK);
- }
- }
-
+
for (i = 0; i < TOTAL_PARTS; i++)
parts [i] = 0;
if (c == '0')
{
- c = java_get_unicode ();
+ java_next_unicode ();
+ c = java_peek_unicode ();
if (c == 'x' || c == 'X')
{
radix = 16;
- c = java_get_unicode ();
+ java_next_unicode ();
+ c = java_peek_unicode ();
}
else if (JAVA_ASCII_DIGIT (c))
- radix = 8;
+ {
+ literal_token [literal_index++] = '0';
+ radix = 8;
+ }
else if (c == '.' || c == 'e' || c =='E')
{
- /* Push the '.', 'e', or 'E' back and prepare for a FP
- parsing... */
- java_unget_unicode ();
- c = '0';
+ literal_token [literal_index++] = '0';
+ /* Handle C during floating-point parsing. */
}
else
{
/* We have a zero literal: 0, 0{l,L}, 0{f,F}, 0{d,D}. */
- JAVA_LEX_LIT ("0", 10);
switch (c)
{
case 'L': case 'l':
+ java_next_unicode ();
SET_LVAL_NODE (long_zero_node);
return (INT_LIT_TK);
case 'f': case 'F':
+ java_next_unicode ();
SET_LVAL_NODE (float_zero_node);
return (FP_LIT_TK);
case 'd': case 'D':
+ java_next_unicode ();
SET_LVAL_NODE (double_zero_node);
return (FP_LIT_TK);
default:
- java_unget_unicode ();
SET_LVAL_NODE (integer_zero_node);
return (INT_LIT_TK);
}
@@ -1110,8 +1017,7 @@ do_java_lex (YYSTYPE *java_lval)
}
/* Parse the first part of the literal, until we find something
which is not a number. */
- while ((radix == 16 && JAVA_ASCII_HEXDIGIT (c)) ||
- JAVA_ASCII_DIGIT (c))
+ while (radix == 16 ? JAVA_ASCII_HEXDIGIT (c) : JAVA_ASCII_DIGIT (c))
{
/* We store in a string (in case it turns out to be a FP) and in
PARTS if we have to process a integer literal. */
@@ -1122,8 +1028,8 @@ do_java_lex (YYSTYPE *java_lval)
if (radix == 16)
found_hex_digits = 1;
/* Remember when we find an invalid octal digit. */
- else if (radix == 8 && !JAVA_ASCII_OCTDIGIT (c))
- found_non_octal_digits = 1;
+ else if (radix == 8 && numeric >= 8 && found_non_octal_digits < 0)
+ found_non_octal_digits = literal_index;
literal_token [literal_index++] = c;
/* This section of code if borrowed from gcc/c-lex.c. */
@@ -1141,13 +1047,20 @@ do_java_lex (YYSTYPE *java_lval)
if (parts [TOTAL_PARTS-1] != 0)
overflow = 1;
/* End borrowed section. */
- c = java_get_unicode ();
+ java_next_unicode ();
+ c = java_peek_unicode ();
}
/* If we have something from the FP char set but not a digit, parse
a FP literal. */
if (JAVA_ASCII_FPCHAR (c) && !JAVA_ASCII_DIGIT (c))
{
+ /* stage==0: seen digits only
+ * stage==1: seen '.'
+ * stage==2: seen 'e' or 'E'.
+ * stage==3: seen '+' or '-' after 'e' or 'E'.
+ * stage==4: seen type suffix ('f'/'F'/'d'/'D')
+ */
int stage = 0;
int seen_digit = (literal_index ? 1 : 0);
int seen_exponent = 0;
@@ -1168,7 +1081,10 @@ do_java_lex (YYSTYPE *java_lval)
{
stage = 1;
literal_token [literal_index++ ] = c;
- c = java_get_unicode ();
+ java_next_unicode ();
+ c = java_peek_unicode ();
+ if (literal_index == 1 && !JAVA_ASCII_DIGIT (c))
+ BUILD_OPERATOR (DOT_TK);
}
else
java_lex_error ("Invalid character in FP literal", 0);
@@ -1186,7 +1102,8 @@ do_java_lex (YYSTYPE *java_lval)
seen_exponent = 1;
stage = 2;
literal_token [literal_index++] = c;
- c = java_get_unicode ();
+ java_next_unicode ();
+ c = java_peek_unicode ();
}
else
java_lex_error ("Invalid character in FP literal", 0);
@@ -1201,7 +1118,8 @@ do_java_lex (YYSTYPE *java_lval)
{
stage = 3;
literal_token [literal_index++] = c;
- c = java_get_unicode ();
+ java_next_unicode ();
+ c = java_peek_unicode ();
}
if ((stage == 0 && JAVA_ASCII_FPCHAR (c)) ||
@@ -1214,12 +1132,13 @@ do_java_lex (YYSTYPE *java_lval)
if (stage == 2)
stage = 3;
literal_token [literal_index++ ] = c;
- c = java_get_unicode ();
+ java_next_unicode ();
+ c = java_peek_unicode ();
}
else
{
- if (stage != 4) /* Don't push back fF/dD. */
- java_unget_unicode ();
+ if (stage == 4) /* Don't push back fF/dD. */
+ java_next_unicode ();
/* An exponent (if any) must have seen a digit. */
if (seen_exponent && !seen_digit)
@@ -1227,7 +1146,6 @@ do_java_lex (YYSTYPE *java_lval)
("Invalid FP literal, exponent must have digit", 0);
literal_token [literal_index] = '\0';
- JAVA_LEX_LIT (literal_token, radix);
#ifndef JC1_LITE
java_perform_atof (java_lval, literal_token,
@@ -1242,17 +1160,19 @@ do_java_lex (YYSTYPE *java_lval)
if (radix == 16 && ! found_hex_digits)
java_lex_error
("0x must be followed by at least one hexadecimal digit", 0);
- else if (radix == 8 && found_non_octal_digits)
- java_lex_error ("Octal literal contains digit out of range", 0);
+ else if (radix == 8 && found_non_octal_digits >= 0)
+ {
+ int back = literal_index - found_non_octal_digits;
+ ctxp->lexer->position.col -= back;
+ java_lex_error ("Octal literal contains digit out of range", 0);
+ ctxp->lexer->position.col += back;
+ }
else if (c == 'L' || c == 'l')
- long_suffix = 1;
- else
- java_unget_unicode ();
+ {
+ java_next_unicode ();
+ long_suffix = 1;
+ }
-#ifdef JAVA_LEX_DEBUG
- literal_token [literal_index] = '\0'; /* So JAVA_LEX_LIT is safe. */
- JAVA_LEX_LIT (literal_token, radix);
-#endif
/* This section of code is borrowed from gcc/c-lex.c. */
if (!overflow)
{
@@ -1294,9 +1214,9 @@ do_java_lex (YYSTYPE *java_lval)
value)))
{
if (long_suffix)
- JAVA_INTEGRAL_RANGE_ERROR ("Numeric overflow for `long' literal");
+ JAVA_RANGE_ERROR ("Numeric overflow for 'long' literal");
else
- JAVA_INTEGRAL_RANGE_ERROR ("Numeric overflow for `int' literal");
+ JAVA_RANGE_ERROR ("Numeric overflow for 'int' literal");
}
/* Sign extend the value. */
@@ -1315,6 +1235,112 @@ do_java_lex (YYSTYPE *java_lval)
return INT_LIT_TK;
}
+ /* We may have an ID here. */
+ if (JAVA_START_CHAR_P (c))
+ {
+ int ascii_index = 0, all_ascii = 1;
+
+ /* Keyword, boolean literal or null literal. */
+ while (c != UEOF && JAVA_PART_CHAR_P (c))
+ {
+ java_unicode_2_utf8 (c);
+ if (c >= 128)
+ all_ascii = 0;
+ java_next_unicode ();
+ ascii_index++;
+ c = java_peek_unicode ();
+ }
+
+ obstack_1grow (&temporary_obstack, '\0');
+ string = obstack_finish (&temporary_obstack);
+
+ /* If we have something all ascii, we consider a keyword, a boolean
+ literal, a null literal or an all ASCII identifier. Otherwise,
+ this is an identifier (possibly not respecting formation rule). */
+ if (all_ascii)
+ {
+ const struct java_keyword *kw;
+ if ((kw=java_keyword (string, ascii_index)))
+ {
+ switch (kw->token)
+ {
+ case PUBLIC_TK: case PROTECTED_TK: case STATIC_TK:
+ case ABSTRACT_TK: case FINAL_TK: case NATIVE_TK:
+ case SYNCHRONIZED_TK: case TRANSIENT_TK: case VOLATILE_TK:
+ case PRIVATE_TK: case STRICT_TK:
+ SET_MODIFIER_CTX (kw->token);
+ return MODIFIER_TK;
+ case FLOAT_TK:
+ SET_LVAL_NODE (float_type_node);
+ return FP_TK;
+ case DOUBLE_TK:
+ SET_LVAL_NODE (double_type_node);
+ return FP_TK;
+ case BOOLEAN_TK:
+ SET_LVAL_NODE (boolean_type_node);
+ return BOOLEAN_TK;
+ case BYTE_TK:
+ SET_LVAL_NODE (byte_type_node);
+ return INTEGRAL_TK;
+ case SHORT_TK:
+ SET_LVAL_NODE (short_type_node);
+ return INTEGRAL_TK;
+ case INT_TK:
+ SET_LVAL_NODE (int_type_node);
+ return INTEGRAL_TK;
+ case LONG_TK:
+ SET_LVAL_NODE (long_type_node);
+ return INTEGRAL_TK;
+ case CHAR_TK:
+ SET_LVAL_NODE (char_type_node);
+ return INTEGRAL_TK;
+
+ /* Keyword based literals. */
+ case TRUE_TK:
+ case FALSE_TK:
+ SET_LVAL_NODE ((kw->token == TRUE_TK ?
+ boolean_true_node : boolean_false_node));
+ return BOOL_LIT_TK;
+ case NULL_TK:
+ SET_LVAL_NODE (null_pointer_node);
+ return NULL_TK;
+
+ case ASSERT_TK:
+ if (flag_assert)
+ {
+ BUILD_OPERATOR (kw->token);
+ return kw->token;
+ }
+ else
+ break;
+
+ /* Some keyword we want to retain information on the location
+ they where found. */
+ case CASE_TK:
+ case DEFAULT_TK:
+ case SUPER_TK:
+ case THIS_TK:
+ case RETURN_TK:
+ case BREAK_TK:
+ case CONTINUE_TK:
+ case TRY_TK:
+ case CATCH_TK:
+ case THROW_TK:
+ case INSTANCEOF_TK:
+ BUILD_OPERATOR (kw->token);
+
+ default:
+ return kw->token;
+ }
+ }
+ }
+
+ java_lval->node = BUILD_ID_WFL (GET_IDENTIFIER (string));
+ return ID_TK;
+ }
+
+ java_next_unicode ();
+
/* Character literals. */
if (c == '\'')
{
@@ -1339,7 +1365,6 @@ do_java_lex (YYSTYPE *java_lval)
if (char_lit == JAVA_CHAR_ERROR)
char_lit = 0; /* We silently convert it to zero. */
- JAVA_LEX_CHAR_LIT (char_lit);
SET_LVAL_NODE (build_int_cst (char_type_node, char_lit));
return CHAR_LIT_TK;
}
@@ -1347,12 +1372,20 @@ do_java_lex (YYSTYPE *java_lval)
/* String literals. */
if (c == '"')
{
- int no_error;
+ int no_error = 1;
char *string;
- for (no_error = 1, c = java_get_unicode ();
- c != UEOF && c != '"' && c != '\n'; c = java_get_unicode ())
+ for (;;)
{
+ c = java_peek_unicode ();
+ if (c == '\n' || c == UEOF) /* ULT. */
+ {
+ java_lex_error ("String not terminated at end of line", 0);
+ break;
+ }
+ java_next_unicode ();
+ if (c == '"')
+ break;
if (c == '\\')
c = java_parse_escape_sequence ();
if (c == JAVA_CHAR_ERROR)
@@ -1362,12 +1395,6 @@ do_java_lex (YYSTYPE *java_lval)
}
java_unicode_2_utf8 (c);
}
- if (c == '\n' || c == UEOF) /* ULT. */
- {
- input_line--; /* Refer to the line where the terminator was seen. */
- java_lex_error ("String not terminated at end of line", 0);
- input_line++;
- }
obstack_1grow (&temporary_obstack, '\0');
string = obstack_finish (&temporary_obstack);
@@ -1382,51 +1409,108 @@ do_java_lex (YYSTYPE *java_lval)
return STRING_LIT_TK;
}
- /* Separator. */
switch (c)
{
+ case '/':
+ /* Check for comment. */
+ switch (c = java_peek_unicode ())
+ {
+ case '/':
+ java_next_unicode ();
+ for (;;)
+ {
+ c = java_get_unicode ();
+ if (c == UEOF)
+ {
+ /* It is ok to end a `//' comment with EOF, unless
+ we're being pedantic. */
+ if (pedantic)
+ java_lex_error ("Comment not terminated at end of input",
+ 0);
+ return 0;
+ }
+ if (c == '\n') /* ULT */
+ goto step1;
+ }
+ break;
+
+ case '*':
+ java_next_unicode ();
+ if ((c = java_get_unicode ()) == '*')
+ {
+ c = java_get_unicode ();
+ if (c == '/')
+ {
+ /* Empty documentation comment. We have to reset
+ the deprecation marker as only the most recent
+ doc comment applies. */
+ ctxp->deprecated = 0;
+ }
+ else
+ java_parse_doc_section (c);
+ }
+ else
+ java_parse_end_comment ((c = java_get_unicode ()));
+ goto step1;
+ break;
+
+ case '=':
+ java_next_unicode ();
+ BUILD_OPERATOR2 (DIV_ASSIGN_TK);
+
+ default:
+ BUILD_OPERATOR (DIV_TK);
+ }
+
case '(':
- JAVA_LEX_SEP (c);
BUILD_OPERATOR (OP_TK);
case ')':
- JAVA_LEX_SEP (c);
return CP_TK;
case '{':
- JAVA_LEX_SEP (c);
+#ifndef JC1_LITE
+ java_lval->operator.token = OCB_TK;
+ java_lval->operator.location = BUILD_LOCATION();
+#endif
+#ifdef USE_MAPPED_LOCATION
+ if (ctxp->ccb_indent == 1)
+ ctxp->first_ccb_indent1 = input_location;
+#else
if (ctxp->ccb_indent == 1)
ctxp->first_ccb_indent1 = input_line;
+#endif
ctxp->ccb_indent++;
- BUILD_OPERATOR (OCB_TK);
+ return OCB_TK;
case '}':
- JAVA_LEX_SEP (c);
+#ifndef JC1_LITE
+ java_lval->operator.token = CCB_TK;
+ java_lval->operator.location = BUILD_LOCATION();
+#endif
ctxp->ccb_indent--;
+#ifdef USE_MAPPED_LOCATION
+ if (ctxp->ccb_indent == 1)
+ ctxp->last_ccb_indent1 = input_location;
+#else
if (ctxp->ccb_indent == 1)
ctxp->last_ccb_indent1 = input_line;
- BUILD_OPERATOR (CCB_TK);
+#endif
+ return CCB_TK;
case '[':
- JAVA_LEX_SEP (c);
BUILD_OPERATOR (OSB_TK);
case ']':
- JAVA_LEX_SEP (c);
return CSB_TK;
case ';':
- JAVA_LEX_SEP (c);
return SC_TK;
case ',':
- JAVA_LEX_SEP (c);
return C_TK;
case '.':
- JAVA_LEX_SEP (c);
BUILD_OPERATOR (DOT_TK);
- /* return DOT_TK; */
- }
- /* Operators. */
- switch (c)
- {
+ /* Operators. */
case '=':
- if ((c = java_get_unicode ()) == '=')
+ c = java_peek_unicode ();
+ if (c == '=')
{
+ java_next_unicode ();
BUILD_OPERATOR (EQ_TK);
}
else
@@ -1435,283 +1519,178 @@ do_java_lex (YYSTYPE *java_lval)
variable_declarator: rule, it has to be seen as '=' as opposed
to being seen as an ordinary assignment operator in
assignment_operators: rule. */
- java_unget_unicode ();
BUILD_OPERATOR (ASSIGN_TK);
}
case '>':
- switch ((c = java_get_unicode ()))
+ switch ((c = java_peek_unicode ()))
{
case '=':
+ java_next_unicode ();
BUILD_OPERATOR (GTE_TK);
case '>':
- switch ((c = java_get_unicode ()))
+ java_next_unicode ();
+ switch ((c = java_peek_unicode ()))
{
case '>':
- if ((c = java_get_unicode ()) == '=')
+ java_next_unicode ();
+ c = java_peek_unicode ();
+ if (c == '=')
{
+ java_next_unicode ();
BUILD_OPERATOR2 (ZRS_ASSIGN_TK);
}
else
{
- java_unget_unicode ();
BUILD_OPERATOR (ZRS_TK);
}
case '=':
+ java_next_unicode ();
BUILD_OPERATOR2 (SRS_ASSIGN_TK);
default:
- java_unget_unicode ();
BUILD_OPERATOR (SRS_TK);
}
default:
- java_unget_unicode ();
BUILD_OPERATOR (GT_TK);
}
case '<':
- switch ((c = java_get_unicode ()))
+ switch ((c = java_peek_unicode ()))
{
case '=':
+ java_next_unicode ();
BUILD_OPERATOR (LTE_TK);
case '<':
- if ((c = java_get_unicode ()) == '=')
+ java_next_unicode ();
+ if ((c = java_peek_unicode ()) == '=')
{
+ java_next_unicode ();
BUILD_OPERATOR2 (LS_ASSIGN_TK);
}
else
{
- java_unget_unicode ();
BUILD_OPERATOR (LS_TK);
}
default:
- java_unget_unicode ();
BUILD_OPERATOR (LT_TK);
}
case '&':
- switch ((c = java_get_unicode ()))
+ switch ((c = java_peek_unicode ()))
{
case '&':
+ java_next_unicode ();
BUILD_OPERATOR (BOOL_AND_TK);
case '=':
+ java_next_unicode ();
BUILD_OPERATOR2 (AND_ASSIGN_TK);
default:
- java_unget_unicode ();
BUILD_OPERATOR (AND_TK);
}
case '|':
- switch ((c = java_get_unicode ()))
+ switch ((c = java_peek_unicode ()))
{
case '|':
+ java_next_unicode ();
BUILD_OPERATOR (BOOL_OR_TK);
case '=':
+ java_next_unicode ();
BUILD_OPERATOR2 (OR_ASSIGN_TK);
default:
- java_unget_unicode ();
BUILD_OPERATOR (OR_TK);
}
case '+':
- switch ((c = java_get_unicode ()))
+ switch ((c = java_peek_unicode ()))
{
case '+':
+ java_next_unicode ();
BUILD_OPERATOR (INCR_TK);
case '=':
+ java_next_unicode ();
BUILD_OPERATOR2 (PLUS_ASSIGN_TK);
default:
- java_unget_unicode ();
BUILD_OPERATOR (PLUS_TK);
}
case '-':
- switch ((c = java_get_unicode ()))
+ switch ((c = java_peek_unicode ()))
{
case '-':
+ java_next_unicode ();
BUILD_OPERATOR (DECR_TK);
case '=':
+ java_next_unicode ();
BUILD_OPERATOR2 (MINUS_ASSIGN_TK);
default:
- java_unget_unicode ();
BUILD_OPERATOR (MINUS_TK);
}
case '*':
- if ((c = java_get_unicode ()) == '=')
+ if ((c = java_peek_unicode ()) == '=')
{
+ java_next_unicode ();
BUILD_OPERATOR2 (MULT_ASSIGN_TK);
}
else
{
- java_unget_unicode ();
BUILD_OPERATOR (MULT_TK);
}
- case '/':
- if ((c = java_get_unicode ()) == '=')
- {
- BUILD_OPERATOR2 (DIV_ASSIGN_TK);
- }
- else
- {
- java_unget_unicode ();
- BUILD_OPERATOR (DIV_TK);
- }
-
case '^':
- if ((c = java_get_unicode ()) == '=')
+ if ((c = java_peek_unicode ()) == '=')
{
+ java_next_unicode ();
BUILD_OPERATOR2 (XOR_ASSIGN_TK);
}
else
{
- java_unget_unicode ();
BUILD_OPERATOR (XOR_TK);
}
case '%':
- if ((c = java_get_unicode ()) == '=')
+ if ((c = java_peek_unicode ()) == '=')
{
+ java_next_unicode ();
BUILD_OPERATOR2 (REM_ASSIGN_TK);
}
else
{
- java_unget_unicode ();
BUILD_OPERATOR (REM_TK);
}
case '!':
- if ((c = java_get_unicode()) == '=')
+ if ((c = java_peek_unicode()) == '=')
{
+ java_next_unicode ();
BUILD_OPERATOR (NEQ_TK);
}
else
{
- java_unget_unicode ();
BUILD_OPERATOR (NEG_TK);
}
case '?':
- JAVA_LEX_OP ("?");
BUILD_OPERATOR (REL_QM_TK);
case ':':
- JAVA_LEX_OP (":");
BUILD_OPERATOR (REL_CL_TK);
case '~':
BUILD_OPERATOR (NOT_TK);
}
- /* Keyword, boolean literal or null literal. */
- for (first_unicode = c, all_ascii = 1, ascii_index = 0;
- c != UEOF && JAVA_PART_CHAR_P (c); c = java_get_unicode ())
- {
- java_unicode_2_utf8 (c);
- if (all_ascii && c >= 128)
- all_ascii = 0;
- ascii_index++;
- }
-
- obstack_1grow (&temporary_obstack, '\0');
- string = obstack_finish (&temporary_obstack);
- if (c != UEOF)
- java_unget_unicode ();
-
- /* If we have something all ascii, we consider a keyword, a boolean
- literal, a null literal or an all ASCII identifier. Otherwise,
- this is an identifier (possibly not respecting formation rule). */
- if (all_ascii)
- {
- const struct java_keyword *kw;
- if ((kw=java_keyword (string, ascii_index)))
- {
- JAVA_LEX_KW (string);
- switch (kw->token)
- {
- case PUBLIC_TK: case PROTECTED_TK: case STATIC_TK:
- case ABSTRACT_TK: case FINAL_TK: case NATIVE_TK:
- case SYNCHRONIZED_TK: case TRANSIENT_TK: case VOLATILE_TK:
- case PRIVATE_TK: case STRICT_TK:
- SET_MODIFIER_CTX (kw->token);
- return MODIFIER_TK;
- case FLOAT_TK:
- SET_LVAL_NODE (float_type_node);
- return FP_TK;
- case DOUBLE_TK:
- SET_LVAL_NODE (double_type_node);
- return FP_TK;
- case BOOLEAN_TK:
- SET_LVAL_NODE (boolean_type_node);
- return BOOLEAN_TK;
- case BYTE_TK:
- SET_LVAL_NODE (byte_type_node);
- return INTEGRAL_TK;
- case SHORT_TK:
- SET_LVAL_NODE (short_type_node);
- return INTEGRAL_TK;
- case INT_TK:
- SET_LVAL_NODE (int_type_node);
- return INTEGRAL_TK;
- case LONG_TK:
- SET_LVAL_NODE (long_type_node);
- return INTEGRAL_TK;
- case CHAR_TK:
- SET_LVAL_NODE (char_type_node);
- return INTEGRAL_TK;
-
- /* Keyword based literals. */
- case TRUE_TK:
- case FALSE_TK:
- SET_LVAL_NODE ((kw->token == TRUE_TK ?
- boolean_true_node : boolean_false_node));
- return BOOL_LIT_TK;
- case NULL_TK:
- SET_LVAL_NODE (null_pointer_node);
- return NULL_TK;
-
- case ASSERT_TK:
- if (flag_assert)
- {
- BUILD_OPERATOR (kw->token);
- return kw->token;
- }
- else
- break;
-
- /* Some keyword we want to retain information on the location
- they where found. */
- case CASE_TK:
- case DEFAULT_TK:
- case SUPER_TK:
- case THIS_TK:
- case RETURN_TK:
- case BREAK_TK:
- case CONTINUE_TK:
- case TRY_TK:
- case CATCH_TK:
- case THROW_TK:
- case INSTANCEOF_TK:
- BUILD_OPERATOR (kw->token);
-
- default:
- return kw->token;
- }
- }
- }
-
- /* We may have an ID here. */
- if (JAVA_START_CHAR_P (first_unicode))
+ if (c == 0x1a) /* CTRL-Z. */
{
- JAVA_LEX_ID (string);
- java_lval->node = BUILD_ID_WFL (GET_IDENTIFIER (string));
- return ID_TK;
+ if ((c = java_peek_unicode ()) == UEOF)
+ return 0; /* Ok here. */
}
/* Everything else is an invalid character in the input. */
{
char lex_error_buffer [128];
- sprintf (lex_error_buffer, "Invalid character `%s' in input",
- java_sprint_unicode (ctxp->c_line, ctxp->c_line->current));
- java_lex_error (lex_error_buffer, 1);
+ sprintf (lex_error_buffer, "Invalid character '%s' in input",
+ java_sprint_unicode (c));
+ java_lex_error (lex_error_buffer, -1);
}
return 0;
}
@@ -1742,9 +1721,9 @@ error_if_numeric_overflow (tree value)
&& tree_int_cst_sgn (value) < 0)
{
if (TREE_TYPE (value) == long_type_node)
- java_lex_error ("Numeric overflow for `long' literal", 0);
+ java_lex_error ("Numeric overflow for 'long' literal", 0);
else
- java_lex_error ("Numeric overflow for `int' literal", 0);
+ java_lex_error ("Numeric overflow for 'int' literal", 0);
}
}
@@ -1777,7 +1756,13 @@ java_unicode_2_utf8 (unicode_t unicode)
static tree
build_wfl_node (tree node)
{
- node = build_expr_wfl (node, ctxp->filename, ctxp->elc.line, ctxp->elc.col);
+#ifdef USE_MAPPED_LOCATION
+ node = build_expr_wfl (node, input_location);
+#else
+ node = build_expr_wfl (node, ctxp->filename,
+ ctxp->lexer->token_start.line,
+ ctxp->lexer->token_start.col);
+#endif
/* Prevent java_complete_lhs from short-circuiting node (if constant). */
TREE_TYPE (node) = NULL_TREE;
return node;
@@ -1788,13 +1773,28 @@ static void
java_lex_error (const char *msg ATTRIBUTE_UNUSED, int forward ATTRIBUTE_UNUSED)
{
#ifndef JC1_LITE
- ctxp->elc.line = ctxp->c_line->lineno;
- ctxp->elc.col = ctxp->c_line->char_col-1+forward;
+ int col = (ctxp->lexer->position.col
+ + forward * ctxp->lexer->next_columns);
+#if USE_MAPPED_LOCATION
+ source_location save_location = input_location;
+ LINEMAP_POSITION_FOR_COLUMN (input_location, &line_table, col);
+
+ /* Might be caught in the middle of some error report. */
+ ctxp->java_error_flag = 0;
+ java_error (NULL);
+ java_error (msg);
+ input_location = save_location;
+#else
+ java_lc save = ctxp->lexer->token_start;
+ ctxp->lexer->token_start.line = ctxp->lexer->position.line;
+ ctxp->lexer->token_start.col = col;
/* Might be caught in the middle of some error report. */
ctxp->java_error_flag = 0;
java_error (NULL);
java_error (msg);
+ ctxp->lexer->token_start = save;
+#endif
#endif
}
@@ -1880,11 +1880,11 @@ java_get_line_col (const char *filename ATTRIBUTE_UNUSED,
/* Place the '^' a the right position. */
base = obstack_base (&temporary_obstack);
- for (ccol = 1; ccol <= col+3; ccol++)
+ for (col += 2, ccol = 0; ccol < col; ccol++)
{
/* Compute \t when reaching first_non_space. */
char c = (first_non_space ?
- (base [ccol-1] == '\t' ? '\t' : ' ') : ' ');
+ (base [ccol] == '\t' ? '\t' : ' ') : ' ');
obstack_1grow (&temporary_obstack, c);
}
obstack_grow0 (&temporary_obstack, "^", 1);
diff --git a/gcc/java/lex.h b/gcc/java/lex.h
index bae504782c4..c9d5ac6d850 100644
--- a/gcc/java/lex.h
+++ b/gcc/java/lex.h
@@ -42,65 +42,9 @@ typedef unsigned short unicode_t;
/* Default encoding to use if no encoding is specified. */
#define DEFAULT_ENCODING "UTF-8"
-/* Debug macro to print-out what we match */
-#ifdef JAVA_LEX_DEBUG
-#ifdef JAVA_LEX_DEBUG_CHAR
-#define JAVA_LEX_CHAR(c) printf ("java_lex:%d: char '%c'.%d\n", \
- lineno, (c < 128 ? c : '.'), c);
-#else
-#define JAVA_LEX_CHAR(c)
-#endif
-#define JAVA_LEX_KW(c) printf ("java_lex:%d: keyword: '%s'\n", lineno,c)
-#define JAVA_LEX_ID(s) printf ("java_lex:%d: ID: '%s'\n", \
- lineno, \
- (all_ascii ? s : "<U>"))
-#define JAVA_LEX_LIT(s, r) printf ("java_lex:%d: literal '%s'_%d\n", \
- lineno, s, r)
-#define JAVA_LEX_CHAR_LIT(s) printf ("java_lex:%d: literal '%d'\n", lineno, s)
-#define JAVA_LEX_STR_LIT(s) { \
- int i; \
- printf ("java_lex:%d: literal '%s'\n", \
- lineno, s); \
- }
-#define JAVA_LEX_SEP(c) printf ("java_lex:%d: separator '%c'\n",lineno,c)
-#define JAVA_LEX_OP(c) printf ("java_lex:%d: operator '%s'\n", lineno,c)
-#else
-#define JAVA_LEX_CHAR(c)
-#define JAVA_LEX_KW(c)
-#define JAVA_LEX_ID(s)
-#define JAVA_LEX_LIT(s,r)
-#define JAVA_LEX_CHAR_LIT(s)
-#define JAVA_LEX_STR_LIT(s)
-#define JAVA_LEX_SEP(c)
-#define JAVA_LEX_OP(s)
-#endif
-
-/* Line information containers */
-struct java_line {
- unicode_t *line; /* The line's unicode */
- char *unicode_escape_p; /* The matching char was a unicode escape */
- unicode_t ahead[1]; /* Character ahead */
- char unicode_escape_ahead_p; /* Character ahead is a unicode escape */
- int max; /* buffer's max size */
- int size; /* number of unicodes */
- int current; /* Current position, unicode based */
- int char_col; /* Current position, input char based */
- int lineno; /* Its line number */
- int white_space_only; /* If it contains only white spaces */
-};
-#define JAVA_COLUMN_DELTA(p) \
- (ctxp->c_line->unicode_escape_p [ctxp->c_line->current+(p)] ? 6 : \
- (ctxp->c_line->line [ctxp->c_line->current+(p)] == '\t' ? 8 : 1))
-
-struct java_error {
- struct java_line *line;
- int error;
-};
-
typedef struct java_lc_s GTY(()) {
- int line;
- int prev_col;
- int col;
+ int line; /* line number (1-based) */
+ int col; /* column number number (1-based) */
} java_lc;
struct java_lexer
@@ -111,15 +55,33 @@ struct java_lexer
/* Number of consecutive backslashes we've read. */
int bs_count;
- /* If nonzero, a value that was pushed back. */
+ /* Next available Unicode character.
+ * This is post-Unicode-escape-processing. -1 if EOF. */
+ int next_unicode;
+
+ /* True if next_unicode is next available character, or EOF. */
+ bool avail_unicode;
+
+ /* Number of source columns of the previous Unicode character (next_unicode).
+ If next_unicode==-2, then this is the number of columns of the previous
+ Unicode character (most recent result of java_{get,peek}_unicode). */
+ int next_columns;
+
+ /* If nonzero, a value that was pushed back. This is a unicode character,
+ but (unlike next_unicode) is pre-'\uXXXX'-processing. It is also used
+ when a '\r' is *not* followed by a '\n'. */
unicode_t unget_value;
- /* If nonzero, we've hit EOF. Used only by java_get_unicode(). */
- unsigned int hit_eof : 1;
-
/* Name of the character encoding we're using. */
const char *encoding;
+ /* Current source position. */
+ java_lc position;
+
+#ifndef USE_MAPPED_LOCATION
+ java_lc token_start; /* Error's line column info */
+#endif
+
#ifdef HAVE_ICONV
/* Nonzero if we've read any bytes. We only recognize the
byte-order-marker (BOM) as the first word. */
@@ -168,7 +130,12 @@ extern void java_destroy_lexer (java_lexer *);
#define JAVA_LINE_MAX 80
/* Build a location compound integer */
-#define BUILD_LOCATION() ((ctxp->elc.line << 12) | (ctxp->elc.col & 0xfff))
+#ifdef USE_MAPPED_LOCATION
+#define BUILD_LOCATION() input_location
+#else
+#define BUILD_LOCATION() ((ctxp->lexer->token_start.line << 12) \
+ | (ctxp->lexer->token_start.col & 0xfff))
+#endif
/* Those macros are defined differently if we compile jc1-lite
(JC1_LITE defined) or jc1. */
@@ -190,7 +157,7 @@ extern void java_destroy_lexer (java_lexer *);
#define SET_LVAL_NODE(NODE)
#define BUILD_ID_WFL(EXP) (EXP)
#define JAVA_FLOAT_RANGE_ERROR(S) {}
-#define JAVA_INTEGRAL_RANGE_ERROR(S) do { } while (0)
+#define JAVA_RANGE_ERROR(S) do { } while (0)
#else
@@ -227,21 +194,19 @@ extern void java_destroy_lexer (java_lexer *);
/* Wrap identifier around a wfl */
#define BUILD_ID_WFL(EXP) build_wfl_node ((EXP))
/* Special ways to report error on numeric literals */
-#define JAVA_FLOAT_RANGE_ERROR(m) \
- { \
- char msg [1024]; \
- int i = ctxp->c_line->current; \
- ctxp->c_line->current = number_beginning; \
- sprintf (msg, "Floating point literal exceeds range of `%s'", (m)); \
- java_lex_error (msg, 0); \
- ctxp->c_line->current = i; \
+#define JAVA_FLOAT_RANGE_ERROR(m) \
+ { \
+ char *msg = xmalloc (100 + strlen (m)); \
+ sprintf (msg, "Floating point literal exceeds range of `%s'", (m)); \
+ JAVA_RANGE_ERROR(msg); \
+ free (msg); \
}
-#define JAVA_INTEGRAL_RANGE_ERROR(m) \
- do { \
- int i = ctxp->c_line->current; \
- ctxp->c_line->current = number_beginning; \
- java_lex_error (m, 0); \
- ctxp->c_line->current = i; \
+#define JAVA_RANGE_ERROR(msg) \
+ do { \
+ int save_col = ctxp->lexer->position.col; \
+ ctxp->lexer->position.col = number_beginning; \
+ java_lex_error (msg, 0); \
+ ctxp->lexer->position.col = save_col; \
} while (0)
#endif /* Definitions for jc1 compilation only */
diff --git a/gcc/java/parse.h b/gcc/java/parse.h
index 9e4e0f8fca4..b83d22e2375 100644
--- a/gcc/java/parse.h
+++ b/gcc/java/parse.h
@@ -89,6 +89,23 @@ extern tree stabilize_reference (tree);
#define MODIFIER_WFL(M) (ctxp->modifier_ctx [(M) - PUBLIC_TK])
/* Check on modifiers */
+#ifdef USE_MAPPED_LOCATION
+#define THIS_MODIFIER_ONLY(f, m, v, count, l) \
+ if ((f) & (m)) \
+ { \
+ tree node = MODIFIER_WFL (v); \
+ if (!l) \
+ l = node; \
+ else \
+ { \
+ expanded_location lloc = expand_location (EXPR_LOCATION (l)); \
+ expanded_location nloc = expand_location (EXPR_LOCATION (node)); \
+ if (nloc.column > lloc.column || nloc.line > lloc.line) \
+ l = node; \
+ } \
+ count++; \
+ }
+#else
#define THIS_MODIFIER_ONLY(f, m, v, count, l) \
if ((f) & (m)) \
{ \
@@ -101,6 +118,7 @@ extern tree stabilize_reference (tree);
l = node; \
count++; \
}
+#endif
#define ABSTRACT_CHECK(FLAG, V, CL, S) \
if ((FLAG) & (V)) \
@@ -163,11 +181,13 @@ extern tree stabilize_reference (tree);
&& !TREE_TYPE (NODE) \
&& TREE_CODE (TYPE_NAME (NODE)) == IDENTIFIER_NODE)
+#ifndef USE_MAPPED_LOCATION
/* Set the EMIT_LINE_NOTE flag of a EXPR_WLF to 1 if debug information
are requested. Works in the context of a parser rule. */
#define JAVA_MAYBE_GENERATE_DEBUG_INFO(node) \
- (debug_info_level != DINFO_LEVEL_NONE ? \
- EXPR_WFL_EMIT_LINE_NOTE (node) = 1, node : node)
+ do {if (debug_info_level != DINFO_LEVEL_NONE) \
+ EXPR_WFL_EMIT_LINE_NOTE (node) = 1; } while (0)
+#endif
/* Types classification, according to the JLS, section 4.2 */
#define JFLOAT_TYPE_P(TYPE) (TYPE && TREE_CODE ((TYPE)) == REAL_TYPE)
@@ -610,22 +630,16 @@ typedef struct jdeplist_s jdeplist;
#define GET_CURRENT_BLOCK(F) ((F) ? DECL_FUNCTION_BODY ((F)) : \
current_static_block)
+#ifndef USE_MAPPED_LOCATION
/* Retrieve line/column from a WFL. */
#define EXPR_WFL_GET_LINECOL(V,LINE,COL) \
{ \
(LINE) = (V) >> 12; \
(COL) = (V) & 0xfff; \
}
-/* Add X to the column number information */
-#define EXPR_WFL_ADD_COL(V, X) \
- (V) = (((V) & 0xfffff000) | ((((V) & 0xfff) + (X)) & 0xfff))
-
-/* Build a WFL for expression nodes */
-#define BUILD_EXPR_WFL(NODE, WFL) \
- build_expr_wfl ((NODE), input_filename, EXPR_WFL_LINENO ((WFL)), \
- EXPR_WFL_COLNO ((WFL)))
+#endif
-#define EXPR_WFL_QUALIFICATION(WFL) TREE_OPERAND ((WFL), 2)
+#define EXPR_WFL_QUALIFICATION(WFL) TREE_OPERAND ((WFL), 1)
#define QUAL_WFL(NODE) TREE_PURPOSE (NODE)
#define QUAL_RESOLUTION(NODE) TREE_VALUE (NODE)
#define QUAL_DECL_TYPE(NODE) GET_SKIP_TYPE (NODE)
@@ -671,10 +685,17 @@ typedef struct jdeplist_s jdeplist;
}
/* Set wfl_operator for the most accurate error location */
+#ifdef USE_MAPPED_LOCATION
+#define SET_WFL_OPERATOR(WHICH, NODE, WFL) \
+ SET_EXPR_LOCATION (WHICH, \
+ (TREE_CODE (WFL) == EXPR_WITH_FILE_LOCATION ? \
+ EXPR_LOCATION (WFL) : EXPR_LOCATION (NODE)))
+#else
#define SET_WFL_OPERATOR(WHICH, NODE, WFL) \
EXPR_WFL_LINECOL (WHICH) = \
(TREE_CODE (WFL) == EXPR_WITH_FILE_LOCATION ? \
EXPR_WFL_LINECOL (WFL) : EXPR_WFL_LINECOL (NODE))
+#endif
#define PATCH_METHOD_RETURN_ERROR() \
{ \
@@ -724,23 +745,23 @@ typedef struct jdeplist_s jdeplist;
/* Parser context data structure. */
struct parser_ctxt GTY(()) {
-
- const char *filename; /* Current filename */
+ const char *filename; /* Current filename */
+ location_t file_start_location;
+ location_t save_location;
struct parser_ctxt *next;
java_lexer * GTY((skip)) lexer; /* Current lexer state */
char marker_begining; /* Marker. Should be a sub-struct */
- struct java_line * GTY ((skip)) p_line; /* Previous line */
- struct java_line * GTY ((skip)) c_line; /* Current line */
- java_lc elc; /* Error's line column info */
- int ccb_indent; /* Keep track of {} indent, lexer */
- int first_ccb_indent1; /* First { at ident level 1 */
- int last_ccb_indent1; /* Last } at ident level 1 */
+ int ccb_indent; /* Number of unmatched { seen. */
+ /* The next two fields are only source_location if USE_MAPPED_LOCATION.
+ Otherwise, they are integer line number, but we can't have #ifdefs
+ in GTY structures. */
+ source_location first_ccb_indent1; /* First { at ident level 1 */
+ source_location last_ccb_indent1; /* Last } at ident level 1 */
int parser_ccb_indent; /* Keep track of {} indent, parser */
int osb_depth; /* Current depth of [ in an expression */
int osb_limit; /* Limit of this depth */
int * GTY ((skip)) osb_number; /* Keep track of ['s */
- int lineno; /* Current lineno */
char marker_end; /* End marker. Should be a sub-struct */
/* The flags section */
@@ -763,8 +784,6 @@ struct parser_ctxt GTY(()) {
tree class_type; /* Current class */
tree function_decl; /* Current function decl, save/restore */
- struct JCF * current_jcf; /* CU jcf */
-
int prevent_ese; /* Prevent expression statement error */
int formal_parameter_number; /* Number of parameters found */
diff --git a/gcc/java/parse.y b/gcc/java/parse.y
index 847a5325a01..dc62f860da0 100644
--- a/gcc/java/parse.y
+++ b/gcc/java/parse.y
@@ -97,8 +97,13 @@ static void fix_method_argument_names (tree ,tree);
static tree method_declarator (tree, tree);
static void parse_warning_context (tree cl, const char *msg, ...)
ATTRIBUTE_PRINTF_2;
+#ifdef USE_MAPPED_LOCATION
+static void issue_warning_error_from_context
+ (source_location, const char *msg, va_list) ATTRIBUTE_PRINTF (2, 0);
+#else
static void issue_warning_error_from_context (tree, const char *msg, va_list)
ATTRIBUTE_PRINTF (2, 0);
+#endif
static void parse_ctor_invocation_error (void);
static tree parse_jdk1_1_error (const char *);
static void complete_class_report_errors (jdep *);
@@ -175,7 +180,11 @@ static int build_type_name_from_array_name (tree, tree *);
static tree build_array_from_name (tree, tree, tree, tree *);
static tree build_array_ref (int, tree, tree);
static tree patch_array_ref (tree);
+#ifdef USE_MAPPED_LOCATION
+static tree make_qualified_name (tree, tree, source_location);
+#else
static tree make_qualified_name (tree, tree, int);
+#endif
static tree merge_qualified_name (tree, tree);
static tree make_qualified_primary (tree, tree, int);
static int resolve_qualified_expression_name (tree, tree *, tree *, tree *);
@@ -214,13 +223,21 @@ static tree build_string_concatenation (tree, tree);
static tree patch_string_cst (tree);
static tree patch_string (tree);
static tree encapsulate_with_try_catch (int, tree, tree, tree);
+#ifdef USE_MAPPED_LOCATION
+static tree build_assertion (source_location, tree, tree);
+#else
static tree build_assertion (int, tree, tree);
+#endif
static tree build_try_statement (int, tree, tree);
static tree build_try_finally_statement (int, tree, tree);
static tree patch_try_statement (tree);
static tree patch_synchronized_statement (tree, tree);
static tree patch_throw_statement (tree, tree);
+#ifdef USE_MAPPED_LOCATION
+static void check_thrown_exceptions (source_location, tree, tree);
+#else
static void check_thrown_exceptions (int, tree, tree);
+#endif
static int check_thrown_exceptions_do (tree);
static void purge_unchecked_exceptions (tree);
static bool ctors_unchecked_throws_clause_p (tree);
@@ -443,12 +460,24 @@ static GTY(()) tree src_parse_roots[1];
int sub_token;
struct {
int token;
+#ifdef USE_MAPPED_LOCATION
+ source_location location;
+#else
int location;
+#endif
} operator;
int value;
}
%{
+#ifdef USE_MAPPED_LOCATION
+#define SET_EXPR_LOCATION_FROM_TOKEN(EXPR, TOKEN) \
+ SET_EXPR_LOCATION(EXPR, (TOKEN).location)
+#else
+#define SET_EXPR_LOCATION_FROM_TOKEN(EXPR, TOKEN) \
+ (EXPR_WFL_LINECOL (EXPR) = (TOKEN).location)
+#endif
+
#include "lex.c"
%}
@@ -882,16 +911,14 @@ class_body:
{
/* Store the location of the `}' when doing xrefs */
if (flag_emit_xref)
- DECL_END_SOURCE_LINE (GET_CPC ()) =
- EXPR_WFL_ADD_COL ($2.location, 1);
+ DECL_END_SOURCE_LINE (GET_CPC ()) = $2.location;
$$ = GET_CPC ();
}
| OCB_TK class_body_declarations CCB_TK
{
/* Store the location of the `}' when doing xrefs */
if (flag_emit_xref)
- DECL_END_SOURCE_LINE (GET_CPC ()) =
- EXPR_WFL_ADD_COL ($3.location, 1);
+ DECL_END_SOURCE_LINE (GET_CPC ()) = $3.location;
$$ = GET_CPC ();
}
;
@@ -1055,7 +1082,7 @@ method_declarator:
{ $$ = method_declarator ($1, $3); }
| method_declarator OSB_TK CSB_TK
{
- EXPR_WFL_LINECOL (wfl_operator) = $2.location;
+ SET_EXPR_LOCATION_FROM_TOKEN (wfl_operator, $2);
TREE_PURPOSE ($1) =
build_unresolved_array_type (TREE_PURPOSE ($1));
parse_warning_context
@@ -1236,13 +1263,13 @@ this_or_super: /* Added, simplifies error diagnostics */
THIS_TK
{
tree wfl = build_wfl_node (this_identifier_node);
- EXPR_WFL_LINECOL (wfl) = $1.location;
+ SET_EXPR_LOCATION_FROM_TOKEN (wfl, $1);
$$ = wfl;
}
| SUPER_TK
{
tree wfl = build_wfl_node (super_identifier_node);
- EXPR_WFL_LINECOL (wfl) = $1.location;
+ SET_EXPR_LOCATION_FROM_TOKEN (wfl, $1);
$$ = wfl;
}
;
@@ -1369,8 +1396,7 @@ block_end:
maybe_absorb_scoping_blocks ();
/* Store the location of the `}' when doing xrefs */
if (current_function_decl && flag_emit_xref)
- DECL_END_SOURCE_LINE (current_function_decl) =
- EXPR_WFL_ADD_COL ($1.location, 1);
+ DECL_END_SOURCE_LINE (current_function_decl) = $1.location;
$$ = exit_block ();
if (!BLOCK_SUBBLOCKS ($$))
BLOCK_SUBBLOCKS ($$) = build_java_empty_stmt ();
@@ -1449,7 +1475,11 @@ empty_statement:
(DECL_CONTEXT (current_function_decl)))))
{
+#ifdef USE_MAPPED_LOCATION
+ SET_EXPR_LOCATION (wfl_operator, input_location);
+#else
EXPR_WFL_SET_LINECOL (wfl_operator, input_line, -1);
+#endif
parse_warning_context (wfl_operator, "An empty declaration is a deprecated feature that should not be used");
}
$$ = build_java_empty_stmt ();
@@ -1486,10 +1516,14 @@ expression_statement:
{
/* We have a statement. Generate a WFL around it so
we can debug it */
+#ifdef USE_MAPPED_LOCATION
+ $$ = expr_add_location ($1, input_location, 1);
+#else
$$ = build_expr_wfl ($1, input_filename, input_line, 0);
+ JAVA_MAYBE_GENERATE_DEBUG_INFO ($$);
+#endif
/* We know we have a statement, so set the debug
info to be eventually generate here. */
- $$ = JAVA_MAYBE_GENERATE_DEBUG_INFO ($$);
}
| error SC_TK
{
@@ -1587,7 +1621,7 @@ switch_expression:
{
$$ = build3 (SWITCH_EXPR, NULL_TREE, $3,
NULL_TREE, NULL_TREE);
- EXPR_WFL_LINECOL ($$) = $2.location;
+ SET_EXPR_LOCATION_FROM_TOKEN ($$, $2);
}
| SWITCH_TK error
{yyerror ("'(' expected"); RECOVER;}
@@ -1629,13 +1663,13 @@ switch_label:
CASE_TK constant_expression REL_CL_TK
{
tree lab = build1 (CASE_EXPR, NULL_TREE, $2);
- EXPR_WFL_LINECOL (lab) = $1.location;
+ SET_EXPR_LOCATION_FROM_TOKEN (lab, $1);
java_method_add_stmt (current_function_decl, lab);
}
| DEFAULT_TK REL_CL_TK
{
tree lab = make_node (DEFAULT_EXPR);
- EXPR_WFL_LINECOL (lab) = $1.location;
+ SET_EXPR_LOCATION_FROM_TOKEN (lab, $1);
java_method_add_stmt (current_function_decl, lab);
}
| CASE_TK error
@@ -1814,7 +1848,7 @@ throw_statement:
THROW_TK expression SC_TK
{
$$ = build1 (THROW_EXPR, NULL_TREE, $2);
- EXPR_WFL_LINECOL ($$) = $1.location;
+ SET_EXPR_LOCATION_FROM_TOKEN ($$, $1);
}
| THROW_TK error
{yyerror ("Missing term"); RECOVER;}
@@ -1917,7 +1951,7 @@ catch_clause_parameter:
build_tree_list
(TREE_PURPOSE ($3), init));
$$ = build1 (JAVA_CATCH_EXPR, NULL_TREE, ccpb);
- EXPR_WFL_LINECOL ($$) = $1.location;
+ SET_EXPR_LOCATION_FROM_TOKEN ($$, $1);
}
else
{
@@ -2225,7 +2259,7 @@ field_access:
| SUPER_TK DOT_TK identifier
{
tree super_wfl = build_wfl_node (super_identifier_node);
- EXPR_WFL_LINECOL (super_wfl) = $1.location;
+ SET_EXPR_LOCATION_FROM_TOKEN (super_wfl, $1);
$$ = make_qualified_name (super_wfl, $3, $2.location);
}
| SUPER_TK error
@@ -2609,7 +2643,7 @@ conditional_expression: /* Error handling here is weak */
| conditional_or_expression REL_QM_TK expression REL_CL_TK conditional_expression
{
$$ = build3 (CONDITIONAL_EXPR, NULL_TREE, $1, $3, $5);
- EXPR_WFL_LINECOL ($$) = $2.location;
+ SET_EXPR_LOCATION_FROM_TOKEN ($$, $2);
}
| conditional_or_expression REL_QM_TK REL_CL_TK error
{
@@ -2718,16 +2752,15 @@ void
java_pop_parser_context (int generate)
{
tree current;
- struct parser_ctxt *toFree, *next;
+ struct parser_ctxt *next;
if (!ctxp)
return;
- toFree = ctxp;
next = ctxp->next;
if (next)
{
- input_line = ctxp->lineno;
+ input_location = ctxp->save_location;
current_class = ctxp->class_type;
}
@@ -2740,19 +2773,19 @@ java_pop_parser_context (int generate)
for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 0;
- /* And restore those of the previous context */
- if ((ctxp = next)) /* Assignment is really meant here */
- for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
- IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 1;
-
/* If we pushed a context to parse a class intended to be generated,
we keep it so we can remember the class. What we could actually
do is to just update a list of class names. */
if (generate)
{
- toFree->next = ctxp_for_generation;
- ctxp_for_generation = toFree;
+ ctxp->next = ctxp_for_generation;
+ ctxp_for_generation = ctxp;
}
+
+ /* And restore those of the previous context */
+ if ((ctxp = next)) /* Assignment is really meant here */
+ for (current = ctxp->import_list; current; current = TREE_CHAIN (current))
+ IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (TREE_VALUE (current)) = 1;
}
/* Create a parser context for the use of saving some global
@@ -2775,9 +2808,8 @@ java_parser_context_save_global (void)
ctxp->saved_data_ctx = 1;
}
- ctxp->lineno = input_line;
+ ctxp->save_location = input_location;
ctxp->class_type = current_class;
- ctxp->filename = input_filename;
ctxp->function_decl = current_function_decl;
ctxp->saved_data = 1;
}
@@ -2788,11 +2820,14 @@ java_parser_context_save_global (void)
void
java_parser_context_restore_global (void)
{
- input_line = ctxp->lineno;
+ input_location = ctxp->save_location;
current_class = ctxp->class_type;
- input_filename = ctxp->filename;
if (wfl_operator)
+#ifdef USE_MAPPED_LOCATION
+ SET_EXPR_LOCATION (wfl_operator, ctxp->save_location);
+#else
EXPR_WFL_FILENAME_NODE (wfl_operator) = get_identifier (input_filename);
+#endif
current_function_decl = ctxp->function_decl;
ctxp->saved_data = 0;
if (ctxp->saved_data_ctx)
@@ -2960,8 +2995,6 @@ java_debug_context_do (int tab)
TAB_CONTEXT (tab);
fprintf (stderr, "filename: %s\n", copy->filename);
TAB_CONTEXT (tab);
- fprintf (stderr, "lineno: %d\n", copy->lineno);
- TAB_CONTEXT (tab);
fprintf (stderr, "package: %s\n",
(copy->package ?
IDENTIFIER_POINTER (copy->package) : "<none>"));
@@ -3016,22 +3049,36 @@ static int do_warning = 0;
void
yyerror (const char *msg)
{
+#ifdef USE_MAPPED_LOCATION
+ static source_location elc;
+ expanded_location xloc = expand_location (input_location);
+ int current_line = xloc.line;
+#else
static java_lc elc;
- static int prev_lineno;
+ int save_lineno;
+ int current_line = input_line;
+#endif
+ static int prev_lineno;
static const char *prev_msg;
- int save_lineno;
char *remainder, *code_from_source;
- if (!force_error && prev_lineno == input_line)
+ if (!force_error && prev_lineno == current_line)
return;
+#ifndef USE_MAPPED_LOCATION
+ current_line = ctxp->lexer->token_start.line;
+#endif
/* Save current error location but report latter, when the context is
richer. */
if (ctxp->java_error_flag == 0)
{
ctxp->java_error_flag = 1;
- elc = ctxp->elc;
+#ifdef USE_MAPPED_LOCATION
+ elc = input_location;
+#else
+ elc = ctxp->lexer->token_start;
+#endif
/* Do something to use the previous line if we're reaching the
end of the file... */
#ifdef VERBOSE_SKELETON
@@ -3041,7 +3088,7 @@ yyerror (const char *msg)
}
/* Ignore duplicate message on the same line. BTW, this is dubious. FIXME */
- if (!force_error && msg == prev_msg && prev_lineno == elc.line)
+ if (!force_error && msg == prev_msg && prev_lineno == current_line)
return;
ctxp->java_error_flag = 0;
@@ -3050,17 +3097,24 @@ yyerror (const char *msg)
else
java_error_count++;
+#if 0 /* FIXME */
if (elc.col == 0 && msg && msg[1] == ';')
- {
- elc.col = ctxp->p_line->char_col-1;
- elc.line = ctxp->p_line->lineno;
- }
+ elc = ctxp->prev_line_end;
+#endif
- save_lineno = input_line;
- prev_lineno = input_line = elc.line;
prev_msg = msg;
- code_from_source = java_get_line_col (ctxp->filename, elc.line, elc.col);
+#ifdef USE_MAPPED_LOCATION
+ prev_lineno = current_line;
+ code_from_source = java_get_line_col (xloc.file, current_line, xloc.column);
+#else
+ save_lineno = input_line;
+ prev_lineno = input_line = current_line;
+ code_from_source = java_get_line_col (input_filename, current_line,
+ ctxp->lexer->token_start.col);
+#endif
+
+
obstack_grow0 (&temporary_obstack,
code_from_source, strlen (code_from_source));
remainder = obstack_finish (&temporary_obstack);
@@ -3074,46 +3128,80 @@ yyerror (const char *msg)
the same line. This occurs when we report an error but don't have
a synchronization point other than ';', which
expression_statement is the only one to take care of. */
- ctxp->prevent_ese = input_line = save_lineno;
+#ifndef USE_MAPPED_LOCATION
+ input_line = save_lineno;
+#endif
+ ctxp->prevent_ese = input_line;
}
static void
-issue_warning_error_from_context (tree cl, const char *msg, va_list ap)
+issue_warning_error_from_context (
+#ifdef USE_MAPPED_LOCATION
+ source_location cl,
+#else
+ tree cl,
+#endif
+ const char *msg, va_list ap)
{
- const char *saved, *saved_input_filename;
+#ifdef USE_MAPPED_LOCATION
+ source_location saved_location = input_location;
+ expanded_location xloc = expand_location (cl);
+#else
+ java_lc save_lc = ctxp->lexer->token_start;
+ const char *saved = ctxp->filename, *saved_input_filename;
+#endif
char buffer [4096];
vsprintf (buffer, msg, ap);
force_error = 1;
- ctxp->elc.line = EXPR_WFL_LINENO (cl);
- ctxp->elc.col = (EXPR_WFL_COLNO (cl) == 0xfff ? -1 :
- (EXPR_WFL_COLNO (cl) == 0xffe ? -2 : EXPR_WFL_COLNO (cl)));
+#ifdef USE_MAPPED_LOCATION
+ if (xloc.file != NULL)
+ {
+ ctxp->filename = xloc.file;
+ input_location = cl;
+ }
+#else
+ ctxp->lexer->token_start.line = EXPR_WFL_LINENO (cl);
+ ctxp->lexer->token_start.col = (EXPR_WFL_COLNO (cl) == 0xfff ? -1
+ : EXPR_WFL_COLNO (cl) == 0xffe ? -2
+ : EXPR_WFL_COLNO (cl));
/* We have a CL, that's a good reason for using it if it contains data */
- saved = ctxp->filename;
if (TREE_CODE (cl) == EXPR_WITH_FILE_LOCATION && EXPR_WFL_FILENAME_NODE (cl))
ctxp->filename = EXPR_WFL_FILENAME (cl);
saved_input_filename = input_filename;
input_filename = ctxp->filename;
+#endif
java_error (NULL);
java_error (buffer);
+#ifdef USE_MAPPED_LOCATION
+ input_location = saved_location;
+#else
ctxp->filename = saved;
input_filename = saved_input_filename;
+ ctxp->lexer->token_start = save_lc;
+#endif
force_error = 0;
}
-/* Issue an error message at a current source line CL */
+/* Issue an error message at a current source line CL.
+ FUTURE/FIXME: change cl to be a source_location. */
void
parse_error_context (tree cl, const char *msg, ...)
{
va_list ap;
va_start (ap, msg);
+#ifdef USE_MAPPED_LOCATION
+ issue_warning_error_from_context (EXPR_LOCATION (cl), msg, ap);
+#else
issue_warning_error_from_context (cl, msg, ap);
+#endif
va_end (ap);
}
-/* Issue a warning at a current source line CL */
+/* Issue a warning at a current source line CL.
+ FUTURE/FIXME: change cl to be a source_location. */
static void
parse_warning_context (tree cl, const char *msg, ...)
@@ -3121,9 +3209,13 @@ parse_warning_context (tree cl, const char *msg, ...)
va_list ap;
va_start (ap, msg);
- force_error = do_warning = 1;
+ do_warning = 1;
+#ifdef USE_MAPPED_LOCATION
+ issue_warning_error_from_context (EXPR_LOCATION (cl), msg, ap);
+#else
issue_warning_error_from_context (cl, msg, ap);
- do_warning = force_error = 0;
+#endif
+ do_warning = 0;
va_end (ap);
}
@@ -3174,7 +3266,11 @@ find_expr_with_wfl (tree node)
static void
missing_return_error (tree method)
{
+#ifdef USE_MAPPED_LOCATION
+ SET_EXPR_LOCATION (wfl_operator, DECL_FUNCTION_LAST_LINE (method));
+#else
EXPR_WFL_SET_LINECOL (wfl_operator, DECL_FUNCTION_LAST_LINE (method), -2);
+#endif
parse_error_context (wfl_operator, "Missing return statement");
}
@@ -3192,7 +3288,11 @@ unreachable_stmt_error (tree node)
if (node)
{
+#ifdef USE_MAPPED_LOCATION
+ SET_EXPR_LOCATION (wfl_operator, EXPR_LOCATION (node));
+#else
EXPR_WFL_SET_LINECOL (wfl_operator, EXPR_WFL_LINENO (node), -2);
+#endif
parse_error_context (wfl_operator, "Unreachable statement");
}
else
@@ -3383,10 +3483,14 @@ build_unresolved_array_type (tree type_or_wfl)
IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl)));
obstack_grow0 (&temporary_obstack, "[]", 2);
ptr = obstack_finish (&temporary_obstack);
+#ifdef USE_MAPPED_LOCATION
+ wfl = build_expr_wfl (get_identifier (ptr), EXPR_LOCATION (type_or_wfl));
+#else
wfl = build_expr_wfl (get_identifier (ptr),
EXPR_WFL_FILENAME (type_or_wfl),
EXPR_WFL_LINENO (type_or_wfl),
EXPR_WFL_COLNO (type_or_wfl));
+#endif
/* Re-install the existing qualifications so that the type can be
resolved properly. */
EXPR_WFL_QUALIFICATION (wfl) = EXPR_WFL_QUALIFICATION (type_or_wfl);
@@ -3446,13 +3550,14 @@ check_class_interface_creation (int is_interface, int flags, tree raw_name,
when dealing with an inner class */
if (!CPC_INNER_P () && (flags & ACC_PUBLIC ))
{
+ const char *fname = input_filename;
const char *f;
- for (f = &input_filename [strlen (input_filename)];
- f != input_filename && ! IS_DIR_SEPARATOR (f[0]);
+ for (f = fname + strlen (fname);
+ f != fname && ! IS_DIR_SEPARATOR (*f);
f--)
;
- if (IS_DIR_SEPARATOR (f[0]))
+ if (IS_DIR_SEPARATOR (*f))
f++;
if (strncmp (IDENTIFIER_POINTER (raw_name),
f , IDENTIFIER_LENGTH (raw_name)) ||
@@ -3650,7 +3755,7 @@ find_as_inner_class (tree enclosing, tree name, tree cl)
else if (cl)
qual = build_tree_list (cl, NULL_TREE);
else
- qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE);
+ qual = build_tree_list (build_unknown_wfl (name), NULL_TREE);
if ((to_return = find_as_inner_class_do (qual, enclosing)))
return to_return;
@@ -3680,7 +3785,7 @@ find_as_inner_class (tree enclosing, tree name, tree cl)
}
/* Otherwise, create a qual for the other part of the resolution. */
else
- qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE);
+ qual = build_tree_list (build_unknown_wfl (name), NULL_TREE);
return find_as_inner_class_do (qual, enclosing);
}
@@ -3769,16 +3874,28 @@ maybe_create_class_interface_decl (tree decl, tree raw_name,
decl = push_class (make_class (), qualified_name);
/* Take care of the file and line business */
+#ifdef USE_MAPPED_LOCATION
+ DECL_SOURCE_LOCATION (decl) = EXPR_LOCATION (cl);
+#else
DECL_SOURCE_FILE (decl) = EXPR_WFL_FILENAME (cl);
/* If we're emitting xrefs, store the line/col number information */
if (flag_emit_xref)
DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (cl);
else
DECL_SOURCE_LINE (decl) = EXPR_WFL_LINENO (cl);
+#endif
CLASS_FROM_SOURCE_P (TREE_TYPE (decl)) = 1;
CLASS_PARSED_P (TREE_TYPE (decl)) = 1;
+#ifdef USE_MAPPED_LOCATION
+ {
+ tree tmp = maybe_get_identifier (EXPR_FILENAME (cl));
+ CLASS_FROM_CURRENTLY_COMPILED_P (TREE_TYPE (decl)) =
+ tmp && IS_A_COMMAND_LINE_FILENAME_P (tmp);
+ }
+#else
CLASS_FROM_CURRENTLY_COMPILED_P (TREE_TYPE (decl)) =
IS_A_COMMAND_LINE_FILENAME_P (EXPR_WFL_FILENAME_NODE (cl));
+#endif
PUSH_CPC (decl, raw_name);
DECL_CONTEXT (decl) = GET_ENCLOSING_CPC_CONTEXT ();
@@ -4298,7 +4415,7 @@ register_fields (int flags, tree type, tree variable_list)
{
tree current, saved_type;
tree class_type = NULL_TREE;
- int saved_lineno = input_line;
+ location_t saved_location = input_location;
int must_chain = 0;
tree wfl = NULL_TREE;
@@ -4367,10 +4484,14 @@ register_fields (int flags, tree type, tree variable_list)
/* Set input_line to the line the field was found and create a
declaration for it. Eventually sets the @deprecated tag flag. */
+#ifdef USE_MAPPED_LOCATION
+ input_location = EXPR_LOCATION (cl);
+#else
if (flag_emit_xref)
input_line = EXPR_WFL_LINECOL (cl);
else
input_line = EXPR_WFL_LINENO (cl);
+#endif
field_decl = add_field (class_type, current_name, real_type, flags);
CHECK_DEPRECATED_NO_RESET (field_decl);
@@ -4432,7 +4553,7 @@ register_fields (int flags, tree type, tree variable_list)
}
CLEAR_DEPRECATED;
- input_line = saved_lineno;
+ input_location = saved_location;
}
/* Generate finit$, using the list of initialized fields to populate
@@ -4553,7 +4674,7 @@ method_header (int flags, tree type, tree mdecl, tree throws)
tree meth_name = NULL_TREE;
tree current, orig_arg, this_class = NULL;
tree id, meth;
- int saved_lineno;
+ location_t saved_location;
int constructor_ok = 0, must_chain;
int count;
@@ -4684,12 +4805,17 @@ method_header (int flags, tree type, tree mdecl, tree throws)
else
TREE_TYPE (meth) = type;
- saved_lineno = input_line;
+ saved_location = input_location;
/* When defining an abstract or interface method, the curly
bracket at level 1 doesn't exist because there is no function
body */
- input_line = (ctxp->first_ccb_indent1 ? ctxp->first_ccb_indent1 :
- EXPR_WFL_LINENO (id));
+#ifdef USE_MAPPED_LOCATION
+ input_location = (ctxp->first_ccb_indent1 ? ctxp->first_ccb_indent1 :
+ EXPR_LOCATION (id));
+#else
+ input_line = (ctxp->first_ccb_indent1 ? (int) ctxp->first_ccb_indent1 :
+ EXPR_WFL_LINENO (id));
+#endif
/* Remember the original argument list */
orig_arg = TYPE_ARG_TYPES (meth);
@@ -4722,7 +4848,7 @@ method_header (int flags, tree type, tree mdecl, tree throws)
/* Register the parameter number and re-install the current line
number */
DECL_MAX_LOCALS (meth) = ctxp->formal_parameter_number+1;
- input_line = saved_lineno;
+ input_location = saved_location;
/* Register exception specified by the `throws' keyword for
resolution and set the method decl appropriate field to the list.
@@ -4763,7 +4889,13 @@ method_header (int flags, tree type, tree mdecl, tree throws)
/* If doing xref, store column and line number information instead
of the line number only. */
if (flag_emit_xref)
- DECL_SOURCE_LINE (meth) = EXPR_WFL_LINECOL (id);
+ {
+#ifdef USE_MAPPED_LOCATION
+ DECL_SOURCE_LOCATION (meth) = EXPR_LOCATION (id);
+#else
+ DECL_SOURCE_LINE (meth) = EXPR_WFL_LINECOL (id);
+#endif
+ }
return meth;
}
@@ -6746,22 +6878,28 @@ lookup_java_method2 (tree clas, tree method_decl, int do_interface)
}
/* Return the line that matches DECL line number, and try its best to
- position the column number. Used during error reports. */
+ position the column number. Used during error reports.
+ FUTURE/FIXME: return source_location instead of node. */
static GTY(()) tree cl_v;
static tree
lookup_cl (tree decl)
{
+#ifndef USE_MAPPED_LOCATION
char *line, *found;
+#endif
if (!decl)
return NULL_TREE;
if (cl_v == NULL_TREE)
{
- cl_v = build_expr_wfl (NULL_TREE, NULL, 0, 0);
+ cl_v = build_unknown_wfl (NULL_TREE);
}
+#ifdef USE_MAPPED_LOCATION
+ SET_EXPR_LOCATION (cl_v, DECL_SOURCE_LOCATION (decl));
+#else
EXPR_WFL_FILENAME_NODE (cl_v) = get_identifier (DECL_SOURCE_FILE (decl));
EXPR_WFL_SET_LINECOL (cl_v, DECL_SOURCE_LINE (decl), -1);
@@ -6772,6 +6910,7 @@ lookup_cl (tree decl)
(const char *)IDENTIFIER_POINTER (DECL_NAME (decl)));
if (found)
EXPR_WFL_SET_LINECOL (cl_v, EXPR_WFL_LINENO (cl_v), found - line);
+#endif
return cl_v;
}
@@ -7026,7 +7165,7 @@ find_in_imports_on_demand (tree enclosing_type, tree class_type)
for (; import; import = TREE_CHAIN (import))
{
- int saved_lineno = input_line;
+ location_t saved_location = input_location;
int access_check;
const char *id_name;
tree decl, type_name_copy;
@@ -7045,7 +7184,11 @@ find_in_imports_on_demand (tree enclosing_type, tree class_type)
/* Setup input_line so that it refers to the line of the import (in
case we parse a class file and encounter errors */
+#ifdef USE_MAPPED_LOCATION
+ input_location = EXPR_LOCATION (TREE_PURPOSE (import));
+#else
input_line = EXPR_WFL_LINENO (TREE_PURPOSE (import));
+#endif
type_name_copy = TYPE_NAME (class_type);
TYPE_NAME (class_type) = node;
@@ -7066,7 +7209,7 @@ find_in_imports_on_demand (tree enclosing_type, tree class_type)
/* 6.6.1: Inner classes are subject to member access rules. */
access_check = 0;
- input_line = saved_lineno;
+ input_location = saved_location;
/* If the loaded class is not accessible or couldn't be loaded,
we restore the original TYPE_NAME and process the next
@@ -7363,8 +7506,13 @@ declare_local_variables (int modifier, tree type, tree vlist)
/* If doing xreferencing, replace the line number with the WFL
compound value */
+#ifdef USE_MAPPED_LOCATION
+ if (flag_emit_xref)
+ DECL_SOURCE_LOCATION (decl) = EXPR_LOCATION (wfl);
+#else
if (flag_emit_xref)
DECL_SOURCE_LINE (decl) = EXPR_WFL_LINECOL (wfl);
+#endif
/* Don't try to use an INIT statement when an error was found */
if (init && java_error_count)
@@ -7462,9 +7610,9 @@ create_artificial_method (tree class, int flags, tree type,
tree name, tree args)
{
tree mdecl;
+ location_t save_location = input_location;
- java_parser_context_save_global ();
- input_line = 0;
+ input_location = DECL_SOURCE_LOCATION (TYPE_NAME (class));
mdecl = make_node (FUNCTION_TYPE);
TREE_TYPE (mdecl) = type;
TYPE_ARG_TYPES (mdecl) = args;
@@ -7473,7 +7621,7 @@ create_artificial_method (tree class, int flags, tree type,
the type of the returned method, which trashes the cache in
get_type_from_signature(). */
mdecl = add_method_1 (class, flags, name, mdecl);
- java_parser_context_restore_global ();
+ input_location = save_location;
DECL_ARTIFICIAL (mdecl) = 1;
return mdecl;
}
@@ -7483,8 +7631,13 @@ create_artificial_method (tree class, int flags, tree type,
static void
start_artificial_method_body (tree mdecl)
{
+#ifdef USE_MAPPED_LOCATION
+ DECL_SOURCE_LOCATION (mdecl) = ctxp->file_start_location;
+ DECL_FUNCTION_LAST_LINE (mdecl) = ctxp->file_start_location;
+#else
DECL_SOURCE_LINE (mdecl) = 1;
DECL_FUNCTION_LAST_LINE (mdecl) = 1;
+#endif
source_start_java_method (mdecl);
enter_block ();
}
@@ -7528,7 +7681,11 @@ source_end_java_method (void)
return;
java_parser_context_save_global ();
+#ifdef USE_MAPPED_LOCATION
+ input_location = ctxp->last_ccb_indent1;
+#else
input_line = ctxp->last_ccb_indent1;
+#endif
/* Turn function bodies with only a NOP expr null, so they don't get
generated at all and we won't get warnings when using the -W
@@ -7587,7 +7744,10 @@ java_layout_seen_class_methods (void)
for (current = previous_list;
current != end; current = TREE_CHAIN (current))
{
- tree cls = TREE_TYPE (TREE_VALUE (current));
+ tree decl = TREE_VALUE (current);
+ tree cls = TREE_TYPE (decl);
+
+ input_location = DECL_SOURCE_LOCATION (decl);
if (! CLASS_LOADED_P (cls))
load_class (cls, 0);
@@ -8018,7 +8178,7 @@ start_complete_expand_method (tree mdecl)
TREE_CHAIN (tem) = next;
}
pushdecl_force_head (DECL_ARGUMENTS (mdecl));
- input_line = DECL_SOURCE_LINE (mdecl);
+ input_location = DECL_SOURCE_LOCATION (mdecl);
build_result_decl (mdecl);
}
@@ -8690,7 +8850,11 @@ build_thisn_assign (void)
tree lhs = make_qualified_primary (build_wfl_node (this_identifier_node),
build_wfl_node (thisn), 0);
tree rhs = build_wfl_node (thisn);
+#ifdef USE_MAPPED_LOCATION
+ SET_EXPR_LOCATION (lhs, input_location);
+#else
EXPR_WFL_SET_LINECOL (lhs, input_line, 0);
+#endif
return build_assignment (ASSIGN_TK, EXPR_WFL_LINECOL (lhs), lhs, rhs);
}
return NULL_TREE;
@@ -8714,7 +8878,11 @@ static tree
build_dot_class_method (tree class)
{
#define BWF(S) build_wfl_node (get_identifier ((S)))
+#ifdef USE_MAPPED_LOCATION
+#define MQN(X,Y) make_qualified_name ((X), (Y), UNKNOWN_LOCATION)
+#else
#define MQN(X,Y) make_qualified_name ((X), (Y), 0)
+#endif
tree args, tmp, saved_current_function_decl, mdecl, qual_name;
tree stmt, throw_stmt;
@@ -8752,8 +8920,13 @@ build_dot_class_method (tree class)
/* Now onto the catch block. We start by building the expression
throwing a new exception: throw new NoClassDefFoundError (_.getMessage) */
+#ifdef USE_MAPPED_LOCATION
+ throw_stmt = make_qualified_name (build_wfl_node (wpv_id),
+ get_message_wfl, UNKNOWN_LOCATION);
+#else
throw_stmt = make_qualified_name (build_wfl_node (wpv_id),
get_message_wfl, 0);
+#endif
throw_stmt = build_method_invocation (throw_stmt, NULL_TREE);
/* Build new NoClassDefFoundError (_.getMessage) */
@@ -8818,7 +8991,7 @@ static void
fix_constructors (tree mdecl)
{
tree iii; /* Instance Initializer Invocation */
- tree body = DECL_FUNCTION_BODY (mdecl);
+ tree *bodyp = &DECL_FUNCTION_BODY (mdecl);
tree thisn_assign, compound = NULL_TREE;
tree class_type = DECL_CONTEXT (mdecl);
@@ -8826,7 +8999,7 @@ fix_constructors (tree mdecl)
return;
DECL_FIXED_CONSTRUCTOR_P (mdecl) = 1;
- if (!body)
+ if (!*bodyp)
{
/* It is an error for the compiler to generate a default
constructor if the superclass doesn't have a constructor that
@@ -8870,31 +9043,30 @@ fix_constructors (tree mdecl)
{
int found = 0;
int invokes_this = 0;
- tree found_call = NULL_TREE;
- tree main_block = BLOCK_EXPR_BODY (body);
+ tree main_block = BLOCK_EXPR_BODY (*bodyp);
- while (body)
- switch (TREE_CODE (body))
- {
- case CALL_EXPR:
- found = CALL_EXPLICIT_CONSTRUCTOR_P (body);
- if (CALL_THIS_CONSTRUCTOR_P (body))
- invokes_this = 1;
- body = NULL_TREE;
- break;
- case COMPOUND_EXPR:
- case EXPR_WITH_FILE_LOCATION:
- found_call = body;
- body = TREE_OPERAND (body, 0);
- break;
- case BLOCK:
- found_call = body;
- body = BLOCK_EXPR_BODY (body);
- break;
- default:
- found = 0;
- body = NULL_TREE;
- }
+ while (*bodyp)
+ {
+ tree body = *bodyp;
+ switch (TREE_CODE (body))
+ {
+ case CALL_EXPR:
+ found = CALL_EXPLICIT_CONSTRUCTOR_P (body);
+ if (CALL_THIS_CONSTRUCTOR_P (body))
+ invokes_this = 1;
+ break;
+ case COMPOUND_EXPR:
+ case EXPR_WITH_FILE_LOCATION:
+ bodyp = &TREE_OPERAND (body, 0);
+ continue;
+ case BLOCK:
+ bodyp = &BLOCK_EXPR_BODY (body);
+ continue;
+ default:
+ break;
+ }
+ break;
+ }
/* Generate the assignment to this$<n>, if necessary */
if ((thisn_assign = build_thisn_assign ()))
@@ -8908,9 +9080,8 @@ fix_constructors (tree mdecl)
instance initializer blocks. */
else
{
- compound = add_stmt_to_compound (compound, NULL_TREE,
- TREE_OPERAND (found_call, 0));
- TREE_OPERAND (found_call, 0) = build_java_empty_stmt ();
+ compound = add_stmt_to_compound (compound, NULL_TREE, *bodyp);
+ *bodyp = build_java_empty_stmt ();
}
DECL_INIT_CALLS_THIS (mdecl) = invokes_this;
@@ -8997,6 +9168,7 @@ java_expand_classes (void)
return;
java_layout_classes ();
java_parse_abort_on_error ();
+ location_t save_location = input_location;
for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
{
@@ -9010,12 +9182,12 @@ java_expand_classes (void)
for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next)
{
ctxp = cur_ctxp;
- input_filename = ctxp->filename;
+ input_location = ctxp->file_start_location;
lang_init_source (2); /* Error msgs have method prototypes */
java_complete_expand_classes (); /* Complete and expand classes */
java_parse_abort_on_error ();
}
- input_filename = main_input_filename;
+ input_location = save_location;
/* Find anonymous classes and expand their constructor. This extra pass is
necessary because the constructor itself is only generated when the
@@ -9227,11 +9399,17 @@ merge_qualified_name (tree left, tree right)
inherited from the location information of the `.' operator. */
static tree
-make_qualified_name (tree left, tree right, int location)
+make_qualified_name (tree left, tree right,
+#ifdef USE_MAPPED_LOCATION
+ source_location location
+#else
+ int location
+#endif
+ )
{
#ifdef USE_COMPONENT_REF
tree node = build3 (COMPONENT_REF, NULL_TREE, left, right, NULL_TREE);
- EXPR_WFL_LINECOL (node) = location;
+ SET_EXPR_LOCATION (node, location);
return node;
#else
tree left_id = EXPR_WFL_NODE (left);
@@ -9241,6 +9419,15 @@ make_qualified_name (tree left, tree right, int location)
merge = merge_qualified_name (left_id, right_id);
/* Left wasn't qualified and is now qualified */
+#ifdef USE_MAPPED_LOCATION
+ if (!QUALIFIED_P (left_id))
+ {
+ tree wfl = build_expr_wfl (left_id, EXPR_LOCATION (left));
+ EXPR_WFL_QUALIFICATION (left) = build_tree_list (wfl, NULL_TREE);
+ }
+
+ wfl = build_expr_wfl (right_id, location);
+#else
if (!QUALIFIED_P (left_id))
{
tree wfl = build_expr_wfl (left_id, ctxp->filename, 0, 0);
@@ -9250,8 +9437,8 @@ make_qualified_name (tree left, tree right, int location)
wfl = build_expr_wfl (right_id, ctxp->filename, 0, 0);
EXPR_WFL_LINECOL (wfl) = location;
+#endif
chainon (EXPR_WFL_QUALIFICATION (left), build_tree_list (wfl, NULL_TREE));
-
EXPR_WFL_NODE (left) = merge;
return left;
#endif
@@ -9523,7 +9710,11 @@ resolve_qualified_expression_name (tree wfl, tree *found_decl,
{
tree qual_wfl = QUAL_WFL (q);
tree ret_decl; /* for EH checking */
+#ifdef USE_MAPPED_LOCATION
+ source_location location; /* for EH checking */
+#else
int location; /* for EH checking */
+#endif
/* 15.10.1 Field Access Using a Primary */
switch (TREE_CODE (qual_wfl))
@@ -9569,8 +9760,14 @@ resolve_qualified_expression_name (tree wfl, tree *found_decl,
if (from_super && TREE_CODE (qual_wfl) == CALL_EXPR)
CALL_USING_SUPER (qual_wfl) = 1;
+#ifdef USE_MAPPED_LOCATION
+ location = (TREE_CODE (qual_wfl) == CALL_EXPR
+ ? EXPR_LOCATION (TREE_OPERAND (qual_wfl, 0))
+ : UNKNOWN_LOCATION);
+#else
location = (TREE_CODE (qual_wfl) == CALL_EXPR ?
EXPR_WFL_LINECOL (TREE_OPERAND (qual_wfl, 0)) : 0);
+#endif
*where_found = patch_method_invocation (qual_wfl, decl, type,
from_super,
&is_static, &ret_decl);
@@ -9602,7 +9799,11 @@ resolve_qualified_expression_name (tree wfl, tree *found_decl,
instantiation using a primary qualified by a `new' */
RESTORE_THIS_AND_CURRENT_CLASS;
+#ifdef USE_MAPPED_LOCATION
+ if (location != UNKNOWN_LOCATION)
+#else
if (location)
+#endif
{
tree arguments = NULL_TREE;
if (TREE_CODE (qual_wfl) == CALL_EXPR
@@ -11603,7 +11804,11 @@ java_complete_lhs (tree node)
/* Only one default label is allowed per switch statement */
if (SWITCH_HAS_DEFAULT (nn))
{
+#ifdef USE_MAPPED_LOCATION
+ SET_EXPR_LOCATION (wfl_operator, EXPR_LOCATION (node));
+#else
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
+#endif
parse_error_context (wfl_operator,
"Duplicate case label: `default'");
return error_mark_node;
@@ -11756,10 +11961,16 @@ java_complete_lhs (tree node)
else
{
tree body;
- int save_lineno = input_line;
+ location_t save_location = input_location;
+#ifdef USE_MAPPED_LOCATION
+ input_location = EXPR_LOCATION (node);
+ if (input_location == UNKNOWN_LOCATION)
+ input_location = save_location;
+#else
input_line = EXPR_WFL_LINENO (node);
+#endif
body = java_complete_tree (EXPR_WFL_NODE (node));
- input_line = save_lineno;
+ input_location = save_location;
EXPR_WFL_NODE (node) = body;
TREE_SIDE_EFFECTS (node) = TREE_SIDE_EFFECTS (body);
CAN_COMPLETE_NORMALLY (node) = CAN_COMPLETE_NORMALLY (body);
@@ -11799,9 +12010,13 @@ java_complete_lhs (tree node)
TREE_VALUE (cn) = dim;
/* Setup the location of the current dimension, for
later error report. */
+#ifdef USE_MAPPED_LOCATION
+ TREE_PURPOSE (cn) = expr_add_location (NULL_TREE, location, 0);
+#else
TREE_PURPOSE (cn) =
build_expr_wfl (NULL_TREE, input_filename, 0, 0);
EXPR_WFL_LINECOL (TREE_PURPOSE (cn)) = location;
+#endif
}
}
/* They complete the array creation expression, if no errors
@@ -11840,7 +12055,11 @@ java_complete_lhs (tree node)
int from_super = (EXPR_WFL_NODE (TREE_OPERAND (node, 0)) ==
super_identifier_node);
tree arguments;
+#ifdef USE_MAPPED_LOCATION
+ source_location location = EXPR_LOCATION (node);
+#else
int location = EXPR_WFL_LINECOL (node);
+#endif
node = patch_method_invocation (node, NULL_TREE, NULL_TREE,
from_super, 0, &decl);
@@ -12204,10 +12423,14 @@ build_debugable_stmt (int location, tree stmt)
{
if (TREE_CODE (stmt) != EXPR_WITH_FILE_LOCATION)
{
+#ifdef USE_MAPPED_LOCATION
+ stmt = expr_add_location (stmt, location, 1);
+#else
stmt = build_expr_wfl (stmt, input_filename, 0, 0);
EXPR_WFL_LINECOL (stmt) = location;
+ JAVA_MAYBE_GENERATE_DEBUG_INFO (stmt);
+#endif
}
- JAVA_MAYBE_GENERATE_DEBUG_INFO (stmt);
return stmt;
}
@@ -12335,9 +12558,15 @@ build_wfl_wrap (tree node, int location)
if (TREE_CODE (node) == THIS_EXPR)
node_to_insert = wfl = build_wfl_node (this_identifier_node);
else
+#ifdef USE_MAPPED_LOCATION
+ wfl = build_unknown_wfl (NULL_TREE);
+
+ SET_EXPR_LOCATION (wfl, location);
+#else
wfl = build_expr_wfl (NULL_TREE, ctxp->filename, 0, 0);
EXPR_WFL_LINECOL (wfl) = location;
+#endif
EXPR_WFL_QUALIFICATION (wfl) = build_tree_list (node_to_insert, NULL_TREE);
return wfl;
}
@@ -13277,8 +13506,6 @@ patch_binop (tree node, tree wfl_op1, tree wfl_op2)
{
tree mod = build_java_binop (TRUNC_MOD_EXPR, prom_type, op1, op2);
COMPOUND_ASSIGN_P (mod) = COMPOUND_ASSIGN_P (node);
- TREE_SIDE_EFFECTS (mod)
- = TREE_SIDE_EFFECTS (op1) | TREE_SIDE_EFFECTS (op2);
return mod;
}
break;
@@ -14153,7 +14380,6 @@ patch_unaryop (tree node, tree wfl_op)
else
{
value = fold (value);
- TREE_SIDE_EFFECTS (value) = TREE_SIDE_EFFECTS (op);
return value;
}
break;
@@ -14481,8 +14707,18 @@ static tree
maybe_build_array_element_wfl (tree node)
{
if (TREE_CODE (node) != EXPR_WITH_FILE_LOCATION)
- return build_expr_wfl (NULL_TREE, ctxp->filename,
- ctxp->elc.line, ctxp->elc.prev_col);
+ {
+ /* FIXME - old code used "prev_lc.line" and "elc.prev_col */
+ return build_expr_wfl (NULL_TREE,
+#ifdef USE_MAPPED_LOCATION
+ input_location
+#else
+ ctxp->filename,
+ ctxp->lexer->token_start.line,
+ ctxp->lexer->token_start.col
+#endif
+ );
+ }
else
return NULL_TREE;
}
@@ -14885,9 +15121,13 @@ finish_loop_body (int location, tree condition, tree body, int reversed)
/* We wrapped the EXIT_EXPR around a WFL so we can debug it.
The real EXIT_EXPR is one operand further. */
EXPR_WFL_LINECOL (cnode) = location;
- /* This one is for accurate error reports */
- EXPR_WFL_LINECOL (TREE_OPERAND (cnode, 0)) = location;
- TREE_OPERAND (TREE_OPERAND (cnode, 0), 0) = condition;
+ if (TREE_CODE (cnode) == EXPR_WITH_FILE_LOCATION)
+ {
+ cnode = EXPR_WFL_NODE (cnode);
+ /* This one is for accurate error reports */
+ EXPR_WFL_LINECOL (cnode) = location;
+ }
+ TREE_OPERAND (cnode, 0) = condition;
}
LOOP_EXPR_BODY_BODY_EXPR (loop_body, reversed) = body;
POP_LOOP ();
@@ -15215,7 +15455,13 @@ patch_switch_statement (tree node)
/* Build an assertion expression for `assert CONDITION : VALUE'; VALUE
might be NULL_TREE. */
static tree
-build_assertion (int location, tree condition, tree value)
+build_assertion (
+#ifdef USE_MAPPED_LOCATION
+ source_location location,
+#else
+ int location,
+#endif
+ tree condition, tree value)
{
tree node;
tree klass = GET_CPC ();
@@ -15639,7 +15885,14 @@ patch_throw_statement (tree node, tree wfl_op1)
effectively caught from where DECL is invoked. THIS_EXPR is the
expression that computes `this' for the method call. */
static void
-check_thrown_exceptions (int location, tree decl, tree this_expr)
+check_thrown_exceptions (
+#ifdef USE_MAPPED_LOCATION
+ source_location location,
+#else
+
+ int location,
+#endif
+ tree decl, tree this_expr)
{
tree throws;
int is_array_call = 0;
@@ -15662,7 +15915,11 @@ check_thrown_exceptions (int location, tree decl, tree this_expr)
if (is_array_call && DECL_NAME (decl) == get_identifier ("clone"))
continue;
+#ifdef USE_MAPPED_LOCATION
+ SET_EXPR_LOCATION (wfl_operator, location);
+#else
EXPR_WFL_LINECOL (wfl_operator) = location;
+#endif
if (DECL_FINIT_P (current_function_decl))
parse_error_context
(wfl_operator, "Exception `%s' can't be thrown in initializer",
diff --git a/gcc/lambda-code.c b/gcc/lambda-code.c
index c1eb476c665..cc6c9bcd04d 100644
--- a/gcc/lambda-code.c
+++ b/gcc/lambda-code.c
@@ -1868,7 +1868,7 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
/* Create the new iv, and insert it's increment on the latch
block. */
- bb = temp->latch->pred->src;
+ bb = EDGE_PRED (temp->latch, 0)->src;
bsi = bsi_last (bb);
create_iv (newlowerbound,
build_int_cst (integer_type_node, LL_STEP (newloop)),
@@ -2282,7 +2282,7 @@ perfect_nestify (struct loops *loops,
VEC_safe_push (tree, phis, PHI_ARG_DEF (phi, 0));
mark_for_rewrite (PHI_RESULT (phi));
}
- e = redirect_edge_and_branch (preheaderbb->succ, headerbb);
+ e = redirect_edge_and_branch (EDGE_SUCC (preheaderbb, 0), headerbb);
unmark_all_for_rewrite ();
bb_ann (olddest)->phi_nodes = NULL;
/* Add back the old exit phis. */
@@ -2294,7 +2294,7 @@ perfect_nestify (struct loops *loops,
phiname = VEC_pop (tree, phis);
phi = create_phi_node (phiname, preheaderbb);
- add_phi_arg (&phi, def, preheaderbb->pred);
+ add_phi_arg (&phi, def, EDGE_PRED (preheaderbb, 0));
}
nestify_update_pending_stmts (e);
@@ -2332,7 +2332,7 @@ perfect_nestify (struct loops *loops,
/* Create the new iv. */
ivvar = create_tmp_var (integer_type_node, "perfectiv");
add_referenced_tmp_var (ivvar);
- bsi = bsi_last (newloop->latch->pred->src);
+ bsi = bsi_last (EDGE_PRED (newloop->latch, 0)->src);
create_iv (VEC_index (tree, lbounds, 0),
build_int_cst (integer_type_node,
VEC_index (int, steps, 0)),
diff --git a/gcc/lcm.c b/gcc/lcm.c
index 3432332a06a..b568b06b99b 100644
--- a/gcc/lcm.c
+++ b/gcc/lcm.c
@@ -102,6 +102,7 @@ compute_antinout_edge (sbitmap *antloc, sbitmap *transp, sbitmap *antin,
edge e;
basic_block *worklist, *qin, *qout, *qend;
unsigned int qlen;
+ edge_iterator ei;
/* Allocate a worklist array/queue. Entries are only added to the
list if they were not already on the list. So the size is
@@ -126,7 +127,7 @@ compute_antinout_edge (sbitmap *antloc, sbitmap *transp, sbitmap *antin,
/* Mark blocks which are predecessors of the exit block so that we
can easily identify them below. */
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
e->src->aux = EXIT_BLOCK_PTR;
/* Iterate until the worklist is empty. */
@@ -157,7 +158,7 @@ compute_antinout_edge (sbitmap *antloc, sbitmap *transp, sbitmap *antin,
/* If the in state of this block changed, then we need
to add the predecessors of this block to the worklist
if they are not already on the worklist. */
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (!e->src->aux && e->src != ENTRY_BLOCK_PTR)
{
*qin++ = e->src;
@@ -251,6 +252,7 @@ compute_laterin (struct edge_list *edge_list, sbitmap *earliest,
edge e;
basic_block *worklist, *qin, *qout, *qend, bb;
unsigned int qlen;
+ edge_iterator ei;
num_edges = NUM_EDGES (edge_list);
@@ -280,7 +282,7 @@ compute_laterin (struct edge_list *edge_list, sbitmap *earliest,
do not want to be overly optimistic. Consider an outgoing edge from
the entry block. That edge should always have a LATER value the
same as EARLIEST for that edge. */
- for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
sbitmap_copy (later[(size_t) e->aux], earliest[(size_t) e->aux]);
/* Add all the blocks to the worklist. This prevents an early exit from
@@ -310,12 +312,12 @@ compute_laterin (struct edge_list *edge_list, sbitmap *earliest,
/* Compute the intersection of LATERIN for each incoming edge to B. */
sbitmap_ones (laterin[bb->index]);
- for (e = bb->pred; e != NULL; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
sbitmap_a_and_b (laterin[bb->index], laterin[bb->index],
later[(size_t)e->aux]);
/* Calculate LATER for all outgoing edges. */
- for (e = bb->succ; e != NULL; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (sbitmap_union_of_diff_cg (later[(size_t) e->aux],
earliest[(size_t) e->aux],
laterin[e->src->index],
@@ -336,7 +338,7 @@ compute_laterin (struct edge_list *edge_list, sbitmap *earliest,
for the EXIT block. We allocated an extra entry in the LATERIN array
for just this purpose. */
sbitmap_ones (laterin[last_basic_block]);
- for (e = EXIT_BLOCK_PTR->pred; e != NULL; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
sbitmap_a_and_b (laterin[last_basic_block],
laterin[last_basic_block],
later[(size_t) e->aux]);
@@ -478,6 +480,7 @@ compute_available (sbitmap *avloc, sbitmap *kill, sbitmap *avout,
edge e;
basic_block *worklist, *qin, *qout, *qend, bb;
unsigned int qlen;
+ edge_iterator ei;
/* Allocate a worklist array/queue. Entries are only added to the
list if they were not already on the list. So the size is
@@ -501,7 +504,7 @@ compute_available (sbitmap *avloc, sbitmap *kill, sbitmap *avout,
/* Mark blocks which are successors of the entry block so that we
can easily identify them below. */
- for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
e->dest->aux = ENTRY_BLOCK_PTR;
/* Iterate until the worklist is empty. */
@@ -534,7 +537,7 @@ compute_available (sbitmap *avloc, sbitmap *kill, sbitmap *avout,
/* If the out state of this block changed, then we need
to add the successors of this block to the worklist
if they are not already on the worklist. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (!e->dest->aux && e->dest != EXIT_BLOCK_PTR)
{
*qin++ = e->dest;
@@ -604,6 +607,7 @@ compute_nearerout (struct edge_list *edge_list, sbitmap *farthest,
int num_edges, i;
edge e;
basic_block *worklist, *tos, bb;
+ edge_iterator ei;
num_edges = NUM_EDGES (edge_list);
@@ -624,7 +628,7 @@ compute_nearerout (struct edge_list *edge_list, sbitmap *farthest,
do not want to be overly optimistic. Consider an incoming edge to
the exit block. That edge should always have a NEARER value the
same as FARTHEST for that edge. */
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
sbitmap_copy (nearer[(size_t)e->aux], farthest[(size_t)e->aux]);
/* Add all the blocks to the worklist. This prevents an early exit
@@ -644,12 +648,12 @@ compute_nearerout (struct edge_list *edge_list, sbitmap *farthest,
/* Compute the intersection of NEARER for each outgoing edge from B. */
sbitmap_ones (nearerout[bb->index]);
- for (e = bb->succ; e != NULL; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
sbitmap_a_and_b (nearerout[bb->index], nearerout[bb->index],
nearer[(size_t) e->aux]);
/* Calculate NEARER for all incoming edges. */
- for (e = bb->pred; e != NULL; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (sbitmap_union_of_diff_cg (nearer[(size_t) e->aux],
farthest[(size_t) e->aux],
nearerout[e->dest->index],
@@ -667,7 +671,7 @@ compute_nearerout (struct edge_list *edge_list, sbitmap *farthest,
for the ENTRY block. We allocated an extra entry in the NEAREROUT array
for just this purpose. */
sbitmap_ones (nearerout[last_basic_block]);
- for (e = ENTRY_BLOCK_PTR->succ; e != NULL; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
sbitmap_a_and_b (nearerout[last_basic_block],
nearerout[last_basic_block],
nearer[(size_t) e->aux]);
@@ -912,8 +916,9 @@ static void
make_preds_opaque (basic_block b, int j)
{
edge e;
+ edge_iterator ei;
- for (e = b->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, b->preds)
{
basic_block pb = e->src;
@@ -1020,17 +1025,18 @@ optimize_mode_switching (FILE *file)
exit block, so that we can note that there NORMAL_MODE is supplied /
required. */
edge eg;
- post_entry = split_edge (ENTRY_BLOCK_PTR->succ);
+ edge_iterator ei;
+ post_entry = split_edge (EDGE_SUCC (ENTRY_BLOCK_PTR, 0));
/* The only non-call predecessor at this stage is a block with a
fallthrough edge; there can be at most one, but there could be
none at all, e.g. when exit is called. */
- for (pre_exit = 0, eg = EXIT_BLOCK_PTR->pred; eg; eg = eg->pred_next)
+ pre_exit = 0;
+ FOR_EACH_EDGE (eg, ei, EXIT_BLOCK_PTR->preds)
if (eg->flags & EDGE_FALLTHRU)
{
regset live_at_end = eg->src->global_live_at_end;
- if (pre_exit)
- abort ();
+ gcc_assert (!pre_exit);
pre_exit = split_edge (eg);
COPY_REG_SET (pre_exit->global_live_at_start, live_at_end);
COPY_REG_SET (pre_exit->global_live_at_end, live_at_end);
diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c
index e4fc91f9058..3c9e9704845 100644
--- a/gcc/libgcc2.c
+++ b/gcc/libgcc2.c
@@ -1496,7 +1496,7 @@ __enable_execute_stack (void *addr __attribute__((__unused__)))
#if defined(WINNT) && ! defined(__CYGWIN__) && ! defined (_UWIN)
-long
+int
getpagesize (void)
{
#ifdef _ALPHA_
diff --git a/gcc/local-alloc.c b/gcc/local-alloc.c
index a01b99a0425..64db8c4258f 100644
--- a/gcc/local-alloc.c
+++ b/gcc/local-alloc.c
@@ -1010,6 +1010,11 @@ update_equiv_regs (void)
if (! INSN_P (insn))
continue;
+ /* Don't substitute into a non-local goto, this confuses CFG. */
+ if (JUMP_P (insn)
+ && find_reg_note (insn, REG_NON_LOCAL_GOTO, NULL_RTX))
+ continue;
+
for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
{
if (REG_NOTE_KIND (link) == REG_DEAD
diff --git a/gcc/loop-doloop.c b/gcc/loop-doloop.c
index 7b4f4d42b5f..1b5ca4dc6d2 100644
--- a/gcc/loop-doloop.c
+++ b/gcc/loop-doloop.c
@@ -358,11 +358,11 @@ doloop_modify (struct loop *loop, struct niter_desc *desc,
/* Expand the condition testing the assumptions and if it does not pass,
reset the count register to 0. */
add_test (XEXP (ass, 0), preheader, set_zero);
- preheader->succ->flags &= ~EDGE_FALLTHRU;
- cnt = preheader->succ->count;
- preheader->succ->probability = 0;
- preheader->succ->count = 0;
- irr = preheader->succ->flags & EDGE_IRREDUCIBLE_LOOP;
+ EDGE_SUCC (preheader, 0)->flags &= ~EDGE_FALLTHRU;
+ cnt = EDGE_SUCC (preheader, 0)->count;
+ EDGE_SUCC (preheader, 0)->probability = 0;
+ EDGE_SUCC (preheader, 0)->count = 0;
+ irr = EDGE_SUCC (preheader, 0)->flags & EDGE_IRREDUCIBLE_LOOP;
te = make_edge (preheader, new_preheader, EDGE_FALLTHRU | irr);
te->probability = REG_BR_PROB_BASE;
te->count = cnt;
@@ -374,7 +374,7 @@ doloop_modify (struct loop *loop, struct niter_desc *desc,
for (ass = XEXP (ass, 1); ass; ass = XEXP (ass, 1))
{
bb = loop_split_edge_with (te, NULL_RTX);
- te = bb->succ;
+ te = EDGE_SUCC (bb, 0);
add_test (XEXP (ass, 0), bb, set_zero);
make_edge (bb, set_zero, irr);
}
diff --git a/gcc/loop-init.c b/gcc/loop-init.c
index 35fa12ea3e6..8db45ec0e40 100644
--- a/gcc/loop-init.c
+++ b/gcc/loop-init.c
@@ -35,6 +35,7 @@ loop_optimizer_init (FILE *dumpfile)
{
struct loops *loops = xcalloc (1, sizeof (struct loops));
edge e;
+ edge_iterator ei;
static bool first_time = true;
if (first_time)
@@ -45,9 +46,12 @@ loop_optimizer_init (FILE *dumpfile)
/* Avoid annoying special cases of edges going to exit
block. */
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
- if ((e->flags & EDGE_FALLTHRU) && e->src->succ->succ_next)
+
+ for (ei = ei_start (EXIT_BLOCK_PTR->preds); (e = ei_safe_edge (ei)); )
+ if ((e->flags & EDGE_FALLTHRU) && EDGE_COUNT (e->src->succs) > 1)
split_edge (e);
+ else
+ ei_next (&ei);
/* Find the loops. */
diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c
index e0824e03ef5..21dc8b88144 100644
--- a/gcc/loop-invariant.c
+++ b/gcc/loop-invariant.c
@@ -219,6 +219,7 @@ find_exits (struct loop *loop, basic_block *body,
bitmap may_exit, bitmap has_exit)
{
unsigned i;
+ edge_iterator ei;
edge e;
struct loop *outermost_exit = loop, *aexit;
bool has_call = false;
@@ -239,7 +240,7 @@ find_exits (struct loop *loop, basic_block *body,
}
}
- for (e = body[i]->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, body[i]->succs)
{
if (flow_bb_inside_loop_p (loop, e->dest))
continue;
diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c
index ed06d1dbb1e..e4d757a0798 100644
--- a/gcc/loop-iv.c
+++ b/gcc/loop-iv.c
@@ -1782,6 +1782,8 @@ simplify_using_initial_values (struct loop *loop, enum rtx_code op, rtx *expr)
while (1)
{
+ basic_block tmp_bb;
+
insn = BB_END (e->src);
if (any_condjump_p (insn))
{
@@ -1813,8 +1815,12 @@ simplify_using_initial_values (struct loop *loop, enum rtx_code op, rtx *expr)
}
}
- e = e->src->pred;
- if (e->pred_next
+ /* This is a bit subtle. Store away e->src in tmp_bb, since we
+ modify `e' and this can invalidate the subsequent count of
+ e->src's predecessors by looking at the wrong block. */
+ tmp_bb = e->src;
+ e = EDGE_PRED (tmp_bb, 0);
+ if (EDGE_COUNT (tmp_bb->preds) > 1
|| e->src == ENTRY_BLOCK_PTR)
break;
}
@@ -2493,7 +2499,7 @@ check_simple_exit (struct loop *loop, edge e, struct niter_desc *desc)
{
basic_block exit_bb;
rtx condition, at;
- edge ei;
+ edge ein;
exit_bb = e->src;
desc->simple_p = false;
@@ -2510,18 +2516,18 @@ check_simple_exit (struct loop *loop, edge e, struct niter_desc *desc)
if (!any_condjump_p (BB_END (exit_bb)))
return;
- ei = exit_bb->succ;
- if (ei == e)
- ei = ei->succ_next;
+ ein = EDGE_SUCC (exit_bb, 0);
+ if (ein == e)
+ ein = EDGE_SUCC (exit_bb, 1);
desc->out_edge = e;
- desc->in_edge = ei;
+ desc->in_edge = ein;
/* Test whether the condition is suitable. */
- if (!(condition = get_condition (BB_END (ei->src), &at, false, false)))
+ if (!(condition = get_condition (BB_END (ein->src), &at, false, false)))
return;
- if (ei->flags & EDGE_FALLTHRU)
+ if (ein->flags & EDGE_FALLTHRU)
{
condition = reversed_condition (condition);
if (!condition)
@@ -2543,13 +2549,14 @@ find_simple_exit (struct loop *loop, struct niter_desc *desc)
edge e;
struct niter_desc act;
bool any = false;
+ edge_iterator ei;
desc->simple_p = false;
body = get_loop_body (loop);
for (i = 0; i < loop->num_nodes; i++)
{
- for (e = body[i]->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, body[i]->succs)
{
if (flow_bb_inside_loop_p (loop, e->dest))
continue;
diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c
index f0e95dc7622..6ea0987e97e 100644
--- a/gcc/loop-unroll.c
+++ b/gcc/loop-unroll.c
@@ -454,7 +454,7 @@ peel_loop_completely (struct loops *loops, struct loop *loop)
sbitmap wont_exit;
unsigned HOST_WIDE_INT npeel;
unsigned n_remove_edges, i;
- edge *remove_edges, ei;
+ edge *remove_edges, ein;
struct niter_desc *desc = get_simple_loop_desc (loop);
struct split_ivs_info *si_info = NULL;
@@ -495,12 +495,12 @@ peel_loop_completely (struct loops *loops, struct loop *loop)
free (remove_edges);
}
- ei = desc->in_edge;
+ ein = desc->in_edge;
free_simple_loop_desc (loop);
/* Now remove the unreachable part of the last iteration and cancel
the loop. */
- remove_path (loops, ei);
+ remove_path (loops, ein);
if (dump_file)
fprintf (dump_file, ";; Peeled loop completely, %d times\n", (int) npeel);
@@ -748,15 +748,15 @@ unroll_loop_constant_iterations (struct loops *loops, struct loop *loop)
basic_block exit_block = desc->in_edge->src->rbi->copy;
/* Find a new in and out edge; they are in the last copy we have made. */
- if (exit_block->succ->dest == desc->out_edge->dest)
+ if (EDGE_SUCC (exit_block, 0)->dest == desc->out_edge->dest)
{
- desc->out_edge = exit_block->succ;
- desc->in_edge = exit_block->succ->succ_next;
+ desc->out_edge = EDGE_SUCC (exit_block, 0);
+ desc->in_edge = EDGE_SUCC (exit_block, 1);
}
else
{
- desc->out_edge = exit_block->succ->succ_next;
- desc->in_edge = exit_block->succ;
+ desc->out_edge = EDGE_SUCC (exit_block, 1);
+ desc->in_edge = EDGE_SUCC (exit_block, 0);
}
}
@@ -1008,11 +1008,11 @@ unroll_loop_runtime_iterations (struct loops *loops, struct loop *loop)
branch_code = compare_and_jump_seq (copy_rtx (niter), GEN_INT (j), EQ,
block_label (preheader), p, NULL_RTX);
- swtch = loop_split_edge_with (swtch->pred, branch_code);
+ swtch = loop_split_edge_with (EDGE_PRED (swtch, 0), branch_code);
set_immediate_dominator (CDI_DOMINATORS, preheader, swtch);
- swtch->succ->probability = REG_BR_PROB_BASE - p;
+ EDGE_SUCC (swtch, 0)->probability = REG_BR_PROB_BASE - p;
e = make_edge (swtch, preheader,
- swtch->succ->flags & EDGE_IRREDUCIBLE_LOOP);
+ EDGE_SUCC (swtch, 0)->flags & EDGE_IRREDUCIBLE_LOOP);
e->probability = p;
}
@@ -1025,11 +1025,11 @@ unroll_loop_runtime_iterations (struct loops *loops, struct loop *loop)
branch_code = compare_and_jump_seq (copy_rtx (niter), const0_rtx, EQ,
block_label (preheader), p, NULL_RTX);
- swtch = loop_split_edge_with (swtch->succ, branch_code);
+ swtch = loop_split_edge_with (EDGE_SUCC (swtch, 0), branch_code);
set_immediate_dominator (CDI_DOMINATORS, preheader, swtch);
- swtch->succ->probability = REG_BR_PROB_BASE - p;
+ EDGE_SUCC (swtch, 0)->probability = REG_BR_PROB_BASE - p;
e = make_edge (swtch, preheader,
- swtch->succ->flags & EDGE_IRREDUCIBLE_LOOP);
+ EDGE_SUCC (swtch, 0)->flags & EDGE_IRREDUCIBLE_LOOP);
e->probability = p;
}
@@ -1061,15 +1061,15 @@ unroll_loop_runtime_iterations (struct loops *loops, struct loop *loop)
basic_block exit_block = desc->in_edge->src->rbi->copy;
/* Find a new in and out edge; they are in the last copy we have made. */
- if (exit_block->succ->dest == desc->out_edge->dest)
+ if (EDGE_SUCC (exit_block, 0)->dest == desc->out_edge->dest)
{
- desc->out_edge = exit_block->succ;
- desc->in_edge = exit_block->succ->succ_next;
+ desc->out_edge = EDGE_SUCC (exit_block, 0);
+ desc->in_edge = EDGE_SUCC (exit_block, 1);
}
else
{
- desc->out_edge = exit_block->succ->succ_next;
- desc->in_edge = exit_block->succ;
+ desc->out_edge = EDGE_SUCC (exit_block, 1);
+ desc->in_edge = EDGE_SUCC (exit_block, 0);
}
}
diff --git a/gcc/loop-unswitch.c b/gcc/loop-unswitch.c
index 2eb3396a759..49608151ff7 100644
--- a/gcc/loop-unswitch.c
+++ b/gcc/loop-unswitch.c
@@ -180,14 +180,14 @@ may_unswitch_on (basic_block bb, struct loop *loop, rtx *cinsn)
enum machine_mode mode;
/* BB must end in a simple conditional jump. */
- if (!bb->succ || !bb->succ->succ_next || bb->succ->succ_next->succ_next)
+ if (EDGE_COUNT (bb->succs) != 2)
return NULL_RTX;
if (!any_condjump_p (BB_END (bb)))
return NULL_RTX;
/* With branches inside loop. */
- if (!flow_bb_inside_loop_p (loop, bb->succ->dest)
- || !flow_bb_inside_loop_p (loop, bb->succ->succ_next->dest))
+ if (!flow_bb_inside_loop_p (loop, EDGE_SUCC (bb, 0)->dest)
+ || !flow_bb_inside_loop_p (loop, EDGE_SUCC (bb, 1)->dest))
return NULL_RTX;
/* It must be executed just once each iteration (because otherwise we
@@ -414,16 +414,15 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on,
/* Some sanity checking. */
if (!flow_bb_inside_loop_p (loop, unswitch_on))
abort ();
- if (!unswitch_on->succ || !unswitch_on->succ->succ_next ||
- unswitch_on->succ->succ_next->succ_next)
+ if (EDGE_COUNT (unswitch_on->succs) != 2)
abort ();
if (!just_once_each_iteration_p (loop, unswitch_on))
abort ();
if (loop->inner)
abort ();
- if (!flow_bb_inside_loop_p (loop, unswitch_on->succ->dest))
+ if (!flow_bb_inside_loop_p (loop, EDGE_SUCC (unswitch_on, 0)->dest))
abort ();
- if (!flow_bb_inside_loop_p (loop, unswitch_on->succ->succ_next->dest))
+ if (!flow_bb_inside_loop_p (loop, EDGE_SUCC (unswitch_on, 1)->dest))
abort ();
entry = loop_preheader_edge (loop);
@@ -444,7 +443,7 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on,
unswitch_on_alt = unswitch_on->rbi->copy;
true_edge = BRANCH_EDGE (unswitch_on_alt);
false_edge = FALLTHRU_EDGE (unswitch_on);
- latch_edge = loop->latch->rbi->copy->succ;
+ latch_edge = EDGE_SUCC (loop->latch->rbi->copy, 0);
/* Create a block with the condition. */
prob = true_edge->probability;
@@ -463,19 +462,19 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on,
if (irred_flag)
{
switch_bb->flags |= BB_IRREDUCIBLE_LOOP;
- switch_bb->succ->flags |= EDGE_IRREDUCIBLE_LOOP;
- switch_bb->succ->succ_next->flags |= EDGE_IRREDUCIBLE_LOOP;
+ EDGE_SUCC (switch_bb, 0)->flags |= EDGE_IRREDUCIBLE_LOOP;
+ EDGE_SUCC (switch_bb, 1)->flags |= EDGE_IRREDUCIBLE_LOOP;
}
else
{
switch_bb->flags &= ~BB_IRREDUCIBLE_LOOP;
- switch_bb->succ->flags &= ~EDGE_IRREDUCIBLE_LOOP;
- switch_bb->succ->succ_next->flags &= ~EDGE_IRREDUCIBLE_LOOP;
+ EDGE_SUCC (switch_bb, 0)->flags &= ~EDGE_IRREDUCIBLE_LOOP;
+ EDGE_SUCC (switch_bb, 1)->flags &= ~EDGE_IRREDUCIBLE_LOOP;
}
/* Loopify from the copy of LOOP body, constructing the new loop. */
nloop = loopify (loops, latch_edge,
- loop->header->rbi->copy->pred, switch_bb, true);
+ EDGE_PRED (loop->header->rbi->copy, 0), switch_bb, true);
/* Remove branches that are now unreachable in new loops. */
remove_path (loops, true_edge);
diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c
index 1207c31aa4f..ea68597cb6c 100644
--- a/gcc/modulo-sched.c
+++ b/gcc/modulo-sched.c
@@ -671,9 +671,9 @@ generate_prolog_epilog (partial_schedule_ptr ps, rtx orig_loop_beg,
rtx orig_loop_bct = NULL_RTX;
/* Loop header edge. */
- e = ps->g->bb->pred;
+ e = EDGE_PRED (ps->g->bb, 0);
if (e->src == ps->g->bb)
- e = e->pred_next;
+ e = EDGE_PRED (ps->g->bb, 1);
/* Generate the prolog, inserting its insns on the loop-entry edge. */
start_sequence ();
@@ -726,9 +726,9 @@ generate_prolog_epilog (partial_schedule_ptr ps, rtx orig_loop_beg,
loop_exit_label_insn = emit_label (loop_exit_label);
}
- e = ps->g->bb->succ;
+ e = EDGE_SUCC (ps->g->bb, 0);
if (e->dest == ps->g->bb)
- e = e->succ_next;
+ e = EDGE_SUCC (ps->g->bb, 1);
e->insns.r = get_insns ();
end_sequence ();
@@ -742,7 +742,7 @@ generate_prolog_epilog (partial_schedule_ptr ps, rtx orig_loop_beg,
basic_block epilog_bb = BLOCK_FOR_INSN (last_epilog_insn);
basic_block precond_bb = BLOCK_FOR_INSN (precond_jump);
basic_block orig_loop_bb = BLOCK_FOR_INSN (precond_exit_label_insn);
- edge epilog_exit_edge = epilog_bb->succ;
+ edge epilog_exit_edge = EDGE_SUCC (epilog_bb, 0);
/* Do loop preconditioning to take care of cases were the loop count is
less than the stage count. Update the CFG properly. */
@@ -851,28 +851,25 @@ sms_schedule (FILE *dump_file)
continue;
/* Check if bb has two successors, one being itself. */
- e = bb->succ;
- if (!e || !e->succ_next || e->succ_next->succ_next)
+ if (EDGE_COUNT (bb->succs) != 2)
continue;
- if (e->dest != bb && e->succ_next->dest != bb)
+ if (EDGE_SUCC (bb, 0)->dest != bb && EDGE_SUCC (bb, 1)->dest != bb)
continue;
- if ((e->flags & EDGE_COMPLEX)
- || (e->succ_next->flags & EDGE_COMPLEX))
+ if ((EDGE_SUCC (bb, 0)->flags & EDGE_COMPLEX)
+ || (EDGE_SUCC (bb, 1)->flags & EDGE_COMPLEX))
continue;
/* Check if bb has two predecessors, one being itself. */
- /* In view of above tests, suffices to check e->pred_next->pred_next? */
- e = bb->pred;
- if (!e || !e->pred_next || e->pred_next->pred_next)
+ if (EDGE_COUNT (bb->preds) != 2)
continue;
- if (e->src != bb && e->pred_next->src != bb)
+ if (EDGE_PRED (bb, 0)->src != bb && EDGE_PRED (bb, 1)->src != bb)
continue;
- if ((e->flags & EDGE_COMPLEX)
- || (e->pred_next->flags & EDGE_COMPLEX))
+ if ((EDGE_PRED (bb, 0)->flags & EDGE_COMPLEX)
+ || (EDGE_PRED (bb, 1)->flags & EDGE_COMPLEX))
continue;
/* For debugging. */
@@ -884,9 +881,9 @@ sms_schedule (FILE *dump_file)
}
get_block_head_tail (bb->index, &head, &tail);
- pre_header_edge = bb->pred;
- if (bb->pred->src != bb)
- pre_header_edge = bb->pred->pred_next;
+ pre_header_edge = EDGE_PRED (bb, 0);
+ if (EDGE_PRED (bb, 0)->src != bb)
+ pre_header_edge = EDGE_PRED (bb, 1);
/* Perfrom SMS only on loops that their average count is above threshold. */
if (bb->count < pre_header_edge->count * SMS_LOOP_AVERAGE_COUNT_THRESHOLD)
@@ -926,9 +923,9 @@ sms_schedule (FILE *dump_file)
if ( !(count_reg = doloop_register_get (tail, &comp)))
continue;
- e = bb->pred;
+ e = EDGE_PRED (bb, 0);
if (e->src == bb)
- pre_header = e->pred_next->src;
+ pre_header = EDGE_PRED (bb, 1)->src;
else
pre_header = e->src;
@@ -987,9 +984,9 @@ sms_schedule (FILE *dump_file)
get_block_head_tail (g->bb->index, &head, &tail);
- pre_header_edge = g->bb->pred;
- if (g->bb->pred->src != g->bb)
- pre_header_edge = g->bb->pred->pred_next;
+ pre_header_edge = EDGE_PRED (g->bb, 0);
+ if (EDGE_PRED (g->bb, 0)->src != g->bb)
+ pre_header_edge = EDGE_PRED (g->bb, 1);
if (stats_file)
{
diff --git a/gcc/optabs.c b/gcc/optabs.c
index abb69700a04..cc0627b1240 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -84,6 +84,12 @@ enum insn_code setcc_gen_code[NUM_RTX_CODE];
enum insn_code movcc_gen_code[NUM_MACHINE_MODES];
#endif
+/* Indexed by the machine mode, gives the insn code for vector conditional
+ operation. */
+
+enum insn_code vcond_gen_code[NUM_MACHINE_MODES];
+enum insn_code vcondu_gen_code[NUM_MACHINE_MODES];
+
/* The insn generating function can not take an rtx_code argument.
TRAP_RTX is used as an rtx argument. Its code is replaced with
the code to be used in the trap insn and all other fields are ignored. */
@@ -116,6 +122,8 @@ static void prepare_float_lib_cmp (rtx *, rtx *, enum rtx_code *,
enum machine_mode *, int *);
static rtx widen_clz (enum machine_mode, rtx, rtx);
static rtx expand_parity (enum machine_mode, rtx, rtx);
+static enum rtx_code get_rtx_code (enum tree_code, bool);
+static rtx vector_compare_rtx (tree, bool, enum insn_code);
#ifndef HAVE_conditional_trap
#define HAVE_conditional_trap 0
@@ -826,11 +834,19 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
force expensive constants into a register. */
if (CONSTANT_P (op0) && optimize
&& rtx_cost (op0, binoptab->code) > COSTS_N_INSNS (1))
- op0 = force_reg (mode, op0);
+ {
+ if (GET_MODE (op0) != VOIDmode)
+ op0 = convert_modes (mode, VOIDmode, op0, unsignedp);
+ op0 = force_reg (mode, op0);
+ }
if (CONSTANT_P (op1) && optimize
&& ! shift_op && rtx_cost (op1, binoptab->code) > COSTS_N_INSNS (1))
- op1 = force_reg (mode, op1);
+ {
+ if (GET_MODE (op1) != VOIDmode)
+ op1 = convert_modes (mode, VOIDmode, op1, unsignedp);
+ op1 = force_reg (mode, op1);
+ }
/* Record where to delete back to if we backtrack. */
last = get_last_insn ();
@@ -2982,7 +2998,6 @@ can_compare_p (enum rtx_code code, enum machine_mode mode,
if (purpose == ccp_store_flag
&& cstore_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
return 1;
-
mode = GET_MODE_WIDER_MODE (mode);
}
while (mode != VOIDmode);
@@ -4649,6 +4664,12 @@ init_optabs (void)
movcc_gen_code[i] = CODE_FOR_nothing;
#endif
+ for (i = 0; i < NUM_MACHINE_MODES; i++)
+ {
+ vcond_gen_code[i] = CODE_FOR_nothing;
+ vcondu_gen_code[i] = CODE_FOR_nothing;
+ }
+
add_optab = init_optab (PLUS);
addv_optab = init_optabv (PLUS);
sub_optab = init_optab (MINUS);
@@ -4992,4 +5013,168 @@ gen_cond_trap (enum rtx_code code ATTRIBUTE_UNUSED, rtx op1,
return insn;
}
+/* Return rtx code for TCODE. Use UNSIGNEDP to select signed
+ or unsigned operation code. */
+
+static enum rtx_code
+get_rtx_code (enum tree_code tcode, bool unsignedp)
+{
+ enum rtx_code code;
+ switch (tcode)
+ {
+ case EQ_EXPR:
+ code = EQ;
+ break;
+ case NE_EXPR:
+ code = NE;
+ break;
+ case LT_EXPR:
+ code = unsignedp ? LTU : LT;
+ break;
+ case LE_EXPR:
+ code = unsignedp ? LEU : LE;
+ break;
+ case GT_EXPR:
+ code = unsignedp ? GTU : GT;
+ break;
+ case GE_EXPR:
+ code = unsignedp ? GEU : GE;
+ break;
+
+ case UNORDERED_EXPR:
+ code = UNORDERED;
+ break;
+ case ORDERED_EXPR:
+ code = ORDERED;
+ break;
+ case UNLT_EXPR:
+ code = UNLT;
+ break;
+ case UNLE_EXPR:
+ code = UNLE;
+ break;
+ case UNGT_EXPR:
+ code = UNGT;
+ break;
+ case UNGE_EXPR:
+ code = UNGE;
+ break;
+ case UNEQ_EXPR:
+ code = UNEQ;
+ break;
+ case LTGT_EXPR:
+ code = LTGT;
+ break;
+
+ default:
+ abort ();
+ }
+ return code;
+}
+
+/* Return comparison rtx for COND. Use UNSIGNEDP to select signed or
+ unsigned operators. Do not generate compare instruction. */
+
+static rtx
+vector_compare_rtx (tree cond, bool unsignedp, enum insn_code icode)
+{
+ enum rtx_code rcode;
+ tree t_op0, t_op1;
+ rtx rtx_op0, rtx_op1;
+
+ if (TREE_CODE_CLASS (TREE_CODE (cond)) != '<')
+ {
+ /* This is unlikely. While generating VEC_COND_EXPR,
+ auto vectorizer ensures that condition is a relational
+ operation. */
+ abort ();
+ }
+ else
+ {
+ rcode = get_rtx_code (TREE_CODE (cond), unsignedp);
+ t_op0 = TREE_OPERAND (cond, 0);
+ t_op1 = TREE_OPERAND (cond, 1);
+ }
+
+ /* Expand operands. */
+ rtx_op0 = expand_expr (t_op0, NULL_RTX, TYPE_MODE (TREE_TYPE (t_op0)), 1);
+ rtx_op1 = expand_expr (t_op1, NULL_RTX, TYPE_MODE (TREE_TYPE (t_op1)), 1);
+
+ if (!(*insn_data[icode].operand[4].predicate) (rtx_op0, GET_MODE (rtx_op0))
+ && GET_MODE (rtx_op0) != VOIDmode)
+ rtx_op0 = force_reg (GET_MODE (rtx_op0), rtx_op0);
+
+ if (!(*insn_data[icode].operand[5].predicate) (rtx_op1, GET_MODE (rtx_op1))
+ && GET_MODE (rtx_op1) != VOIDmode)
+ rtx_op1 = force_reg (GET_MODE (rtx_op1), rtx_op1);
+
+ return gen_rtx_fmt_ee (rcode, VOIDmode, rtx_op0, rtx_op1);
+}
+
+/* Return insn code for VEC_COND_EXPR EXPR. */
+
+static inline enum insn_code
+get_vcond_icode (tree expr, enum machine_mode mode)
+{
+ enum insn_code icode = CODE_FOR_nothing;
+
+ if (TYPE_UNSIGNED (TREE_TYPE (expr)))
+ icode = vcondu_gen_code[mode];
+ else
+ icode = vcond_gen_code[mode];
+ return icode;
+}
+
+/* Return TRUE iff, appropriate vector insns are available
+ for vector cond expr expr in VMODE mode. */
+
+bool
+expand_vec_cond_expr_p (tree expr, enum machine_mode vmode)
+{
+ if (get_vcond_icode (expr, vmode) == CODE_FOR_nothing)
+ return false;
+ return true;
+}
+
+/* Generate insns for VEC_COND_EXPR. */
+
+rtx
+expand_vec_cond_expr (tree vec_cond_expr, rtx target)
+{
+ enum insn_code icode;
+ rtx comparison, rtx_op1, rtx_op2, cc_op0, cc_op1;
+ enum machine_mode mode = TYPE_MODE (TREE_TYPE (vec_cond_expr));
+ bool unsignedp = TYPE_UNSIGNED (TREE_TYPE (vec_cond_expr));
+
+ icode = get_vcond_icode (vec_cond_expr, mode);
+ if (icode == CODE_FOR_nothing)
+ return 0;
+
+ if (!target)
+ target = gen_reg_rtx (mode);
+
+ /* Get comparison rtx. First expand both cond expr operands. */
+ comparison = vector_compare_rtx (TREE_OPERAND (vec_cond_expr, 0),
+ unsignedp, icode);
+ cc_op0 = XEXP (comparison, 0);
+ cc_op1 = XEXP (comparison, 1);
+ /* Expand both operands and force them in reg, if required. */
+ rtx_op1 = expand_expr (TREE_OPERAND (vec_cond_expr, 1),
+ NULL_RTX, VOIDmode, 1);
+ if (!(*insn_data[icode].operand[1].predicate) (rtx_op1, mode)
+ && mode != VOIDmode)
+ rtx_op1 = force_reg (mode, rtx_op1);
+
+ rtx_op2 = expand_expr (TREE_OPERAND (vec_cond_expr, 2),
+ NULL_RTX, VOIDmode, 1);
+ if (!(*insn_data[icode].operand[2].predicate) (rtx_op2, mode)
+ && mode != VOIDmode)
+ rtx_op2 = force_reg (mode, rtx_op2);
+
+ /* Emit instruction! */
+ emit_insn (GEN_FCN (icode) (target, rtx_op1, rtx_op2,
+ comparison, cc_op0, cc_op1));
+
+ return target;
+}
#include "gt-optabs.h"
diff --git a/gcc/optabs.h b/gcc/optabs.h
index 8e895f203c5..2d332e31794 100644
--- a/gcc/optabs.h
+++ b/gcc/optabs.h
@@ -398,6 +398,12 @@ extern enum insn_code setcc_gen_code[NUM_RTX_CODE];
extern enum insn_code movcc_gen_code[NUM_MACHINE_MODES];
#endif
+/* Indexed by the machine mode, gives the insn code for vector conditional
+ operation. */
+
+extern enum insn_code vcond_gen_code[NUM_MACHINE_MODES];
+extern enum insn_code vcondu_gen_code[NUM_MACHINE_MODES];
+
/* This array records the insn_code of insns to perform block moves. */
extern enum insn_code movmem_optab[NUM_MACHINE_MODES];
@@ -498,4 +504,10 @@ extern void expand_float (rtx, rtx, int);
/* Generate code for a FIX_EXPR. */
extern void expand_fix (rtx, rtx, int);
+/* Return tree if target supports vector operations for COND_EXPR. */
+bool expand_vec_cond_expr_p (tree, enum machine_mode);
+
+/* Generate code for VEC_COND_EXPR. */
+extern rtx expand_vec_cond_expr (tree, rtx);
+
#endif /* GCC_OPTABS_H */
diff --git a/gcc/po/ChangeLog b/gcc/po/ChangeLog
index b4e3a759df3..7dfec1d78e3 100644
--- a/gcc/po/ChangeLog
+++ b/gcc/po/ChangeLog
@@ -1,3 +1,7 @@
+2004-09-30 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ * gcc.pot: Regenerate.
+
2004-09-24 Joseph S. Myers <jsm@polyomino.org.uk>
* es.po: Update.
diff --git a/gcc/po/gcc.pot b/gcc/po/gcc.pot
index fa794278fdf..82025b10575 100644
--- a/gcc/po/gcc.pot
+++ b/gcc/po/gcc.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n"
-"POT-Creation-Date: 2004-09-16 07:58+0000\n"
+"POT-Creation-Date: 2004-09-30 22:56+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -36,116 +36,116 @@ msgstr ""
msgid "%qs attribute only applies to function types"
msgstr ""
-#: builtins.c:343
+#: builtins.c:341
msgid "offset outside bounds of constant string"
msgstr ""
-#: builtins.c:927
+#: builtins.c:925
msgid "second arg to %<__builtin_prefetch%> must be a constant"
msgstr ""
-#: builtins.c:934
+#: builtins.c:932
msgid "invalid second arg to __builtin_prefetch; using zero"
msgstr ""
-#: builtins.c:941
+#: builtins.c:939
msgid "third arg to %<__builtin_prefetch%> must be a constant"
msgstr ""
-#: builtins.c:948
+#: builtins.c:946
msgid "invalid third arg to __builtin_prefetch; using zero"
msgstr ""
-#: builtins.c:4150
+#: builtins.c:4161
msgid "argument of %<__builtin_args_info%> must be constant"
msgstr ""
-#: builtins.c:4156
+#: builtins.c:4167
msgid "argument of %<__builtin_args_info%> out of range"
msgstr ""
-#: builtins.c:4162
+#: builtins.c:4173
msgid "missing argument in %<__builtin_args_info%>"
msgstr ""
-#: builtins.c:4178 builtins.c:9263
+#: builtins.c:4189 builtins.c:9153
msgid "%<va_start%> used in function with fixed args"
msgstr ""
-#: builtins.c:4197 builtins.c:9279
+#: builtins.c:4208 builtins.c:9169
msgid "second parameter of %<va_start%> not last named argument"
msgstr ""
#. Evidently an out of date version of <stdarg.h>; can't validate
#. va_start's second argument, but can still work as intended.
-#: builtins.c:4202 builtins.c:9285
+#: builtins.c:4213 builtins.c:9175
msgid "%<__builtin_next_arg%> called without an argument"
msgstr ""
-#: builtins.c:4287 builtins.c:9250
+#: builtins.c:4298
msgid "too many arguments to function %<va_start%>"
msgstr ""
-#: builtins.c:4433
+#: builtins.c:4446
msgid "first argument to %<va_arg%> not of type %<va_list%>"
msgstr ""
#. Unfortunately, this is merely undefined, rather than a constraint
#. violation, so we cannot make this an error. If this call is never
#. executed, the program is still strictly conforming.
-#: builtins.c:4447
+#: builtins.c:4460
msgid "%qT is promoted to %qT when passed through %<...%>"
msgstr ""
-#: builtins.c:4452
+#: builtins.c:4465
msgid "(so you should pass %qT not %qT to %<va_arg%>)"
msgstr ""
#. We can, however, treat "undefined" any way we please.
#. Call abort to encourage the user to fix the program.
-#: builtins.c:4458 c-typeck.c:1950
+#: builtins.c:4471 c-typeck.c:1956
msgid "if this code is reached, the program will abort"
msgstr ""
-#: builtins.c:4576
+#: builtins.c:4589
msgid "invalid arg to %<__builtin_frame_address%>"
msgstr ""
-#: builtins.c:4578
+#: builtins.c:4591
msgid "invalid arg to %<__builtin_return_address%>"
msgstr ""
-#: builtins.c:4592
+#: builtins.c:4605
msgid "unsupported arg to %<__builtin_frame_address%>"
msgstr ""
-#: builtins.c:4594
+#: builtins.c:4607
msgid "unsupported arg to %<__builtin_return_address%>"
msgstr ""
-#: builtins.c:4760
+#: builtins.c:4773
msgid "second arg to %<__builtin_expect%> must be a constant"
msgstr ""
-#: builtins.c:5967
+#: builtins.c:5980
msgid "__builtin_longjmp second argument must be 1"
msgstr ""
-#: builtins.c:6312
+#: builtins.c:6325
msgid "target format does not support infinity"
msgstr ""
-#: builtins.c:8043 builtins.c:8139 c-typeck.c:2179
+#: builtins.c:8001 builtins.c:8097 c-typeck.c:2185
#, c-format
msgid "too few arguments to function %qs"
msgstr ""
-#: builtins.c:8049 builtins.c:8145 c-typeck.c:2038
+#: builtins.c:8007 builtins.c:8103 c-typeck.c:2044
#, c-format
msgid "too many arguments to function %qs"
msgstr ""
-#: builtins.c:8055 builtins.c:8169
+#: builtins.c:8013 builtins.c:8127
#, c-format
msgid "non-floating-point argument to function %qs"
msgstr ""
@@ -161,439 +161,439 @@ msgid ""
"required to support"
msgstr ""
-#: c-common.c:885
+#: c-common.c:898
msgid "overflow in constant expression"
msgstr ""
-#: c-common.c:905
+#: c-common.c:918
msgid "integer overflow in expression"
msgstr ""
-#: c-common.c:914
+#: c-common.c:927
msgid "floating point overflow in expression"
msgstr ""
-#: c-common.c:920
+#: c-common.c:933
msgid "vector overflow in expression"
msgstr ""
#. This detects cases like converting -129 or 256 to unsigned char.
-#: c-common.c:942
+#: c-common.c:955
msgid "large integer implicitly truncated to unsigned type"
msgstr ""
-#: c-common.c:944
+#: c-common.c:957
msgid "negative integer implicitly converted to unsigned type"
msgstr ""
-#: c-common.c:1002
+#: c-common.c:1015
msgid "overflow in implicit constant conversion"
msgstr ""
-#: c-common.c:1138
+#: c-common.c:1151
#, c-format
msgid "operation on %qs may be undefined"
msgstr ""
-#: c-common.c:1431
+#: c-common.c:1437
msgid "case label does not reduce to an integer constant"
msgstr ""
-#: c-common.c:1474
+#: c-common.c:1480
msgid "case label value is less than minimum value for type"
msgstr ""
-#: c-common.c:1482
+#: c-common.c:1488
msgid "case label value exceeds maximum value for type"
msgstr ""
-#: c-common.c:1490
+#: c-common.c:1496
msgid "lower value in case label range less than minimum value for type"
msgstr ""
-#: c-common.c:1499
+#: c-common.c:1505
msgid "upper value in case label range exceeds maximum value for type"
msgstr ""
-#: c-common.c:1815
+#: c-common.c:1821
msgid "invalid truth-value expression"
msgstr ""
-#: c-common.c:1866
+#: c-common.c:1872
#, c-format
msgid "invalid operands to binary %s"
msgstr ""
-#: c-common.c:2109
+#: c-common.c:2115
msgid "comparison is always false due to limited range of data type"
msgstr ""
-#: c-common.c:2111
+#: c-common.c:2117
msgid "comparison is always true due to limited range of data type"
msgstr ""
-#: c-common.c:2181
+#: c-common.c:2187
msgid "comparison of unsigned expression >= 0 is always true"
msgstr ""
-#: c-common.c:2190
+#: c-common.c:2196
msgid "comparison of unsigned expression < 0 is always false"
msgstr ""
-#: c-common.c:2232
+#: c-common.c:2238
msgid "pointer of type %<void *%> used in arithmetic"
msgstr ""
-#: c-common.c:2238
+#: c-common.c:2244
msgid "pointer to a function used in arithmetic"
msgstr ""
-#: c-common.c:2244
+#: c-common.c:2250
msgid "pointer to member function used in arithmetic"
msgstr ""
#. Common Ada/Pascal programmer's mistake. We always warn
#. about this since it is so bad.
-#: c-common.c:2352
+#: c-common.c:2358
msgid "the address of %qD, will always evaluate as %<true%>"
msgstr ""
-#: c-common.c:2448
+#: c-common.c:2454
msgid "suggest parentheses around assignment used as truth value"
msgstr ""
-#: c-common.c:2497 c-common.c:2537
+#: c-common.c:2503 c-common.c:2543
msgid "invalid use of %<restrict%>"
msgstr ""
-#: c-common.c:2752
+#: c-common.c:2758
msgid "invalid application of %<sizeof%> to a function type"
msgstr ""
-#: c-common.c:2762
+#: c-common.c:2768
#, c-format
msgid "invalid application of %qs to a void type"
msgstr ""
-#: c-common.c:2768
+#: c-common.c:2774
msgid "invalid application of %qs to incomplete type %qT "
msgstr ""
-#: c-common.c:2809
+#: c-common.c:2815
msgid "%<__alignof%> applied to a bit-field"
msgstr ""
-#: c-common.c:3252
+#: c-common.c:3258
#, c-format
msgid "cannot disable built-in function %qs"
msgstr ""
-#: c-common.c:3512
+#: c-common.c:3518
msgid "pointers are not permitted as case values"
msgstr ""
-#: c-common.c:3516
+#: c-common.c:3522
msgid "range expressions in switch statements are non-standard"
msgstr ""
-#: c-common.c:3541
+#: c-common.c:3547
msgid "empty range specified"
msgstr ""
-#: c-common.c:3600
+#: c-common.c:3606
msgid "duplicate (or overlapping) case value"
msgstr ""
-#: c-common.c:3601
+#: c-common.c:3607
msgid "%Jthis is the first entry overlapping that value"
msgstr ""
-#: c-common.c:3605
+#: c-common.c:3611
msgid "duplicate case value"
msgstr ""
-#: c-common.c:3606
+#: c-common.c:3612
msgid "%Jpreviously used here"
msgstr ""
-#: c-common.c:3610
+#: c-common.c:3616
msgid "multiple default labels in one switch"
msgstr ""
-#: c-common.c:3611
+#: c-common.c:3617
msgid "%Jthis is the first default label"
msgstr ""
-#: c-common.c:3660
+#: c-common.c:3666
msgid "%Jcase value %qs not in enumerated type"
msgstr ""
-#: c-common.c:3663
+#: c-common.c:3669
msgid "%Jcase value %qs not in enumerated type %qT"
msgstr ""
-#: c-common.c:3730
+#: c-common.c:3736
msgid "%Hswitch missing default case"
msgstr ""
#. Warn if there are enumerators that don't correspond to
#. case expressions.
-#: c-common.c:3764
+#: c-common.c:3770
msgid "%Henumeration value %qE not handled in switch"
msgstr ""
-#: c-common.c:3791
+#: c-common.c:3797
msgid "taking the address of a label is non-standard"
msgstr ""
-#: c-common.c:3960 c-common.c:3979 c-common.c:3997 c-common.c:4024
-#: c-common.c:4043 c-common.c:4066 c-common.c:4090 c-common.c:4116
-#: c-common.c:4150 c-common.c:4194 c-common.c:4222 c-common.c:4250
-#: c-common.c:4269 c-common.c:4581 c-common.c:4612 c-common.c:4698
-#: c-common.c:4765 c-common.c:4811 c-common.c:4869 c-common.c:4898
-#: c-common.c:5177 c-common.c:5200 c-common.c:5239 tree.c:3075
+#: c-common.c:3966 c-common.c:3985 c-common.c:4003 c-common.c:4030
+#: c-common.c:4049 c-common.c:4072 c-common.c:4096 c-common.c:4122
+#: c-common.c:4156 c-common.c:4200 c-common.c:4228 c-common.c:4256
+#: c-common.c:4275 c-common.c:4587 c-common.c:4618 c-common.c:4704
+#: c-common.c:4771 c-common.c:4817 c-common.c:4875 c-common.c:4904
+#: c-common.c:5183 c-common.c:5206 c-common.c:5245 tree.c:3142
#, c-format
msgid "%qs attribute ignored"
msgstr ""
-#: c-common.c:4304
+#: c-common.c:4310
msgid "unknown machine mode %<%s%>"
msgstr ""
-#: c-common.c:4324
+#: c-common.c:4330
msgid "specifying vector types with __attribute__ ((mode)) is deprecated"
msgstr ""
-#: c-common.c:4326
+#: c-common.c:4332
msgid "use __attribute__ ((vector_size)) instead"
msgstr ""
-#: c-common.c:4335
+#: c-common.c:4341
msgid "unable to emulate %<%s%>"
msgstr ""
-#: c-common.c:4345
+#: c-common.c:4351
msgid "invalid pointer mode %<%s%>"
msgstr ""
-#: c-common.c:4360
+#: c-common.c:4366
msgid "no data type for mode %<%s%>"
msgstr ""
-#: c-common.c:4370
+#: c-common.c:4376
#, c-format
msgid "cannot use mode %qs for enumeral types"
msgstr ""
-#: c-common.c:4409
+#: c-common.c:4415
msgid "%Jsection attribute cannot be specified for local variables"
msgstr ""
-#: c-common.c:4420
+#: c-common.c:4426
msgid "%Jsection of %qD conflicts with previous declaration"
msgstr ""
-#: c-common.c:4429
+#: c-common.c:4435
msgid "%Jsection attribute not allowed for %qD"
msgstr ""
-#: c-common.c:4435
+#: c-common.c:4441
msgid "%Jsection attributes are not supported for this target"
msgstr ""
-#: c-common.c:4473
+#: c-common.c:4479
msgid "requested alignment is not a constant"
msgstr ""
-#: c-common.c:4478
+#: c-common.c:4484
msgid "requested alignment is not a power of 2"
msgstr ""
-#: c-common.c:4483
+#: c-common.c:4489
msgid "requested alignment is too large"
msgstr ""
-#: c-common.c:4509
+#: c-common.c:4515
msgid "%Jalignment may not be specified for %qD"
msgstr ""
-#: c-common.c:4547
+#: c-common.c:4553
msgid "%J%qD defined both normally and as an alias"
msgstr ""
-#: c-common.c:4563
+#: c-common.c:4569
msgid "alias arg not a string"
msgstr ""
-#: c-common.c:4605
+#: c-common.c:4611
#, c-format
msgid "%qs attribute ignored on non-class types"
msgstr ""
-#: c-common.c:4618
+#: c-common.c:4624
msgid "visibility arg not a string"
msgstr ""
-#: c-common.c:4639
+#: c-common.c:4645
msgid ""
"visibility arg must be one of \"default\", \"hidden\", \"protected\" or "
"\"internal\""
msgstr ""
-#: c-common.c:4708
+#: c-common.c:4714
msgid "tls_model arg not a string"
msgstr ""
-#: c-common.c:4717
+#: c-common.c:4723
msgid ""
"tls_model arg must be one of \"local-exec\", \"initial-exec\", \"local-"
"dynamic\" or \"global-dynamic\""
msgstr ""
-#: c-common.c:4739 c-common.c:4785
+#: c-common.c:4745 c-common.c:4791
msgid "%J%qE attribute applies only to functions"
msgstr ""
-#: c-common.c:4744 c-common.c:4790
+#: c-common.c:4750 c-common.c:4796
msgid "%Jcan%'t set %qE attribute after definition"
msgstr ""
-#: c-common.c:4866
+#: c-common.c:4872
#, c-format
msgid "%qs attribute ignored for %qs"
msgstr ""
-#: c-common.c:4927
+#: c-common.c:4933
#, c-format
msgid "invalid vector type for attribute %qs"
msgstr ""
-#: c-common.c:4936
+#: c-common.c:4942
msgid "number of components of the vector not a power of two"
msgstr ""
-#: c-common.c:4964
+#: c-common.c:4970
msgid "nonnull attribute without arguments on a non-prototype"
msgstr ""
-#: c-common.c:4979
+#: c-common.c:4985
#, c-format
msgid "nonnull argument has invalid operand number (arg %lu)"
msgstr ""
-#: c-common.c:4998
+#: c-common.c:5004
#, c-format
msgid ""
"nonnull argument with out-of-range operand number (arg %lu, operand %lu)"
msgstr ""
-#: c-common.c:5006
+#: c-common.c:5012
#, c-format
msgid "nonnull argument references non-pointer operand (arg %lu, operand %lu)"
msgstr ""
-#: c-common.c:5061 c-common.c:5098
+#: c-common.c:5067 c-common.c:5104
msgid "missing sentinel in function call"
msgstr ""
-#: c-common.c:5084
+#: c-common.c:5090
msgid "not enough arguments to fit a sentinel"
msgstr ""
-#: c-common.c:5140
+#: c-common.c:5146
#, c-format
msgid "null argument where non-null required (arg %lu)"
msgstr ""
-#: c-common.c:5211
+#: c-common.c:5217
msgid "cleanup arg not an identifier"
msgstr ""
-#: c-common.c:5218
+#: c-common.c:5224
msgid "cleanup arg not a function"
msgstr ""
-#: c-common.c:5256
+#: c-common.c:5262
#, c-format
msgid "%qs attribute requires prototypes with named arguments"
msgstr ""
-#: c-common.c:5267
+#: c-common.c:5273
#, c-format
msgid "%qs attribute only applies to variadic functions"
msgstr ""
-#: c-common.c:5280
+#: c-common.c:5286
msgid "requested position is not an integer constant"
msgstr ""
-#: c-common.c:5287
+#: c-common.c:5293
msgid "requested position is less than zero"
msgstr ""
-#: c-common.c:5474
+#: c-common.c:5480
#, c-format
msgid "%s at end of input"
msgstr ""
-#: c-common.c:5480
+#: c-common.c:5486
#, c-format
msgid "%s before %s'%c'"
msgstr ""
-#: c-common.c:5482
+#: c-common.c:5488
#, c-format
msgid "%s before %s'\\x%x'"
msgstr ""
-#: c-common.c:5486
+#: c-common.c:5492
#, c-format
msgid "%s before string constant"
msgstr ""
-#: c-common.c:5488
+#: c-common.c:5494
#, c-format
msgid "%s before numeric constant"
msgstr ""
-#: c-common.c:5490
+#: c-common.c:5496
#, c-format
msgid "%s before \"%s\""
msgstr ""
-#: c-common.c:5492
+#: c-common.c:5498
#, c-format
msgid "%s before %qs token"
msgstr ""
#. Use `%s' to print the string in case there are any escape
#. characters in the message.
-#: c-common.c:5494 c-typeck.c:2696 c-typeck.c:3949 c-typeck.c:3964
-#: c-typeck.c:3979 final.c:2839 final.c:2841 gcc.c:4647 rtl-error.c:113
-#: toplev.c:605 config/cris/cris.c:568 cp/parser.c:2086 cp/typeck.c:4136
-#: java/expr.c:368 java/verify.c:1552 java/verify.c:1553 java/verify.c:1572
+#: c-common.c:5500 c-typeck.c:3994 c-typeck.c:4009 c-typeck.c:4024
+#: final.c:2840 final.c:2842 gcc.c:4647 rtl-error.c:113 toplev.c:599
+#: config/cris/cris.c:568 cp/parser.c:1924 cp/typeck.c:4160 java/expr.c:368
+#: java/verify.c:1552 java/verify.c:1553 java/verify.c:1572
#, c-format
msgid "%s"
msgstr ""
-#: c-common.c:5554
+#: c-common.c:5560
msgid ""
"%Hignoring return value of %qD, declared with attribute warn_unused_result"
msgstr ""
-#: c-common.c:5558
+#: c-common.c:5564
msgid ""
"%Hignoring return value of function declared with attribute "
"warn_unused_result"
msgstr ""
-#: c-common.c:5597
+#: c-common.c:5603
#, c-format
msgid "attempt to take address of bit-field structure member %qs"
msgstr ""
-#: c-convert.c:83 c-typeck.c:1334 c-typeck.c:3393 cp/typeck.c:1376
-#: cp/typeck.c:5657 fortran/convert.c:89 treelang/tree-convert.c:79
+#: c-convert.c:83 c-typeck.c:1352 c-typeck.c:3438 cp/typeck.c:1376
+#: cp/typeck.c:5706 fortran/convert.c:89 treelang/tree-convert.c:79
msgid "void value not ignored as it ought to be"
msgstr ""
@@ -685,937 +685,992 @@ msgstr ""
msgid "%Jbuilt-in function %qD declared as non-function"
msgstr ""
-#: c-decl.c:1143 c-decl.c:1238 c-decl.c:1803
+#: c-decl.c:1143 c-decl.c:1247 c-decl.c:1816
msgid "%Jdeclaration of %qD shadows a built-in function"
msgstr ""
+#: c-decl.c:1152
+msgid "%Jredeclaration of enumerator %qD"
+msgstr ""
+
#. If types don't match for a built-in, throw away the
#. built-in. No point in calling locate_old_decl here, it
#. won't print anything.
-#: c-decl.c:1164
+#: c-decl.c:1173
msgid "%Jconflicting types for built-in function %qD"
msgstr ""
-#: c-decl.c:1188 c-decl.c:1199
+#: c-decl.c:1197 c-decl.c:1208
msgid "%Jconflicting types for %qD"
msgstr ""
-#: c-decl.c:1197
+#: c-decl.c:1206
msgid "%J conflicting type qualifiers for %qD"
msgstr ""
#. Allow OLDDECL to continue in use.
-#: c-decl.c:1214
+#: c-decl.c:1223
msgid "%Jredefinition of typedef %qD"
msgstr ""
-#: c-decl.c:1253 c-decl.c:1331
+#: c-decl.c:1262 c-decl.c:1340
msgid "%Jredefinition of %qD"
msgstr ""
-#: c-decl.c:1288 c-decl.c:1369
+#: c-decl.c:1297 c-decl.c:1378
msgid "%Jstatic declaration of %qD follows non-static declaration"
msgstr ""
-#: c-decl.c:1298 c-decl.c:1305 c-decl.c:1358 c-decl.c:1366
+#: c-decl.c:1307 c-decl.c:1314 c-decl.c:1367 c-decl.c:1375
msgid "%Jnon-static declaration of %qD follows static declaration"
msgstr ""
-#: c-decl.c:1318
+#: c-decl.c:1327
msgid "%Jthread-local declaration of %qD follows non-thread-local declaration"
msgstr ""
-#: c-decl.c:1321
+#: c-decl.c:1330
msgid "%Jnon-thread-local declaration of %qD follows thread-local declaration"
msgstr ""
-#: c-decl.c:1351
+#: c-decl.c:1360
msgid "%Jextern declaration of %qD follows declaration with no linkage"
msgstr ""
-#: c-decl.c:1387
+#: c-decl.c:1396
msgid "%Jdeclaration of %qD with no linkage follows extern declaration"
msgstr ""
-#: c-decl.c:1393
+#: c-decl.c:1402
msgid "%Jredeclaration of %qD with no linkage"
msgstr ""
-#: c-decl.c:1407
+#: c-decl.c:1416
msgid ""
"%Jredeclaration of %qD with different visibility (old visibility preserved)"
msgstr ""
-#: c-decl.c:1418
+#: c-decl.c:1427
msgid "%Jinline declaration of %qD follows declaration with attribute noinline"
msgstr ""
-#: c-decl.c:1425
+#: c-decl.c:1434
msgid ""
"%Jdeclaration of %qD with attribute noinline follows inline declaration "
msgstr ""
-#: c-decl.c:1440
+#: c-decl.c:1449
msgid "%J%qD declared inline after being called"
msgstr ""
-#: c-decl.c:1446
+#: c-decl.c:1455
msgid "%J%qD declared inline after its definition"
msgstr ""
-#: c-decl.c:1466
+#: c-decl.c:1475
msgid "%Jredefinition of parameter %qD"
msgstr ""
-#: c-decl.c:1490
+#: c-decl.c:1499
msgid "%Jredundant redeclaration of %qD"
msgstr ""
-#: c-decl.c:1796
+#: c-decl.c:1809
msgid "%Jdeclaration of %qD shadows a parameter"
msgstr ""
-#: c-decl.c:1799
+#: c-decl.c:1812
msgid "%Jdeclaration of %qD shadows a global declaration"
msgstr ""
-#: c-decl.c:1806
+#: c-decl.c:1819
msgid "%Jdeclaration of %qD shadows a previous local"
msgstr ""
-#: c-decl.c:1811 cp/name-lookup.c:1011 cp/name-lookup.c:1042
+#: c-decl.c:1824 cp/name-lookup.c:1011 cp/name-lookup.c:1042
#: cp/name-lookup.c:1050
msgid "%Jshadowed declaration is here"
msgstr ""
-#: c-decl.c:1965
+#: c-decl.c:1978
msgid "nested extern declaration of %qD"
msgstr ""
-#: c-decl.c:2054
+#: c-decl.c:2067
msgid "nested static declaration of %qD"
msgstr ""
-#: c-decl.c:2149
+#: c-decl.c:2162
#, c-format
msgid "implicit declaration of function %qE"
msgstr ""
-#: c-decl.c:2205
+#: c-decl.c:2220
msgid "incompatible implicit declaration of built-in function %qD"
msgstr ""
-#: c-decl.c:2214
+#: c-decl.c:2229
msgid "incompatible implicit declaration of function %qD"
msgstr ""
-#: c-decl.c:2264
+#: c-decl.c:2282
#, c-format
msgid "%qE undeclared here (not in a function)"
msgstr ""
-#: c-decl.c:2269
+#: c-decl.c:2287
#, c-format
msgid "%qE undeclared (first use in this function)"
msgstr ""
-#: c-decl.c:2273
+#: c-decl.c:2291
msgid "(Each undeclared identifier is reported only once"
msgstr ""
-#: c-decl.c:2274
+#: c-decl.c:2292
msgid "for each function it appears in.)"
msgstr ""
-#: c-decl.c:2312
+#: c-decl.c:2330
#, c-format
msgid "label %qs referenced outside of any function"
msgstr ""
-#: c-decl.c:2355
+#: c-decl.c:2373
#, c-format
msgid "duplicate label declaration %qs"
msgstr ""
-#: c-decl.c:2390
+#: c-decl.c:2408
msgid "%Hduplicate label %qD"
msgstr ""
-#: c-decl.c:2412
+#: c-decl.c:2430
msgid ""
"%Htraditional C lacks a separate namespace for labels, identifier %qs "
"conflicts"
msgstr ""
-#: c-decl.c:2478
+#: c-decl.c:2496
msgid "%H%qs defined as wrong kind of tag"
msgstr ""
-#: c-decl.c:2703
+#: c-decl.c:2721
msgid "unnamed struct/union that defines no instances"
msgstr ""
-#: c-decl.c:2722 c-decl.c:2729
+#: c-decl.c:2740 c-decl.c:2747
msgid "useless type name in empty declaration"
msgstr ""
-#: c-decl.c:2739
-msgid ""
-"long, short, signed, unsigned or complex used invalidly in empty declaration"
-msgstr ""
-
-#: c-decl.c:2746
+#: c-decl.c:2753
msgid "%<inline%> in empty declaration"
msgstr ""
-#: c-decl.c:2752
+#: c-decl.c:2759
msgid "%<auto%> in file-scope empty declaration"
msgstr ""
-#: c-decl.c:2758
+#: c-decl.c:2765
msgid "%<register%> in file-scope empty declaration"
msgstr ""
-#: c-decl.c:2764
+#: c-decl.c:2771
msgid "useless storage class specifier in empty declaration"
msgstr ""
-#: c-decl.c:2770
+#: c-decl.c:2777
msgid "useless %<__thread%> in empty declaration"
msgstr ""
-#: c-decl.c:2778
+#: c-decl.c:2785
msgid "useless type qualifier in empty declaration"
msgstr ""
-#: c-decl.c:2784
-msgid "useless keyword or type name in empty declaration"
-msgstr ""
-
-#: c-decl.c:2791 c-parse.y:782 c-parse.y:784 objc/objc-parse.y:820
-#: objc/objc-parse.y:822
+#: c-decl.c:2792 c-parse.y:787 c-parse.y:789 objc/objc-parse.y:825
+#: objc/objc-parse.y:827
msgid "empty declaration"
msgstr ""
-#: c-decl.c:2854
+#: c-decl.c:2858
msgid ""
"ISO C90 does not support %<static%> or type qualifiers in parameter array "
"declarators"
msgstr ""
-#: c-decl.c:2857
+#: c-decl.c:2861
msgid "ISO C90 does not support %<[*]%> array declarators"
msgstr ""
-#: c-decl.c:2860
+#: c-decl.c:2864
msgid "GCC does not yet properly implement %<[*]%> array declarators"
msgstr ""
-#: c-decl.c:2879
+#: c-decl.c:2883
msgid "static or type qualifiers in abstract declarator"
msgstr ""
-#: c-decl.c:2936
+#: c-decl.c:2940
msgid "%J%qD is usually a function"
msgstr ""
-#: c-decl.c:2945
+#: c-decl.c:2949
msgid "typedef %qD is initialized (use __typeof__ instead)"
msgstr ""
-#: c-decl.c:2950
+#: c-decl.c:2954
msgid "function %qD is initialized like a variable"
msgstr ""
#. DECL_INITIAL in a PARM_DECL is really DECL_ARG_TYPE.
-#: c-decl.c:2956
+#: c-decl.c:2960
msgid "parameter %qD is initialized"
msgstr ""
-#: c-decl.c:2975 c-typeck.c:4229
+#. Although C99 is unclear about whether incomplete arrays
+#. of VLAs themselves count as VLAs, it does not make
+#. sense to permit them to be initialized given that
+#. ordinary VLAs may not be initialized.
+#: c-decl.c:2979 c-decl.c:2999 c-typeck.c:4274
msgid "variable-sized object may not be initialized"
msgstr ""
-#: c-decl.c:2981
+#: c-decl.c:2985
msgid "variable %qD has initializer but incomplete type"
msgstr ""
-#: c-decl.c:2986
+#: c-decl.c:2990
msgid "elements of array %qD have incomplete type"
msgstr ""
-#: c-decl.c:3053 c-decl.c:5774
+#: c-decl.c:3066 c-decl.c:5643
msgid "%Jinline function %qD given attribute noinline"
msgstr ""
-#: c-decl.c:3120
+#: c-decl.c:3134
msgid "%Jinitializer fails to determine size of %qD"
msgstr ""
-#: c-decl.c:3125
+#: c-decl.c:3139
msgid "%Jarray size missing in %qD"
msgstr ""
-#: c-decl.c:3141
+#: c-decl.c:3155
msgid "%Jzero or negative size array %qD"
msgstr ""
-#: c-decl.c:3167 varasm.c:1523
+#: c-decl.c:3181 varasm.c:1523
msgid "%Jstorage size of %qD isn%'t known"
msgstr ""
-#: c-decl.c:3177
+#: c-decl.c:3191
msgid "%Jstorage size of %qD isn%'t constant"
msgstr ""
-#: c-decl.c:3232
+#: c-decl.c:3246
msgid "%Jignoring asm-specifier for non-static local variable %qD"
msgstr ""
-#: c-decl.c:3262 fortran/f95-lang.c:646
+#: c-decl.c:3276 fortran/f95-lang.c:646
msgid "cannot put object with volatile field into register"
msgstr ""
-#: c-decl.c:3396
+#: c-decl.c:3410
msgid "ISO C forbids forward parameter declarations"
msgstr ""
-#: c-decl.c:3575
+#: c-decl.c:3594
msgid "<anonymous>"
msgstr ""
-#: c-decl.c:3584
+#: c-decl.c:3603
#, c-format
msgid "bit-field %qs width not an integer constant"
msgstr ""
-#: c-decl.c:3592
+#: c-decl.c:3611
#, c-format
msgid "negative width in bit-field %qs"
msgstr ""
-#: c-decl.c:3597
+#: c-decl.c:3616
#, c-format
msgid "zero width for bit-field %qs"
msgstr ""
-#: c-decl.c:3607
+#: c-decl.c:3626
#, c-format
msgid "bit-field %qs has invalid type"
msgstr ""
-#: c-decl.c:3616
+#: c-decl.c:3635
#, c-format
msgid "type of bit-field %qs is a GCC extension"
msgstr ""
-#: c-decl.c:3625
+#: c-decl.c:3644
#, c-format
msgid "width of %qs exceeds its type"
msgstr ""
-#: c-decl.c:3638
+#: c-decl.c:3657
#, c-format
msgid "%qs is narrower than values of its type"
msgstr ""
-#: c-decl.c:3775
+#: c-decl.c:3782
msgid "type defaults to %<int%> in declaration of %qs"
msgstr ""
-#: c-decl.c:3804
-#, c-format
-msgid "both long and short specified for %qs"
-msgstr ""
-
-#: c-decl.c:3808
-#, c-format
-msgid "long or short specified with char for %qs"
-msgstr ""
-
-#: c-decl.c:3815
-#, c-format
-msgid "long or short specified with floating type for %qs"
-msgstr ""
-
-#: c-decl.c:3818
-msgid "the only valid combination is %<long double%>"
-msgstr ""
-
-#: c-decl.c:3824
-#, c-format
-msgid "both signed and unsigned specified for %qs"
-msgstr ""
-
-#: c-decl.c:3826
-#, c-format
-msgid "long, short, signed or unsigned invalid for %qs"
-msgstr ""
-
-#: c-decl.c:3833
-#, c-format
-msgid "long, short, signed or unsigned used invalidly for %qs"
-msgstr ""
-
-#: c-decl.c:3851
-#, c-format
-msgid "complex invalid for %qs"
-msgstr ""
-
-#: c-decl.c:3893
-msgid "ISO C90 does not support complex types"
-msgstr ""
-
-#: c-decl.c:3905
-msgid "ISO C does not support plain %<complex%> meaning %<double complex%>"
-msgstr ""
-
-#: c-decl.c:3912 c-decl.c:3924
-msgid "ISO C does not support complex integer types"
-msgstr ""
-
-#: c-decl.c:3951
+#: c-decl.c:3814
msgid "duplicate %<const%>"
msgstr ""
-#: c-decl.c:3953
+#: c-decl.c:3816
msgid "duplicate %<restrict%>"
msgstr ""
-#: c-decl.c:3955
+#: c-decl.c:3818
msgid "duplicate %<volatile%>"
msgstr ""
-#: c-decl.c:3974
+#: c-decl.c:3837
msgid "function definition declared %<auto%>"
msgstr ""
-#: c-decl.c:3976
+#: c-decl.c:3839
msgid "function definition declared %<register%>"
msgstr ""
-#: c-decl.c:3978
+#: c-decl.c:3841
msgid "function definition declared %<typedef%>"
msgstr ""
-#: c-decl.c:3980
+#: c-decl.c:3843
msgid "function definition declared %<__thread%>"
msgstr ""
-#: c-decl.c:3996
+#: c-decl.c:3859
#, c-format
msgid "storage class specified for structure field %qs"
msgstr ""
-#: c-decl.c:4000
+#: c-decl.c:3863
#, c-format
msgid "storage class specified for parameter %qs"
msgstr ""
-#: c-decl.c:4003 cp/decl.c:6962
+#: c-decl.c:3866 cp/decl.c:7044
msgid "storage class specified for typename"
msgstr ""
-#: c-decl.c:4016
+#: c-decl.c:3879
msgid "%qs initialized and declared %<extern%>"
msgstr ""
-#: c-decl.c:4018
+#: c-decl.c:3881
msgid "%qs has both %<extern%> and initializer"
msgstr ""
-#: c-decl.c:4023
+#: c-decl.c:3886
msgid "file-scope declaration of %qs specifies %<auto%>"
msgstr ""
-#: c-decl.c:4025
+#: c-decl.c:3888
msgid "file-scope declaration of %qs specifies %<register%>"
msgstr ""
-#: c-decl.c:4030
+#: c-decl.c:3893
msgid "nested function %qs declared %<extern%>"
msgstr ""
-#: c-decl.c:4033
+#: c-decl.c:3896
msgid "function-scope %qs implicitly auto and declared %<__thread%>"
msgstr ""
#. Only the innermost declarator (making a parameter be of
#. array type which is converted to pointer type)
#. may have static or type qualifiers.
-#: c-decl.c:4074 c-decl.c:4268
+#: c-decl.c:3937 c-decl.c:4131
msgid "static or type qualifiers in non-parameter array declarator"
msgstr ""
-#: c-decl.c:4120
+#: c-decl.c:3983
#, c-format
msgid "declaration of %qs as array of voids"
msgstr ""
-#: c-decl.c:4126
+#: c-decl.c:3989
#, c-format
msgid "declaration of %qs as array of functions"
msgstr ""
-#: c-decl.c:4131
+#: c-decl.c:3994
msgid "invalid use of structure with flexible array member"
msgstr ""
-#: c-decl.c:4151
+#: c-decl.c:4014
#, c-format
msgid "size of array %qs has non-integer type"
msgstr ""
-#: c-decl.c:4156
+#: c-decl.c:4019
#, c-format
msgid "ISO C forbids zero-size array %qs"
msgstr ""
-#: c-decl.c:4163
+#: c-decl.c:4026
#, c-format
msgid "size of array %qs is negative"
msgstr ""
-#: c-decl.c:4177
+#: c-decl.c:4040
msgid "ISO C90 forbids array %qs whose size can%'t be evaluated"
msgstr ""
-#: c-decl.c:4181
+#: c-decl.c:4044
#, c-format
msgid "ISO C90 forbids variable-size array %qs"
msgstr ""
-#: c-decl.c:4214 c-decl.c:4383
+#: c-decl.c:4077 c-decl.c:4246
#, c-format
msgid "size of array %qs is too large"
msgstr ""
-#: c-decl.c:4227
+#: c-decl.c:4090
msgid "ISO C90 does not support flexible array members"
msgstr ""
-#: c-decl.c:4236
+#: c-decl.c:4099
msgid "array type has incomplete element type"
msgstr ""
-#: c-decl.c:4300
+#: c-decl.c:4163
#, c-format
msgid "%qs declared as function returning a function"
msgstr ""
-#: c-decl.c:4305
+#: c-decl.c:4168
#, c-format
msgid "%qs declared as function returning an array"
msgstr ""
-#: c-decl.c:4325
+#: c-decl.c:4188
msgid "function definition has qualified void return type"
msgstr ""
-#: c-decl.c:4327
+#: c-decl.c:4190
msgid "type qualifiers ignored on function return type"
msgstr ""
-#: c-decl.c:4356 c-decl.c:4396 c-decl.c:4491 c-decl.c:4578
+#: c-decl.c:4219 c-decl.c:4259 c-decl.c:4353 c-decl.c:4440
msgid "ISO C forbids qualified function types"
msgstr ""
-#: c-decl.c:4405
+#: c-decl.c:4267
msgid "%Jtypedef %qD declared %<inline%>"
msgstr ""
-#: c-decl.c:4435
+#: c-decl.c:4297
msgid "ISO C forbids const or volatile function types"
msgstr ""
-#: c-decl.c:4455
+#: c-decl.c:4317
#, c-format
msgid "variable or field %qs declared void"
msgstr ""
-#: c-decl.c:4484
+#: c-decl.c:4346
msgid "attributes in parameter array declarator ignored"
msgstr ""
-#: c-decl.c:4519
+#: c-decl.c:4381
msgid "%Jparameter %qD declared %<inline%>"
msgstr ""
-#: c-decl.c:4532
+#: c-decl.c:4394
#, c-format
msgid "field %qs declared as a function"
msgstr ""
-#: c-decl.c:4538
+#: c-decl.c:4400
#, c-format
msgid "field %qs has incomplete type"
msgstr ""
-#: c-decl.c:4555 c-decl.c:4566 c-decl.c:4569
+#: c-decl.c:4417 c-decl.c:4428 c-decl.c:4431
#, c-format
msgid "invalid storage class for function %qs"
msgstr ""
-#: c-decl.c:4584
+#: c-decl.c:4446
msgid "%<noreturn%> function returns non-void value"
msgstr ""
-#: c-decl.c:4612
+#: c-decl.c:4474
msgid "cannot inline function %<main%>"
msgstr ""
-#: c-decl.c:4669
+#: c-decl.c:4531
msgid "variable previously declared %<static%> redeclared %<extern%>"
msgstr ""
-#: c-decl.c:4678
+#: c-decl.c:4540
msgid "%Jvariable %qD declared %<inline%>"
msgstr ""
#. A mere warning is sure to result in improper semantics
#. at runtime. Don't bother to allow this to compile.
-#: c-decl.c:4709 cp/decl.c:5886
+#: c-decl.c:4571 cp/decl.c:5942
msgid "thread-local storage not supported for this target"
msgstr ""
-#: c-decl.c:4771 c-decl.c:5813
+#: c-decl.c:4633 c-decl.c:5682
msgid "function declaration isn%'t a prototype"
msgstr ""
-#: c-decl.c:4779
+#: c-decl.c:4641
msgid "parameter names (without types) in function declaration"
msgstr ""
-#: c-decl.c:4808 c-decl.c:4820
+#: c-decl.c:4670 c-decl.c:4682
msgid "%Jparameter %u (%qD) has incomplete type"
msgstr ""
-#: c-decl.c:4811 c-decl.c:4823
+#: c-decl.c:4673 c-decl.c:4685
msgid "%Jparameter %u has incomplete type"
msgstr ""
-#: c-decl.c:4880
+#: c-decl.c:4742
msgid "%<void%> as only parameter may not be qualified"
msgstr ""
-#: c-decl.c:4884 c-decl.c:4919
+#: c-decl.c:4746 c-decl.c:4781
msgid "%<void%> must be the only parameter"
msgstr ""
-#: c-decl.c:4912
+#: c-decl.c:4774
msgid "%Jparameter %qD has just a forward declaration"
msgstr ""
#. The %s will be one of 'struct', 'union', or 'enum'.
-#: c-decl.c:4958
+#: c-decl.c:4820
msgid "%<%s %E%> declared inside parameter list"
msgstr ""
#. The %s will be one of 'struct', 'union', or 'enum'.
-#: c-decl.c:4962
+#: c-decl.c:4824
#, c-format
msgid "anonymous %s declared inside parameter list"
msgstr ""
-#: c-decl.c:4967
+#: c-decl.c:4829
msgid ""
"its scope is only this definition or declaration, which is probably not what "
"you want"
msgstr ""
-#: c-decl.c:5081
+#: c-decl.c:4943
msgid "redefinition of %<union %s%>"
msgstr ""
-#: c-decl.c:5083
+#: c-decl.c:4945
msgid "redefinition of %<struct %s%>"
msgstr ""
-#: c-decl.c:5154 cp/decl.c:3492
+#: c-decl.c:4950
+msgid "nested redefinition of %<union %s%>"
+msgstr ""
+
+#: c-decl.c:4953
+msgid "nested redefinition of %<struct %s%>"
+msgstr ""
+
+#: c-decl.c:5025 cp/decl.c:3499
msgid "declaration does not declare anything"
msgstr ""
-#: c-decl.c:5199 c-decl.c:5215
+#: c-decl.c:5070 c-decl.c:5086
msgid "%Jduplicate member %qD"
msgstr ""
-#: c-decl.c:5250
+#: c-decl.c:5121
#, c-format
msgid "%s has no %s"
msgstr ""
-#: c-decl.c:5251
+#: c-decl.c:5122
msgid "union"
msgstr ""
-#: c-decl.c:5251
+#: c-decl.c:5122
msgid "struct"
msgstr ""
-#: c-decl.c:5252
+#: c-decl.c:5123
msgid "named members"
msgstr ""
-#: c-decl.c:5252
+#: c-decl.c:5123
msgid "members"
msgstr ""
-#: c-decl.c:5293
-#, c-format
-msgid "nested redefinition of %qs"
-msgstr ""
-
-#: c-decl.c:5312
+#: c-decl.c:5178
msgid "%Jflexible array member in union"
msgstr ""
-#: c-decl.c:5317
+#: c-decl.c:5183
msgid "%Jflexible array member not at end of struct"
msgstr ""
-#: c-decl.c:5322
+#: c-decl.c:5188
msgid "%Jflexible array member in otherwise empty struct"
msgstr ""
-#: c-decl.c:5329
+#: c-decl.c:5195
msgid "%Jinvalid use of structure with flexible array member"
msgstr ""
-#: c-decl.c:5434
+#: c-decl.c:5300
msgid "union cannot be made transparent"
msgstr ""
+#: c-decl.c:5365
+msgid "nested redefinition of %<enum %s%>"
+msgstr ""
+
#. This enum is a named one that has been declared already.
-#: c-decl.c:5503
+#: c-decl.c:5372
msgid "redeclaration of %<enum %s%>"
msgstr ""
-#: c-decl.c:5566
+#: c-decl.c:5435
msgid "enumeration values exceed range of largest integer"
msgstr ""
-#: c-decl.c:5583
+#: c-decl.c:5452
msgid "specified mode too small for enumeral values"
msgstr ""
-#: c-decl.c:5682
+#: c-decl.c:5551
#, c-format
msgid "enumerator value for %qE is not an integer constant"
msgstr ""
-#: c-decl.c:5699
+#: c-decl.c:5568
msgid "overflow in enumeration values"
msgstr ""
-#: c-decl.c:5704
+#: c-decl.c:5573
msgid "ISO C restricts enumerator values to range of %<int%>"
msgstr ""
-#: c-decl.c:5780
+#: c-decl.c:5649
msgid "return type is an incomplete type"
msgstr ""
-#: c-decl.c:5788
+#: c-decl.c:5657
msgid "return type defaults to %<int%>"
msgstr ""
-#: c-decl.c:5819
+#: c-decl.c:5688
msgid "%Jno previous prototype for %qD"
msgstr ""
-#: c-decl.c:5825
+#: c-decl.c:5694
msgid "%J%qD was used with no prototype before its definition"
msgstr ""
-#: c-decl.c:5832
+#: c-decl.c:5701
msgid "%Jno previous declaration for %qD"
msgstr ""
-#: c-decl.c:5838
+#: c-decl.c:5707
msgid "%J%qD was used with no declaration before its definition"
msgstr ""
-#: c-decl.c:5871 c-decl.c:6368
+#: c-decl.c:5740 c-decl.c:6228
msgid "%Jreturn type of %qD is not %<int%>"
msgstr ""
-#: c-decl.c:5886
+#: c-decl.c:5755
msgid "%Jfirst argument of %qD should be %<int%>"
msgstr ""
-#: c-decl.c:5895
+#: c-decl.c:5764
msgid "%Jsecond argument of %qD should be %<char **%>"
msgstr ""
-#: c-decl.c:5904
+#: c-decl.c:5773
msgid "%Jthird argument of %qD should probably be %<char **%>"
msgstr ""
-#: c-decl.c:5914
+#: c-decl.c:5783
msgid "%J%qD takes only zero or two arguments"
msgstr ""
-#: c-decl.c:5917
+#: c-decl.c:5786
msgid "%J%qD is normally a non-static function"
msgstr ""
-#: c-decl.c:5963
+#: c-decl.c:5832
msgid "%Jold-style parameter declarations in prototyped function definition"
msgstr ""
-#: c-decl.c:5976
+#: c-decl.c:5845
msgid "%Jtraditional C rejects ISO C style function definitions"
msgstr ""
-#: c-decl.c:5988
+#: c-decl.c:5857
msgid "%Jparameter name omitted"
msgstr ""
-#: c-decl.c:6028
+#: c-decl.c:5897
msgid "%Jold-style function definition"
msgstr ""
-#: c-decl.c:6036
+#: c-decl.c:5905
msgid "%Jparameter name missing from parameter list"
msgstr ""
-#: c-decl.c:6047
+#: c-decl.c:5916
msgid "%J%qD declared as a non-parameter"
msgstr ""
-#: c-decl.c:6052
+#: c-decl.c:5921
msgid "%Jmultiple parameters named %qD"
msgstr ""
-#: c-decl.c:6060
+#: c-decl.c:5929
msgid "%Jparameter %qD declared with void type"
msgstr ""
-#: c-decl.c:6075 c-decl.c:6077
+#: c-decl.c:5944 c-decl.c:5946
msgid "%Jtype of %qD defaults to %<int%>"
msgstr ""
-#: c-decl.c:6095
+#: c-decl.c:5964
msgid "%Jparameter %qD has incomplete type"
msgstr ""
-#: c-decl.c:6101
+#: c-decl.c:5970
msgid "%Jdeclaration for parameter %qD but no such parameter"
msgstr ""
-#: c-decl.c:6151
+#: c-decl.c:6020
msgid "number of arguments doesn%'t match prototype"
msgstr ""
-#: c-decl.c:6152 c-decl.c:6182 c-decl.c:6189
+#: c-decl.c:6021 c-decl.c:6051 c-decl.c:6058
msgid "%Hprototype declaration"
msgstr ""
-#: c-decl.c:6180
+#: c-decl.c:6049
msgid "promoted argument %qD doesn%'t match prototype"
msgstr ""
-#: c-decl.c:6188
+#: c-decl.c:6057
msgid "argument %qD doesn%'t match prototype"
msgstr ""
-#: c-decl.c:6395 cp/decl.c:10483
+#: c-decl.c:6255 cp/decl.c:10576
msgid "no return statement in function returning non-void"
msgstr ""
-#: c-decl.c:6402
+#: c-decl.c:6262
msgid "this function may return with or without a value"
msgstr ""
#. If we get here, declarations have been used in a for loop without
#. the C99 for loop scope. This doesn't make much sense, so don't
#. allow it.
-#: c-decl.c:6482
+#: c-decl.c:6351
msgid "%<for%> loop initial declaration used outside C99 mode"
msgstr ""
-#: c-decl.c:6511
+#: c-decl.c:6380
msgid ""
"%Jdeclaration of static variable %qD in %<for%> loop initial declaration"
msgstr ""
-#: c-decl.c:6514
+#: c-decl.c:6383
msgid ""
"%Jdeclaration of %<extern%> variable %qD in %<for%> loop initial declaration"
msgstr ""
-#: c-decl.c:6519
+#: c-decl.c:6388
msgid "%<struct %E%> declared in %<for%> loop initial declaration"
msgstr ""
-#: c-decl.c:6523
+#: c-decl.c:6392
msgid "%<union %E%> declared in %<for%> loop initial declaration"
msgstr ""
-#: c-decl.c:6527
+#: c-decl.c:6396
msgid "%<enum %E%> declared in %<for%> loop initial declaration"
msgstr ""
-#: c-decl.c:6531
+#: c-decl.c:6400
msgid "%Jdeclaration of non-variable %qD in %<for%> loop initial declaration"
msgstr ""
-#: c-decl.c:6815 c-decl.c:6851 c-decl.c:6953
+#: c-decl.c:6688 c-decl.c:6836 c-decl.c:7041
#, c-format
msgid "duplicate %qs"
msgstr ""
-#: c-decl.c:6841
+#: c-decl.c:6708 c-decl.c:6845 c-decl.c:6948
+msgid "two or more data types in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6720
msgid "%<long long long%> is too long for GCC"
msgstr ""
-#: c-decl.c:6846
+#: c-decl.c:6727 c-decl.c:6919
+msgid "both %<long long%> and %<double%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6733
msgid "ISO C90 does not support %<long long%>"
msgstr ""
-#: c-decl.c:6858
-msgid "two or more data types in declaration specifiers"
+#: c-decl.c:6738 c-decl.c:6758
+msgid "both %<long%> and %<short%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6741 c-decl.c:6852
+msgid "both %<long%> and %<void%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6744 c-decl.c:6871
+msgid "both %<long%> and %<_Bool%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6747 c-decl.c:6890
+msgid "both %<long%> and %<char%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6750 c-decl.c:6903
+msgid "both %<long%> and %<float%> in declaration specifiers"
msgstr ""
-#: c-decl.c:6877
+#: c-decl.c:6761 c-decl.c:6855
+msgid "both %<short%> and %<void%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6764 c-decl.c:6874
+msgid "both %<short%> and %<_Bool%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6767 c-decl.c:6893
+msgid "both %<short%> and %<char%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6770 c-decl.c:6906
+msgid "both %<short%> and %<float%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6773 c-decl.c:6922
+msgid "both %<short%> and %<double%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6781 c-decl.c:6801
+msgid "both %<signed%> and %<unsigned%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6784 c-decl.c:6858
+msgid "both %<signed%> and %<void%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6787 c-decl.c:6877
+msgid "both %<signed%> and %<_Bool%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6790 c-decl.c:6909
+msgid "both %<signed%> and %<float%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6793 c-decl.c:6925
+msgid "both %<signed%> and %<double%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6804 c-decl.c:6861
+msgid "both %<unsigned%> and %<void%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6807 c-decl.c:6880
+msgid "both %<unsigned%> and %<_Bool%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6810 c-decl.c:6912
+msgid "both %<unsigned%> and %<float%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6813 c-decl.c:6928
+msgid "both %<unsigned%> and %<double%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6821
+msgid "ISO C90 does not support complex types"
+msgstr ""
+
+#: c-decl.c:6823 c-decl.c:6864
+msgid "both %<complex%> and %<void%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6826 c-decl.c:6883
+msgid "both %<complex%> and %<_Bool%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6965
#, c-format
msgid "%qs fails to be a typedef or built in type"
msgstr ""
-#: c-decl.c:6903
+#: c-decl.c:6991
#, c-format
msgid "%qs is not at beginning of declaration"
msgstr ""
-#: c-decl.c:6918
+#: c-decl.c:7006
msgid "%<__thread%> used with %<auto%>"
msgstr ""
-#: c-decl.c:6920
+#: c-decl.c:7008
msgid "%<__thread%> used with %<register%>"
msgstr ""
-#: c-decl.c:6922
+#: c-decl.c:7010
msgid "%<__thread%> used with %<typedef%>"
msgstr ""
-#: c-decl.c:6933
+#: c-decl.c:7021
msgid "%<__thread%> before %<extern%>"
msgstr ""
-#: c-decl.c:6942
+#: c-decl.c:7030
msgid "%<__thread%> before %<static%>"
msgstr ""
-#: c-decl.c:6958
+#: c-decl.c:7046
msgid "multiple storage classes in declaration specifiers"
msgstr ""
-#: c-decl.c:6965
+#: c-decl.c:7053
msgid "%<__thread%> used with %qs"
msgstr ""
-#: c-decl.c:7025 toplev.c:843
+#: c-decl.c:7107
+msgid "ISO C does not support plain %<complex%> meaning %<double complex%>"
+msgstr ""
+
+#: c-decl.c:7152 c-decl.c:7178
+msgid "ISO C does not support complex integer types"
+msgstr ""
+
+#: c-decl.c:7253 toplev.c:837
msgid "%J%qF used but never defined"
msgstr ""
@@ -2120,7 +2175,7 @@ msgstr ""
msgid "statement with no effect"
msgstr ""
-#: c-gimplify.c:315 c-typeck.c:6688 cp/parser.c:6583
+#: c-gimplify.c:315 c-typeck.c:6722 cp/parser.c:6491
msgid "break statement not within loop or switch"
msgstr ""
@@ -2158,53 +2213,53 @@ msgstr ""
msgid "End of search list.\n"
msgstr ""
-#: c-lex.c:255
+#: c-lex.c:259
msgid "badly nested C headers from preprocessor"
msgstr ""
-#: c-lex.c:303
+#: c-lex.c:307
#, c-format
msgid "ignoring #pragma %s %s"
msgstr ""
#. ... or not.
-#: c-lex.c:408
+#: c-lex.c:412
msgid "%Hstray '@' in program"
msgstr ""
-#: c-lex.c:416
+#: c-lex.c:420
#, c-format
msgid "missing terminating %c character"
msgstr ""
-#: c-lex.c:418
+#: c-lex.c:422
#, c-format
msgid "stray '%c' in program"
msgstr ""
-#: c-lex.c:420
+#: c-lex.c:424
#, c-format
msgid "stray '\\%o' in program"
msgstr ""
-#: c-lex.c:568
+#: c-lex.c:577
msgid "this decimal constant is unsigned only in ISO C90"
msgstr ""
-#: c-lex.c:571
+#: c-lex.c:580
msgid "this decimal constant would be unsigned in ISO C90"
msgstr ""
-#: c-lex.c:587
+#: c-lex.c:596
#, c-format
msgid "integer constant is too large for %qs type"
msgstr ""
-#: c-lex.c:653
+#: c-lex.c:662
msgid "floating constant exceeds range of %<%s%>"
msgstr ""
-#: c-lex.c:729
+#: c-lex.c:738
msgid "traditional C rejects string constant concatenation"
msgstr ""
@@ -2370,8 +2425,8 @@ msgid "too late for # directive to set debug directory"
msgstr ""
#. Like YYERROR but do call yyerror.
-#: c-parse.y:55 c-parse.c:5315 gengtype-yacc.c:1559 java/parse-scan.c:3063
-#: java/parse.c:6126 objc/objc-parse.y:54 objc/objc-parse.c:6397
+#: c-parse.y:55 c-parse.c:5321 gengtype-yacc.c:1559 java/parse-scan.c:3063
+#: java/parse.c:6132 objc/objc-parse.y:54 objc/objc-parse.c:6403
msgid "syntax error"
msgstr ""
@@ -2408,106 +2463,110 @@ msgstr ""
msgid "ISO C forbids omitting the middle term of a ?: expression"
msgstr ""
-#: c-parse.y:649 objc/objc-parse.y:672
+#: c-parse.y:642 objc/objc-parse.y:665
+msgid "compound literal has variable size"
+msgstr ""
+
+#: c-parse.y:654 objc/objc-parse.y:677
msgid "ISO C90 forbids compound literals"
msgstr ""
-#: c-parse.y:662 objc/objc-parse.y:685
+#: c-parse.y:667 objc/objc-parse.y:690
msgid "ISO C forbids braced-groups within expressions"
msgstr ""
-#: c-parse.y:698 objc/objc-parse.y:721
+#: c-parse.y:703 objc/objc-parse.y:726
msgid "first argument to __builtin_choose_expr not a constant"
msgstr ""
-#: c-parse.y:1221 objc/objc-parse.y:1268
+#: c-parse.y:1227 objc/objc-parse.y:1274
msgid "%<typeof%> applied to a bit-field"
msgstr ""
-#: c-parse.y:1349 objc/objc-parse.y:1396
+#: c-parse.y:1355 objc/objc-parse.y:1402
msgid "ISO C forbids empty initializer braces"
msgstr ""
-#: c-parse.y:1363 objc/objc-parse.y:1410
+#: c-parse.y:1369 objc/objc-parse.y:1416
msgid "ISO C90 forbids specifying subobject to initialize"
msgstr ""
-#: c-parse.y:1366 objc/objc-parse.y:1413
+#: c-parse.y:1372 objc/objc-parse.y:1419
msgid "obsolete use of designated initializer without %<=%>"
msgstr ""
-#: c-parse.y:1370 objc/objc-parse.y:1417
+#: c-parse.y:1376 objc/objc-parse.y:1423
msgid "obsolete use of designated initializer with %<:%>"
msgstr ""
-#: c-parse.y:1397 objc/objc-parse.y:1444
+#: c-parse.y:1403 objc/objc-parse.y:1450
msgid "ISO C forbids specifying range of elements to initialize"
msgstr ""
-#: c-parse.y:1405 c-parse.y:1435 objc/objc-parse.y:1452 objc/objc-parse.y:1482
+#: c-parse.y:1411 c-parse.y:1441 objc/objc-parse.y:1458 objc/objc-parse.y:1488
msgid "ISO C forbids nested functions"
msgstr ""
-#: c-parse.y:1602 objc/objc-parse.y:1653
+#: c-parse.y:1608 objc/objc-parse.y:1659
msgid "ISO C forbids forward references to %<enum%> types"
msgstr ""
-#: c-parse.y:1614 cp/parser.c:9991 objc/objc-parse.y:1665
+#: c-parse.y:1620 cp/parser.c:9903 objc/objc-parse.y:1671
msgid "comma at end of enumerator list"
msgstr ""
-#: c-parse.y:1634 objc/objc-parse.y:1685
+#: c-parse.y:1640 objc/objc-parse.y:1691
msgid "no semicolon at end of struct or union"
msgstr ""
-#: c-parse.y:1643 objc/objc-parse.y:1694 objc/objc-parse.y:2683
+#: c-parse.y:1649 objc/objc-parse.y:1700 objc/objc-parse.y:2689
msgid "extra semicolon in struct or union specified"
msgstr ""
-#: c-parse.y:1656 objc/objc-parse.y:1710
+#: c-parse.y:1662 objc/objc-parse.y:1716
msgid "ISO C doesn't support unnamed structs/unions"
msgstr ""
-#: c-parse.y:1666 objc/objc-parse.y:1720
+#: c-parse.y:1672 objc/objc-parse.y:1726
msgid "ISO C forbids member declarations with no members"
msgstr ""
-#: c-parse.y:1832 objc/objc-parse.y:1886
+#: c-parse.y:1838 objc/objc-parse.y:1892
msgid "label at end of compound statement"
msgstr ""
-#: c-parse.y:1851 objc/objc-parse.y:1905
+#: c-parse.y:1857 objc/objc-parse.y:1911
msgid "ISO C90 forbids mixed declarations and code"
msgstr ""
-#: c-parse.y:1891 objc/objc-parse.y:1945
+#: c-parse.y:1897 objc/objc-parse.y:1951
msgid "ISO C forbids label declarations"
msgstr ""
-#: c-parse.y:1935 objc/objc-parse.y:1989
+#: c-parse.y:1941 objc/objc-parse.y:1995
msgid "braced-group within expression allowed only inside a function"
msgstr ""
-#: c-parse.y:2231 objc/objc-parse.y:2328
+#: c-parse.y:2237 objc/objc-parse.y:2334
#, c-format
msgid "%E qualifier ignored on asm"
msgstr ""
-#: c-parse.y:2325 objc/objc-parse.y:2422
+#: c-parse.y:2331 objc/objc-parse.y:2428
msgid "ISO C requires a named argument before %<...%>"
msgstr ""
-#: c-parse.c:5311 gengtype-yacc.c:1555 java/parse-scan.c:3059
-#: java/parse.c:6122 objc/objc-parse.c:6393
+#: c-parse.c:5317 gengtype-yacc.c:1555 java/parse-scan.c:3059
+#: java/parse.c:6128 objc/objc-parse.c:6399
msgid "syntax error; also virtual memory exhausted"
msgstr ""
-#: c-parse.c:5429 gengtype-yacc.c:1673 java/parse-scan.c:3177
-#: java/parse.c:6240 objc/objc-parse.c:6511
+#: c-parse.c:5435 gengtype-yacc.c:1673 java/parse-scan.c:3177
+#: java/parse.c:6246 objc/objc-parse.c:6517
msgid "parser stack overflow"
msgstr ""
-#: c-parse.y:2841 objc/objc-parse.y:3444
+#: c-parse.y:2847 objc/objc-parse.y:3450
#, c-format
msgid "syntax error at %qs token"
msgstr ""
@@ -2709,809 +2768,840 @@ msgstr ""
msgid "junk at end of %<#pragma GCC visibility%>"
msgstr ""
-#: c-typeck.c:128
+#: c-typeck.c:140
#, c-format
msgid "%qs has an incomplete type"
msgstr ""
-#: c-typeck.c:150 cp/call.c:2667
+#: c-typeck.c:162 cp/call.c:2667
msgid "invalid use of void expression"
msgstr ""
-#: c-typeck.c:158
+#: c-typeck.c:170
msgid "invalid use of flexible array member"
msgstr ""
-#: c-typeck.c:164
+#: c-typeck.c:176
msgid "invalid use of array with unspecified bounds"
msgstr ""
-#: c-typeck.c:172
+#: c-typeck.c:184
msgid "invalid use of undefined type %<%s %s%>"
msgstr ""
#. If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL.
-#: c-typeck.c:176
+#: c-typeck.c:188
#, c-format
msgid "invalid use of incomplete typedef %qs"
msgstr ""
-#: c-typeck.c:363 c-typeck.c:377
+#: c-typeck.c:375 c-typeck.c:389
msgid "function types not truly compatible in ISO C"
msgstr ""
-#: c-typeck.c:731
+#: c-typeck.c:743
msgid "types are not quite compatible"
msgstr ""
-#: c-typeck.c:967
+#: c-typeck.c:985
msgid "function return types not compatible due to %<volatile%>"
msgstr ""
-#: c-typeck.c:1108 c-typeck.c:2338
+#: c-typeck.c:1126 c-typeck.c:2347
msgid "arithmetic on pointer to an incomplete type"
msgstr ""
-#: c-typeck.c:1483
-#, c-format
-msgid "%s has no member named %qs"
+#: c-typeck.c:1481
+msgid "%qT has no member named %qs"
msgstr ""
-#: c-typeck.c:1520
+#: c-typeck.c:1517
#, c-format
msgid "request for member %qs in something not a structure or union"
msgstr ""
-#: c-typeck.c:1549
+#: c-typeck.c:1546
msgid "dereferencing pointer to incomplete type"
msgstr ""
-#: c-typeck.c:1553
+#: c-typeck.c:1550
msgid "dereferencing %<void *%> pointer"
msgstr ""
-#: c-typeck.c:1570
+#: c-typeck.c:1567
#, c-format
msgid "invalid type argument of %qs"
msgstr ""
-#: c-typeck.c:1588 cp/typeck.c:2166
+#: c-typeck.c:1585 cp/typeck.c:2170
msgid "subscript missing in array reference"
msgstr ""
-#: c-typeck.c:1608
+#: c-typeck.c:1605
msgid "array subscript has type %<char%>"
msgstr ""
-#: c-typeck.c:1616 c-typeck.c:1705 cp/typeck.c:2211 cp/typeck.c:2297
+#: c-typeck.c:1613 c-typeck.c:1702 cp/typeck.c:2215 cp/typeck.c:2301
msgid "array subscript is not an integer"
msgstr ""
-#: c-typeck.c:1649
+#: c-typeck.c:1646
msgid "ISO C forbids subscripting %<register%> array"
msgstr ""
-#: c-typeck.c:1651
+#: c-typeck.c:1648
msgid "ISO C90 forbids subscripting non-lvalue array"
msgstr ""
-#: c-typeck.c:1684
+#: c-typeck.c:1681
msgid "subscript has type %<char%>"
msgstr ""
-#: c-typeck.c:1700 cp/typeck.c:2292
+#: c-typeck.c:1697 cp/typeck.c:2296
msgid "subscripted value is neither array nor pointer"
msgstr ""
-#: c-typeck.c:1730
+#: c-typeck.c:1727
#, c-format
msgid "local declaration of %qs hides instance variable"
msgstr ""
-#: c-typeck.c:1914
-msgid "called object is not a function"
+#: c-typeck.c:1920
+#, c-format
+msgid "called object %qE is not a function"
msgstr ""
#. This situation leads to run-time undefined behavior. We can't,
#. therefore, simply error unless we can prove that all possible
#. executions of the program must execute the code.
-#: c-typeck.c:1946
+#: c-typeck.c:1952
msgid "function called through a non-compatible type"
msgstr ""
-#: c-typeck.c:1990 c-typeck.c:4176 c-typeck.c:4178 c-typeck.c:4186
-#: c-typeck.c:4211 c-typeck.c:5609
+#: c-typeck.c:1996 c-typeck.c:4221 c-typeck.c:4223 c-typeck.c:4231
+#: c-typeck.c:4256 c-typeck.c:5643
msgid "initializer element is not constant"
msgstr ""
-#: c-typeck.c:2041 cp/typeck.c:2565
+#: c-typeck.c:2047 cp/typeck.c:2569
msgid "too many arguments to function"
msgstr ""
-#: c-typeck.c:2062
+#: c-typeck.c:2068
#, c-format
msgid "type of formal parameter %d is incomplete"
msgstr ""
-#: c-typeck.c:2075
+#: c-typeck.c:2081
#, c-format
msgid "%s as integer rather than floating due to prototype"
msgstr ""
-#: c-typeck.c:2078
+#: c-typeck.c:2084
#, c-format
msgid "%s as integer rather than complex due to prototype"
msgstr ""
-#: c-typeck.c:2081
+#: c-typeck.c:2087
#, c-format
msgid "%s as complex rather than floating due to prototype"
msgstr ""
-#: c-typeck.c:2084
+#: c-typeck.c:2090
#, c-format
msgid "%s as floating rather than integer due to prototype"
msgstr ""
-#: c-typeck.c:2087
+#: c-typeck.c:2093
#, c-format
msgid "%s as complex rather than integer due to prototype"
msgstr ""
-#: c-typeck.c:2090
+#: c-typeck.c:2096
#, c-format
msgid "%s as floating rather than complex due to prototype"
msgstr ""
-#: c-typeck.c:2100
+#: c-typeck.c:2106
msgid "%s as %<float%> rather than %<double%> due to prototype"
msgstr ""
-#: c-typeck.c:2120
+#: c-typeck.c:2126
#, c-format
msgid "%s with different width due to prototype"
msgstr ""
-#: c-typeck.c:2146
+#: c-typeck.c:2152
#, c-format
msgid "%s as unsigned due to prototype"
msgstr ""
-#: c-typeck.c:2148
+#: c-typeck.c:2154
#, c-format
msgid "%s as signed due to prototype"
msgstr ""
-#: c-typeck.c:2182 cp/typeck.c:2671
+#: c-typeck.c:2188 cp/typeck.c:2675
msgid "too few arguments to function"
msgstr ""
-#: c-typeck.c:2217
+#: c-typeck.c:2223
msgid "suggest parentheses around + or - inside shift"
msgstr ""
-#: c-typeck.c:2224
+#: c-typeck.c:2230
msgid "suggest parentheses around && within ||"
msgstr ""
-#: c-typeck.c:2233
+#: c-typeck.c:2239
msgid "suggest parentheses around arithmetic in operand of |"
msgstr ""
-#: c-typeck.c:2236
+#: c-typeck.c:2243
msgid "suggest parentheses around comparison in operand of |"
msgstr ""
-#: c-typeck.c:2245
+#: c-typeck.c:2252
msgid "suggest parentheses around arithmetic in operand of ^"
msgstr ""
-#: c-typeck.c:2248
+#: c-typeck.c:2256
msgid "suggest parentheses around comparison in operand of ^"
msgstr ""
-#: c-typeck.c:2255
+#: c-typeck.c:2263
msgid "suggest parentheses around + or - in operand of &"
msgstr ""
-#: c-typeck.c:2258
+#: c-typeck.c:2267
msgid "suggest parentheses around comparison in operand of &"
msgstr ""
-#: c-typeck.c:2264
+#: c-typeck.c:2273
msgid "comparisons like X<=Y<=Z do not have their mathematical meaning"
msgstr ""
-#: c-typeck.c:2290
+#: c-typeck.c:2299
msgid "pointer of type %<void *%> used in subtraction"
msgstr ""
-#: c-typeck.c:2292
+#: c-typeck.c:2301
msgid "pointer to a function used in subtraction"
msgstr ""
-#: c-typeck.c:2381
+#: c-typeck.c:2390
msgid "wrong type argument to unary plus"
msgstr ""
-#: c-typeck.c:2394
+#: c-typeck.c:2403
msgid "wrong type argument to unary minus"
msgstr ""
-#: c-typeck.c:2411
+#: c-typeck.c:2420
msgid "ISO C does not support %<~%> for complex conjugation"
msgstr ""
-#: c-typeck.c:2417
+#: c-typeck.c:2426
msgid "wrong type argument to bit-complement"
msgstr ""
-#: c-typeck.c:2425
+#: c-typeck.c:2434
msgid "wrong type argument to abs"
msgstr ""
-#: c-typeck.c:2437
+#: c-typeck.c:2446
msgid "wrong type argument to conjugation"
msgstr ""
-#: c-typeck.c:2451
+#: c-typeck.c:2460
msgid "wrong type argument to unary exclamation mark"
msgstr ""
-#: c-typeck.c:2488
+#: c-typeck.c:2497
msgid "ISO C does not support %<++%> and %<--%> on complex types"
msgstr ""
-#: c-typeck.c:2504 c-typeck.c:2536
+#: c-typeck.c:2513 c-typeck.c:2545
msgid "wrong type argument to increment"
msgstr ""
-#: c-typeck.c:2506 c-typeck.c:2538
+#: c-typeck.c:2515 c-typeck.c:2547
msgid "wrong type argument to decrement"
msgstr ""
-#: c-typeck.c:2527
+#: c-typeck.c:2536
msgid "increment of pointer to unknown structure"
msgstr ""
-#: c-typeck.c:2529
+#: c-typeck.c:2538
msgid "decrement of pointer to unknown structure"
msgstr ""
-#: c-typeck.c:2597
+#: c-typeck.c:2628
+msgid "attempt to take address of bit-field structure member %qD"
+msgstr ""
+
+#: c-typeck.c:2710
+msgid "invalid lvalue in assignment"
+msgstr ""
+
+#: c-typeck.c:2713
+msgid "invalid lvalue in increment"
+msgstr ""
+
+#: c-typeck.c:2716
+msgid "invalid lvalue in decrement"
+msgstr ""
+
+#: c-typeck.c:2719
msgid "invalid lvalue in unary %<&%>"
msgstr ""
-#: c-typeck.c:2619
-msgid "attempt to take address of bit-field structure member %qD"
+#: c-typeck.c:2722
+msgid "invalid lvalue in asm statement"
msgstr ""
-#: c-typeck.c:2712
+#: c-typeck.c:2750
#, c-format
-msgid "%s of read-only member %qs"
+msgid "assignment of read-only member %qs"
msgstr ""
-#: c-typeck.c:2716
+#: c-typeck.c:2751
#, c-format
-msgid "%s of read-only variable %qs"
+msgid "increment of read-only member %qs"
msgstr ""
-#: c-typeck.c:2719
+#: c-typeck.c:2752
+#, c-format
+msgid "decrement of read-only member %qs"
+msgstr ""
+
+#: c-typeck.c:2756
#, c-format
-msgid "%s of read-only location"
+msgid "assignment of read-only variable %qs"
msgstr ""
-#: c-typeck.c:2737
+#: c-typeck.c:2757
+#, c-format
+msgid "increment of read-only variable %qs"
+msgstr ""
+
+#: c-typeck.c:2758
+#, c-format
+msgid "decrement of read-only variable %qs"
+msgstr ""
+
+#: c-typeck.c:2761
+msgid "assignment of read-only location"
+msgstr ""
+
+#: c-typeck.c:2762
+msgid "increment of read-only location"
+msgstr ""
+
+#: c-typeck.c:2763
+msgid "decrement of read-only location"
+msgstr ""
+
+#: c-typeck.c:2781
#, c-format
msgid "cannot take address of bit-field %qs"
msgstr ""
-#: c-typeck.c:2765
+#: c-typeck.c:2809
#, c-format
msgid "global register variable %qs used in nested function"
msgstr ""
-#: c-typeck.c:2769
+#: c-typeck.c:2813
#, c-format
msgid "register variable %qs used in nested function"
msgstr ""
-#: c-typeck.c:2776
+#: c-typeck.c:2820
#, c-format
msgid "address of global register variable %qs requested"
msgstr ""
-#: c-typeck.c:2781
+#: c-typeck.c:2825
#, c-format
msgid "address of register variable %qs requested"
msgstr ""
-#: c-typeck.c:2829
+#: c-typeck.c:2873
msgid "non-lvalue array in conditional expression"
msgstr ""
-#: c-typeck.c:2873
+#: c-typeck.c:2917
msgid "signed and unsigned type in conditional expression"
msgstr ""
-#: c-typeck.c:2880
+#: c-typeck.c:2924
msgid "ISO C forbids conditional expr with only one void side"
msgstr ""
-#: c-typeck.c:2896 c-typeck.c:2904
+#: c-typeck.c:2940 c-typeck.c:2948
msgid "ISO C forbids conditional expr between %<void *%> and function pointer"
msgstr ""
-#: c-typeck.c:2911
+#: c-typeck.c:2955
msgid "pointer type mismatch in conditional expression"
msgstr ""
-#: c-typeck.c:2918 c-typeck.c:2928
+#: c-typeck.c:2962 c-typeck.c:2972
msgid "pointer/integer type mismatch in conditional expression"
msgstr ""
-#: c-typeck.c:2942
+#: c-typeck.c:2986
msgid "type mismatch in conditional expression"
msgstr ""
-#: c-typeck.c:2985
+#: c-typeck.c:3029
msgid "left-hand operand of comma expression has no effect"
msgstr ""
-#: c-typeck.c:3018
+#: c-typeck.c:3062
msgid "cast specifies array type"
msgstr ""
-#: c-typeck.c:3024
+#: c-typeck.c:3068
msgid "cast specifies function type"
msgstr ""
-#: c-typeck.c:3034
+#: c-typeck.c:3078
msgid "ISO C forbids casting nonscalar to the same type"
msgstr ""
-#: c-typeck.c:3052
+#: c-typeck.c:3096
msgid "ISO C forbids casts to union type"
msgstr ""
-#: c-typeck.c:3061
+#: c-typeck.c:3105
msgid "cast to union type from type not present in union"
msgstr ""
-#: c-typeck.c:3112
+#: c-typeck.c:3156
msgid "cast adds new qualifiers to function type"
msgstr ""
#. There are qualifiers present in IN_OTYPE that are not
#. present in IN_TYPE.
-#: c-typeck.c:3117
+#: c-typeck.c:3161
msgid "cast discards qualifiers from pointer target type"
msgstr ""
-#: c-typeck.c:3132
+#: c-typeck.c:3176
msgid "cast increases required alignment of target type"
msgstr ""
-#: c-typeck.c:3138 cp/typeck.c:4932
+#: c-typeck.c:3182 cp/typeck.c:4956
msgid "cast from pointer to integer of different size"
msgstr ""
-#: c-typeck.c:3143
-msgid "cast does not match function type"
+#: c-typeck.c:3187
+msgid "cast from function call of type %qT to non-matching type %qT"
msgstr ""
-#: c-typeck.c:3150 cp/typeck.c:4939
+#: c-typeck.c:3195 cp/typeck.c:4963
msgid "cast to pointer from integer of different size"
msgstr ""
-#: c-typeck.c:3162
+#: c-typeck.c:3207
msgid "type-punning to incomplete type might break strict-aliasing rules"
msgstr ""
-#: c-typeck.c:3169
+#: c-typeck.c:3214
msgid "dereferencing type-punned pointer will break strict-aliasing rules"
msgstr ""
-#: c-typeck.c:3172
+#: c-typeck.c:3217
msgid "dereferencing type-punned pointer might break strict-aliasing rules"
msgstr ""
-#: c-typeck.c:3184
+#: c-typeck.c:3229
msgid "ISO C forbids conversion of function pointer to object pointer type"
msgstr ""
-#: c-typeck.c:3193
+#: c-typeck.c:3238
msgid "ISO C forbids conversion of object pointer to function pointer type"
msgstr ""
-#: c-typeck.c:3286
-msgid "invalid lvalue in assignment"
-msgstr ""
-
#. Convert new value to destination type.
-#. Check this here to avoid odd errors when trying to convert
-#. a throw to the type of the COND_EXPR.
-#. The left-hand side must be an lvalue.
-#: c-typeck.c:3295 c-typeck.c:3320 c-typeck.c:3337 cp/typeck.c:5054
-#: cp/typeck.c:5153 cp/typeck.c:5168
+#: c-typeck.c:3365 c-typeck.c:3382
msgid "assignment"
msgstr ""
-#: c-typeck.c:3404
+#: c-typeck.c:3449
msgid "cannot pass rvalue to reference parameter"
msgstr ""
-#: c-typeck.c:3512 c-typeck.c:3589
+#: c-typeck.c:3557 c-typeck.c:3634
#, c-format
msgid "%s makes qualified function pointer from unqualified"
msgstr ""
-#: c-typeck.c:3516 c-typeck.c:3569
+#: c-typeck.c:3561 c-typeck.c:3614
#, c-format
msgid "%s discards qualifiers from pointer target type"
msgstr ""
-#: c-typeck.c:3522
+#: c-typeck.c:3567
msgid "ISO C prohibits argument conversion to union type"
msgstr ""
-#: c-typeck.c:3560
+#: c-typeck.c:3605
msgid "ISO C forbids %s between function pointer and %<void *%>"
msgstr ""
-#: c-typeck.c:3578
+#: c-typeck.c:3623
#, c-format
msgid "pointer targets in %s differ in signedness"
msgstr ""
-#: c-typeck.c:3594
+#: c-typeck.c:3639
#, c-format
msgid "%s from incompatible pointer type"
msgstr ""
-#: c-typeck.c:3600 c-typeck.c:4136 cp/typeck.c:1402
+#: c-typeck.c:3645 c-typeck.c:4181 cp/typeck.c:1402
msgid "invalid use of non-lvalue array"
msgstr ""
-#: c-typeck.c:3614
+#: c-typeck.c:3659
#, c-format
msgid "%s makes pointer from integer without a cast"
msgstr ""
-#: c-typeck.c:3621
+#: c-typeck.c:3666
#, c-format
msgid "%s makes integer from pointer without a cast"
msgstr ""
-#: c-typeck.c:3635 c-typeck.c:3638
+#: c-typeck.c:3680 c-typeck.c:3683
#, c-format
msgid "incompatible type for argument %d of %qs"
msgstr ""
-#: c-typeck.c:3642
+#: c-typeck.c:3687
#, c-format
msgid "incompatible type for argument %d of indirect function call"
msgstr ""
-#: c-typeck.c:3646
+#: c-typeck.c:3691
#, c-format
msgid "incompatible types in %s"
msgstr ""
#. Function name is known; supply it.
-#: c-typeck.c:3702
+#: c-typeck.c:3747
#, c-format
msgid "passing arg of '%s'"
msgstr ""
#. Function name unknown (call through ptr).
-#: c-typeck.c:3711
+#: c-typeck.c:3756
msgid "passing arg of pointer to function"
msgstr ""
#. Function name is known; supply it.
-#: c-typeck.c:3719
+#: c-typeck.c:3764
#, c-format
msgid "passing arg %d of '%s'"
msgstr ""
#. Function name unknown (call through ptr); just give arg number.
-#: c-typeck.c:3728
+#: c-typeck.c:3773
#, c-format
msgid "passing arg %d of pointer to function"
msgstr ""
-#: c-typeck.c:3784
+#: c-typeck.c:3829
msgid "traditional C rejects automatic aggregate initialization"
msgstr ""
-#: c-typeck.c:3952 c-typeck.c:3967 c-typeck.c:3982
+#: c-typeck.c:3997 c-typeck.c:4012 c-typeck.c:4027
#, c-format
msgid "(near initialization for %qs)"
msgstr ""
-#: c-typeck.c:3996
+#: c-typeck.c:4041
msgid "array initialized from parenthesized string constant"
msgstr ""
-#: c-typeck.c:4060 cp/typeck2.c:704
+#: c-typeck.c:4105 cp/typeck2.c:708
msgid "char-array initialized from wide string"
msgstr ""
-#: c-typeck.c:4065
+#: c-typeck.c:4110
msgid "wchar_t-array initialized from non-wide string"
msgstr ""
-#: c-typeck.c:4083 cp/typeck2.c:726
+#: c-typeck.c:4128 cp/typeck2.c:730
msgid "initializer-string for array of chars is too long"
msgstr ""
-#: c-typeck.c:4089
+#: c-typeck.c:4134
msgid "array of inappropriate type initialized from string constant"
msgstr ""
-#: c-typeck.c:4159
+#: c-typeck.c:4204
msgid "array initialized from non-constant array expression"
msgstr ""
-#: c-typeck.c:4203
+#: c-typeck.c:4248
msgid "initialization"
msgstr ""
-#: c-typeck.c:4218 c-typeck.c:5613
+#: c-typeck.c:4263 c-typeck.c:5647
msgid "initializer element is not computable at load time"
msgstr ""
-#: c-typeck.c:4233 cp/typeck2.c:804
+#: c-typeck.c:4278 cp/typeck2.c:808
msgid "invalid initializer"
msgstr ""
-#: c-typeck.c:4514 cp/decl.c:4461
+#: c-typeck.c:4548 cp/decl.c:4507
msgid "opaque vector types cannot be initialized"
msgstr ""
-#: c-typeck.c:4710
+#: c-typeck.c:4744
msgid "extra brace group at end of initializer"
msgstr ""
-#: c-typeck.c:4730
+#: c-typeck.c:4764
msgid "missing braces around initializer"
msgstr ""
-#: c-typeck.c:4790
+#: c-typeck.c:4824
msgid "braces around scalar initializer"
msgstr ""
-#: c-typeck.c:4847
+#: c-typeck.c:4881
msgid "initialization of flexible array member in a nested context"
msgstr ""
-#: c-typeck.c:4849
+#: c-typeck.c:4883
msgid "initialization of a flexible array member"
msgstr ""
-#: c-typeck.c:4876
+#: c-typeck.c:4910
msgid "missing initializer"
msgstr ""
-#: c-typeck.c:4898
+#: c-typeck.c:4932
msgid "empty scalar initializer"
msgstr ""
-#: c-typeck.c:4903
+#: c-typeck.c:4937
msgid "extra elements in scalar initializer"
msgstr ""
-#: c-typeck.c:4991
+#: c-typeck.c:5025
msgid "initialization designators may not nest"
msgstr ""
-#: c-typeck.c:5013 c-typeck.c:5088
+#: c-typeck.c:5047 c-typeck.c:5122
msgid "array index in non-array initializer"
msgstr ""
-#: c-typeck.c:5018 c-typeck.c:5141
+#: c-typeck.c:5052 c-typeck.c:5175
msgid "field name not in record or union initializer"
msgstr ""
-#: c-typeck.c:5064
+#: c-typeck.c:5098
msgid "array index in initializer not of integer type"
msgstr ""
-#: c-typeck.c:5084 c-typeck.c:5086
+#: c-typeck.c:5118 c-typeck.c:5120
msgid "nonconstant array index in initializer"
msgstr ""
-#: c-typeck.c:5090 c-typeck.c:5093
+#: c-typeck.c:5124 c-typeck.c:5127
msgid "array index in initializer exceeds array bounds"
msgstr ""
-#: c-typeck.c:5104
+#: c-typeck.c:5138
msgid "empty index range in initializer"
msgstr ""
-#: c-typeck.c:5113
+#: c-typeck.c:5147
msgid "array index range in initializer exceeds array bounds"
msgstr ""
-#: c-typeck.c:5153
+#: c-typeck.c:5187
#, c-format
msgid "unknown field %qs specified in initializer"
msgstr ""
-#: c-typeck.c:5189 c-typeck.c:5210 c-typeck.c:5676
+#: c-typeck.c:5223 c-typeck.c:5244 c-typeck.c:5710
msgid "initialized field with side-effects overwritten"
msgstr ""
-#: c-typeck.c:5885
+#: c-typeck.c:5919
msgid "excess elements in char array initializer"
msgstr ""
-#: c-typeck.c:5892 c-typeck.c:5938
+#: c-typeck.c:5926 c-typeck.c:5972
msgid "excess elements in struct initializer"
msgstr ""
-#: c-typeck.c:5953
+#: c-typeck.c:5987
msgid "non-static initialization of a flexible array member"
msgstr ""
-#: c-typeck.c:6021
+#: c-typeck.c:6055
msgid "excess elements in union initializer"
msgstr ""
-#: c-typeck.c:6043
+#: c-typeck.c:6077
msgid "traditional C rejects initialization of unions"
msgstr ""
-#: c-typeck.c:6107
+#: c-typeck.c:6141
msgid "excess elements in array initializer"
msgstr ""
-#: c-typeck.c:6137
+#: c-typeck.c:6171
msgid "excess elements in vector initializer"
msgstr ""
-#: c-typeck.c:6160
+#: c-typeck.c:6194
msgid "excess elements in scalar initializer"
msgstr ""
-#: c-typeck.c:6263
-msgid "invalid lvalue in asm statement"
-msgstr ""
-
-#: c-typeck.c:6322
+#: c-typeck.c:6356
msgid "ISO C forbids %<goto *expr;%>"
msgstr ""
-#: c-typeck.c:6336
+#: c-typeck.c:6370
msgid "function declared %<noreturn%> has a %<return%> statement"
msgstr ""
-#: c-typeck.c:6343
+#: c-typeck.c:6377
msgid "%<return%> with no value, in function returning non-void"
msgstr ""
-#: c-typeck.c:6350
+#: c-typeck.c:6384
msgid "%<return%> with a value, in function returning void"
msgstr ""
-#: c-typeck.c:6354
+#: c-typeck.c:6388
msgid "return"
msgstr ""
-#: c-typeck.c:6407
+#: c-typeck.c:6441
msgid "function returns address of local variable"
msgstr ""
-#: c-typeck.c:6468 cp/semantics.c:856
+#: c-typeck.c:6502 cp/semantics.c:856
msgid "switch quantity not an integer"
msgstr ""
-#: c-typeck.c:6478
+#: c-typeck.c:6512
msgid "%<long%> switch expression not converted to %<int%> in ISO C"
msgstr ""
-#: c-typeck.c:6515 cp/parser.c:6093
+#: c-typeck.c:6549 cp/parser.c:6000
msgid "case label not within a switch statement"
msgstr ""
-#: c-typeck.c:6517
+#: c-typeck.c:6551
msgid "%<default%> label not within a switch statement"
msgstr ""
-#: c-typeck.c:6581
+#: c-typeck.c:6615
msgid "%Hsuggest explicit braces to avoid ambiguous %<else%>"
msgstr ""
-#: c-typeck.c:6591
+#: c-typeck.c:6625
msgid "%Hempty body in an if-statement"
msgstr ""
-#: c-typeck.c:6599
+#: c-typeck.c:6633
msgid "%Hempty body in an else-statement"
msgstr ""
-#: c-typeck.c:6690 cp/parser.c:6594
+#: c-typeck.c:6724 cp/parser.c:6502
msgid "continue statement not within a loop"
msgstr ""
-#: c-typeck.c:6707
+#: c-typeck.c:6741
msgid "%Hstatement with no effect"
msgstr ""
-#: c-typeck.c:6736
+#: c-typeck.c:6770
msgid "expression statement has incomplete type"
msgstr ""
-#: c-typeck.c:7059 c-typeck.c:7098
+#: c-typeck.c:7093 c-typeck.c:7132
msgid "division by zero"
msgstr ""
-#: c-typeck.c:7143 cp/typeck.c:2956
+#: c-typeck.c:7177 cp/typeck.c:2965
msgid "right shift count is negative"
msgstr ""
-#: c-typeck.c:7150 cp/typeck.c:2962
+#: c-typeck.c:7184 cp/typeck.c:2971
msgid "right shift count >= width of type"
msgstr ""
-#: c-typeck.c:7171 cp/typeck.c:2981
+#: c-typeck.c:7205 cp/typeck.c:2990
msgid "left shift count is negative"
msgstr ""
-#: c-typeck.c:7174 cp/typeck.c:2983
+#: c-typeck.c:7208 cp/typeck.c:2992
msgid "left shift count >= width of type"
msgstr ""
-#: c-typeck.c:7195
+#: c-typeck.c:7229
msgid "shift count is negative"
msgstr ""
-#: c-typeck.c:7197
+#: c-typeck.c:7231
msgid "shift count >= width of type"
msgstr ""
-#: c-typeck.c:7214 cp/typeck.c:3018
+#: c-typeck.c:7248 cp/typeck.c:3027
msgid "comparing floating point with == or != is unsafe"
msgstr ""
-#: c-typeck.c:7238 c-typeck.c:7245
+#: c-typeck.c:7272 c-typeck.c:7279
msgid "ISO C forbids comparison of %<void *%> with function pointer"
msgstr ""
-#: c-typeck.c:7249 c-typeck.c:7289 c-typeck.c:7317
+#: c-typeck.c:7283 c-typeck.c:7323 c-typeck.c:7351
msgid "comparison of distinct pointer types lacks a cast"
msgstr ""
-#: c-typeck.c:7263 c-typeck.c:7268 c-typeck.c:7337 c-typeck.c:7342
+#: c-typeck.c:7297 c-typeck.c:7302 c-typeck.c:7371 c-typeck.c:7376
msgid "comparison between pointer and integer"
msgstr ""
-#: c-typeck.c:7284 c-typeck.c:7312
+#: c-typeck.c:7318 c-typeck.c:7346
msgid "ISO C forbids ordered comparisons of pointers to functions"
msgstr ""
-#: c-typeck.c:7309
+#: c-typeck.c:7343
msgid "comparison of complete and incomplete pointers"
msgstr ""
-#: c-typeck.c:7325 c-typeck.c:7332
+#: c-typeck.c:7359 c-typeck.c:7366
msgid "ordered comparison of pointer with integer zero"
msgstr ""
-#: c-typeck.c:7357 cp/typeck.c:3159
+#: c-typeck.c:7391 cp/typeck.c:3168
msgid "unordered comparison on non-floating point argument"
msgstr ""
-#: c-typeck.c:7570
+#: c-typeck.c:7604
msgid "comparison between signed and unsigned"
msgstr ""
-#: c-typeck.c:7616 cp/typeck.c:3406
+#: c-typeck.c:7650 cp/typeck.c:3432
msgid "comparison of promoted ~unsigned with constant"
msgstr ""
-#: c-typeck.c:7624 cp/typeck.c:3414
+#: c-typeck.c:7658 cp/typeck.c:3440
msgid "comparison of promoted ~unsigned with unsigned"
msgstr ""
@@ -3529,335 +3619,335 @@ msgstr ""
msgid "prev_bb of %d should be %d, not %d"
msgstr ""
-#: cfghooks.c:112
+#: cfghooks.c:113
#, c-format
msgid "verify_flow_info: Wrong count of block %i %i"
msgstr ""
-#: cfghooks.c:118
+#: cfghooks.c:119
#, c-format
msgid "verify_flow_info: Wrong frequency of block %i %i"
msgstr ""
-#: cfghooks.c:126
+#: cfghooks.c:127
#, c-format
msgid "verify_flow_info: Duplicate edge %i->%i"
msgstr ""
-#: cfghooks.c:132
+#: cfghooks.c:133
#, c-format
msgid "verify_flow_info: Wrong probability of edge %i->%i %i"
msgstr ""
-#: cfghooks.c:138
+#: cfghooks.c:139
#, c-format
msgid "verify_flow_info: Wrong count of edge %i->%i %i"
msgstr ""
-#: cfghooks.c:150
+#: cfghooks.c:151
#, c-format
msgid "verify_flow_info: Basic block %d succ edge is corrupted"
msgstr ""
-#: cfghooks.c:164 cfgrtl.c:2032
+#: cfghooks.c:165 cfgrtl.c:2051
#, c-format
msgid "Wrong amount of branch edges after unconditional jump %i"
msgstr ""
-#: cfghooks.c:172
+#: cfghooks.c:173
#, c-format
msgid "basic block %d pred edge is corrupted"
msgstr ""
-#: cfghooks.c:198
+#: cfghooks.c:200
#, c-format
msgid "basic block %i edge lists are corrupted"
msgstr ""
-#: cfghooks.c:212
+#: cfghooks.c:214
msgid "verify_flow_info failed"
msgstr ""
-#: cfghooks.c:272
+#: cfghooks.c:275
#, c-format
msgid "%s does not support redirect_edge_and_branch."
msgstr ""
-#: cfghooks.c:290
+#: cfghooks.c:293
#, c-format
msgid "%s does not support redirect_edge_and_branch_force."
msgstr ""
-#: cfghooks.c:308
+#: cfghooks.c:311
#, c-format
msgid "%s does not support split_block."
msgstr ""
-#: cfghooks.c:344
+#: cfghooks.c:347
#, c-format
msgid "%s does not support move_block_after."
msgstr ""
-#: cfghooks.c:357
+#: cfghooks.c:360
#, c-format
msgid "%s does not support delete_basic_block."
msgstr ""
-#: cfghooks.c:391
+#: cfghooks.c:394
#, c-format
msgid "%s does not support split_edge."
msgstr ""
-#: cfghooks.c:444
+#: cfghooks.c:448
#, c-format
msgid "%s does not support create_basic_block."
msgstr ""
-#: cfghooks.c:472
+#: cfghooks.c:476
#, c-format
msgid "%s does not support can_merge_blocks_p."
msgstr ""
-#: cfghooks.c:483
+#: cfghooks.c:487
#, c-format
msgid "%s does not support predict_edge."
msgstr ""
-#: cfghooks.c:492
+#: cfghooks.c:496
#, c-format
msgid "%s does not support predicted_by_p."
msgstr ""
-#: cfghooks.c:505
+#: cfghooks.c:510
#, c-format
msgid "%s does not support merge_blocks."
msgstr ""
-#: cfghooks.c:549
+#: cfghooks.c:556
#, c-format
msgid "%s does not support make_forwarder_block."
msgstr ""
-#: cfghooks.c:650
+#: cfghooks.c:662
#, c-format
msgid "%s does not support can_duplicate_block_p."
msgstr ""
-#: cfghooks.c:676
+#: cfghooks.c:689
#, c-format
msgid "%s does not support duplicate_block."
msgstr ""
-#: cfghooks.c:742
+#: cfghooks.c:755
#, c-format
msgid "%s does not support block_ends_with_call_p"
msgstr ""
-#: cfghooks.c:753
+#: cfghooks.c:766
#, c-format
msgid "%s does not support block_ends_with_condjump_p"
msgstr ""
-#: cfghooks.c:771
+#: cfghooks.c:784
#, c-format
msgid "%s does not support flow_call_edges_add"
msgstr ""
-#: cfgloop.c:1288
+#: cfgloop.c:1302
#, c-format
msgid "Size of loop %d should be %d, not %d."
msgstr ""
-#: cfgloop.c:1305
+#: cfgloop.c:1319
#, c-format
msgid "Bb %d do not belong to loop %d."
msgstr ""
-#: cfgloop.c:1323
+#: cfgloop.c:1336
#, c-format
msgid "Loop %d's header does not have exactly 2 entries."
msgstr ""
-#: cfgloop.c:1331
+#: cfgloop.c:1343
#, c-format
msgid "Loop %d's latch does not have exactly 1 successor."
msgstr ""
-#: cfgloop.c:1336
+#: cfgloop.c:1348
#, c-format
msgid "Loop %d's latch does not have header as successor."
msgstr ""
-#: cfgloop.c:1341
+#: cfgloop.c:1353
#, c-format
msgid "Loop %d's latch does not belong directly to it."
msgstr ""
-#: cfgloop.c:1347
+#: cfgloop.c:1359
#, c-format
msgid "Loop %d's header does not belong directly to it."
msgstr ""
-#: cfgloop.c:1353
+#: cfgloop.c:1365
#, c-format
msgid "Loop %d's latch is marked as part of irreducible region."
msgstr ""
-#: cfgloop.c:1383
+#: cfgloop.c:1398
#, c-format
msgid "Basic block %d should be marked irreducible."
msgstr ""
-#: cfgloop.c:1389
+#: cfgloop.c:1404
#, c-format
msgid "Basic block %d should not be marked irreducible."
msgstr ""
-#: cfgloop.c:1397
+#: cfgloop.c:1412
#, c-format
msgid "Edge from %d to %d should be marked irreducible."
msgstr ""
-#: cfgloop.c:1404
+#: cfgloop.c:1419
#, c-format
msgid "Edge from %d to %d should not be marked irreducible."
msgstr ""
-#: cfgloop.c:1438
+#: cfgloop.c:1454
#, c-format
msgid "Wrong single exit %d->%d recorded for loop %d."
msgstr ""
-#: cfgloop.c:1442
+#: cfgloop.c:1458
#, c-format
msgid "Right exit is %d->%d."
msgstr ""
-#: cfgloop.c:1459
+#: cfgloop.c:1475
#, c-format
msgid "Single exit not recorded for loop %d."
msgstr ""
-#: cfgloop.c:1466
+#: cfgloop.c:1482
#, c-format
msgid "Loop %d should not have single exit (%d -> %d)."
msgstr ""
-#: cfgrtl.c:1926
+#: cfgrtl.c:1943
#, c-format
msgid "end insn %d for block %d not found in the insn stream"
msgstr ""
-#: cfgrtl.c:1940
+#: cfgrtl.c:1957
#, c-format
msgid "insn %d is in multiple basic blocks (%d and %d)"
msgstr ""
-#: cfgrtl.c:1952
+#: cfgrtl.c:1969
#, c-format
msgid "head insn %d for block %d not found in the insn stream"
msgstr ""
-#: cfgrtl.c:1974
+#: cfgrtl.c:1993
msgid "verify_flow_info: REG_BR_PROB does not match cfg %wi %i"
msgstr ""
-#: cfgrtl.c:1989
+#: cfgrtl.c:2008
#, c-format
msgid "Fallthru edge crosses section boundary (bb %i)"
msgstr ""
-#: cfgrtl.c:2014
+#: cfgrtl.c:2033
#, c-format
msgid "Missing REG_EH_REGION note in the end of bb %i"
msgstr ""
-#: cfgrtl.c:2022
+#: cfgrtl.c:2041
#, c-format
msgid "Too many outgoing branch edges from bb %i"
msgstr ""
-#: cfgrtl.c:2027
+#: cfgrtl.c:2046
#, c-format
msgid "Fallthru edge after unconditional jump %i"
msgstr ""
-#: cfgrtl.c:2038
+#: cfgrtl.c:2057
#, c-format
msgid "Wrong amount of branch edges after conditional jump %i"
msgstr ""
-#: cfgrtl.c:2043
+#: cfgrtl.c:2062
#, c-format
msgid "Call edges for non-call insn in bb %i"
msgstr ""
-#: cfgrtl.c:2052
+#: cfgrtl.c:2071
#, c-format
msgid "Abnormal edges for no purpose in bb %i"
msgstr ""
-#: cfgrtl.c:2062
+#: cfgrtl.c:2081
#, c-format
msgid "insn %d inside basic block %d but block_for_insn is NULL"
msgstr ""
-#: cfgrtl.c:2066
+#: cfgrtl.c:2085
#, c-format
msgid "insn %d inside basic block %d but block_for_insn is %i"
msgstr ""
-#: cfgrtl.c:2080 cfgrtl.c:2090
+#: cfgrtl.c:2099 cfgrtl.c:2109
#, c-format
msgid "NOTE_INSN_BASIC_BLOCK is missing for block %d"
msgstr ""
-#: cfgrtl.c:2103
+#: cfgrtl.c:2122
#, c-format
msgid "NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d"
msgstr ""
-#: cfgrtl.c:2113
+#: cfgrtl.c:2132
#, c-format
msgid "in basic block %d:"
msgstr ""
-#: cfgrtl.c:2114
+#: cfgrtl.c:2133
msgid "flow control insn inside a basic block"
msgstr ""
-#: cfgrtl.c:2160
+#: cfgrtl.c:2181
#, c-format
msgid "missing barrier after block %i"
msgstr ""
-#: cfgrtl.c:2173
+#: cfgrtl.c:2194
#, c-format
msgid "verify_flow_info: Incorrect blocks for fallthru %i->%i"
msgstr ""
-#: cfgrtl.c:2188
+#: cfgrtl.c:2209
#, c-format
msgid "verify_flow_info: Incorrect fallthru %i->%i"
msgstr ""
-#: cfgrtl.c:2190
+#: cfgrtl.c:2211
msgid "wrong insn in the fallthru edge"
msgstr ""
-#: cfgrtl.c:2207
+#: cfgrtl.c:2228
msgid "basic blocks not laid down consecutively"
msgstr ""
-#: cfgrtl.c:2232
+#: cfgrtl.c:2253
msgid "insn outside basic block"
msgstr ""
-#: cfgrtl.c:2240
+#: cfgrtl.c:2261
msgid "return not followed by barrier"
msgstr ""
-#: cfgrtl.c:2247
+#: cfgrtl.c:2268
#, c-format
msgid "number of bb notes in insn chain (%d) != n_basic_blocks (%d)"
msgstr ""
@@ -3866,15 +3956,15 @@ msgstr ""
msgid "function body not available"
msgstr ""
-#: cgraph.c:233 cgraphunit.c:869
+#: cgraph.c:233 cgraphunit.c:875
msgid "redefined extern inline functions are not considered for inlining"
msgstr ""
-#: cgraph.c:236 cgraphunit.c:874
+#: cgraph.c:236 cgraphunit.c:880
msgid "function not considered for inlining"
msgstr ""
-#: cgraph.c:238 cgraphunit.c:872
+#: cgraph.c:238 cgraphunit.c:878
msgid "function not inlinable"
msgstr ""
@@ -3882,82 +3972,82 @@ msgstr ""
msgid "%D renamed after being referenced in assembly"
msgstr ""
-#: cgraphunit.c:720
+#: cgraphunit.c:726
msgid "Shared call_expr:"
msgstr ""
-#: cgraphunit.c:726
+#: cgraphunit.c:732
msgid "Edge points to wrong declaration:"
msgstr ""
-#: cgraphunit.c:735
+#: cgraphunit.c:741
msgid "Missing callgraph edge for call expr:"
msgstr ""
-#: cgraphunit.c:761
+#: cgraphunit.c:767
#, c-format
msgid "Aux field set for edge %s->%s"
msgstr ""
-#: cgraphunit.c:773
+#: cgraphunit.c:779
msgid "Inlined_to pointer is wrong"
msgstr ""
-#: cgraphunit.c:778
+#: cgraphunit.c:784
msgid "Multiple inline callers"
msgstr ""
-#: cgraphunit.c:785
+#: cgraphunit.c:791
msgid "Inlined_to pointer set for noninline callers"
msgstr ""
-#: cgraphunit.c:791
+#: cgraphunit.c:797
msgid "Inlined_to pointer is set but no predecesors found"
msgstr ""
-#: cgraphunit.c:796
+#: cgraphunit.c:802
msgid "Inlined_to pointer reffers to itself"
msgstr ""
-#: cgraphunit.c:806
+#: cgraphunit.c:812
msgid "Node not found in DECL_ASSEMBLER_NAME hash"
msgstr ""
-#: cgraphunit.c:820
+#: cgraphunit.c:826
#, c-format
msgid "Edge %s->%s has no corresponding call_expr"
msgstr ""
-#: cgraphunit.c:831
+#: cgraphunit.c:837
msgid "verify_cgraph_node failed."
msgstr ""
-#: cgraphunit.c:1015
+#: cgraphunit.c:1021
msgid "failed to reclaim unneeded function"
msgstr ""
-#: cgraphunit.c:1545
+#: cgraphunit.c:1551
msgid "--param large-function-growth limit reached"
msgstr ""
-#: cgraphunit.c:1582
+#: cgraphunit.c:1588
msgid "recursive inlining"
msgstr ""
-#: cgraphunit.c:1747 cgraphunit.c:1999
+#: cgraphunit.c:1753 cgraphunit.c:2005
msgid "--param max-inline-insns-single limit reached"
msgstr ""
-#: cgraphunit.c:1771
+#: cgraphunit.c:1777
msgid ""
"--param max-inline-insns-single limit reached after inlining into the callee"
msgstr ""
-#: cgraphunit.c:1821
+#: cgraphunit.c:1827
msgid "--param inline-unit-growth limit reached"
msgstr ""
-#: cgraphunit.c:2843
+#: cgraphunit.c:2865
msgid "Nodes with no released memory found."
msgstr ""
@@ -4119,7 +4209,7 @@ msgstr ""
msgid "library lib%s not found"
msgstr ""
-#: combine.c:12371
+#: combine.c:12363
#, c-format
msgid ""
";; Combiner statistics: %d attempts, %d substitutions (%d requiring new "
@@ -4128,7 +4218,7 @@ msgid ""
"\n"
msgstr ""
-#: combine.c:12380
+#: combine.c:12372
#, c-format
msgid ""
"\n"
@@ -4152,23 +4242,23 @@ msgstr ""
msgid "conversion to incomplete type"
msgstr ""
-#: convert.c:681 convert.c:757
+#: convert.c:660 convert.c:736
msgid "can't convert between vector values of different size"
msgstr ""
-#: convert.c:687
+#: convert.c:666
msgid "aggregate value used where an integer was expected"
msgstr ""
-#: convert.c:737
+#: convert.c:716
msgid "pointer value used where a complex was expected"
msgstr ""
-#: convert.c:741
+#: convert.c:720
msgid "aggregate value used where a complex was expected"
msgstr ""
-#: convert.c:763
+#: convert.c:742
msgid "can't convert value to a vector"
msgstr ""
@@ -4240,7 +4330,7 @@ msgstr ""
msgid "too many input files"
msgstr ""
-#: cse.c:6729
+#: cse.c:6735
#, c-format
msgid ";; Processing block from %d to %d, %d sets.\n"
msgstr ""
@@ -4267,12 +4357,17 @@ msgstr ""
msgid "in %s, at %s:%d"
msgstr ""
-#: dominance.c:810
+#: dominance.c:836
+#, c-format
+msgid "dominator of %d status unknown"
+msgstr ""
+
+#: dominance.c:838
#, c-format
msgid "dominator of %d should be %d, not %d"
msgstr ""
-#: dominance.c:823
+#: dominance.c:851
#, c-format
msgid "ENTRY does not dominate bb %d"
msgstr ""
@@ -4290,19 +4385,19 @@ msgstr ""
msgid "can't access imaginary part of complex value in hard register"
msgstr ""
-#: emit-rtl.c:2266
+#: emit-rtl.c:2285
msgid "Invalid rtl sharing found in the insn"
msgstr ""
-#: emit-rtl.c:2268
+#: emit-rtl.c:2287
msgid "Shared rtx"
msgstr ""
-#: emit-rtl.c:2270
+#: emit-rtl.c:2289
msgid "Internal consistency failure"
msgstr ""
-#: emit-rtl.c:3417
+#: emit-rtl.c:3436
msgid "ICE: emit_insn used where emit_jump_insn needed:\n"
msgstr ""
@@ -4315,11 +4410,11 @@ msgstr ""
msgid "exception handling disabled, use -fexceptions to enable"
msgstr ""
-#: except.c:2924
+#: except.c:2934
msgid "argument of %<__builtin_eh_return_regno%> must be constant"
msgstr ""
-#: except.c:3055
+#: except.c:3065
msgid "__builtin_eh_return not supported on this target"
msgstr ""
@@ -4327,41 +4422,41 @@ msgstr ""
msgid "stack limits not supported on this target"
msgstr ""
-#: final.c:1059
+#: final.c:1060
msgid "negative insn length"
msgstr ""
-#: final.c:2499
+#: final.c:2500
msgid "could not split insn"
msgstr ""
-#: final.c:2834
+#: final.c:2835
msgid "invalid `asm': "
msgstr ""
-#: final.c:3017
+#: final.c:3018
msgid "nested assembly dialect alternatives"
msgstr ""
-#: final.c:3034 final.c:3046
+#: final.c:3035 final.c:3047
msgid "unterminated assembly dialect alternative"
msgstr ""
-#: final.c:3093
+#: final.c:3094
#, c-format
msgid "operand number missing after %%-letter"
msgstr ""
-#: final.c:3096 final.c:3137
+#: final.c:3097 final.c:3138
msgid "operand number out of range"
msgstr ""
-#: final.c:3156
+#: final.c:3157
#, c-format
msgid "invalid %%-code"
msgstr ""
-#: final.c:3186
+#: final.c:3187
#, c-format
msgid "`%%l' operand isn't a label"
msgstr ""
@@ -4372,12 +4467,12 @@ msgstr ""
#. handle them.
#. We can't handle floating point constants;
#. PRINT_OPERAND must handle them.
-#: final.c:3288 vmsdbgout.c:487 config/i386/i386.c:5831
+#: final.c:3289 vmsdbgout.c:487 config/i386/i386.c:5853
#: config/pdp11/pdp11.c:1690
msgid "floating constant misused"
msgstr ""
-#: final.c:3344 vmsdbgout.c:544 config/i386/i386.c:5909
+#: final.c:3345 vmsdbgout.c:544 config/i386/i386.c:5931
#: config/pdp11/pdp11.c:1737
msgid "invalid expression as operand"
msgstr ""
@@ -4386,29 +4481,29 @@ msgstr ""
msgid "internal consistency failure"
msgstr ""
-#: flow.c:1557
+#: flow.c:1559
msgid "Attempt to delete prologue/epilogue insn:"
msgstr ""
-#: fold-const.c:3186 fold-const.c:3197
+#: fold-const.c:3190 fold-const.c:3201
#, c-format
msgid "comparison is always %d due to width of bit-field"
msgstr ""
-#: fold-const.c:4756 fold-const.c:4771
+#: fold-const.c:4761 fold-const.c:4776
#, c-format
msgid "comparison is always %d"
msgstr ""
-#: fold-const.c:4900
+#: fold-const.c:4905
msgid "%<or%> of unmatched not-equal tests is always 1"
msgstr ""
-#: fold-const.c:4905
+#: fold-const.c:4910
msgid "%<and%> of mutually exclusive equal-tests is always 0"
msgstr ""
-#: fold-const.c:9025
+#: fold-const.c:9032
msgid "fold check: original tree changed by fold"
msgstr ""
@@ -4428,11 +4523,11 @@ msgstr ""
msgid "%Jargument %qD might be clobbered by %<longjmp%> or %<vfork%>"
msgstr ""
-#: function.c:3869
+#: function.c:3873
msgid "function returns an aggregate"
msgstr ""
-#: function.c:4202
+#: function.c:4206
msgid "%Junused parameter %qD"
msgstr ""
@@ -4764,12 +4859,12 @@ msgstr ""
msgid "%s (GCC) %s\n"
msgstr ""
-#: gcc.c:3408 gcov.c:412 java/gjavah.c:2310 java/jcf-dump.c:916
+#: gcc.c:3408 gcov.c:412 java/gjavah.c:2326 java/jcf-dump.c:916
#: java/jv-scan.c:126
msgid "(C)"
msgstr ""
-#: gcc.c:3409 java/gjavah.c:2311 java/jcf-dump.c:917 java/jv-scan.c:127
+#: gcc.c:3409 java/gjavah.c:2327 java/jcf-dump.c:917 java/jv-scan.c:127
#, c-format
msgid ""
"This is free software; see the source for copying conditions. There is NO\n"
@@ -4863,7 +4958,7 @@ msgid "spec `%s' has invalid `%%x%c'"
msgstr ""
#. Catch the case where a spec string contains something like
-#. '%{foo:%*}'. ie there is no * in the pattern on the left
+#. '%{foo:%*}'. i.e. there is no * in the pattern on the left
#. hand side of the :.
#: gcc.c:5174
#, c-format
@@ -5300,22 +5395,22 @@ msgid "GCSE disabled"
msgstr ""
#. Return if there's nothing to do, or it is too expensive.
-#: gcse.c:6527
+#: gcse.c:6567
msgid "jump bypassing disabled"
msgstr ""
-#: gcse.c:6588
+#: gcse.c:6628
#, c-format
msgid "%s: %d basic blocks and %d edges/basic block"
msgstr ""
-#: gcse.c:6601
+#: gcse.c:6641
#, c-format
msgid "%s: %d basic blocks and %d registers"
msgstr ""
#: ggc-common.c:397 ggc-common.c:405 ggc-common.c:473 ggc-common.c:494
-#: ggc-page.c:2196 ggc-page.c:2228 ggc-page.c:2235 ggc-zone.c:1582
+#: ggc-page.c:2203 ggc-page.c:2235 ggc-page.c:2242 ggc-zone.c:1582
#: ggc-zone.c:1588 ggc-zone.c:1597
#, c-format
msgid "can't write PCH file: %m"
@@ -5332,7 +5427,7 @@ msgid "can't write padding to PCH file: %m"
msgstr ""
#: ggc-common.c:550 ggc-common.c:558 ggc-common.c:565 ggc-common.c:568
-#: ggc-common.c:578 ggc-common.c:581 ggc-page.c:2322 ggc-zone.c:1607
+#: ggc-common.c:578 ggc-common.c:581 ggc-page.c:2329 ggc-zone.c:1607
#, c-format
msgid "can't read PCH file: %m"
msgstr ""
@@ -5341,12 +5436,12 @@ msgstr ""
msgid "had to relocate PCH"
msgstr ""
-#: ggc-page.c:1441
+#: ggc-page.c:1448
#, c-format
msgid "open /dev/zero: %m"
msgstr ""
-#: ggc-page.c:2213 ggc-page.c:2219
+#: ggc-page.c:2220 ggc-page.c:2226
msgid "can't write PCH file"
msgstr ""
@@ -5354,17 +5449,17 @@ msgstr ""
msgid "unexpected node"
msgstr ""
-#: gimplify.c:3164
+#: gimplify.c:3163
#, c-format
msgid "invalid lvalue in asm output %d"
msgstr ""
-#: gimplify.c:3212
+#: gimplify.c:3211
#, c-format
msgid "memory input %d is not directly addressable"
msgstr ""
-#: gimplify.c:4065
+#: gimplify.c:4066
msgid "gimplification failed"
msgstr ""
@@ -5373,8 +5468,8 @@ msgstr ""
msgid "%s cannot be used in asm here"
msgstr ""
-#: graph.c:399 passes.c:131 java/jcf-parse.c:907 java/jcf-parse.c:1065
-#: java/lex.c:1841 objc/objc-act.c:548
+#: graph.c:400 passes.c:131 java/jcf-parse.c:908 java/jcf-parse.c:1066
+#: java/lex.c:1841 objc/objc-act.c:550
#, c-format
msgid "can't open %s: %m"
msgstr ""
@@ -5516,32 +5611,32 @@ msgstr ""
msgid "invalid parameter %qs"
msgstr ""
-#: passes.c:1252
+#: passes.c:1260
msgid ""
"branch target register load optimization is not intended to be run twice"
msgstr ""
-#: profile.c:281
+#: profile.c:284
msgid "corrupted profile info: run_max * runs < sum_max"
msgstr ""
-#: profile.c:287
+#: profile.c:290
msgid "corrupted profile info: sum_all is smaller than sum_max"
msgstr ""
-#: profile.c:329
+#: profile.c:335
#, c-format
msgid "corrupted profile info: edge from %i to %i exceeds maximal count"
msgstr ""
-#: profile.c:492
+#: profile.c:503
#, c-format
msgid ""
"corrupted profile info: number of iterations for basic block %d thought to "
"be %i"
msgstr ""
-#: profile.c:513
+#: profile.c:524
#, c-format
msgid ""
"corrupted profile info: number of executions for edge %d-%d thought to be %i"
@@ -5850,72 +5945,72 @@ msgstr ""
msgid "%s: input file names must have .c suffixes: %s\n"
msgstr ""
-#: ra.c:772
+#: ra.c:774
msgid "Didn't find a coloring.\n"
msgstr ""
-#: reg-stack.c:671
+#: reg-stack.c:673
#, c-format
msgid "output constraint %d must specify a single register"
msgstr ""
-#: reg-stack.c:681
+#: reg-stack.c:683
#, c-format
msgid "output constraint %d cannot be specified together with \"%s\" clobber"
msgstr ""
-#: reg-stack.c:704
+#: reg-stack.c:706
msgid "output regs must be grouped at top of stack"
msgstr ""
-#: reg-stack.c:741
+#: reg-stack.c:743
msgid "implicitly popped regs must be grouped at top of stack"
msgstr ""
-#: reg-stack.c:760
+#: reg-stack.c:762
#, c-format
msgid "output operand %d must use `&' constraint"
msgstr ""
-#: regclass.c:770
+#: regclass.c:765
#, c-format
msgid "can't use '%s' as a %s register"
msgstr ""
-#: regclass.c:785 config/ia64/ia64.c:4106 config/ia64/ia64.c:4113
+#: regclass.c:780 config/ia64/ia64.c:4107 config/ia64/ia64.c:4114
#: config/pa/pa.c:328 config/pa/pa.c:335
#, c-format
msgid "unknown register name: %s"
msgstr ""
-#: regclass.c:795
+#: regclass.c:790
msgid "global register variable follows a function definition"
msgstr ""
-#: regclass.c:799
+#: regclass.c:794
msgid "register used for two global register variables"
msgstr ""
-#: regclass.c:804
+#: regclass.c:799
msgid "call-clobbered register used for global register variable"
msgstr ""
-#: regrename.c:1857
+#: regrename.c:1856
#, c-format
msgid "validate_value_data: [%u] Bad next_regno for empty chain (%u)"
msgstr ""
-#: regrename.c:1869
+#: regrename.c:1868
#, c-format
msgid "validate_value_data: Loop in regno chain (%u)"
msgstr ""
-#: regrename.c:1872
+#: regrename.c:1871
#, c-format
msgid "validate_value_data: [%u] Bad oldest_regno (%u)"
msgstr ""
-#: regrename.c:1884
+#: regrename.c:1883
#, c-format
msgid "validate_value_data: [%u] Non-empty reg in chain (%s %u %i)"
msgstr ""
@@ -6029,102 +6124,102 @@ msgstr ""
msgid "RTL flag check: %s used with unexpected rtx code `%s' in %s, at %s:%d"
msgstr ""
-#: stmt.c:315
+#: stmt.c:316
msgid "output operand constraint lacks %<=%>"
msgstr ""
-#: stmt.c:330
+#: stmt.c:331
#, c-format
msgid "output constraint %qc for operand %d is not at the beginning"
msgstr ""
-#: stmt.c:353
+#: stmt.c:354
msgid "operand constraint contains incorrectly positioned %<+%> or %<=%>"
msgstr ""
-#: stmt.c:360 stmt.c:459
+#: stmt.c:361 stmt.c:460
msgid "%<%%%> constraint used with last operand"
msgstr ""
-#: stmt.c:379
+#: stmt.c:380
msgid "matching constraint not valid in output operand"
msgstr ""
-#: stmt.c:450
+#: stmt.c:451
#, c-format
msgid "input operand constraint contains %qc"
msgstr ""
-#: stmt.c:492
+#: stmt.c:493
msgid "matching constraint references invalid operand number"
msgstr ""
-#: stmt.c:530
+#: stmt.c:531
#, c-format
msgid "invalid punctuation %qc in constraint"
msgstr ""
-#: stmt.c:554
+#: stmt.c:555
msgid "matching constraint does not allow a register"
msgstr ""
-#: stmt.c:609
+#: stmt.c:610
#, c-format
msgid "asm-specifier for variable %qs conflicts with asm clobber list"
msgstr ""
-#: stmt.c:698
+#: stmt.c:699
msgid "unknown register name %qs in %<asm%>"
msgstr ""
-#: stmt.c:706
+#: stmt.c:707
msgid "PIC register %qs clobbered in %<asm%>"
msgstr ""
-#: stmt.c:753
+#: stmt.c:754
msgid "more than %d operands in %<asm%>"
msgstr ""
-#: stmt.c:816
+#: stmt.c:817
#, c-format
msgid "output number %d not directly addressable"
msgstr ""
-#: stmt.c:895
+#: stmt.c:896
msgid "asm operand %d probably doesn%'t match constraints"
msgstr ""
-#: stmt.c:905
+#: stmt.c:906
#, c-format
msgid "use of memory input without lvalue in asm operand %d is deprecated"
msgstr ""
-#: stmt.c:1051
+#: stmt.c:1053
msgid "asm clobber conflict with output operand"
msgstr ""
-#: stmt.c:1056
+#: stmt.c:1058
msgid "asm clobber conflict with input operand"
msgstr ""
-#: stmt.c:1133
+#: stmt.c:1135
msgid "too many alternatives in %<asm%>"
msgstr ""
-#: stmt.c:1145
+#: stmt.c:1147
msgid "operand constraints for %<asm%> differ in number of alternatives"
msgstr ""
-#: stmt.c:1198
+#: stmt.c:1200
#, c-format
msgid "duplicate asm operand name %qs"
msgstr ""
-#: stmt.c:1296
+#: stmt.c:1298
msgid "missing close brace for named operand"
msgstr ""
-#: stmt.c:1324
+#: stmt.c:1326
#, c-format
msgid "undefined named operand %qs"
msgstr ""
@@ -6149,37 +6244,37 @@ msgstr ""
msgid "%Jsize of %qD is larger than %d bytes"
msgstr ""
-#: stor-layout.c:842
+#: stor-layout.c:844
msgid "%Jpacked attribute causes inefficient alignment for %qD"
msgstr ""
-#: stor-layout.c:845
+#: stor-layout.c:847
msgid "%Jpacked attribute is unnecessary for %qD"
msgstr ""
-#: stor-layout.c:861
+#: stor-layout.c:863
msgid "%Jpadding struct to align %qD"
msgstr ""
-#: stor-layout.c:1203
+#: stor-layout.c:1205
msgid "padding struct size to alignment boundary"
msgstr ""
-#: stor-layout.c:1233
+#: stor-layout.c:1235
#, c-format
msgid "packed attribute causes inefficient alignment for %qs"
msgstr ""
-#: stor-layout.c:1236
+#: stor-layout.c:1238
#, c-format
msgid "packed attribute is unnecessary for %qs"
msgstr ""
-#: stor-layout.c:1241
+#: stor-layout.c:1243
msgid "packed attribute causes inefficient alignment"
msgstr ""
-#: stor-layout.c:1243
+#: stor-layout.c:1245
msgid "packed attribute is unnecessary"
msgstr ""
@@ -6240,97 +6335,97 @@ msgstr ""
msgid "ld returned %d exit status"
msgstr ""
-#: toplev.c:470
+#: toplev.c:464
#, c-format
msgid "%s "
msgstr ""
-#: toplev.c:472
+#: toplev.c:466
#, c-format
msgid " %s"
msgstr ""
-#: toplev.c:537
+#: toplev.c:531
#, c-format
msgid "invalid option argument %qs"
msgstr ""
-#: toplev.c:601
+#: toplev.c:595
msgid "unrecoverable error"
msgstr ""
-#: toplev.c:621
+#: toplev.c:615
#, c-format
msgid "getting core file size maximum limit: %m"
msgstr ""
-#: toplev.c:624
+#: toplev.c:618
#, c-format
msgid "setting core file size limit to maximum: %m"
msgstr ""
-#: toplev.c:845
+#: toplev.c:839
msgid "%J%qF declared %<static%> but never defined"
msgstr ""
-#: toplev.c:871
+#: toplev.c:865
msgid "%J%qD defined but not used"
msgstr ""
-#: toplev.c:894 toplev.c:917
+#: toplev.c:888 toplev.c:911
#, c-format
msgid "%qs is deprecated (declared at %s:%d)"
msgstr ""
-#: toplev.c:920
+#: toplev.c:914
#, c-format
msgid "type is deprecated (declared at %s:%d)"
msgstr ""
-#: toplev.c:926
+#: toplev.c:920
#, c-format
msgid "%qs is deprecated"
msgstr ""
-#: toplev.c:928
+#: toplev.c:922
msgid "type is deprecated"
msgstr ""
-#: toplev.c:1070
+#: toplev.c:1064
#, c-format
msgid ""
"\n"
"Target specific options:\n"
msgstr ""
-#: toplev.c:1084 toplev.c:1103
+#: toplev.c:1078 toplev.c:1097
#, c-format
msgid " -m%-23s [undocumented]\n"
msgstr ""
-#: toplev.c:1112
+#: toplev.c:1106
#, c-format
msgid ""
"\n"
"There are undocumented target specific options as well.\n"
msgstr ""
-#: toplev.c:1114
+#: toplev.c:1108
#, c-format
msgid " They exist, but they are not documented.\n"
msgstr ""
-#: toplev.c:1158
+#: toplev.c:1152
#, c-format
msgid "unrecognized gcc debugging option: %c"
msgstr ""
-#: toplev.c:1220
+#: toplev.c:1214
#, c-format
msgid "invalid option %qs"
msgstr ""
-#: toplev.c:1235
+#: toplev.c:1229
#, c-format
msgid ""
"%s%s%s version %s (%s)\n"
@@ -6338,279 +6433,279 @@ msgid ""
"%s%s%s version %s (%s) compiled by CC.\n"
msgstr ""
-#: toplev.c:1242
+#: toplev.c:1236
#, c-format
msgid ""
"%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n"
msgstr ""
-#: toplev.c:1294
+#: toplev.c:1288
msgid "options passed: "
msgstr ""
-#: toplev.c:1323
+#: toplev.c:1317
msgid "options enabled: "
msgstr ""
-#: toplev.c:1397
+#: toplev.c:1391
msgid "can%'t open %s for writing: %m"
msgstr ""
-#: toplev.c:1480 config/sh/sh.c:7263
+#: toplev.c:1474 config/sh/sh.c:7287
msgid "created and used with different settings of -fpic"
msgstr ""
-#: toplev.c:1482 config/sh/sh.c:7265
+#: toplev.c:1476 config/sh/sh.c:7289
msgid "created and used with different settings of -fpie"
msgstr ""
-#: toplev.c:1533
+#: toplev.c:1527
#, c-format
msgid "created and used with differing settings of '-m%s'"
msgstr ""
-#: toplev.c:1536 config/sh/sh.c:7318
+#: toplev.c:1530 config/sh/sh.c:7342
msgid "out of memory"
msgstr ""
-#: toplev.c:1731
+#: toplev.c:1725
msgid "instruction scheduling not supported on this target machine"
msgstr ""
-#: toplev.c:1735
+#: toplev.c:1729
msgid "this target machine does not have delayed branches"
msgstr ""
-#: toplev.c:1739
+#: toplev.c:1733
msgid "value-based profiling not yet implemented in trees."
msgstr ""
-#: toplev.c:1752
+#: toplev.c:1746
#, c-format
msgid "-f%sleading-underscore not supported on this target machine"
msgstr ""
-#: toplev.c:1826
+#: toplev.c:1820
#, c-format
msgid "target system does not support the \"%s\" debug format"
msgstr ""
-#: toplev.c:1838
+#: toplev.c:1832
msgid "variable tracking requested, but useless unless producing debug info"
msgstr ""
-#: toplev.c:1841
+#: toplev.c:1835
msgid "variable tracking requested, but not supported by this debug format"
msgstr ""
-#: toplev.c:1865
+#: toplev.c:1855
msgid "can%'t open %s: %m"
msgstr ""
-#: toplev.c:1872
+#: toplev.c:1862
msgid "-ffunction-sections not supported for this target"
msgstr ""
-#: toplev.c:1877
+#: toplev.c:1867
msgid "-fdata-sections not supported for this target"
msgstr ""
-#: toplev.c:1884
+#: toplev.c:1874
msgid "-ffunction-sections disabled; it makes profiling impossible"
msgstr ""
-#: toplev.c:1891
+#: toplev.c:1881
msgid "-fprefetch-loop-arrays not supported for this target"
msgstr ""
-#: toplev.c:1897
+#: toplev.c:1887
msgid "-fspeculative-prefetching not supported for this target"
msgstr ""
-#: toplev.c:1903
+#: toplev.c:1893
msgid ""
"-fprefetch-loop-arrays not supported for this target (try -march switches)"
msgstr ""
-#: toplev.c:1909
+#: toplev.c:1899
msgid ""
"-fspeculative-prefetching not supported for this target (try -march switches)"
msgstr ""
-#: toplev.c:1918
+#: toplev.c:1908
msgid "-fprefetch-loop-arrays is not supported with -Os"
msgstr ""
-#: toplev.c:1924
+#: toplev.c:1914
msgid "-ffunction-sections may affect debugging on some targets"
msgstr ""
-#: toplev.c:2033
+#: toplev.c:2023
#, c-format
msgid "error writing to %s: %m"
msgstr ""
-#: toplev.c:2035 java/jcf-parse.c:926 java/jcf-write.c:3524
+#: toplev.c:2025 java/jcf-parse.c:927 java/jcf-write.c:3527
#, c-format
msgid "error closing %s: %m"
msgstr ""
-#: tree-cfg.c:1127 tree-cfg.c:1827 tree-cfg.c:1829
+#: tree-cfg.c:1127 tree-cfg.c:1826 tree-cfg.c:1828
msgid "%Hwill never be executed"
msgstr ""
-#: tree-cfg.c:3096
+#: tree-cfg.c:3082
msgid "SSA name in freelist but still referenced"
msgstr ""
-#: tree-cfg.c:3106
+#: tree-cfg.c:3092
msgid "GIMPLE register modified with BIT_FIELD_REF"
msgstr ""
-#: tree-cfg.c:3126
+#: tree-cfg.c:3112
msgid "address taken, but ADDRESSABLE bit not set"
msgstr ""
-#: tree-cfg.c:3135
+#: tree-cfg.c:3121
msgid "non-boolean used in condition"
msgstr ""
-#: tree-cfg.c:3192
+#: tree-cfg.c:3177
msgid "Invalid reference prefix."
msgstr ""
-#: tree-cfg.c:3257
+#: tree-cfg.c:3242
msgid "Is not a valid GIMPLE statement."
msgstr ""
-#: tree-cfg.c:3277
+#: tree-cfg.c:3262
msgid "Statement marked for throw, but doesn%'t."
msgstr ""
-#: tree-cfg.c:3282
+#: tree-cfg.c:3267
msgid "Statement marked for throw in middle of block."
msgstr ""
-#: tree-cfg.c:3382
+#: tree-cfg.c:3367
msgid "PHI def is not a GIMPLE value"
msgstr ""
-#: tree-cfg.c:3398 tree-cfg.c:3414
+#: tree-cfg.c:3383 tree-cfg.c:3399
msgid "Incorrect sharing of tree nodes"
msgstr ""
-#: tree-cfg.c:3423
+#: tree-cfg.c:3408
msgid "verify_stmts failed."
msgstr ""
-#: tree-cfg.c:3443
+#: tree-cfg.c:3429
msgid "ENTRY_BLOCK has a statement list associated with it\n"
msgstr ""
-#: tree-cfg.c:3449
+#: tree-cfg.c:3435
msgid "EXIT_BLOCK has a statement list associated with it\n"
msgstr ""
-#: tree-cfg.c:3456
+#: tree-cfg.c:3442
#, c-format
msgid "Fallthru to exit from bb %d\n"
msgstr ""
-#: tree-cfg.c:3472
+#: tree-cfg.c:3458
#, c-format
msgid "Label %s to block does not match in bb %d\n"
msgstr ""
-#: tree-cfg.c:3481
+#: tree-cfg.c:3467
#, c-format
msgid "Label %s has incorrect context in bb %d\n"
msgstr ""
-#: tree-cfg.c:3495
+#: tree-cfg.c:3481
#, c-format
msgid "Control flow in the middle of basic block %d\n"
msgstr ""
-#: tree-cfg.c:3505
+#: tree-cfg.c:3491
#, c-format
msgid "Label %s in the middle of basic block %d\n"
msgstr ""
-#: tree-cfg.c:3522
+#: tree-cfg.c:3508
#, c-format
msgid "Fallthru edge after a control statement in bb %d \n"
msgstr ""
-#: tree-cfg.c:3537
+#: tree-cfg.c:3523
#, c-format
msgid "Structured COND_EXPR at the end of bb %d\n"
msgstr ""
-#: tree-cfg.c:3550 tree-cfg.c:3588 tree-cfg.c:3600 tree-cfg.c:3671
+#: tree-cfg.c:3536 tree-cfg.c:3574 tree-cfg.c:3586 tree-cfg.c:3657
#, c-format
msgid "Wrong outgoing edge flags at end of bb %d\n"
msgstr ""
-#: tree-cfg.c:3558
+#: tree-cfg.c:3544
msgid "%<then%> label does not match edge at end of bb %d\n"
msgstr ""
-#: tree-cfg.c:3566
+#: tree-cfg.c:3552
msgid "%<else%> label does not match edge at end of bb %d\n"
msgstr ""
-#: tree-cfg.c:3576
+#: tree-cfg.c:3562
#, c-format
msgid "Explicit goto at end of bb %d\n"
msgstr ""
-#: tree-cfg.c:3605
+#: tree-cfg.c:3591
#, c-format
msgid "Return edge does not point to exit in bb %d\n"
msgstr ""
-#: tree-cfg.c:3638
+#: tree-cfg.c:3624
msgid "Found default case not at end of case vector"
msgstr ""
-#: tree-cfg.c:3644
+#: tree-cfg.c:3630
msgid ""
"Case labels not sorted:\n"
" "
msgstr ""
-#: tree-cfg.c:3655
+#: tree-cfg.c:3641
msgid "No default case found at end of case vector"
msgstr ""
-#: tree-cfg.c:3663
+#: tree-cfg.c:3649
#, c-format
msgid "Extra outgoing edge %d->%d\n"
msgstr ""
-#: tree-cfg.c:3685
+#: tree-cfg.c:3671
#, c-format
msgid "Missing edge %i->%i\n"
msgstr ""
-#: tree-cfg.c:4845
+#: tree-cfg.c:5247
msgid "%Jfunction might be possible candidate for attribute %<noreturn%>"
msgstr ""
-#: tree-cfg.c:4872 tree-cfg.c:4876
+#: tree-cfg.c:5274 tree-cfg.c:5278
msgid "%H%<noreturn%> function does return"
msgstr ""
-#: tree-cfg.c:4896 tree-cfg.c:4901
+#: tree-cfg.c:5298 tree-cfg.c:5303
msgid "%Hcontrol reaches end of non-void function"
msgstr ""
-#: tree-dump.c:845
+#: tree-dump.c:847
#, c-format
msgid "could not open dump file %qs: %s"
msgstr ""
-#: tree-dump.c:958
+#: tree-dump.c:960
msgid "ignoring unknown option %q.*s in %<-fdump-%s%>"
msgstr ""
@@ -6639,47 +6734,42 @@ msgstr ""
msgid "%Jfunction '%F' can never be inlined because it uses non-local goto"
msgstr ""
-#: tree-inline.c:1003
-msgid ""
-"%Jfunction '%F' can never be inlined because it contains a nested function"
-msgstr ""
-
-#: tree-inline.c:1020
+#: tree-inline.c:1006
msgid ""
"%Jfunction '%F' can never be inlined because it contains a computed goto"
msgstr ""
-#: tree-inline.c:1034
+#: tree-inline.c:1020
msgid ""
"%Jfunction '%F' can never be inlined because it receives a non-local goto"
msgstr ""
-#: tree-inline.c:1056
+#: tree-inline.c:1042
msgid ""
"%Jfunction '%F' can never be inlined because it uses variable sized variables"
msgstr ""
-#: tree-inline.c:1478
+#: tree-inline.c:1463
msgid "originally indirect function call not considered for inlining"
msgstr ""
-#: tree-inline.c:1488 tree-inline.c:1495
+#: tree-inline.c:1473 tree-inline.c:1480
msgid "%Jinlining failed in call to '%F': %s"
msgstr ""
-#: tree-inline.c:1489 tree-inline.c:1496
+#: tree-inline.c:1474 tree-inline.c:1481
msgid "called from here"
msgstr ""
-#: tree-mudflap.c:750
+#: tree-mudflap.c:768
msgid "mudflap checking not yet implemented for ARRAY_RANGE_REF"
msgstr ""
-#: tree-mudflap.c:972
+#: tree-mudflap.c:990
msgid "mudflap ran off end of BIND_EXPR body"
msgstr ""
-#: tree-mudflap.c:1163
+#: tree-mudflap.c:1181
#, c-format
msgid "mudflap cannot track lifetime of %qs"
msgstr ""
@@ -6688,17 +6778,17 @@ msgstr ""
msgid "mudflap: this language is not supported"
msgstr ""
-#: tree-optimize.c:666
+#: tree-optimize.c:685
msgid "%Jsize of return value of '%D' is %u bytes"
msgstr ""
-#: tree-optimize.c:669
+#: tree-optimize.c:688
msgid "%Jsize of return value of '%D' is larger than %wd bytes"
msgstr ""
-#: tree-outof-ssa.c:613 tree-outof-ssa.c:628 tree-outof-ssa.c:642
-#: tree-outof-ssa.c:663 tree-outof-ssa.c:1036 tree-outof-ssa.c:1849
-#: tree-ssa-live.c:417 tree-ssa-live.c:1791
+#: tree-outof-ssa.c:614 tree-outof-ssa.c:629 tree-outof-ssa.c:643
+#: tree-outof-ssa.c:664 tree-outof-ssa.c:1037 tree-outof-ssa.c:1847
+#: tree-ssa-live.c:417 tree-ssa-live.c:1799
msgid "SSA corruption"
msgstr ""
@@ -6706,7 +6796,7 @@ msgstr ""
msgid "unimplemented functionality"
msgstr ""
-#: tree-ssa-operands.c:1186
+#: tree-ssa-operands.c:1200
msgid "internal error"
msgstr ""
@@ -6757,138 +6847,138 @@ msgstr ""
msgid "SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set"
msgstr ""
-#: tree-ssa.c:300
+#: tree-ssa.c:301
#, c-format
msgid "Wrong edge %d->%d for PHI argument\n"
msgstr ""
-#: tree-ssa.c:307
+#: tree-ssa.c:308
#, c-format
msgid "PHI argument flowing through dead edge %d->%d\n"
msgstr ""
-#: tree-ssa.c:314
+#: tree-ssa.c:315
#, c-format
msgid "PHI argument duplicated for edge %d->%d\n"
msgstr ""
-#: tree-ssa.c:333
+#: tree-ssa.c:334
#, c-format
msgid "No argument flowing through edge %d->%d\n"
msgstr ""
-#: tree-ssa.c:378
+#: tree-ssa.c:379
msgid "Non-addressable variable inside an alias set."
msgstr ""
-#: tree-ssa.c:396
+#: tree-ssa.c:397
msgid "Addressable variable that is an alias tag but is not in any alias set."
msgstr ""
-#: tree-ssa.c:406
+#: tree-ssa.c:407
msgid "verify_flow_insensitive_alias_info failed."
msgstr ""
-#: tree-ssa.c:443
+#: tree-ssa.c:446
msgid "Dereferenced pointers should have a name or a type tag"
msgstr ""
-#: tree-ssa.c:452
+#: tree-ssa.c:455
msgid ""
"Pointers with a memory tag, should have points-to sets or point to malloc"
msgstr ""
-#: tree-ssa.c:460
+#: tree-ssa.c:463
msgid "Pointer escapes but its name tag is not call-clobbered."
msgstr ""
-#: tree-ssa.c:483
+#: tree-ssa.c:487
msgid "Two pointers with different name tags and identical points-to sets"
msgstr ""
-#: tree-ssa.c:495
+#: tree-ssa.c:499
msgid "verify_flow_sensitive_alias_info failed."
msgstr ""
-#: tree-ssa.c:553
+#: tree-ssa.c:558
msgid "Statement makes aliased stores, but has no V_MAY_DEFS"
msgstr ""
-#: tree-ssa.c:586
+#: tree-ssa.c:592
#, c-format
msgid "AUX pointer initialized for edge %d->%d\n"
msgstr ""
-#: tree-ssa.c:665
+#: tree-ssa.c:671
msgid "verify_ssa failed."
msgstr ""
-#: tree-ssa.c:1277
+#: tree-ssa.c:1302
msgid "%H'%D' is used uninitialized in this function"
msgstr ""
-#: tree-ssa.c:1302
+#: tree-ssa.c:1327
msgid "%H'%D' may be used uninitialized in this function"
msgstr ""
-#: tree-vectorizer.c:928
+#: tree-vectorizer.c:1213
msgid "no support for reduction/induction"
msgstr ""
-#: tree-vectorizer.c:954
+#: tree-vectorizer.c:1239
msgid "unsupported defining stmt"
msgstr ""
-#: tree.c:3093
+#: tree.c:3160
msgid "%Jfunction %qD definition is marked dllimport."
msgstr ""
-#: tree.c:3101
+#: tree.c:3168
msgid "%Jvariable %qD definition is marked dllimport."
msgstr ""
-#: tree.c:3121
+#: tree.c:3188
msgid "%Jexternal linkage required for symbol %qD because of %qs attribute."
msgstr ""
-#: tree.c:4261
+#: tree.c:4328
msgid "arrays of functions are not meaningful"
msgstr ""
-#: tree.c:4310
+#: tree.c:4377
msgid "function return type cannot be function"
msgstr ""
-#: tree.c:5191
+#: tree.c:5259
msgid "invalid initializer for bit string"
msgstr ""
-#: tree.c:5269
+#: tree.c:5337
#, c-format
msgid "tree check: expected %s, have %s in %s, at %s:%d"
msgstr ""
-#: tree.c:5306
+#: tree.c:5374
#, c-format
msgid "tree check: expected none of %s, have %s in %s, at %s:%d"
msgstr ""
-#: tree.c:5319
+#: tree.c:5387
#, c-format
-msgid "tree check: expected class %qc, have %qc (%s) in %s, at %s:%d"
+msgid "tree check: expected class %qs, have %qs (%s) in %s, at %s:%d"
msgstr ""
-#: tree.c:5332
+#: tree.c:5401
#, c-format
msgid "tree check: accessed elt %d of tree_vec with %d elts in %s, at %s:%d"
msgstr ""
-#: tree.c:5344
+#: tree.c:5413
#, c-format
msgid "tree check: accessed elt %d of phi_node with %d elts in %s, at %s:%d"
msgstr ""
-#: tree.c:5356
+#: tree.c:5425
#, c-format
msgid "tree check: accessed operand %d of %s with %d operands in %s, at %s:%d"
msgstr ""
@@ -6939,49 +7029,49 @@ msgid ""
"%Jrequested alignment for %qD is greater than implemented alignment of %d"
msgstr ""
-#: varasm.c:3725
+#: varasm.c:3727
msgid "initializer for integer value is too complicated"
msgstr ""
-#: varasm.c:3730
+#: varasm.c:3732
msgid "initializer for floating value is not a floating constant"
msgstr ""
-#: varasm.c:3796
+#: varasm.c:3798
msgid "unknown set constructor type"
msgstr ""
-#: varasm.c:4015
+#: varasm.c:4017
#, c-format
msgid "invalid initial value for member %qs"
msgstr ""
-#: varasm.c:4202 varasm.c:4246
+#: varasm.c:4204 varasm.c:4248
msgid "%Jweak declaration of %qD must precede definition"
msgstr ""
-#: varasm.c:4210
+#: varasm.c:4212
msgid ""
"%Jweak declaration of %qD after first use results in unspecified behavior"
msgstr ""
-#: varasm.c:4244
+#: varasm.c:4246
msgid "%Jweak declaration of %qD must be public"
msgstr ""
-#: varasm.c:4253
+#: varasm.c:4255
msgid "%Jweak declaration of %qD not supported"
msgstr ""
-#: varasm.c:4282 varasm.c:4375
+#: varasm.c:4284 varasm.c:4377
msgid "only weak aliases are supported in this configuration"
msgstr ""
-#: varasm.c:4378
+#: varasm.c:4380
msgid "alias definitions not supported in this configuration; ignored"
msgstr ""
-#: varasm.c:4407
+#: varasm.c:4409
msgid "visibility attribute not supported in this configuration; ignored"
msgstr ""
@@ -7461,7 +7551,7 @@ msgstr ""
msgid "bad value `%s' for -mfp-trap-mode switch"
msgstr ""
-#: config/alpha/alpha.c:347 config/rs6000/rs6000.c:1613
+#: config/alpha/alpha.c:347 config/rs6000/rs6000.c:1646
#, c-format
msgid "bad value `%s' for -mtls-size switch"
msgstr ""
@@ -7501,91 +7591,91 @@ msgstr ""
msgid "bad value `%s' for -mmemory-latency"
msgstr ""
-#: config/alpha/alpha.c:4541
+#: config/alpha/alpha.c:4547
#, c-format
msgid "invalid %%H value"
msgstr ""
-#: config/alpha/alpha.c:4562
+#: config/alpha/alpha.c:4568
#, c-format
msgid "invalid %%J value"
msgstr ""
-#: config/alpha/alpha.c:4578 config/ia64/ia64.c:3709
+#: config/alpha/alpha.c:4584 config/ia64/ia64.c:3710
#, c-format
msgid "invalid %%r value"
msgstr ""
-#: config/alpha/alpha.c:4588 config/rs6000/rs6000.c:10187
+#: config/alpha/alpha.c:4594 config/rs6000/rs6000.c:10316
#: config/xtensa/xtensa.c:1951
#, c-format
msgid "invalid %%R value"
msgstr ""
-#: config/alpha/alpha.c:4594 config/rs6000/rs6000.c:10106
+#: config/alpha/alpha.c:4600 config/rs6000/rs6000.c:10235
#: config/xtensa/xtensa.c:1918
#, c-format
msgid "invalid %%N value"
msgstr ""
-#: config/alpha/alpha.c:4602 config/rs6000/rs6000.c:10134
+#: config/alpha/alpha.c:4608 config/rs6000/rs6000.c:10263
#, c-format
msgid "invalid %%P value"
msgstr ""
-#: config/alpha/alpha.c:4610
+#: config/alpha/alpha.c:4616
#, c-format
msgid "invalid %%h value"
msgstr ""
-#: config/alpha/alpha.c:4618 config/xtensa/xtensa.c:1944
+#: config/alpha/alpha.c:4624 config/xtensa/xtensa.c:1944
#, c-format
msgid "invalid %%L value"
msgstr ""
-#: config/alpha/alpha.c:4657 config/rs6000/rs6000.c:10088
+#: config/alpha/alpha.c:4663 config/rs6000/rs6000.c:10217
#, c-format
msgid "invalid %%m value"
msgstr ""
-#: config/alpha/alpha.c:4665 config/rs6000/rs6000.c:10096
+#: config/alpha/alpha.c:4671 config/rs6000/rs6000.c:10225
#, c-format
msgid "invalid %%M value"
msgstr ""
-#: config/alpha/alpha.c:4709
+#: config/alpha/alpha.c:4715
#, c-format
msgid "invalid %%U value"
msgstr ""
-#: config/alpha/alpha.c:4721 config/alpha/alpha.c:4735
-#: config/rs6000/rs6000.c:10195
+#: config/alpha/alpha.c:4727 config/alpha/alpha.c:4741
+#: config/rs6000/rs6000.c:10324
#, c-format
msgid "invalid %%s value"
msgstr ""
-#: config/alpha/alpha.c:4758
+#: config/alpha/alpha.c:4764
#, c-format
msgid "invalid %%C value"
msgstr ""
-#: config/alpha/alpha.c:4795 config/rs6000/rs6000.c:9925
-#: config/rs6000/rs6000.c:9945
+#: config/alpha/alpha.c:4801 config/rs6000/rs6000.c:10054
+#: config/rs6000/rs6000.c:10074
#, c-format
msgid "invalid %%E value"
msgstr ""
-#: config/alpha/alpha.c:4820 config/alpha/alpha.c:4868
+#: config/alpha/alpha.c:4826 config/alpha/alpha.c:4874
msgid "unknown relocation unspec"
msgstr ""
-#: config/alpha/alpha.c:4829 config/rs6000/rs6000.c:10507
+#: config/alpha/alpha.c:4835 config/rs6000/rs6000.c:10641
#, c-format
msgid "invalid %%xn code"
msgstr ""
-#: config/alpha/alpha.c:5789 config/alpha/alpha.c:5792 config/s390/s390.c:7333
-#: config/s390/s390.c:7336
+#: config/alpha/alpha.c:5795 config/alpha/alpha.c:5798 config/s390/s390.c:7411
+#: config/s390/s390.c:7414
msgid "bad builtin fcode"
msgstr ""
@@ -7603,7 +7693,7 @@ msgstr ""
#. where VALUE is the bits to set or minus the bits to clear.
#. An empty string NAME is used to identify the default VALUE.
#: config/alpha/alpha.h:293 config/i386/i386.h:333 config/i386/i386.h:335
-#: config/i386/i386.h:337 config/ns32k/ns32k.h:140 config/s390/s390.h:132
+#: config/i386/i386.h:337 config/ns32k/ns32k.h:140 config/s390/s390.h:135
#: config/sparc/sparc.h:616 config/sparc/sparc.h:621
msgid "Use hardware fp"
msgstr ""
@@ -7769,7 +7859,7 @@ msgstr ""
#. Unknown flag.
#. Undocumented flag.
-#: config/arc/arc.c:1812 config/m32r/m32r.c:2251 config/sparc/sparc.c:7254
+#: config/arc/arc.c:1812 config/m32r/m32r.c:2251 config/sparc/sparc.c:7298
msgid "invalid operand output code"
msgstr ""
@@ -7778,7 +7868,7 @@ msgstr ""
msgid "switch -mcpu=%s conflicts with -march= switch"
msgstr ""
-#: config/arm/arm.c:784 config/rs6000/rs6000.c:1187 config/sparc/sparc.c:612
+#: config/arm/arm.c:784 config/rs6000/rs6000.c:1200 config/sparc/sparc.c:621
#, c-format
msgid "bad value (%s) for %s switch"
msgstr ""
@@ -7875,20 +7965,20 @@ msgid "unable to use '%s' for PIC register"
msgstr ""
#: config/arm/arm.c:2598 config/arm/arm.c:2616 config/avr/avr.c:4533
-#: config/c4x/c4x.c:4500 config/h8300/h8300.c:5755 config/i386/i386.c:1681
-#: config/i386/i386.c:1727 config/ip2k/ip2k.c:3181
+#: config/c4x/c4x.c:4500 config/h8300/h8300.c:5755 config/i386/i386.c:1685
+#: config/i386/i386.c:1731 config/ip2k/ip2k.c:3181
#: config/m68hc11/m68hc11.c:1350 config/m68k/m68k.c:288
#: config/mcore/mcore.c:3375 config/ns32k/ns32k.c:1068
-#: config/rs6000/rs6000.c:16236 config/sh/sh.c:7117 config/sh/sh.c:7138
-#: config/sh/sh.c:7173 config/stormy16/stormy16.c:2413 config/v850/v850.c:2207
+#: config/rs6000/rs6000.c:16369 config/sh/sh.c:7141 config/sh/sh.c:7162
+#: config/sh/sh.c:7197 config/stormy16/stormy16.c:2413 config/v850/v850.c:2207
#, c-format
msgid "`%s' attribute only applies to functions"
msgstr ""
#: config/arm/arm.c:2630 config/arm/arm.c:2657 config/avr/avr.c:4514
-#: config/h8300/h8300.c:5779 config/h8300/h8300.c:5802 config/i386/i386.c:1709
-#: config/i386/i386.c:14480 config/ia64/ia64.c:512 config/ip2k/ip2k.c:3163
-#: config/m68hc11/m68hc11.c:1314 config/rs6000/rs6000.c:16201
+#: config/h8300/h8300.c:5779 config/h8300/h8300.c:5802 config/i386/i386.c:1713
+#: config/i386/i386.c:14513 config/ia64/ia64.c:512 config/ip2k/ip2k.c:3163
+#: config/m68hc11/m68hc11.c:1314 config/rs6000/rs6000.c:16334
#: config/sh/symbian.c:414 config/sh/symbian.c:421
#, c-format
msgid "`%s' attribute ignored"
@@ -7904,7 +7994,7 @@ msgid "selector must be an immediate"
msgstr ""
#. @@@ better error message
-#: config/arm/arm.c:12002 config/i386/i386.c:13373 config/i386/i386.c:13407
+#: config/arm/arm.c:12002 config/i386/i386.c:13406 config/i386/i386.c:13440
msgid "mask must be an immediate"
msgstr ""
@@ -8991,177 +9081,177 @@ msgstr ""
msgid "Use H8/300 alignment rules"
msgstr ""
-#: config/i386/i386.c:1242
+#: config/i386/i386.c:1246
#, c-format
msgid "code model %s not supported in PIC mode"
msgstr ""
-#: config/i386/i386.c:1252 config/sparc/sparc.c:575
+#: config/i386/i386.c:1256 config/sparc/sparc.c:584
#, c-format
msgid "bad value (%s) for -mcmodel= switch"
msgstr ""
-#: config/i386/i386.c:1267
+#: config/i386/i386.c:1271
#, c-format
msgid "bad value (%s) for -masm= switch"
msgstr ""
-#: config/i386/i386.c:1270
+#: config/i386/i386.c:1274
#, c-format
msgid "code model `%s' not supported in the %s bit mode"
msgstr ""
-#: config/i386/i386.c:1273
+#: config/i386/i386.c:1277
msgid "code model `large' not supported yet"
msgstr ""
-#: config/i386/i386.c:1275
+#: config/i386/i386.c:1279
#, c-format
msgid "%i-bit mode not compiled in"
msgstr ""
-#: config/i386/i386.c:1316 config/i386/i386.c:1330
+#: config/i386/i386.c:1320 config/i386/i386.c:1334
msgid "CPU you selected does not support x86-64 instruction set"
msgstr ""
-#: config/i386/i386.c:1323 config/iq2000/iq2000.c:1671
+#: config/i386/i386.c:1327 config/iq2000/iq2000.c:1671
#, c-format
msgid "bad value (%s) for -march= switch"
msgstr ""
-#: config/i386/i386.c:1342
+#: config/i386/i386.c:1346
#, c-format
msgid "bad value (%s) for -mtune= switch"
msgstr ""
-#: config/i386/i386.c:1359
+#: config/i386/i386.c:1363
#, c-format
msgid "-mregparm=%d is not between 0 and %d"
msgstr ""
-#: config/i386/i386.c:1372
+#: config/i386/i386.c:1376
msgid "-malign-loops is obsolete, use -falign-loops"
msgstr ""
-#: config/i386/i386.c:1377 config/i386/i386.c:1390 config/i386/i386.c:1403
+#: config/i386/i386.c:1381 config/i386/i386.c:1394 config/i386/i386.c:1407
#, c-format
msgid "-malign-loops=%d is not between 0 and %d"
msgstr ""
-#: config/i386/i386.c:1385
+#: config/i386/i386.c:1389
msgid "-malign-jumps is obsolete, use -falign-jumps"
msgstr ""
-#: config/i386/i386.c:1398
+#: config/i386/i386.c:1402
msgid "-malign-functions is obsolete, use -falign-functions"
msgstr ""
-#: config/i386/i386.c:1436
+#: config/i386/i386.c:1440
#, c-format
msgid "-mpreferred-stack-boundary=%d is not between %d and 12"
msgstr ""
-#: config/i386/i386.c:1448
+#: config/i386/i386.c:1452
#, c-format
msgid "-mbranch-cost=%d is not between 0 and 5"
msgstr ""
-#: config/i386/i386.c:1460
+#: config/i386/i386.c:1464
#, c-format
msgid "bad value (%s) for -mtls-dialect= switch"
msgstr ""
-#: config/i386/i386.c:1489
+#: config/i386/i386.c:1493
msgid "-malign-double makes no sense in the 64bit mode"
msgstr ""
-#: config/i386/i386.c:1491
+#: config/i386/i386.c:1495
msgid "-mrtd calling convention not supported in the 64bit mode"
msgstr ""
-#: config/i386/i386.c:1513 config/i386/i386.c:1524
+#: config/i386/i386.c:1517 config/i386/i386.c:1528
msgid "SSE instruction set disabled, using 387 arithmetics"
msgstr ""
-#: config/i386/i386.c:1529
+#: config/i386/i386.c:1533
msgid "387 instruction set disabled, using SSE arithmetics"
msgstr ""
-#: config/i386/i386.c:1536
+#: config/i386/i386.c:1540
#, c-format
msgid "bad value (%s) for -mfpmath= switch"
msgstr ""
-#: config/i386/i386.c:1691 config/i386/i386.c:1702
+#: config/i386/i386.c:1695 config/i386/i386.c:1706
msgid "fastcall and stdcall attributes are not compatible"
msgstr ""
-#: config/i386/i386.c:1695 config/i386/i386.c:1751
+#: config/i386/i386.c:1699 config/i386/i386.c:1755
msgid "fastcall and regparm attributes are not compatible"
msgstr ""
-#: config/i386/i386.c:1738
+#: config/i386/i386.c:1742
#, c-format
msgid "`%s' attribute requires an integer constant argument"
msgstr ""
-#: config/i386/i386.c:1744
+#: config/i386/i386.c:1748
#, c-format
msgid "argument to `%s' attribute larger than %d"
msgstr ""
-#: config/i386/i386.c:2760
+#: config/i386/i386.c:2764
msgid "SSE vector argument without SSE enabled changes the ABI"
msgstr ""
-#: config/i386/i386.c:2776
+#: config/i386/i386.c:2780
msgid "MMX vector argument without MMX enabled changes the ABI"
msgstr ""
-#: config/i386/i386.c:3022
+#: config/i386/i386.c:3026
msgid "SSE vector return without SSE enabled changes the ABI"
msgstr ""
-#: config/i386/i386.c:5903
+#: config/i386/i386.c:5925
msgid "invalid UNSPEC as operand"
msgstr ""
-#: config/i386/i386.c:6161
+#: config/i386/i386.c:6183
msgid "extended registers have no high halves"
msgstr ""
-#: config/i386/i386.c:6176
+#: config/i386/i386.c:6198
msgid "unsupported operand size for extended register"
msgstr ""
-#: config/i386/i386.c:6491
+#: config/i386/i386.c:6513
msgid ""
"operand is neither a constant nor a condition code, invalid operand code 'c'"
msgstr ""
-#: config/i386/i386.c:6537
+#: config/i386/i386.c:6559
#, c-format
msgid "invalid operand code `%c'"
msgstr ""
-#: config/i386/i386.c:6580
+#: config/i386/i386.c:6602
msgid "invalid constraints for operand"
msgstr ""
-#: config/i386/i386.c:11316
+#: config/i386/i386.c:11338
msgid "unknown insn mode"
msgstr ""
-#: config/i386/i386.c:13175 config/i386/i386.c:13211
+#: config/i386/i386.c:13208 config/i386/i386.c:13244
#, c-format
msgid "selector must be an integer constant in the range 0..%i"
msgstr ""
-#: config/i386/i386.c:13439
+#: config/i386/i386.c:13472
msgid "shift must be an immediate"
msgstr ""
-#: config/i386/i386.c:14489
+#: config/i386/i386.c:14522
#, c-format
msgid "`%s' incompatible attribute ignored"
msgstr ""
@@ -9171,46 +9261,46 @@ msgstr ""
msgid "`%s' attribute only applies to variables"
msgstr ""
-#: config/i386/winnt.c:173
+#: config/i386/winnt.c:172
msgid ""
"%Jfunction '%D' is defined after prior declaration as dllimport: attribute "
"ignored"
msgstr ""
-#: config/i386/winnt.c:184
+#: config/i386/winnt.c:183
msgid "%Jinline function '%D' is declared as dllimport: attribute ignored."
msgstr ""
-#: config/i386/winnt.c:196
+#: config/i386/winnt.c:195
msgid "%Jdefinition of static data member '%D' of dllimport'd class."
msgstr ""
-#: config/i386/winnt.c:256
+#: config/i386/winnt.c:255
msgid "%Jinconsistent dll linkage for '%D', dllexport assumed."
msgstr ""
-#: config/i386/winnt.c:300 config/sh/symbian.c:279
+#: config/i386/winnt.c:299 config/sh/symbian.c:279
#, c-format
msgid "`%s' declared as both exported to and imported from a DLL"
msgstr ""
-#: config/i386/winnt.c:309
+#: config/i386/winnt.c:308
msgid ""
"%Jfailure in redeclaration of '%D': dllimport'd symbol lacks external "
"linkage."
msgstr ""
-#: config/i386/winnt.c:448
+#: config/i386/winnt.c:447
msgid "%J'%D' defined locally after being referenced with dllimport linkage"
msgstr ""
-#: config/i386/winnt.c:451
+#: config/i386/winnt.c:450
msgid ""
"%J'%D' redeclared without dllimport attribute after being referenced with "
"dllimport linkage"
msgstr ""
-#: config/i386/winnt.c:618
+#: config/i386/winnt.c:617
msgid "%J'%D' causes a section type conflict"
msgstr ""
@@ -9444,7 +9534,7 @@ msgstr ""
#. option if the fixed part matches. The actual option name is made
#. by appending `-m' to the specified name.
#: config/i386/i386.h:465 config/ia64/ia64.h:286 config/rs6000/rs6000.h:453
-#: config/s390/s390.h:152 config/sparc/sparc.h:711
+#: config/s390/s390.h:155 config/sparc/sparc.h:711
msgid "Schedule code for given CPU"
msgstr ""
@@ -9452,7 +9542,7 @@ msgstr ""
msgid "Generate floating point mathematics using given instruction set"
msgstr ""
-#: config/i386/i386.h:469 config/s390/s390.h:154
+#: config/i386/i386.h:469 config/s390/s390.h:157
msgid "Generate code for given CPU"
msgstr ""
@@ -9548,41 +9638,41 @@ msgstr ""
msgid "%Jaddress area attribute cannot be specified for functions"
msgstr ""
-#: config/ia64/ia64.c:3754
+#: config/ia64/ia64.c:3755
msgid "ia64_print_operand: unknown code"
msgstr ""
-#: config/ia64/ia64.c:4094 config/pa/pa.c:316
+#: config/ia64/ia64.c:4095 config/pa/pa.c:316
msgid "value of -mfixed-range must have form REG1-REG2"
msgstr ""
-#: config/ia64/ia64.c:4121 config/pa/pa.c:343
+#: config/ia64/ia64.c:4122 config/pa/pa.c:343
#, c-format
msgid "%s-%s is an empty range"
msgstr ""
-#: config/ia64/ia64.c:4172
+#: config/ia64/ia64.c:4173
msgid "cannot optimize floating point division for both latency and throughput"
msgstr ""
-#: config/ia64/ia64.c:4189
+#: config/ia64/ia64.c:4190
msgid "cannot optimize integer division for both latency and throughput"
msgstr ""
-#: config/ia64/ia64.c:4206
+#: config/ia64/ia64.c:4207
msgid "cannot optimize square root for both latency and throughput"
msgstr ""
-#: config/ia64/ia64.c:4220
+#: config/ia64/ia64.c:4221
msgid "not yet implemented: latency-optimized inline square root"
msgstr ""
-#: config/ia64/ia64.c:4232
+#: config/ia64/ia64.c:4233
#, c-format
msgid "bad value (%s) for -mtls-size= switch"
msgstr ""
-#: config/ia64/ia64.c:4248
+#: config/ia64/ia64.c:4249
#, c-format
msgid "bad value (%s) for -tune= switch"
msgstr ""
@@ -9739,7 +9829,7 @@ msgstr ""
msgid "PRINT_OPERAND: Unknown punctuation '%c'"
msgstr ""
-#: config/iq2000/iq2000.c:3312 config/mips/mips.c:4809
+#: config/iq2000/iq2000.c:3312 config/mips/mips.c:4801
#: config/xtensa/xtensa.c:1887
msgid "PRINT_OPERAND null pointer"
msgstr ""
@@ -9749,12 +9839,12 @@ msgstr ""
msgid "invalid %%P operand"
msgstr ""
-#: config/iq2000/iq2000.c:3389 config/rs6000/rs6000.c:10124
+#: config/iq2000/iq2000.c:3389 config/rs6000/rs6000.c:10253
#, c-format
msgid "invalid %%p value"
msgstr ""
-#: config/iq2000/iq2000.c:3453 config/mips/mips.c:4935
+#: config/iq2000/iq2000.c:3453 config/mips/mips.c:4927
#, c-format
msgid "invalid use of %%d, %%x, or %%X"
msgstr ""
@@ -9847,7 +9937,7 @@ msgid "post-increment address is not a register"
msgstr ""
#: config/m32r/m32r.c:2355 config/m32r/m32r.c:2371
-#: config/rs6000/rs6000.c:16433
+#: config/rs6000/rs6000.c:16566
msgid "bad address"
msgstr ""
@@ -10037,7 +10127,7 @@ msgstr ""
msgid "-fPIC is not currently supported on the 68000 or 68010\n"
msgstr ""
-#: config/m68k/m68k.c:543 config/rs6000/rs6000.c:12609
+#: config/m68k/m68k.c:543 config/rs6000/rs6000.c:12743
msgid "stack limit expression is not supported"
msgstr ""
@@ -10231,131 +10321,131 @@ msgstr ""
msgid "Maximum amount for a single stack increment operation"
msgstr ""
-#: config/mips/mips.c:4006
+#: config/mips/mips.c:3998
#, c-format
msgid "bad value (%s) for -mabi= switch"
msgstr ""
-#: config/mips/mips.c:4029
+#: config/mips/mips.c:4021
#, c-format
msgid ""
"-mips%s conflicts with the other architecture options, which specify a MIPS%"
"d processor"
msgstr ""
-#: config/mips/mips.c:4048
+#: config/mips/mips.c:4040
#, c-format
msgid "-march=%s is not compatible with the selected ABI"
msgstr ""
-#: config/mips/mips.c:4063
+#: config/mips/mips.c:4055
msgid "-mgp64 used with a 32-bit processor"
msgstr ""
-#: config/mips/mips.c:4065
+#: config/mips/mips.c:4057
msgid "-mgp32 used with a 64-bit ABI"
msgstr ""
-#: config/mips/mips.c:4067
+#: config/mips/mips.c:4059
msgid "-mgp64 used with a 32-bit ABI"
msgstr ""
-#: config/mips/mips.c:4085 config/mips/mips.c:4087 config/mips/mips.c:4089
-#: config/mips/mips.c:4169
+#: config/mips/mips.c:4077 config/mips/mips.c:4079 config/mips/mips.c:4081
+#: config/mips/mips.c:4161
#, c-format
msgid "unsupported combination: %s"
msgstr ""
-#: config/mips/mips.c:4164
+#: config/mips/mips.c:4156
msgid ""
"generation of Branch Likely instructions enabled, but not supported by "
"architecture"
msgstr ""
-#: config/mips/mips.c:4181
+#: config/mips/mips.c:4173
msgid "-G is incompatible with PIC code which is the default"
msgstr ""
-#: config/mips/mips.c:4248
+#: config/mips/mips.c:4240
msgid "-mips3d requires -mpaired-single"
msgstr ""
-#: config/mips/mips.c:4257
+#: config/mips/mips.c:4249
msgid "-mips3d/-mpaired-single must be used with -mfp64 -mhard-float"
msgstr ""
-#: config/mips/mips.c:4262
+#: config/mips/mips.c:4254
msgid "-mips3d/-mpaired-single must be used with -mips64"
msgstr ""
-#: config/mips/mips.c:4620
+#: config/mips/mips.c:4612
msgid "mips_debugger_offset called with non stack/frame/arg pointer"
msgstr ""
-#: config/mips/mips.c:4746
+#: config/mips/mips.c:4738
#, c-format
msgid "internal error: %%) found without a %%( in assembler pattern"
msgstr ""
-#: config/mips/mips.c:4760
+#: config/mips/mips.c:4752
#, c-format
msgid "internal error: %%] found without a %%[ in assembler pattern"
msgstr ""
-#: config/mips/mips.c:4773
+#: config/mips/mips.c:4765
#, c-format
msgid "internal error: %%> found without a %%< in assembler pattern"
msgstr ""
-#: config/mips/mips.c:4786
+#: config/mips/mips.c:4778
#, c-format
msgid "internal error: %%} found without a %%{ in assembler pattern"
msgstr ""
-#: config/mips/mips.c:4800
+#: config/mips/mips.c:4792
#, c-format
msgid "PRINT_OPERAND: unknown punctuation '%c'"
msgstr ""
-#: config/mips/mips.c:4829
+#: config/mips/mips.c:4821
#, c-format
msgid "PRINT_OPERAND, invalid insn for %%C"
msgstr ""
-#: config/mips/mips.c:4846
+#: config/mips/mips.c:4838
#, c-format
msgid "PRINT_OPERAND, invalid insn for %%N"
msgstr ""
-#: config/mips/mips.c:4855
+#: config/mips/mips.c:4847
#, c-format
msgid "PRINT_OPERAND, invalid insn for %%F"
msgstr ""
-#: config/mips/mips.c:4864
+#: config/mips/mips.c:4856
#, c-format
msgid "PRINT_OPERAND, invalid insn for %%W"
msgstr ""
-#: config/mips/mips.c:4885
+#: config/mips/mips.c:4877
#, c-format
msgid "invalid %%Y value"
msgstr ""
-#: config/mips/mips.c:4963
+#: config/mips/mips.c:4955
msgid "PRINT_OPERAND, invalid operand for relocation"
msgstr ""
-#: config/mips/mips.c:7518
+#: config/mips/mips.c:7517
#, c-format
msgid "cannot handle inconsistent calls to `%s'"
msgstr ""
-#: config/mips/mips.c:8908
+#: config/mips/mips.c:8907
msgid "the cpu name must be lower case"
msgstr ""
-#: config/mips/mips.c:8930
+#: config/mips/mips.c:8929
#, c-format
msgid "bad value (%s) for %s"
msgstr ""
@@ -10808,7 +10898,7 @@ msgstr ""
msgid "Do not work around hardware multiply bug"
msgstr ""
-#: config/ns32k/ns32k.h:142 config/s390/s390.h:133
+#: config/ns32k/ns32k.h:142 config/s390/s390.h:136
msgid "Don't use hardware fp"
msgstr ""
@@ -11222,184 +11312,184 @@ msgstr ""
msgid "junk at end of #pragma longcall"
msgstr ""
-#: config/rs6000/rs6000.c:1211
+#: config/rs6000/rs6000.c:1224
msgid "-mmultiple is not supported on little endian systems"
msgstr ""
-#: config/rs6000/rs6000.c:1218
+#: config/rs6000/rs6000.c:1231
msgid "-mstring is not supported on little endian systems"
msgstr ""
-#: config/rs6000/rs6000.c:1232
+#: config/rs6000/rs6000.c:1245
#, c-format
msgid "unknown -mdebug-%s switch"
msgstr ""
-#: config/rs6000/rs6000.c:1244
+#: config/rs6000/rs6000.c:1257
#, c-format
msgid "unknown -mtraceback arg `%s'; expecting `full', `partial' or `none'"
msgstr ""
-#: config/rs6000/rs6000.c:1255
+#: config/rs6000/rs6000.c:1268
#, c-format
msgid "Unknown switch -mlong-double-%s"
msgstr ""
-#: config/rs6000/rs6000.c:1296
+#: config/rs6000/rs6000.c:1309
msgid "AltiVec and E500 instructions cannot coexist"
msgstr ""
#. Handle -mfix-and-continue.
-#: config/rs6000/rs6000.c:1342 config/rs6000/rs6000.c:1353
+#: config/rs6000/rs6000.c:1355 config/rs6000/rs6000.c:1366
#: config/rs6000/darwin.h:106
#, c-format
msgid "invalid option `%s'"
msgstr ""
-#: config/rs6000/rs6000.c:1554
+#: config/rs6000/rs6000.c:1587
#, c-format
msgid "unknown -m%s= option specified: '%s'"
msgstr ""
-#: config/rs6000/rs6000.c:1575
+#: config/rs6000/rs6000.c:1608
#, c-format
msgid "not configured for ABI: '%s'"
msgstr ""
-#: config/rs6000/rs6000.c:1581
+#: config/rs6000/rs6000.c:1614
#, c-format
msgid "unknown ABI specified: '%s'"
msgstr ""
-#: config/rs6000/rs6000.c:1595
+#: config/rs6000/rs6000.c:1628
#, c-format
msgid "unknown -malign-XXXXX option specified: '%s'"
msgstr ""
-#: config/rs6000/rs6000.c:4582
+#: config/rs6000/rs6000.c:4624
msgid ""
"Cannot return value in vector register because altivec instructions are "
"disabled, use -maltivec to enable them."
msgstr ""
-#: config/rs6000/rs6000.c:4716
+#: config/rs6000/rs6000.c:4758
msgid ""
"Cannot pass argument in vector register because altivec instructions are "
"disabled, use -maltivec to enable them."
msgstr ""
-#: config/rs6000/rs6000.c:6150
+#: config/rs6000/rs6000.c:6216
msgid "argument 1 must be a 5-bit signed literal"
msgstr ""
-#: config/rs6000/rs6000.c:6253 config/rs6000/rs6000.c:6922
+#: config/rs6000/rs6000.c:6319 config/rs6000/rs6000.c:6988
msgid "argument 2 must be a 5-bit unsigned literal"
msgstr ""
-#: config/rs6000/rs6000.c:6293
+#: config/rs6000/rs6000.c:6359
msgid "argument 1 of __builtin_altivec_predicate must be a constant"
msgstr ""
-#: config/rs6000/rs6000.c:6347
+#: config/rs6000/rs6000.c:6413
msgid "argument 1 of __builtin_altivec_predicate is out of range"
msgstr ""
-#: config/rs6000/rs6000.c:6509
+#: config/rs6000/rs6000.c:6575
msgid "argument 3 must be a 4-bit unsigned literal"
msgstr ""
-#: config/rs6000/rs6000.c:6681
+#: config/rs6000/rs6000.c:6747
#, c-format
msgid "argument to `%s' must be a 2-bit unsigned literal"
msgstr ""
-#: config/rs6000/rs6000.c:6794
+#: config/rs6000/rs6000.c:6860
msgid "argument to dss must be a 2-bit unsigned literal"
msgstr ""
-#: config/rs6000/rs6000.c:6809
+#: config/rs6000/rs6000.c:6875
#, c-format
msgid "invalid parameter combination for `%s' AltiVec intrinsic"
msgstr ""
-#: config/rs6000/rs6000.c:7042
+#: config/rs6000/rs6000.c:7108
msgid "argument 1 of __builtin_spe_predicate must be a constant"
msgstr ""
-#: config/rs6000/rs6000.c:7115
+#: config/rs6000/rs6000.c:7181
msgid "argument 1 of __builtin_spe_predicate is out of range"
msgstr ""
-#: config/rs6000/rs6000.c:9954
+#: config/rs6000/rs6000.c:10083
#, c-format
msgid "invalid %%f value"
msgstr ""
-#: config/rs6000/rs6000.c:9963
+#: config/rs6000/rs6000.c:10092
#, c-format
msgid "invalid %%F value"
msgstr ""
-#: config/rs6000/rs6000.c:9972
+#: config/rs6000/rs6000.c:10101
#, c-format
msgid "invalid %%G value"
msgstr ""
-#: config/rs6000/rs6000.c:10007
+#: config/rs6000/rs6000.c:10136
#, c-format
msgid "invalid %%j code"
msgstr ""
-#: config/rs6000/rs6000.c:10017
+#: config/rs6000/rs6000.c:10146
#, c-format
msgid "invalid %%J code"
msgstr ""
-#: config/rs6000/rs6000.c:10027
+#: config/rs6000/rs6000.c:10156
#, c-format
msgid "invalid %%k value"
msgstr ""
-#: config/rs6000/rs6000.c:10047 config/xtensa/xtensa.c:1937
+#: config/rs6000/rs6000.c:10176 config/xtensa/xtensa.c:1937
#, c-format
msgid "invalid %%K value"
msgstr ""
-#: config/rs6000/rs6000.c:10114
+#: config/rs6000/rs6000.c:10243
#, c-format
msgid "invalid %%O value"
msgstr ""
-#: config/rs6000/rs6000.c:10161
+#: config/rs6000/rs6000.c:10290
#, c-format
msgid "invalid %%q value"
msgstr ""
-#: config/rs6000/rs6000.c:10205
+#: config/rs6000/rs6000.c:10334
#, c-format
msgid "invalid %%S value"
msgstr ""
-#: config/rs6000/rs6000.c:10247
+#: config/rs6000/rs6000.c:10376
#, c-format
msgid "invalid %%T value"
msgstr ""
-#: config/rs6000/rs6000.c:10257
+#: config/rs6000/rs6000.c:10386
#, c-format
msgid "invalid %%u value"
msgstr ""
-#: config/rs6000/rs6000.c:10266 config/xtensa/xtensa.c:1907
+#: config/rs6000/rs6000.c:10395 config/xtensa/xtensa.c:1907
#, c-format
msgid "invalid %%v value"
msgstr ""
-#: config/rs6000/rs6000.c:15086
+#: config/rs6000/rs6000.c:15220
msgid "no profiling of 64-bit code for this ABI"
msgstr ""
-#: config/rs6000/rs6000.c:16152
+#: config/rs6000/rs6000.c:16285
msgid "use of 'long' in AltiVec types is deprecated; use 'int'"
msgstr ""
@@ -11464,15 +11554,15 @@ msgstr ""
msgid "-m64 requires PowerPC64 architecture, enabling"
msgstr ""
-#: config/rs6000/linux64.h:104
+#: config/rs6000/linux64.h:106
msgid "-m64 requires a PowerPC64 cpu"
msgstr ""
-#: config/rs6000/linux64.h:214
+#: config/rs6000/linux64.h:216
msgid "Call mcount for profiling before a function prologue"
msgstr ""
-#: config/rs6000/linux64.h:216
+#: config/rs6000/linux64.h:218
msgid "Call mcount for profiling after a function prologue"
msgstr ""
@@ -11843,199 +11933,199 @@ msgstr ""
msgid "-m%s not supported in this configuration"
msgstr ""
-#: config/s390/s390.c:1133
+#: config/s390/s390.c:1130
#, c-format
msgid "Unknown cpu used in -march=%s."
msgstr ""
-#: config/s390/s390.c:1152
+#: config/s390/s390.c:1149
#, c-format
msgid "Unknown cpu used in -mtune=%s."
msgstr ""
-#: config/s390/s390.c:1157
+#: config/s390/s390.c:1154
#, c-format
msgid "z/Architecture mode not supported on %s."
msgstr ""
-#: config/s390/s390.c:1159
+#: config/s390/s390.c:1156
msgid "64-bit ABI not supported in ESA/390 mode."
msgstr ""
-#: config/s390/s390.c:1165
+#: config/s390/s390.c:1162
msgid "invalid value for -mwarn-framesize"
msgstr ""
-#: config/s390/s390.c:1175
+#: config/s390/s390.c:1172
msgid "invalid value for -mstack-size"
msgstr ""
-#: config/s390/s390.c:1178
+#: config/s390/s390.c:1175
msgid "stack size must be an exact power of 2"
msgstr ""
-#: config/s390/s390.c:1184
+#: config/s390/s390.c:1181
msgid "invalid value for -mstack-guard"
msgstr ""
-#: config/s390/s390.c:1187
+#: config/s390/s390.c:1184
msgid "stack size must be greater than the stack guard value"
msgstr ""
-#: config/s390/s390.c:1190
+#: config/s390/s390.c:1187
msgid "stack guard value must be an exact power of 2"
msgstr ""
-#: config/s390/s390.c:1193
+#: config/s390/s390.c:1190
msgid "-mstack-size implies use of -mstack-guard"
msgstr ""
-#: config/s390/s390.c:1197
+#: config/s390/s390.c:1194
msgid "-mstack-guard implies use of -mstack-size"
msgstr ""
-#: config/s390/s390.c:3877
+#: config/s390/s390.c:3882
msgid "Cannot decompose address."
msgstr ""
-#: config/s390/s390.c:4048
+#: config/s390/s390.c:4053
msgid "UNKNOWN in print_operand !?"
msgstr ""
-#: config/s390/s390.c:5926
+#: config/s390/s390.c:5920
msgid "Total size of local variables exceeds architecture limit."
msgstr ""
-#: config/s390/s390.c:6389
+#: config/s390/s390.c:6459
#, c-format
msgid "frame size of `%s' is "
msgstr ""
-#: config/s390/s390.c:6389
+#: config/s390/s390.c:6459
msgid " bytes"
msgstr ""
-#: config/s390/s390.c:6393
+#: config/s390/s390.c:6463
#, c-format
msgid "`%s' uses dynamic stack allocation"
msgstr ""
-#: config/s390/s390.h:134
+#: config/s390/s390.h:137
msgid "Use bras for executable < 64k"
msgstr ""
-#: config/s390/s390.h:135
+#: config/s390/s390.h:138
msgid "Don't use bras"
msgstr ""
-#: config/s390/s390.h:136
+#: config/s390/s390.h:139
msgid "Additional debug prints"
msgstr ""
-#: config/s390/s390.h:137
+#: config/s390/s390.h:140
msgid "Don't print additional debug prints"
msgstr ""
-#: config/s390/s390.h:138
+#: config/s390/s390.h:141
msgid "64 bit ABI"
msgstr ""
-#: config/s390/s390.h:139
+#: config/s390/s390.h:142
msgid "31 bit ABI"
msgstr ""
-#: config/s390/s390.h:140
+#: config/s390/s390.h:143
msgid "z/Architecture"
msgstr ""
-#: config/s390/s390.h:141
+#: config/s390/s390.h:144
msgid "ESA/390 architecture"
msgstr ""
-#: config/s390/s390.h:142
+#: config/s390/s390.h:145
msgid "mvcle use"
msgstr ""
-#: config/s390/s390.h:143
+#: config/s390/s390.h:146
msgid "mvc&ex"
msgstr ""
-#: config/s390/s390.h:144
+#: config/s390/s390.h:147
msgid "enable tpf OS tracing code"
msgstr ""
-#: config/s390/s390.h:145
+#: config/s390/s390.h:148
msgid "disable tpf OS tracing code"
msgstr ""
-#: config/s390/s390.h:146
+#: config/s390/s390.h:149
msgid "disable fused multiply/add instructions"
msgstr ""
-#: config/s390/s390.h:147
+#: config/s390/s390.h:150
msgid "enable fused multiply/add instructions"
msgstr ""
-#: config/s390/s390.h:156
+#: config/s390/s390.h:159
msgid "Set backchain"
msgstr ""
-#: config/s390/s390.h:158
+#: config/s390/s390.h:161
msgid "Do not set backchain"
msgstr ""
-#: config/s390/s390.h:160
+#: config/s390/s390.h:163
msgid "Set backchain appropriate for the linux kernel"
msgstr ""
-#: config/s390/s390.h:162
+#: config/s390/s390.h:165
msgid "Warn if a single function's framesize exceeds the given framesize"
msgstr ""
-#: config/s390/s390.h:165
+#: config/s390/s390.h:168
msgid "Warn if a function uses alloca or creates an array with dynamic size"
msgstr ""
-#: config/s390/s390.h:168
+#: config/s390/s390.h:171
msgid ""
"Emit extra code in the function prologue in order to trap if the stacksize "
"exceeds the given limit"
msgstr ""
-#: config/s390/s390.h:171
+#: config/s390/s390.h:174
msgid ""
"Set the max. number of bytes which has to be left to stack size before a "
"trap instruction is triggered"
msgstr ""
-#: config/sh/sh.c:6160
+#: config/sh/sh.c:6178
msgid "__builtin_saveregs not supported by this subtarget"
msgstr ""
-#: config/sh/sh.c:7123
+#: config/sh/sh.c:7147
msgid "attribute interrupt_handler is not compatible with -m5-compact"
msgstr ""
#. The sp_switch attribute only has meaning for interrupt functions.
#. The trap_exit attribute only has meaning for interrupt functions.
-#: config/sh/sh.c:7145 config/sh/sh.c:7180
+#: config/sh/sh.c:7169 config/sh/sh.c:7204
#, c-format
msgid "`%s' attribute only applies to interrupt functions"
msgstr ""
#. The argument must be a constant string.
-#: config/sh/sh.c:7152
+#: config/sh/sh.c:7176
#, c-format
msgid "`%s' attribute argument not a string constant"
msgstr ""
#. The argument must be a constant integer.
-#: config/sh/sh.c:7187
+#: config/sh/sh.c:7211
#, c-format
msgid "`%s' attribute argument not an integer constant"
msgstr ""
-#: config/sh/sh.c:7315
+#: config/sh/sh.c:7339
#, c-format
msgid "created and used with differing settings of `-m%s'"
msgstr ""
@@ -12072,7 +12162,7 @@ msgstr ""
msgid "%Hexternal linkage required for symbol '%D' because of '%s' attribute."
msgstr ""
-#: config/sh/symbian.c:893 cp/tree.c:2337
+#: config/sh/symbian.c:893 cp/tree.c:2355
#, c-format
msgid "lang_* check: failed in %s, at %s:%d"
msgstr ""
@@ -12084,69 +12174,69 @@ msgstr ""
msgid "Profiling is not supported on this target."
msgstr ""
-#: config/sparc/sparc.c:548
+#: config/sparc/sparc.c:557
#, c-format
msgid "%s is not supported by this configuration"
msgstr ""
-#: config/sparc/sparc.c:555
+#: config/sparc/sparc.c:564
msgid "-mlong-double-64 not allowed with -m64"
msgstr ""
-#: config/sparc/sparc.c:580
+#: config/sparc/sparc.c:589
msgid "-mcmodel= is not supported on 32 bit systems"
msgstr ""
-#: config/sparc/sparc.c:7062 config/sparc/sparc.c:7068
+#: config/sparc/sparc.c:7106 config/sparc/sparc.c:7112
#, c-format
msgid "invalid %%Y operand"
msgstr ""
-#: config/sparc/sparc.c:7138
+#: config/sparc/sparc.c:7182
#, c-format
msgid "invalid %%A operand"
msgstr ""
-#: config/sparc/sparc.c:7148
+#: config/sparc/sparc.c:7192
#, c-format
msgid "invalid %%B operand"
msgstr ""
-#: config/sparc/sparc.c:7187
+#: config/sparc/sparc.c:7231
#, c-format
msgid "invalid %%c operand"
msgstr ""
-#: config/sparc/sparc.c:7188
+#: config/sparc/sparc.c:7232
#, c-format
msgid "invalid %%C operand"
msgstr ""
-#: config/sparc/sparc.c:7209
+#: config/sparc/sparc.c:7253
#, c-format
msgid "invalid %%d operand"
msgstr ""
-#: config/sparc/sparc.c:7210
+#: config/sparc/sparc.c:7254
#, c-format
msgid "invalid %%D operand"
msgstr ""
-#: config/sparc/sparc.c:7226
+#: config/sparc/sparc.c:7270
#, c-format
msgid "invalid %%f operand"
msgstr ""
-#: config/sparc/sparc.c:7240
+#: config/sparc/sparc.c:7284
#, c-format
msgid "invalid %%s operand"
msgstr ""
-#: config/sparc/sparc.c:7294
+#: config/sparc/sparc.c:7338
msgid "long long constant not a valid immediate operand"
msgstr ""
-#: config/sparc/sparc.c:7297
+#: config/sparc/sparc.c:7341
msgid "floating point constant not a valid immediate operand"
msgstr ""
@@ -12725,384 +12815,384 @@ msgstr ""
msgid "enumeral and non-enumeral type in conditional expression"
msgstr ""
-#: cp/call.c:3695
+#: cp/call.c:3696
msgid "no `%D(int)' declared for postfix `%s', trying prefix operator instead"
msgstr ""
-#: cp/call.c:3747
+#: cp/call.c:3748
msgid "using synthesized `%#D' for copy assignment"
msgstr ""
-#: cp/call.c:3749
+#: cp/call.c:3750
msgid " where cfront would use `%#D'"
msgstr ""
-#: cp/call.c:3781
+#: cp/call.c:3782
msgid "comparison between `%#T' and `%#T'"
msgstr ""
-#: cp/call.c:4038
+#: cp/call.c:4039
msgid "no suitable `operator %s' for `%T'"
msgstr ""
-#: cp/call.c:4055
+#: cp/call.c:4056
msgid "`%+#D' is private"
msgstr ""
-#: cp/call.c:4057
+#: cp/call.c:4058
msgid "`%+#D' is protected"
msgstr ""
-#: cp/call.c:4059
+#: cp/call.c:4060
msgid "`%+#D' is inaccessible"
msgstr ""
-#: cp/call.c:4060
+#: cp/call.c:4061
msgid "within this context"
msgstr ""
-#: cp/call.c:4143
+#: cp/call.c:4144
msgid "invalid conversion from `%T' to `%T'"
msgstr ""
-#: cp/call.c:4145
+#: cp/call.c:4146
msgid " initializing argument %P of `%D'"
msgstr ""
-#: cp/call.c:4288
+#: cp/call.c:4289
msgid "cannot bind bitfield `%E' to `%T'"
msgstr ""
-#: cp/call.c:4291
+#: cp/call.c:4292
msgid "cannot bind packed field `%E' to `%T'"
msgstr ""
-#: cp/call.c:4294
+#: cp/call.c:4295
msgid "cannot bind rvalue `%E' to `%T'"
msgstr ""
-#: cp/call.c:4379
+#: cp/call.c:4380
msgid ""
"cannot pass objects of non-POD type `%#T' through `...'; call will abort at "
"runtime"
msgstr ""
#. Undefined behavior [expr.call] 5.2.2/7.
-#: cp/call.c:4405
+#: cp/call.c:4406
msgid ""
"cannot receive objects of non-POD type `%#T' through `...'; call will abort "
"at runtime"
msgstr ""
-#: cp/call.c:4449
+#: cp/call.c:4450
msgid "the default argument for parameter %d of `%D' has not yet been parsed"
msgstr ""
-#: cp/call.c:4654
+#: cp/call.c:4655
msgid "passing `%T' as `this' argument of `%#D' discards qualifiers"
msgstr ""
-#: cp/call.c:4673
+#: cp/call.c:4674
msgid "`%T' is not an accessible base of `%T'"
msgstr ""
-#: cp/call.c:4923
+#: cp/call.c:4924
msgid "could not find class$ field in java interface type `%T'"
msgstr ""
-#: cp/call.c:5185
+#: cp/call.c:5186
msgid "call to non-function `%D'"
msgstr ""
-#: cp/call.c:5210
+#: cp/call.c:5211
msgid "request for member `%D' in `%E', which is of non-aggregate type `%T'"
msgstr ""
-#: cp/call.c:5288
+#: cp/call.c:5289
msgid "no matching function for call to `%T::%s(%A)%#V'"
msgstr ""
-#: cp/call.c:5306
+#: cp/call.c:5307
#, c-format
msgid "call of overloaded `%s(%A)' is ambiguous"
msgstr ""
-#: cp/call.c:5328
+#: cp/call.c:5331
msgid "cannot call member function `%D' without object"
msgstr ""
-#: cp/call.c:5933
+#: cp/call.c:5936
msgid "passing `%T' chooses `%T' over `%T'"
msgstr ""
-#: cp/call.c:5935 cp/name-lookup.c:4246
+#: cp/call.c:5938 cp/name-lookup.c:4246
msgid " in call to `%D'"
msgstr ""
-#: cp/call.c:5992
+#: cp/call.c:5995
msgid "choosing `%D' over `%D'"
msgstr ""
-#: cp/call.c:5993
+#: cp/call.c:5996
msgid " for conversion from `%T' to `%T'"
msgstr ""
-#: cp/call.c:5995
+#: cp/call.c:5998
msgid " because conversion sequence for the argument is better"
msgstr ""
-#: cp/call.c:6116
+#: cp/call.c:6119
msgid ""
"ISO C++ says that these are ambiguous, even though the worst conversion for "
"the first is better than the worst conversion for the second:"
msgstr ""
-#: cp/call.c:6120
+#: cp/call.c:6123
msgid "candidate 1:"
msgstr ""
-#: cp/call.c:6121
+#: cp/call.c:6124
msgid "candidate 2:"
msgstr ""
-#: cp/call.c:6257
+#: cp/call.c:6260
msgid "could not convert `%E' to `%T'"
msgstr ""
-#: cp/call.c:6381
+#: cp/call.c:6384
msgid ""
"invalid initialization of non-const reference of type '%T' from a temporary "
"of type '%T'"
msgstr ""
-#: cp/call.c:6385
+#: cp/call.c:6388
msgid ""
"invalid initialization of reference of type '%T' from expression of type '%T'"
msgstr ""
-#: cp/class.c:284
+#: cp/class.c:276
msgid ""
"cannot convert from base `%T' to derived type `%T' via virtual base `%T'"
msgstr ""
-#: cp/class.c:912
+#: cp/class.c:888
msgid "Java class '%T' cannot have an implicit non-trivial destructor"
msgstr ""
-#: cp/class.c:913
+#: cp/class.c:889
msgid "Java class '%T' cannot have a destructor"
msgstr ""
-#: cp/class.c:1012
+#: cp/class.c:988
msgid "`%#D' and `%#D' cannot be overloaded"
msgstr ""
-#: cp/class.c:1069
+#: cp/class.c:1045
msgid "conflicting access specifications for method `%D', ignored"
msgstr ""
-#: cp/class.c:1071
+#: cp/class.c:1047
#, c-format
msgid "conflicting access specifications for field `%E', ignored"
msgstr ""
-#: cp/class.c:1121
+#: cp/class.c:1097
msgid "`%D' names constructor"
msgstr ""
-#: cp/class.c:1126
+#: cp/class.c:1102
msgid "`%D' invalid in `%T'"
msgstr ""
-#: cp/class.c:1134
+#: cp/class.c:1110
msgid "no members matching `%D' in `%#T'"
msgstr ""
-#: cp/class.c:1166 cp/class.c:1174
+#: cp/class.c:1142 cp/class.c:1150
msgid "`%D' invalid in `%#T'"
msgstr ""
-#: cp/class.c:1167
+#: cp/class.c:1143
msgid " because of local method `%#D' with same name"
msgstr ""
-#: cp/class.c:1175
+#: cp/class.c:1151
msgid " because of local member `%#D' with same name"
msgstr ""
-#: cp/class.c:1220
+#: cp/class.c:1196
msgid "base class `%#T' has a non-virtual destructor"
msgstr ""
-#: cp/class.c:1240
+#: cp/class.c:1216
msgid ""
"base `%T' with only non-default constructor in class without a constructor"
msgstr ""
-#: cp/class.c:1550
+#: cp/class.c:1522
msgid "all member functions in class `%T' are private"
msgstr ""
-#: cp/class.c:1561
+#: cp/class.c:1533
msgid "`%#T' only defines a private destructor and has no friends"
msgstr ""
-#: cp/class.c:1601
+#: cp/class.c:1573
msgid "`%#T' only defines private constructors and has no friends"
msgstr ""
-#: cp/class.c:2013
+#: cp/class.c:1954
msgid "no unique final overrider for `%D' in `%T'"
msgstr ""
#. Here we know it is a hider, and no overrider exists.
-#: cp/class.c:2465
+#: cp/class.c:2408
msgid "`%D' was hidden"
msgstr ""
-#: cp/class.c:2466
+#: cp/class.c:2409
msgid " by `%D'"
msgstr ""
-#: cp/class.c:2507 cp/decl2.c:1143
+#: cp/class.c:2450 cp/decl2.c:1143
msgid "`%#D' invalid; an anonymous union can only have non-static data members"
msgstr ""
-#: cp/class.c:2513 cp/decl2.c:1150
+#: cp/class.c:2456 cp/decl2.c:1150
msgid "private member `%#D' in anonymous union"
msgstr ""
-#: cp/class.c:2516 cp/decl2.c:1152
+#: cp/class.c:2459 cp/decl2.c:1152
msgid "protected member `%#D' in anonymous union"
msgstr ""
-#: cp/class.c:2630
+#: cp/class.c:2573
msgid ""
"vtable layout for class `%T' may not be ABI-compliant and may change in a "
"future version of GCC due to implicit virtual destructor"
msgstr ""
-#: cp/class.c:2688
+#: cp/class.c:2631
msgid "bit-field `%#D' with non-integral type"
msgstr ""
-#: cp/class.c:2708
+#: cp/class.c:2651
msgid "bit-field `%D' width not an integer constant"
msgstr ""
-#: cp/class.c:2714
+#: cp/class.c:2657
msgid "negative width in bit-field `%D'"
msgstr ""
-#: cp/class.c:2719
+#: cp/class.c:2662
msgid "zero width for bit-field `%D'"
msgstr ""
-#: cp/class.c:2725
+#: cp/class.c:2668
msgid "width of `%D' exceeds its type"
msgstr ""
-#: cp/class.c:2734
+#: cp/class.c:2677
msgid "`%D' is too small to hold all values of `%#T'"
msgstr ""
-#: cp/class.c:2796
+#: cp/class.c:2739
msgid "member `%#D' with constructor not allowed in union"
msgstr ""
-#: cp/class.c:2799
+#: cp/class.c:2742
msgid "member `%#D' with destructor not allowed in union"
msgstr ""
-#: cp/class.c:2802
+#: cp/class.c:2745
msgid "member `%#D' with copy assignment operator not allowed in union"
msgstr ""
-#: cp/class.c:2829
+#: cp/class.c:2772
msgid "multiple fields in union `%T' initialized"
msgstr ""
-#: cp/class.c:2895
+#: cp/class.c:2838
msgid "ignoring packed attribute on unpacked non-POD field `%#D'"
msgstr ""
-#: cp/class.c:2955
+#: cp/class.c:2898
msgid "`%D' may not be static because it is a member of a union"
msgstr ""
-#: cp/class.c:2960
+#: cp/class.c:2903
msgid "`%D' may not have reference type `%T' because it is a member of a union"
msgstr ""
-#: cp/class.c:2968
+#: cp/class.c:2911
msgid "field `%D' in local class cannot be static"
msgstr ""
-#: cp/class.c:2974
+#: cp/class.c:2917
msgid "field `%D' invalidly declared function type"
msgstr ""
-#: cp/class.c:2981
+#: cp/class.c:2924
msgid "field `%D' invalidly declared method type"
msgstr ""
-#: cp/class.c:3014
+#: cp/class.c:2957
msgid "non-static reference `%#D' in class without a constructor"
msgstr ""
-#: cp/class.c:3062
+#: cp/class.c:3005
msgid "non-static const member `%#D' in class without a constructor"
msgstr ""
-#: cp/class.c:3077
+#: cp/class.c:3020
msgid "field `%#D' with same name as class"
msgstr ""
-#: cp/class.c:3111
+#: cp/class.c:3054
msgid "`%#T' has pointer data members"
msgstr ""
-#: cp/class.c:3115
+#: cp/class.c:3058
msgid " but does not override `%T(const %T&)'"
msgstr ""
-#: cp/class.c:3117
+#: cp/class.c:3060
msgid " or `operator=(const %T&)'"
msgstr ""
-#: cp/class.c:3120
+#: cp/class.c:3063
msgid " but does not override `operator=(const %T&)'"
msgstr ""
-#: cp/class.c:3553
+#: cp/class.c:3496
msgid ""
"offset of empty base `%T' may not be ABI-compliant and maychange in a future "
"version of GCC"
msgstr ""
-#: cp/class.c:3664
+#: cp/class.c:3608
msgid "class `%T' will be considered nearly empty in a future version of GCC"
msgstr ""
-#: cp/class.c:3746
+#: cp/class.c:3690
msgid "initializer specified for non-virtual method `%D'"
msgstr ""
-#: cp/class.c:4415
+#: cp/class.c:4349
msgid ""
"offset of virtual base `%T' is not ABI-compliant and may change in a future "
"version of GCC"
msgstr ""
-#: cp/class.c:4509
+#: cp/class.c:4443
msgid "direct base `%T' inaccessible in `%T' due to ambiguity"
msgstr ""
-#: cp/class.c:4521
+#: cp/class.c:4455
msgid "virtual base `%T' inaccessible in `%T' due to ambiguity"
msgstr ""
-#: cp/class.c:4692
+#: cp/class.c:4626
msgid ""
"size assigned to `%T' may not be ABI-compliant and may change in a future "
"version of GCC"
@@ -13110,77 +13200,77 @@ msgstr ""
#. Versions of G++ before G++ 3.4 did not reset the
#. DECL_MODE.
-#: cp/class.c:4731
+#: cp/class.c:4665
msgid ""
"the offset of `%D' may not be ABI-compliant and may change in a future "
"version of GCC"
msgstr ""
-#: cp/class.c:4754
+#: cp/class.c:4688
msgid ""
"offset of `%D' is not ABI-compliant and may change in a future version of GCC"
msgstr ""
-#: cp/class.c:4763
+#: cp/class.c:4697
msgid ""
"`%D' contains empty classes which may cause base classes to be placed at "
"different locations in a future version of GCC"
msgstr ""
-#: cp/class.c:4822
+#: cp/class.c:4756
msgid ""
"layout of classes derived from empty class `%T' may change in a future "
"version of GCC"
msgstr ""
-#: cp/class.c:4963 cp/semantics.c:2078
+#: cp/class.c:4897 cp/semantics.c:2075
msgid "redefinition of `%#T'"
msgstr ""
-#: cp/class.c:5107
+#: cp/class.c:5041
msgid "%#T' has virtual functions but non-virtual destructor"
msgstr ""
-#: cp/class.c:5203
+#: cp/class.c:5136
msgid "trying to finish struct, but kicked out due to previous parse errors"
msgstr ""
-#: cp/class.c:5621
+#: cp/class.c:5554
#, c-format
msgid "language string `\"%E\"' not recognized"
msgstr ""
-#: cp/class.c:5708
+#: cp/class.c:5641
msgid ""
"cannot resolve overloaded function `%D' based on conversion to type `%T'"
msgstr ""
-#: cp/class.c:5833
+#: cp/class.c:5766
msgid "no matches converting function `%D' to type `%#T'"
msgstr ""
-#: cp/class.c:5856
+#: cp/class.c:5789
msgid "converting overloaded function `%D' to type `%#T' is ambiguous"
msgstr ""
-#: cp/class.c:5882
+#: cp/class.c:5815
msgid "assuming pointer to member `%D'"
msgstr ""
-#: cp/class.c:5885
+#: cp/class.c:5818
#, c-format
msgid "(a pointer to member can only be formed with `&%E')"
msgstr ""
-#: cp/class.c:5930 cp/class.c:6109 cp/class.c:6116
+#: cp/class.c:5863 cp/class.c:6042 cp/class.c:6049
msgid "not enough type information"
msgstr ""
-#: cp/class.c:5947
+#: cp/class.c:5880
msgid "argument of type `%T' does not match `%T'"
msgstr ""
-#: cp/class.c:6093
+#: cp/class.c:6026
msgid "invalid operation on uninstantiated type"
msgstr ""
@@ -13189,197 +13279,197 @@ msgstr ""
#. A name N used in a class S shall refer to the same declaration
#. in its context and when re-evaluated in the completed scope of
#. S.
-#: cp/class.c:6359 cp/decl.c:1229 cp/name-lookup.c:577 cp/pt.c:2153
+#: cp/class.c:6292 cp/decl.c:1230 cp/name-lookup.c:577 cp/pt.c:2146
msgid "declaration of `%#D'"
msgstr ""
-#: cp/class.c:6360
+#: cp/class.c:6293
msgid "changes meaning of `%D' from `%+#D'"
msgstr ""
-#: cp/cvt.c:88
+#: cp/cvt.c:90
msgid "can't convert from incomplete type `%T' to `%T'"
msgstr ""
-#: cp/cvt.c:97
+#: cp/cvt.c:99
msgid "conversion of `%E' from `%T' to `%T' is ambiguous"
msgstr ""
-#: cp/cvt.c:113 cp/cvt.c:127
+#: cp/cvt.c:115 cp/cvt.c:129
msgid "converting from `%T' to `%T'"
msgstr ""
-#: cp/cvt.c:185 cp/cvt.c:253 cp/cvt.c:299
+#: cp/cvt.c:187 cp/cvt.c:255 cp/cvt.c:301
msgid "cannot convert `%E' from type `%T' to type `%T'"
msgstr ""
-#: cp/cvt.c:214 cp/cvt.c:218
+#: cp/cvt.c:216 cp/cvt.c:220
msgid "pointer to member cast from `%T' to `%T' is via virtual base"
msgstr ""
-#: cp/cvt.c:278
+#: cp/cvt.c:280
msgid "invalid conversion from '%T' to '%T'"
msgstr ""
-#: cp/cvt.c:510
+#: cp/cvt.c:512
msgid "conversion from `%T' to `%T' discards qualifiers"
msgstr ""
-#: cp/cvt.c:528
+#: cp/cvt.c:530
msgid "casting `%T' to `%T' does not dereference pointer"
msgstr ""
-#: cp/cvt.c:555
+#: cp/cvt.c:557
msgid "cannot convert type `%T' to type `%T'"
msgstr ""
-#: cp/cvt.c:679
+#: cp/cvt.c:681
msgid "conversion from `%#T' to `%#T'"
msgstr ""
-#: cp/cvt.c:691
+#: cp/cvt.c:693 cp/cvt.c:713
msgid "`%#T' used where a `%T' was expected"
msgstr ""
-#: cp/cvt.c:713
+#: cp/cvt.c:728
msgid "`%#T' used where a floating point value was expected"
msgstr ""
-#: cp/cvt.c:760
+#: cp/cvt.c:775
msgid "conversion from `%T' to non-scalar type `%T' requested"
msgstr ""
-#: cp/cvt.c:848
+#: cp/cvt.c:863
msgid "object of incomplete type `%T' will not be accessed in %s"
msgstr ""
-#: cp/cvt.c:851
+#: cp/cvt.c:866
msgid "object of type `%T' will not be accessed in %s"
msgstr ""
-#: cp/cvt.c:867
+#: cp/cvt.c:882
msgid "object `%E' of incomplete type `%T' will not be accessed in %s"
msgstr ""
#. [over.over] enumerates the places where we can take the address
#. of an overloaded function, and this is not one of them.
-#: cp/cvt.c:883
+#: cp/cvt.c:898
#, c-format
msgid "%s cannot resolve address of overloaded function"
msgstr ""
#. Only warn when there is no &.
-#: cp/cvt.c:889
+#: cp/cvt.c:904
#, c-format
msgid "%s is a reference, not call, to function `%E'"
msgstr ""
-#: cp/cvt.c:897
+#: cp/cvt.c:912
#, c-format
msgid "%s has no effect"
msgstr ""
-#: cp/cvt.c:1008
+#: cp/cvt.c:1024
msgid "converting NULL to non-pointer type"
msgstr ""
-#: cp/cvt.c:1081
+#: cp/cvt.c:1097
msgid "ambiguous default type conversion from `%T'"
msgstr ""
-#: cp/cvt.c:1083
+#: cp/cvt.c:1099
msgid " candidate conversions include `%D' and `%D'"
msgstr ""
-#: cp/decl.c:366
+#: cp/decl.c:367
msgid "label `%D' used but not defined"
msgstr ""
-#: cp/decl.c:377
+#: cp/decl.c:378
msgid "label `%D' defined but not used"
msgstr ""
-#: cp/decl.c:573
+#: cp/decl.c:574
msgid "%Junused variable '%D'"
msgstr ""
-#: cp/decl.c:1136
+#: cp/decl.c:1137
msgid "`%D' was declared `extern' and later `static'"
msgstr ""
-#: cp/decl.c:1137 cp/decl.c:1602
+#: cp/decl.c:1138 cp/decl.c:1603
msgid "previous declaration of `%D'"
msgstr ""
-#: cp/decl.c:1185
+#: cp/decl.c:1186
msgid "%Jfunction '%D' redeclared as inline"
msgstr ""
-#: cp/decl.c:1186
+#: cp/decl.c:1187
msgid "%Jprevious declaration of '%D' with attribute noinline"
msgstr ""
-#: cp/decl.c:1193
+#: cp/decl.c:1194
msgid "%Jfunction '%D' redeclared with attribute noinline"
msgstr ""
-#: cp/decl.c:1195
+#: cp/decl.c:1196
msgid "%Jprevious declaration of '%D' was inline"
msgstr ""
-#: cp/decl.c:1216 cp/decl.c:1287
+#: cp/decl.c:1217 cp/decl.c:1288
msgid "shadowing %s function `%#D'"
msgstr ""
-#: cp/decl.c:1225
+#: cp/decl.c:1226
msgid "library function `%#D' redeclared as non-function `%#D'"
msgstr ""
-#: cp/decl.c:1230
+#: cp/decl.c:1231
msgid "conflicts with built-in declaration `%#D'"
msgstr ""
-#: cp/decl.c:1282 cp/decl.c:1391 cp/decl.c:1407
+#: cp/decl.c:1283 cp/decl.c:1392 cp/decl.c:1408
msgid "new declaration `%#D'"
msgstr ""
-#: cp/decl.c:1283
+#: cp/decl.c:1284
msgid "ambiguates built-in declaration `%#D'"
msgstr ""
-#: cp/decl.c:1354
+#: cp/decl.c:1355
msgid "`%#D' redeclared as different kind of symbol"
msgstr ""
-#: cp/decl.c:1357
+#: cp/decl.c:1358
msgid "previous declaration of `%#D'"
msgstr ""
-#: cp/decl.c:1376
+#: cp/decl.c:1377
msgid "declaration of template `%#D'"
msgstr ""
-#: cp/decl.c:1377 cp/name-lookup.c:578
+#: cp/decl.c:1378 cp/name-lookup.c:578
msgid "conflicts with previous declaration `%#D'"
msgstr ""
-#: cp/decl.c:1392 cp/decl.c:1408
+#: cp/decl.c:1393 cp/decl.c:1409
msgid "ambiguates old declaration `%#D'"
msgstr ""
-#: cp/decl.c:1400
+#: cp/decl.c:1401
msgid "declaration of C function `%#D' conflicts with"
msgstr ""
-#: cp/decl.c:1402
+#: cp/decl.c:1403
msgid "previous declaration `%#D' here"
msgstr ""
-#: cp/decl.c:1415
+#: cp/decl.c:1416
msgid "conflicting declaration '%#D'"
msgstr ""
-#: cp/decl.c:1416
+#: cp/decl.c:1417
msgid "'%D' has a previous declaration as `%#D'"
msgstr ""
@@ -13390,65 +13480,65 @@ msgstr ""
#. A namespace-name defined at global scope shall not be
#. declared as the name of any other entity in any global scope
#. of the program.
-#: cp/decl.c:1469
+#: cp/decl.c:1470
msgid "declaration of `namespace %D' conflicts with"
msgstr ""
-#: cp/decl.c:1470
+#: cp/decl.c:1471
msgid "previous declaration of `namespace %D' here"
msgstr ""
-#: cp/decl.c:1482
+#: cp/decl.c:1483
msgid "`%#D' previously defined here"
msgstr ""
-#: cp/decl.c:1483
+#: cp/decl.c:1484
msgid "`%#D' previously declared here"
msgstr ""
#. Prototype decl follows defn w/o prototype.
-#: cp/decl.c:1492
+#: cp/decl.c:1493
msgid "prototype for `%#D'"
msgstr ""
-#: cp/decl.c:1493
+#: cp/decl.c:1494
msgid "%Jfollows non-prototype definition here"
msgstr ""
-#: cp/decl.c:1505
+#: cp/decl.c:1506
msgid "previous declaration of `%#D' with %L linkage"
msgstr ""
-#: cp/decl.c:1507
+#: cp/decl.c:1508
msgid "conflicts with new declaration with %L linkage"
msgstr ""
-#: cp/decl.c:1530 cp/decl.c:1537
+#: cp/decl.c:1531 cp/decl.c:1538
msgid "default argument given for parameter %d of `%#D'"
msgstr ""
-#: cp/decl.c:1532 cp/decl.c:1539
+#: cp/decl.c:1533 cp/decl.c:1540
msgid "after previous specification in `%#D'"
msgstr ""
-#: cp/decl.c:1548
+#: cp/decl.c:1549
msgid "`%#D' was used before it was declared inline"
msgstr ""
-#: cp/decl.c:1549
+#: cp/decl.c:1550
msgid "%Jprevious non-inline declaration here"
msgstr ""
-#: cp/decl.c:1601
+#: cp/decl.c:1602
msgid "redundant redeclaration of `%D' in same scope"
msgstr ""
-#: cp/decl.c:1695
+#: cp/decl.c:1696
#, c-format
msgid "declaration of `%F' throws different exceptions"
msgstr ""
-#: cp/decl.c:1697
+#: cp/decl.c:1698
#, c-format
msgid "than previous declaration `%F'"
msgstr ""
@@ -13461,857 +13551,863 @@ msgstr ""
#. that specialization that would cause an implicit
#. instantiation to take place, in every translation unit in
#. which such a use occurs.
-#: cp/decl.c:1844
+#: cp/decl.c:1851
msgid "explicit specialization of %D after first use"
msgstr ""
-#: cp/decl.c:1923
+#: cp/decl.c:1930
msgid "%J'%D': visibility attribute ignored because it"
msgstr ""
-#: cp/decl.c:1925
+#: cp/decl.c:1932
msgid "%Jconflicts with previous declaration here"
msgstr ""
-#: cp/decl.c:2153
+#: cp/decl.c:2160
#, c-format
msgid "label `%E' referenced outside of any function"
msgstr ""
-#: cp/decl.c:2249 cp/decl.c:2273 cp/decl.c:2361
+#: cp/decl.c:2256 cp/decl.c:2280 cp/decl.c:2368
msgid "jump to label `%D'"
msgstr ""
-#: cp/decl.c:2251 cp/decl.c:2275
+#: cp/decl.c:2258 cp/decl.c:2282
msgid "jump to case label"
msgstr ""
-#: cp/decl.c:2254 cp/decl.c:2278
+#: cp/decl.c:2261 cp/decl.c:2285
msgid "%H from here"
msgstr ""
-#: cp/decl.c:2259
+#: cp/decl.c:2266
msgid " crosses initialization of `%#D'"
msgstr ""
-#: cp/decl.c:2262 cp/decl.c:2377
+#: cp/decl.c:2269 cp/decl.c:2384
msgid " enters scope of non-POD `%#D'"
msgstr ""
-#: cp/decl.c:2282 cp/decl.c:2381
+#: cp/decl.c:2289 cp/decl.c:2388
msgid " enters try block"
msgstr ""
-#: cp/decl.c:2284 cp/decl.c:2383
+#: cp/decl.c:2291 cp/decl.c:2390
msgid " enters catch block"
msgstr ""
-#: cp/decl.c:2362
+#: cp/decl.c:2369
msgid " from here"
msgstr ""
#. Can't skip init of __exception_info.
-#: cp/decl.c:2373
+#: cp/decl.c:2380
msgid "%J enters catch block"
msgstr ""
-#: cp/decl.c:2375
+#: cp/decl.c:2382
msgid " skips initialization of `%#D'"
msgstr ""
-#: cp/decl.c:2409
+#: cp/decl.c:2416
msgid "label named wchar_t"
msgstr ""
-#: cp/decl.c:2412
+#: cp/decl.c:2419
msgid "duplicate label `%D'"
msgstr ""
-#: cp/decl.c:2643 cp/parser.c:3542
+#: cp/decl.c:2650 cp/parser.c:3525
msgid "`%D' used without template parameters"
msgstr ""
-#: cp/decl.c:2653 cp/decl.c:2669 cp/decl.c:2756
+#: cp/decl.c:2660 cp/decl.c:2676 cp/decl.c:2763
msgid "no class template named `%#T' in `%#T'"
msgstr ""
-#: cp/decl.c:2690 cp/decl.c:2700 cp/decl.c:2720
+#: cp/decl.c:2697 cp/decl.c:2707 cp/decl.c:2727
msgid "no type named `%#T' in `%#T'"
msgstr ""
-#: cp/decl.c:3426
+#: cp/decl.c:3433
msgid "%Jan anonymous union cannot have function members"
msgstr ""
-#: cp/decl.c:3444
+#: cp/decl.c:3451
msgid "member %#D' with constructor not allowed in anonymous aggregate"
msgstr ""
-#: cp/decl.c:3447
+#: cp/decl.c:3454
msgid "member %#D' with destructor not allowed in anonymous aggregate"
msgstr ""
-#: cp/decl.c:3450
+#: cp/decl.c:3457
msgid ""
"member %#D' with copy assignment operator not allowed in anonymous aggregate"
msgstr ""
-#: cp/decl.c:3475
+#: cp/decl.c:3482
msgid "multiple types in one declaration"
msgstr ""
-#: cp/decl.c:3479
+#: cp/decl.c:3486
msgid "redeclaration of C++ built-in type %qT"
msgstr ""
-#: cp/decl.c:3515
+#: cp/decl.c:3522
msgid "missing type-name in typedef-declaration"
msgstr ""
-#: cp/decl.c:3523
+#: cp/decl.c:3530
msgid "ISO C++ prohibits anonymous structs"
msgstr ""
-#: cp/decl.c:3530
+#: cp/decl.c:3537
#, c-format
msgid "`%s' can only be specified for functions"
msgstr ""
-#: cp/decl.c:3536
+#: cp/decl.c:3543
msgid "`friend' can only be specified inside a class"
msgstr ""
-#: cp/decl.c:3538
+#: cp/decl.c:3545
msgid "`explicit' can only be specified for constructors"
msgstr ""
-#: cp/decl.c:3540
+#: cp/decl.c:3547
msgid "a storage class can only be specified for objects and functions"
msgstr ""
-#: cp/decl.c:3546
+#: cp/decl.c:3553
msgid "qualifiers can only be specified for objects and functions"
msgstr ""
-#: cp/decl.c:3684 cp/decl2.c:856
+#: cp/decl.c:3691 cp/decl2.c:856
msgid "typedef `%D' is initialized (use __typeof__ instead)"
msgstr ""
-#: cp/decl.c:3689
+#: cp/decl.c:3696
msgid "function `%#D' is initialized like a variable"
msgstr ""
-#: cp/decl.c:3701
+#: cp/decl.c:3708
msgid "declaration of `%#D' has `extern' and is initialized"
msgstr ""
-#: cp/decl.c:3724 cp/decl.c:9720
+#: cp/decl.c:3731 cp/decl.c:9821
msgid "%Jinline function '%D' given attribute noinline"
msgstr ""
-#: cp/decl.c:3732
+#: cp/decl.c:3739
msgid "`%#D' is not a static member of `%#T'"
msgstr ""
-#: cp/decl.c:3738
+#: cp/decl.c:3745
msgid "ISO C++ does not permit `%T::%D' to be defined as `%T::%D'"
msgstr ""
-#: cp/decl.c:3749
+#: cp/decl.c:3756
msgid "duplicate initialization of %D"
msgstr ""
-#: cp/decl.c:3782
+#: cp/decl.c:3789
msgid "declaration of `%#D' outside of class is not definition"
msgstr ""
-#: cp/decl.c:3831
+#: cp/decl.c:3838
msgid "variable `%#D' has initializer but incomplete type"
msgstr ""
-#: cp/decl.c:3839 cp/decl.c:4421
+#: cp/decl.c:3846 cp/decl.c:4467
msgid "elements of array `%#D' have incomplete type"
msgstr ""
-#: cp/decl.c:3855
+#: cp/decl.c:3862
msgid "aggregate `%#D' has incomplete type and cannot be defined"
msgstr ""
-#: cp/decl.c:3905
+#: cp/decl.c:3912
msgid "`%D' declared as reference but not initialized"
msgstr ""
-#: cp/decl.c:3911
+#: cp/decl.c:3918
msgid "ISO C++ forbids use of initializer list to initialize reference `%D'"
msgstr ""
-#: cp/decl.c:3939
+#: cp/decl.c:3946
msgid "cannot initialize `%T' from `%T'"
msgstr ""
-#: cp/decl.c:3971
+#: cp/decl.c:3978
msgid "initializer fails to determine size of `%D'"
msgstr ""
-#: cp/decl.c:3976
+#: cp/decl.c:3983
msgid "array size missing in `%D'"
msgstr ""
-#: cp/decl.c:3988
+#: cp/decl.c:3995
msgid "zero-size array `%D'"
msgstr ""
#. An automatic variable with an incomplete type: that is an error.
#. Don't talk about array types here, since we took care of that
#. message in grokdeclarator.
-#: cp/decl.c:4025
+#: cp/decl.c:4032
msgid "storage size of `%D' isn't known"
msgstr ""
-#: cp/decl.c:4047
+#: cp/decl.c:4054
msgid "storage size of `%D' isn't constant"
msgstr ""
-#: cp/decl.c:4102
+#: cp/decl.c:4109
msgid ""
"sorry: semantics of inline function static data `%#D' are wrong (you'll wind "
"up with multiple copies)"
msgstr ""
-#: cp/decl.c:4103
+#: cp/decl.c:4110
msgid "%J you can work around this by removing the initializer"
msgstr ""
-#: cp/decl.c:4129
+#: cp/decl.c:4136
msgid "uninitialized const `%D'"
msgstr ""
-#: cp/decl.c:4207
+#: cp/decl.c:4196
+msgid "name `%D' used in a GNU-style designated initializer for an array"
+msgstr ""
+
+#: cp/decl.c:4206
+#, c-format
+msgid "Designated initializer `%E' larger than array size"
+msgstr ""
+
+#: cp/decl.c:4277
msgid "brace-enclosed initializer used to initialize `%T'"
msgstr ""
-#: cp/decl.c:4270
+#: cp/decl.c:4340
msgid "initializer for `%T' must be brace-enclosed"
msgstr ""
-#: cp/decl.c:4287
+#: cp/decl.c:4357
msgid "ISO C++ does not allow designated initializers"
msgstr ""
-#: cp/decl.c:4291
+#: cp/decl.c:4361
msgid "`%T' has no non-static data member named `%D'"
msgstr ""
-#: cp/decl.c:4354
-msgid "name `%D' used in a GNU-style designated initializer for an array"
-msgstr ""
-
-#: cp/decl.c:4377
+#: cp/decl.c:4423
msgid "too many initializers for `%T'"
msgstr ""
-#: cp/decl.c:4415
+#: cp/decl.c:4461
msgid "variable-sized object `%D' may not be initialized"
msgstr ""
-#: cp/decl.c:4426
+#: cp/decl.c:4472
msgid "`%D' has incomplete type"
msgstr ""
-#: cp/decl.c:4480
+#: cp/decl.c:4526
msgid "`%D' must be initialized by constructor, not by `{...}'"
msgstr ""
-#: cp/decl.c:4524
+#: cp/decl.c:4570
msgid "structure `%D' with uninitialized const members"
msgstr ""
-#: cp/decl.c:4526
+#: cp/decl.c:4572
msgid "structure `%D' with uninitialized reference members"
msgstr ""
-#: cp/decl.c:4721
+#: cp/decl.c:4767
msgid "assignment (not initialization) in declaration"
msgstr ""
-#: cp/decl.c:4738
+#: cp/decl.c:4784
msgid "cannot initialize `%D' to namespace `%D'"
msgstr ""
-#: cp/decl.c:4782
+#: cp/decl.c:4828
msgid "shadowing previous type declaration of `%#D'"
msgstr ""
-#: cp/decl.c:4819
+#: cp/decl.c:4865
msgid "`%D' cannot be thread-local because it has non-POD type `%T'"
msgstr ""
-#: cp/decl.c:4834
+#: cp/decl.c:4880
msgid "`%D' is thread-local and so cannot be dynamically initialized"
msgstr ""
-#: cp/decl.c:5425
+#: cp/decl.c:5471
msgid "destructor for alien class `%T' cannot be a member"
msgstr ""
-#: cp/decl.c:5428
+#: cp/decl.c:5474
msgid "constructor for alien class `%T' cannot be a member"
msgstr ""
-#: cp/decl.c:5450
+#: cp/decl.c:5496
msgid "`%D' declared as a `virtual' %s"
msgstr ""
-#: cp/decl.c:5452
+#: cp/decl.c:5498
msgid "`%D' declared as an `inline' %s"
msgstr ""
-#: cp/decl.c:5454
+#: cp/decl.c:5500
msgid ""
"`const' and `volatile' function specifiers on `%D' invalid in %s declaration"
msgstr ""
-#: cp/decl.c:5457
+#: cp/decl.c:5503
msgid "`%D' declared as a friend"
msgstr ""
-#: cp/decl.c:5463
+#: cp/decl.c:5509
msgid "`%D' declared with an exception specification"
msgstr ""
-#: cp/decl.c:5545
+#: cp/decl.c:5592
msgid "cannot declare `::main' to be a template"
msgstr ""
-#: cp/decl.c:5547
+#: cp/decl.c:5594
msgid "cannot declare `::main' to be inline"
msgstr ""
-#: cp/decl.c:5549
+#: cp/decl.c:5596
msgid "cannot declare `::main' to be static"
msgstr ""
-#: cp/decl.c:5552
-msgid "`main' must return `int'"
+#: cp/decl.c:5600
+msgid "`::main' must return `int'"
msgstr ""
-#: cp/decl.c:5580
+#: cp/decl.c:5630
msgid "non-local function `%#D' uses anonymous type"
msgstr ""
-#: cp/decl.c:5583 cp/decl.c:5909
+#: cp/decl.c:5633 cp/decl.c:5977
msgid ""
"`%#D' does not refer to the unqualified type, so it is not used for linkage"
msgstr ""
-#: cp/decl.c:5589
+#: cp/decl.c:5639
msgid "non-local function `%#D' uses local type `%T'"
msgstr ""
-#: cp/decl.c:5613
+#: cp/decl.c:5663
msgid "%smember function `%D' cannot have cv-qualifier"
msgstr ""
-#: cp/decl.c:5637
+#: cp/decl.c:5687
msgid "defining explicit specialization `%D' in friend declaration"
msgstr ""
#. Something like `template <class T> friend void f<T>()'.
-#: cp/decl.c:5647
+#: cp/decl.c:5697
msgid "invalid use of template-id `%D' in declaration of primary template"
msgstr ""
-#: cp/decl.c:5674
+#: cp/decl.c:5724
msgid ""
"default arguments are not allowed in declaration of friend template "
"specialization `%D'"
msgstr ""
-#: cp/decl.c:5681
+#: cp/decl.c:5731
msgid ""
"`inline' is not allowed in declaration of friend template specialization `%D'"
msgstr ""
-#: cp/decl.c:5741
+#: cp/decl.c:5797
msgid "definition of implicitly-declared `%D'"
msgstr ""
-#: cp/decl.c:5761 cp/decl2.c:718
+#: cp/decl.c:5817 cp/decl2.c:718
msgid "no `%#D' member function declared in class `%T'"
msgstr ""
-#: cp/decl.c:5906
+#. It's a typedef referring to an anonymous type.
+#: cp/decl.c:5974
msgid "non-local variable `%#D' uses anonymous type"
msgstr ""
-#: cp/decl.c:5915
+#: cp/decl.c:5983
msgid "non-local variable `%#D' uses local type `%T'"
msgstr ""
-#: cp/decl.c:6031
+#: cp/decl.c:6099
msgid ""
"invalid in-class initialization of static data member of non-integral type `%"
"T'"
msgstr ""
-#: cp/decl.c:6040
+#: cp/decl.c:6108
msgid "ISO C++ forbids in-class initialization of non-const static member `%D'"
msgstr ""
-#: cp/decl.c:6043
+#: cp/decl.c:6111
msgid ""
"ISO C++ forbids initialization of member constant `%D' of non-integral type `"
"%T'"
msgstr ""
-#: cp/decl.c:6062
+#: cp/decl.c:6130
msgid "size of array `%D' has non-integral type `%T'"
msgstr ""
-#: cp/decl.c:6064
+#: cp/decl.c:6132
msgid "size of array has non-integral type `%T'"
msgstr ""
-#: cp/decl.c:6100
+#: cp/decl.c:6168
msgid "size of array `%D' is negative"
msgstr ""
-#: cp/decl.c:6102
+#: cp/decl.c:6170
msgid "size of array is negative"
msgstr ""
-#: cp/decl.c:6110
+#: cp/decl.c:6178
msgid "ISO C++ forbids zero-size array `%D'"
msgstr ""
-#: cp/decl.c:6112
+#: cp/decl.c:6180
msgid "ISO C++ forbids zero-size array"
msgstr ""
-#: cp/decl.c:6119
+#: cp/decl.c:6187
msgid "size of array `%D' is not an integral constant-expression"
msgstr ""
-#: cp/decl.c:6122
+#: cp/decl.c:6190
msgid "size of array is not an integral constant-expression"
msgstr ""
-#: cp/decl.c:6127
+#: cp/decl.c:6195
msgid "ISO C++ forbids variable-size array `%D'"
msgstr ""
-#: cp/decl.c:6129
+#: cp/decl.c:6197
msgid "ISO C++ forbids variable-size array"
msgstr ""
-#: cp/decl.c:6151
+#: cp/decl.c:6227
msgid "overflow in array dimension"
msgstr ""
-#: cp/decl.c:6226
+#: cp/decl.c:6302
msgid "declaration of `%D' as %s"
msgstr ""
-#: cp/decl.c:6228
+#: cp/decl.c:6304
#, c-format
msgid "creating %s"
msgstr ""
-#: cp/decl.c:6240
+#: cp/decl.c:6316
msgid ""
"declaration of `%D' as multidimensional array must have bounds for all "
"dimensions except the first"
msgstr ""
-#: cp/decl.c:6243
+#: cp/decl.c:6319
msgid ""
"multidimensional array must have bounds for all dimensions except the first"
msgstr ""
-#: cp/decl.c:6277
+#: cp/decl.c:6353
msgid "return type specification for constructor invalid"
msgstr ""
-#: cp/decl.c:6287
+#: cp/decl.c:6363
msgid "return type specification for destructor invalid"
msgstr ""
-#: cp/decl.c:6300
+#: cp/decl.c:6376
msgid "operator `%T' declared to return `%T'"
msgstr ""
-#: cp/decl.c:6302
+#: cp/decl.c:6378
msgid "return type specified for `operator %T'"
msgstr ""
-#: cp/decl.c:6471
+#: cp/decl.c:6548
msgid "type `%T' is not derived from type `%T'"
msgstr ""
-#: cp/decl.c:6516
+#: cp/decl.c:6593
msgid "declarator-id missing; using reserved word `%D'"
msgstr ""
-#: cp/decl.c:6572
+#: cp/decl.c:6649
msgid "declaration of `%D' as non-function"
msgstr ""
-#: cp/decl.c:6605
+#: cp/decl.c:6682
#, c-format
msgid "two or more data types in declaration of `%s'"
msgstr ""
-#: cp/decl.c:6643
+#: cp/decl.c:6723
msgid "`long long long' is too long for GCC"
msgstr ""
-#: cp/decl.c:6645
+#: cp/decl.c:6725
msgid "ISO C++ does not support `long long'"
msgstr ""
-#: cp/decl.c:6667
+#: cp/decl.c:6747
#, c-format
msgid "duplicate `%s'"
msgstr ""
-#: cp/decl.c:6703 cp/decl.c:6706
+#: cp/decl.c:6785 cp/decl.c:6788
#, c-format
msgid "ISO C++ forbids declaration of `%s' with no type"
msgstr ""
-#: cp/decl.c:6732
+#: cp/decl.c:6814
#, c-format
msgid "short, signed or unsigned invalid for `%s'"
msgstr ""
-#: cp/decl.c:6734
+#: cp/decl.c:6816
#, c-format
msgid "long, short, signed or unsigned invalid for `%s'"
msgstr ""
-#: cp/decl.c:6736
+#: cp/decl.c:6818
#, c-format
msgid "long and short specified together for `%s'"
msgstr ""
-#: cp/decl.c:6738
+#: cp/decl.c:6820
#, c-format
msgid "long or short specified with char for `%s'"
msgstr ""
-#: cp/decl.c:6740
+#: cp/decl.c:6822
#, c-format
msgid "long or short specified with floating type for `%s'"
msgstr ""
-#: cp/decl.c:6742
+#: cp/decl.c:6824
#, c-format
msgid "signed and unsigned given together for `%s'"
msgstr ""
-#: cp/decl.c:6748
+#: cp/decl.c:6830
#, c-format
msgid "long, short, signed or unsigned used invalidly for `%s'"
msgstr ""
-#: cp/decl.c:6813
+#: cp/decl.c:6895
#, c-format
msgid "complex invalid for `%s'"
msgstr ""
-#: cp/decl.c:6842
+#: cp/decl.c:6924
msgid "qualifiers are not allowed on declaration of `operator %T'"
msgstr ""
-#: cp/decl.c:6863
+#: cp/decl.c:6945
msgid "member `%D' cannot be declared both virtual and static"
msgstr ""
-#: cp/decl.c:6871
+#: cp/decl.c:6953
msgid "`%T::%D' is not a valid declarator"
msgstr ""
-#: cp/decl.c:6879
+#: cp/decl.c:6961
msgid "typedef declaration invalid in parameter declaration"
msgstr ""
-#: cp/decl.c:6883
+#: cp/decl.c:6965
msgid "storage class specifiers invalid in parameter declarations"
msgstr ""
-#: cp/decl.c:6890
+#: cp/decl.c:6972
msgid "virtual outside class declaration"
msgstr ""
-#: cp/decl.c:6903 cp/decl.c:6910
+#: cp/decl.c:6985 cp/decl.c:6992
#, c-format
msgid "multiple storage classes in declaration of `%s'"
msgstr ""
-#: cp/decl.c:6953
+#: cp/decl.c:7035
#, c-format
msgid "storage class specified for %s `%s'"
msgstr ""
-#: cp/decl.c:6960
+#: cp/decl.c:7042
#, c-format
msgid "storage class specified for parameter `%s'"
msgstr ""
-#: cp/decl.c:6979
+#: cp/decl.c:7061
#, c-format
msgid "`%s' initialized and declared `extern'"
msgstr ""
-#: cp/decl.c:6982
+#: cp/decl.c:7064
#, c-format
msgid "`%s' has both `extern' and initializer"
msgstr ""
-#: cp/decl.c:6986
+#: cp/decl.c:7068
#, c-format
msgid "nested function `%s' declared `extern'"
msgstr ""
-#: cp/decl.c:6990
+#: cp/decl.c:7072
#, c-format
msgid "top-level declaration of `%s' specifies `auto'"
msgstr ""
-#: cp/decl.c:6996
+#: cp/decl.c:7078
#, c-format
msgid "function-scope `%s' implicitly auto and declared `__thread'"
msgstr ""
-#: cp/decl.c:7002
+#: cp/decl.c:7084
msgid "storage class specifiers invalid in friend function declarations"
msgstr ""
-#: cp/decl.c:7095
+#: cp/decl.c:7177
#, c-format
msgid "`%s' declared as function returning a function"
msgstr ""
-#: cp/decl.c:7100
+#: cp/decl.c:7182
#, c-format
msgid "`%s' declared as function returning an array"
msgstr ""
-#: cp/decl.c:7136
+#: cp/decl.c:7218
msgid "destructor cannot be static member function"
msgstr ""
-#: cp/decl.c:7139
+#: cp/decl.c:7221
msgid "destructors may not be cv-qualified"
msgstr ""
-#: cp/decl.c:7159
+#: cp/decl.c:7241
msgid "constructor cannot be static member function"
msgstr ""
-#: cp/decl.c:7162
+#: cp/decl.c:7244
msgid "constructors cannot be declared virtual"
msgstr ""
-#: cp/decl.c:7167
+#: cp/decl.c:7249
msgid "constructors may not be cv-qualified"
msgstr ""
-#: cp/decl.c:7187
+#: cp/decl.c:7269
#, c-format
msgid "can't initialize friend function `%s'"
msgstr ""
#. Cannot be both friend and virtual.
-#: cp/decl.c:7191
+#: cp/decl.c:7273
msgid "virtual functions cannot be friends"
msgstr ""
-#: cp/decl.c:7195
+#: cp/decl.c:7277
msgid "friend declaration not in class definition"
msgstr ""
-#: cp/decl.c:7197
+#: cp/decl.c:7279
#, c-format
msgid "can't define friend function `%s' in a local class definition"
msgstr ""
-#: cp/decl.c:7209
+#: cp/decl.c:7291
msgid "destructors may not have parameters"
msgstr ""
-#: cp/decl.c:7227 cp/decl.c:7234
+#: cp/decl.c:7309 cp/decl.c:7316
msgid "cannot declare reference to `%#T'"
msgstr ""
-#: cp/decl.c:7228
+#: cp/decl.c:7310
msgid "cannot declare pointer to `%#T'"
msgstr ""
-#: cp/decl.c:7236
+#: cp/decl.c:7318
msgid "cannot declare pointer to `%#T' member"
msgstr ""
-#: cp/decl.c:7292
+#: cp/decl.c:7374
msgid "template-id `%D' used as a declarator"
msgstr ""
-#: cp/decl.c:7343
+#: cp/decl.c:7425
msgid "extra qualification `%T::' on member `%s' ignored"
msgstr ""
-#: cp/decl.c:7362
+#: cp/decl.c:7444
msgid "cannot declare member function `%T::%s' within `%T'"
msgstr ""
-#: cp/decl.c:7377
+#: cp/decl.c:7459
msgid "cannot declare member `%T::%s' within `%T'"
msgstr ""
-#: cp/decl.c:7405
+#: cp/decl.c:7487
#, c-format
msgid "size of array `%s' is too large"
msgstr ""
-#: cp/decl.c:7416
+#: cp/decl.c:7498
msgid "data member may not have variably modified type `%T'"
msgstr ""
-#: cp/decl.c:7418
+#: cp/decl.c:7500
msgid "parameter may not have variably modified type `%T'"
msgstr ""
#. [dcl.fct.spec] The explicit specifier shall only be used in
#. declarations of constructors within a class definition.
-#: cp/decl.c:7426
+#: cp/decl.c:7508
msgid "only declarations of constructors can be `explicit'"
msgstr ""
-#: cp/decl.c:7434
+#: cp/decl.c:7516
#, c-format
msgid "non-member `%s' cannot be declared `mutable'"
msgstr ""
-#: cp/decl.c:7439
+#: cp/decl.c:7521
#, c-format
msgid "non-object member `%s' cannot be declared `mutable'"
msgstr ""
-#: cp/decl.c:7445
+#: cp/decl.c:7527
#, c-format
msgid "function `%s' cannot be declared `mutable'"
msgstr ""
-#: cp/decl.c:7450
+#: cp/decl.c:7532
#, c-format
msgid "static `%s' cannot be declared `mutable'"
msgstr ""
-#: cp/decl.c:7455
+#: cp/decl.c:7537
#, c-format
msgid "const `%s' cannot be declared `mutable'"
msgstr ""
-#: cp/decl.c:7473
+#: cp/decl.c:7555
msgid "ISO C++ forbids nested type `%D' with same name as enclosing class"
msgstr ""
-#: cp/decl.c:7481
+#: cp/decl.c:7563
msgid "%Jtypedef name may not be a nested-name-specifier"
msgstr ""
-#: cp/decl.c:7527
+#: cp/decl.c:7609
msgid "%Jinvalid type qualifier for non-member function type"
msgstr ""
-#: cp/decl.c:7590
+#: cp/decl.c:7672
msgid "type qualifiers specified for friend class declaration"
msgstr ""
-#: cp/decl.c:7595
+#: cp/decl.c:7677
msgid "`inline' specified for friend class declaration"
msgstr ""
-#: cp/decl.c:7603
+#: cp/decl.c:7685
msgid "template parameters cannot be friends"
msgstr ""
-#: cp/decl.c:7605
+#: cp/decl.c:7687
msgid "friend declaration requires class-key, i.e. `friend class %T::%D'"
msgstr ""
-#: cp/decl.c:7609
+#: cp/decl.c:7691
msgid "friend declaration requires class-key, i.e. `friend %#T'"
msgstr ""
-#: cp/decl.c:7622
+#: cp/decl.c:7704
msgid "trying to make class `%T' a friend of global scope"
msgstr ""
-#: cp/decl.c:7633
+#: cp/decl.c:7715
msgid "invalid qualifiers on non-member function type"
msgstr ""
-#: cp/decl.c:7652
+#: cp/decl.c:7734
msgid "abstract declarator `%T' used as declaration"
msgstr ""
-#: cp/decl.c:7664
+#: cp/decl.c:7746
msgid "unnamed variable or field declared void"
msgstr ""
-#: cp/decl.c:7668
+#: cp/decl.c:7750
#, c-format
msgid "variable or field `%s' declared void"
msgstr ""
-#: cp/decl.c:7671
+#: cp/decl.c:7753
msgid "variable or field declared void"
msgstr ""
-#: cp/decl.c:7681
+#: cp/decl.c:7763
msgid "cannot use `::' in parameter declaration"
msgstr ""
#. Something like struct S { int N::j; };
-#: cp/decl.c:7726
+#: cp/decl.c:7808
msgid "invalid use of `::'"
msgstr ""
-#: cp/decl.c:7738
+#: cp/decl.c:7820
msgid "function `%D' cannot be declared friend"
msgstr ""
-#: cp/decl.c:7750
+#: cp/decl.c:7832
msgid "can't make `%D' into a method -- not in a class"
msgstr ""
-#: cp/decl.c:7759
+#: cp/decl.c:7841
msgid "function `%D' declared virtual inside a union"
msgstr ""
-#: cp/decl.c:7768
+#: cp/decl.c:7850
msgid "`%D' cannot be declared virtual, since it is always static"
msgstr ""
-#: cp/decl.c:7847
+#: cp/decl.c:7929
msgid "field `%D' has incomplete type"
msgstr ""
-#: cp/decl.c:7849
+#: cp/decl.c:7931
msgid "name `%T' has incomplete type"
msgstr ""
-#: cp/decl.c:7858
+#: cp/decl.c:7940
msgid " in instantiation of template `%T'"
msgstr ""
-#: cp/decl.c:7868
+#: cp/decl.c:7950
#, c-format
msgid "`%E' is neither function nor member function; cannot be declared friend"
msgstr ""
-#: cp/decl.c:7879
+#: cp/decl.c:7961
msgid "member functions are implicitly friends of their class"
msgstr ""
@@ -14327,86 +14423,86 @@ msgstr ""
#. the rest of the compiler does not correctly
#. handle the initialization unless the member is
#. static so we make it static below.
-#: cp/decl.c:7919
+#: cp/decl.c:8001
msgid "ISO C++ forbids initialization of member `%D'"
msgstr ""
-#: cp/decl.c:7921
+#: cp/decl.c:8003
msgid "making `%D' static"
msgstr ""
-#: cp/decl.c:7979
+#: cp/decl.c:8061
#, c-format
msgid "storage class `auto' invalid for function `%s'"
msgstr ""
-#: cp/decl.c:7981
+#: cp/decl.c:8063
#, c-format
msgid "storage class `register' invalid for function `%s'"
msgstr ""
-#: cp/decl.c:7983
+#: cp/decl.c:8065
#, c-format
msgid "storage class `__thread' invalid for function `%s'"
msgstr ""
-#: cp/decl.c:7994
+#: cp/decl.c:8076
#, c-format
msgid ""
"`static' specified invalid for function `%s' declared out of global scope"
msgstr ""
-#: cp/decl.c:7996
+#: cp/decl.c:8078
#, c-format
msgid ""
"`inline' specifier invalid for function `%s' declared out of global scope"
msgstr ""
-#: cp/decl.c:8003
+#: cp/decl.c:8085
#, c-format
msgid "virtual non-class function `%s'"
msgstr ""
-#: cp/decl.c:8034
+#: cp/decl.c:8116
msgid "cannot declare member function `%D' to have static linkage"
msgstr ""
#. FIXME need arm citation
-#: cp/decl.c:8040
+#: cp/decl.c:8122
msgid "cannot declare static function inside another function"
msgstr ""
-#: cp/decl.c:8069
+#: cp/decl.c:8151
msgid ""
"`static' may not be used when defining (as opposed to declaring) a static "
"data member"
msgstr ""
-#: cp/decl.c:8075
+#: cp/decl.c:8157
msgid "static member `%D' declared `register'"
msgstr ""
-#: cp/decl.c:8080
+#: cp/decl.c:8162
msgid "cannot explicitly declare member `%#D' to have extern linkage"
msgstr ""
-#: cp/decl.c:8220
+#: cp/decl.c:8302
msgid "default argument for `%#D' has type `%T'"
msgstr ""
-#: cp/decl.c:8223
+#: cp/decl.c:8305
msgid "default argument for parameter of type `%T' has type `%T'"
msgstr ""
-#: cp/decl.c:8240
+#: cp/decl.c:8322
msgid "default argument `%E' uses local variable `%D'"
msgstr ""
-#: cp/decl.c:8309
+#: cp/decl.c:8391
msgid "parameter `%D' invalidly declared method type"
msgstr ""
-#: cp/decl.c:8333
+#: cp/decl.c:8415
msgid "parameter `%D' includes %s to array of unknown bound `%T'"
msgstr ""
@@ -14425,102 +14521,102 @@ msgstr ""
#. or implicitly defined), there's no need to worry about their
#. existence. Theoretically, they should never even be
#. instantiated, but that's hard to forestall.
-#: cp/decl.c:8490
+#: cp/decl.c:8572
msgid "invalid constructor; you probably meant `%T (const %T&)'"
msgstr ""
-#: cp/decl.c:8614
+#: cp/decl.c:8696
msgid "`%D' may not be declared within a namespace"
msgstr ""
-#: cp/decl.c:8616
+#: cp/decl.c:8698
msgid "`%D' may not be declared as static"
msgstr ""
-#: cp/decl.c:8636
+#: cp/decl.c:8718
msgid "`%D' must be a nonstatic member function"
msgstr ""
-#: cp/decl.c:8642
+#: cp/decl.c:8724
msgid ""
"`%D' must be either a non-static member function or a non-member function"
msgstr ""
-#: cp/decl.c:8659
+#: cp/decl.c:8741
msgid "`%D' must have an argument of class or enumerated type"
msgstr ""
-#: cp/decl.c:8694
+#: cp/decl.c:8776
#, c-format
msgid "conversion to %s%s will never use a type conversion operator"
msgstr ""
#. 13.4.0.3
-#: cp/decl.c:8701
+#: cp/decl.c:8783
msgid "ISO C++ prohibits overloading operator ?:"
msgstr ""
-#: cp/decl.c:8751
+#: cp/decl.c:8833
msgid "postfix `%D' must take `int' as its argument"
msgstr ""
-#: cp/decl.c:8755
+#: cp/decl.c:8837
msgid "postfix `%D' must take `int' as its second argument"
msgstr ""
-#: cp/decl.c:8762
+#: cp/decl.c:8844
msgid "`%D' must take either zero or one argument"
msgstr ""
-#: cp/decl.c:8764
+#: cp/decl.c:8846
msgid "`%D' must take either one or two arguments"
msgstr ""
-#: cp/decl.c:8785
+#: cp/decl.c:8867
msgid "prefix `%D' should return `%T'"
msgstr ""
-#: cp/decl.c:8791
+#: cp/decl.c:8873
msgid "postfix `%D' should return `%T'"
msgstr ""
-#: cp/decl.c:8800
+#: cp/decl.c:8882
msgid "`%D' must take `void'"
msgstr ""
-#: cp/decl.c:8802 cp/decl.c:8810
+#: cp/decl.c:8884 cp/decl.c:8892
msgid "`%D' must take exactly one argument"
msgstr ""
-#: cp/decl.c:8812
+#: cp/decl.c:8894
msgid "`%D' must take exactly two arguments"
msgstr ""
-#: cp/decl.c:8820
+#: cp/decl.c:8902
msgid "user-defined `%D' always evaluates both arguments"
msgstr ""
-#: cp/decl.c:8834
+#: cp/decl.c:8916
msgid "`%D' should return by value"
msgstr ""
-#: cp/decl.c:8846 cp/decl.c:8849
+#: cp/decl.c:8928 cp/decl.c:8931
msgid "`%D' cannot have default arguments"
msgstr ""
-#: cp/decl.c:8909
+#: cp/decl.c:8991
msgid "using typedef-name `%D' after `%s'"
msgstr ""
-#: cp/decl.c:8915
+#: cp/decl.c:8997
msgid "using template type parameter `%T' after `%s'"
msgstr ""
-#: cp/decl.c:8923
+#: cp/decl.c:9005
msgid "`%T' referred to as `%s'"
msgstr ""
-#: cp/decl.c:8929
+#: cp/decl.c:9011
msgid "`%T' referred to as enum"
msgstr ""
@@ -14531,47 +14627,47 @@ msgstr ""
#. void f(class C); // No template header here
#.
#. then the required template argument is missing.
-#: cp/decl.c:8944
+#: cp/decl.c:9026
msgid "template argument required for `%s %T'"
msgstr ""
-#: cp/decl.c:9089
+#: cp/decl.c:9171
msgid "use of enum `%#D' without previous declaration"
msgstr ""
-#: cp/decl.c:9107
+#: cp/decl.c:9189
msgid "redeclaration of `%T' as a non-template"
msgstr ""
-#: cp/decl.c:9200
+#: cp/decl.c:9282
msgid "derived union `%T' invalid"
msgstr ""
-#: cp/decl.c:9211
+#: cp/decl.c:9288
msgid "Java class '%T' cannot have multiple bases"
msgstr ""
-#: cp/decl.c:9223
+#: cp/decl.c:9296
msgid "Java class '%T' cannot have virtual bases"
msgstr ""
-#: cp/decl.c:9242
+#: cp/decl.c:9315
msgid "base type `%T' fails to be a struct or class type"
msgstr ""
-#: cp/decl.c:9250
+#: cp/decl.c:9348
msgid "recursive type `%T' undefined"
msgstr ""
-#: cp/decl.c:9252
+#: cp/decl.c:9350
msgid "duplicate base type `%T' invalid"
msgstr ""
-#: cp/decl.c:9317
+#: cp/decl.c:9418
msgid "multiple definition of `%#T'"
msgstr ""
-#: cp/decl.c:9318
+#: cp/decl.c:9419
msgid "%Jprevious definition here"
msgstr ""
@@ -14579,43 +14675,39 @@ msgstr ""
#.
#. IF no integral type can represent all the enumerator values, the
#. enumeration is ill-formed.
-#: cp/decl.c:9443
+#: cp/decl.c:9544
msgid "no integral type can represent all of the enumerator values for `%T'"
msgstr ""
-#: cp/decl.c:9544
+#: cp/decl.c:9645
msgid "enumerator value for `%D' not integer constant"
msgstr ""
-#: cp/decl.c:9571
+#: cp/decl.c:9672
msgid "overflow in enumeration values at `%D'"
msgstr ""
-#: cp/decl.c:9642
+#: cp/decl.c:9743
msgid "return type `%#T' is incomplete"
msgstr ""
-#: cp/decl.c:9757 cp/typeck.c:5982
+#: cp/decl.c:9858 cp/typeck.c:6031
msgid "`operator=' should return a reference to `*this'"
msgstr ""
-#: cp/decl.c:10034
-msgid "return type for `main' changed to `int'"
-msgstr ""
-
-#: cp/decl.c:10089
+#: cp/decl.c:10182
msgid "parameter `%D' declared void"
msgstr ""
-#: cp/decl.c:10571
+#: cp/decl.c:10664
msgid "invalid member function declaration"
msgstr ""
-#: cp/decl.c:10586
+#: cp/decl.c:10679
msgid "`%D' is already defined in class `%T'"
msgstr ""
-#: cp/decl.c:10797
+#: cp/decl.c:10890
msgid "static member function `%#D' declared with type qualifiers"
msgstr ""
@@ -14660,7 +14752,7 @@ msgstr ""
msgid "invalid use of `virtual' in template declaration of `%#D'"
msgstr ""
-#: cp/decl2.c:506 cp/pt.c:2912
+#: cp/decl2.c:506 cp/pt.c:2905
msgid "template declaration of `%#D'"
msgstr ""
@@ -14756,11 +14848,11 @@ msgstr ""
msgid "`operator delete' takes type `%T' as first parameter"
msgstr ""
-#: cp/decl2.c:3030
+#: cp/decl2.c:3020
msgid "inline function `%D' used but never defined"
msgstr ""
-#: cp/decl2.c:3180
+#: cp/decl2.c:3170
msgid "default argument missing for parameter %P of `%+#D'"
msgstr ""
@@ -14792,7 +14884,7 @@ msgstr ""
msgid "throwing NULL, which has integral, not pointer type"
msgstr ""
-#: cp/except.c:599 cp/init.c:1874
+#: cp/except.c:599 cp/init.c:1876
msgid "`%D' should never be overloaded"
msgstr ""
@@ -14875,220 +14967,220 @@ msgid ""
"template-friend disables this warning"
msgstr ""
-#: cp/g++spec.c:235 java/jvspec.c:415
+#: cp/g++spec.c:238 java/jvspec.c:415
#, c-format
msgid "argument to `%s' missing\n"
msgstr ""
#: cp/init.c:318
-msgid "`%D' should be initialized in the member initialization list"
+msgid "%J%qD should be initialized in the member initialization list"
msgstr ""
-#: cp/init.c:367
-msgid "default-initialization of `%#D', which has reference type"
+#: cp/init.c:365
+msgid "%Jdefault-initialization of %q#D, which has reference type"
msgstr ""
-#: cp/init.c:372
-msgid "uninitialized reference member `%D'"
+#: cp/init.c:371
+msgid "%Juninitialized reference member %qD"
msgstr ""
#: cp/init.c:374
-msgid "uninitialized member `%D' with `const' type `%T'"
+msgid "%Juninitialized member %qD with %<const%> type %qT"
msgstr ""
-#: cp/init.c:516
+#: cp/init.c:517
msgid "`%D' will be initialized after"
msgstr ""
-#: cp/init.c:519
+#: cp/init.c:520
msgid "base `%T' will be initialized after"
msgstr ""
-#: cp/init.c:522
+#: cp/init.c:523
msgid " `%#D'"
msgstr ""
-#: cp/init.c:524
+#: cp/init.c:525
msgid " base `%T'"
msgstr ""
-#: cp/init.c:525
-msgid " when initialized here"
+#: cp/init.c:526
+msgid "%J when initialized here"
msgstr ""
-#: cp/init.c:541
-msgid "multiple initializations given for `%D'"
+#: cp/init.c:542
+msgid "%Jmultiple initializations given for %qD"
msgstr ""
-#: cp/init.c:543
-msgid "multiple initializations given for base `%T'"
+#: cp/init.c:545
+msgid "%Jmultiple initializations given for base %qT"
msgstr ""
-#: cp/init.c:610
-msgid "initializations for multiple members of `%T'"
+#: cp/init.c:612
+msgid "%Jinitializations for multiple members of %qT"
msgstr ""
-#: cp/init.c:667
+#: cp/init.c:669
msgid ""
-"base class `%#T' should be explicitly initialized in the copy constructor"
+"%Jbase class `%#T' should be explicitly initialized in the copy constructor"
msgstr ""
-#: cp/init.c:891 cp/init.c:910
+#: cp/init.c:893 cp/init.c:912
msgid "class `%T' does not have any field named `%D'"
msgstr ""
-#: cp/init.c:897
+#: cp/init.c:899
msgid ""
"`%#D' is a static data member; it can only be initialized at its definition"
msgstr ""
-#: cp/init.c:904
+#: cp/init.c:906
msgid "`%#D' is not a non-static data member of `%T'"
msgstr ""
-#: cp/init.c:943
+#: cp/init.c:945
msgid "unnamed initializer for `%T', which has no base classes"
msgstr ""
-#: cp/init.c:951
+#: cp/init.c:953
msgid "unnamed initializer for `%T', which uses multiple inheritance"
msgstr ""
-#: cp/init.c:997
+#: cp/init.c:999
msgid "'%D' is both a direct base and an indirect virtual base"
msgstr ""
-#: cp/init.c:1005
+#: cp/init.c:1007
msgid "type `%D' is not a direct or virtual base of `%T'"
msgstr ""
-#: cp/init.c:1008
+#: cp/init.c:1010
msgid "type `%D' is not a direct base of `%T'"
msgstr ""
-#: cp/init.c:1088
+#: cp/init.c:1090
msgid "bad array initializer"
msgstr ""
-#: cp/init.c:1287
+#: cp/init.c:1289
msgid "`%T' is not an aggregate type"
msgstr ""
-#: cp/init.c:1379 cp/typeck.c:1835
+#: cp/init.c:1381 cp/typeck.c:1839
msgid "qualified type `%T' does not match destructor name `~%T'"
msgstr ""
-#: cp/init.c:1387
+#: cp/init.c:1389
msgid "incomplete type `%T' does not have member `%D'"
msgstr ""
-#: cp/init.c:1407
+#: cp/init.c:1409
msgid "`%D' is not a member of type `%T'"
msgstr ""
-#: cp/init.c:1434
+#: cp/init.c:1436
msgid "invalid pointer to bit-field `%D'"
msgstr ""
-#: cp/init.c:1536
+#: cp/init.c:1538
msgid "invalid use of non-static member function `%D'"
msgstr ""
-#: cp/init.c:1542 cp/semantics.c:1268
+#: cp/init.c:1544 cp/semantics.c:1268
msgid "invalid use of non-static data member `%D'"
msgstr ""
-#: cp/init.c:1659
+#: cp/init.c:1661
msgid "new cannot be applied to a reference type"
msgstr ""
-#: cp/init.c:1665
+#: cp/init.c:1667
msgid "new cannot be applied to a function type"
msgstr ""
-#: cp/init.c:1697
+#: cp/init.c:1699
msgid "call to Java constructor, while `jclass' undefined"
msgstr ""
-#: cp/init.c:1713
+#: cp/init.c:1715
msgid "can't find class$"
msgstr ""
-#: cp/init.c:1826
+#: cp/init.c:1828
msgid "invalid type `void' for new"
msgstr ""
-#: cp/init.c:1836
+#: cp/init.c:1838
msgid "uninitialized const in `new' of `%#T'"
msgstr ""
-#: cp/init.c:1869
+#: cp/init.c:1871
#, c-format
msgid "call to Java constructor with `%s' undefined"
msgstr ""
-#: cp/init.c:1909
+#: cp/init.c:1911
msgid "request for member `%D' is ambiguous"
msgstr ""
-#: cp/init.c:2042
+#: cp/init.c:2044
msgid "ISO C++ forbids initialization in array new"
msgstr ""
-#: cp/init.c:2512
+#: cp/init.c:2514
msgid "initializer ends prematurely"
msgstr ""
-#: cp/init.c:2565
+#: cp/init.c:2567
msgid "cannot initialize multi-dimensional array with initializer"
msgstr ""
-#: cp/init.c:2724
+#: cp/init.c:2726
msgid "possible problem detected in invocation of delete operator:"
msgstr ""
-#: cp/init.c:2727
+#: cp/init.c:2729
msgid ""
"neither the destructor nor the class-specific operator delete will be "
"called, even if they are declared when the class is defined."
msgstr ""
-#: cp/init.c:2748
+#: cp/init.c:2750
msgid "unknown array size in delete"
msgstr ""
-#: cp/init.c:3008
+#: cp/init.c:3010
msgid "type to vector delete is neither pointer or array type"
msgstr ""
-#: cp/lex.c:437
+#: cp/lex.c:436
#, c-format
msgid "junk at end of #pragma %s"
msgstr ""
-#: cp/lex.c:444
+#: cp/lex.c:443
#, c-format
msgid "invalid #pragma %s"
msgstr ""
-#: cp/lex.c:452
+#: cp/lex.c:451
msgid "#pragma vtable no longer supported"
msgstr ""
-#: cp/lex.c:524
+#: cp/lex.c:530
#, c-format
-msgid "#pragma implementation for %s appears after file is included"
+msgid "#pragma implementation for %qs appears after file is included"
msgstr ""
-#: cp/lex.c:548
+#: cp/lex.c:555
msgid "junk at end of #pragma GCC java_exceptions"
msgstr ""
-#: cp/lex.c:562
+#: cp/lex.c:569
msgid "`%D' not defined"
msgstr ""
-#: cp/lex.c:566
+#: cp/lex.c:573
msgid "`%D' was not declared in this scope"
msgstr ""
@@ -15102,13 +15194,13 @@ msgstr ""
#. Note that we have the exact wording of the following message in
#. the manual (trouble.texi, node "Name lookup"), so they need to
#. be kept in synch.
-#: cp/lex.c:600
+#: cp/lex.c:610
msgid ""
"there are no arguments to `%D' that depend on a template parameter, so a "
"declaration of `%D' must be available"
msgstr ""
-#: cp/lex.c:609
+#: cp/lex.c:619
msgid ""
"(if you use `-fpermissive', G++ will accept your code, but allowing the use "
"of an undeclared name is deprecated)"
@@ -15350,7 +15442,7 @@ msgstr ""
#. This happens for A::B where B is a template, and there are no
#. template arguments.
-#: cp/name-lookup.c:3650 cp/typeck.c:1809
+#: cp/name-lookup.c:3650 cp/typeck.c:1813
msgid "invalid use of `%D'"
msgstr ""
@@ -15378,319 +15470,319 @@ msgstr ""
msgid "XXX leaving pop_everything ()\n"
msgstr ""
-#: cp/parser.c:635
+#: cp/parser.c:438
msgid "invalid token"
msgstr ""
-#: cp/parser.c:2037
+#: cp/parser.c:1875
msgid "`%D::%D' has not been declared"
msgstr ""
-#: cp/parser.c:2040 cp/semantics.c:2321
+#: cp/parser.c:1878 cp/semantics.c:2318
msgid "`::%D' has not been declared"
msgstr ""
-#: cp/parser.c:2043
+#: cp/parser.c:1881
msgid "request for member `%D' in non-class type `%T'"
msgstr ""
-#: cp/parser.c:2046
+#: cp/parser.c:1884
msgid "`%T::%D' has not been declared"
msgstr ""
-#: cp/parser.c:2049
+#: cp/parser.c:1887
msgid "`%D' has not been declared"
msgstr ""
-#: cp/parser.c:2052
+#: cp/parser.c:1890
msgid "`%D::%D' %s"
msgstr ""
-#: cp/parser.c:2054
+#: cp/parser.c:1892
msgid "`::%D' %s"
msgstr ""
-#: cp/parser.c:2056
+#: cp/parser.c:1894
msgid "`%D' %s"
msgstr ""
-#: cp/parser.c:2109
+#: cp/parser.c:1947
msgid "new types may not be defined in a return type"
msgstr ""
-#: cp/parser.c:2127 cp/pt.c:4278
+#: cp/parser.c:1965 cp/pt.c:4277
msgid "`%T' is not a template"
msgstr ""
-#: cp/parser.c:2129
+#: cp/parser.c:1967
#, c-format
msgid "`%E' is not a template"
msgstr ""
-#: cp/parser.c:2131
+#: cp/parser.c:1969
msgid "invalid template-id"
msgstr ""
-#: cp/parser.c:2172
+#: cp/parser.c:2010
#, c-format
msgid "%s cannot appear in a constant-expression"
msgstr ""
-#: cp/parser.c:2196
+#: cp/parser.c:2034
#, c-format
msgid "invalid use of template-name `%E' without an argument list"
msgstr ""
#. Issue an error message.
-#: cp/parser.c:2201
+#: cp/parser.c:2039
#, c-format
msgid "`%E' does not name a type"
msgstr ""
-#: cp/parser.c:2232
+#: cp/parser.c:2070
msgid "(perhaps `typename %T::%E' was intended)"
msgstr ""
-#: cp/parser.c:2247
+#: cp/parser.c:2085
#, c-format
msgid "`%E' in namespace `%E' does not name a type"
msgstr ""
-#: cp/parser.c:2250
+#: cp/parser.c:2088
msgid "`%E' in class `%T' does not name a type"
msgstr ""
-#: cp/parser.c:2778
+#: cp/parser.c:2759
msgid "ISO C++ forbids braced-groups within expressions"
msgstr ""
-#: cp/parser.c:2787
+#: cp/parser.c:2768
msgid "statement-expressions are allowed only inside functions"
msgstr ""
-#: cp/parser.c:2838
+#: cp/parser.c:2819
msgid "`this' may not be used in this context"
msgstr ""
-#: cp/parser.c:2973
+#: cp/parser.c:2954
msgid "local variable `%D' may not appear in this context"
msgstr ""
-#: cp/parser.c:3338
+#: cp/parser.c:3319
msgid "typedef-name `%D' used as destructor declarator"
msgstr ""
-#: cp/parser.c:3995
+#: cp/parser.c:3978
msgid "ISO C++ forbids compound-literals"
msgstr ""
-#: cp/parser.c:4862
+#: cp/parser.c:4845
msgid "array bound forbidden after parenthesized type-id"
msgstr ""
-#: cp/parser.c:4863
+#: cp/parser.c:4846
msgid "try removing the parentheses around the type-id"
msgstr ""
-#: cp/parser.c:4969
+#: cp/parser.c:4952
msgid "size in array new must have integral type"
msgstr ""
-#: cp/parser.c:4972
+#: cp/parser.c:4955
msgid "zero size array reserves no space"
msgstr ""
-#: cp/parser.c:5071
+#: cp/parser.c:5054
msgid "expression in new-declarator must have integral or enumeration type"
msgstr ""
-#: cp/parser.c:5252
+#: cp/parser.c:5235
msgid "use of old-style cast"
msgstr ""
-#: cp/parser.c:6083
+#: cp/parser.c:5990
#, c-format
msgid "case label `%E' not within a switch statement"
msgstr ""
-#: cp/parser.c:6625
+#: cp/parser.c:6533
msgid "ISO C++ forbids computed gotos"
msgstr ""
-#: cp/parser.c:6749
-msgid "extra `;'"
+#: cp/parser.c:6658
+msgid "extra %<;%>"
msgstr ""
-#: cp/parser.c:7061
+#: cp/parser.c:6976
msgid "mixing declarations and function-definitions is forbidden"
msgstr ""
-#: cp/parser.c:7188
+#: cp/parser.c:7108
msgid "duplicate `friend'"
msgstr ""
-#: cp/parser.c:7240
+#: cp/parser.c:7160
msgid "`__thread' before `static'"
msgstr ""
-#: cp/parser.c:7250
+#: cp/parser.c:7170
msgid "`__thread' before `extern'"
msgstr ""
-#: cp/parser.c:7357
+#: cp/parser.c:7277
msgid "class definition may not be declared a friend"
msgstr ""
-#: cp/parser.c:7681
+#: cp/parser.c:7590
msgid "only constructors take base initializers"
msgstr ""
-#: cp/parser.c:7732
+#: cp/parser.c:7641
msgid "anachronistic old-style base class initializer"
msgstr ""
-#: cp/parser.c:7773
+#: cp/parser.c:7682
msgid ""
"keyword `typename' not allowed in this context (a qualified member "
"initializer is implicitly a type)"
msgstr ""
#. Warn that we do not support `export'.
-#: cp/parser.c:8135
+#: cp/parser.c:8044
msgid "keyword `export' not implemented, and will be ignored"
msgstr ""
#. Otherwise, emit an error about the invalid digraph, but continue
#. parsing because we got our argument list.
-#: cp/parser.c:8508
+#: cp/parser.c:8417
msgid "`<::' cannot begin a template-argument list"
msgstr ""
-#: cp/parser.c:8509
+#: cp/parser.c:8418
msgid ""
"`<:' is an alternate spelling for `['. Insert whitespace between `<' and `::'"
msgstr ""
-#: cp/parser.c:8516
+#: cp/parser.c:8425
msgid "(if you use `-fpermissive' G++ will accept your code)"
msgstr ""
#. Explain what went wrong.
-#: cp/parser.c:8691
+#: cp/parser.c:8600
msgid "non-template `%D' used as template"
msgstr ""
-#: cp/parser.c:8692
+#: cp/parser.c:8601
msgid "use `%T::template %D' to indicate that it is a template"
msgstr ""
-#: cp/parser.c:9719
+#: cp/parser.c:9628
msgid "using `typename' outside of template"
msgstr ""
-#: cp/parser.c:9842
+#: cp/parser.c:9751
msgid "expected type-name"
msgstr ""
-#: cp/parser.c:9901
+#: cp/parser.c:9810
msgid "type attributes are honored only at type definition"
msgstr ""
#. [namespace.udecl]
#.
#. A using declaration shall not name a template-id.
-#: cp/parser.c:10272
+#: cp/parser.c:10184
msgid "a template-id may not appear in a using-declaration"
msgstr ""
-#: cp/parser.c:10597
+#: cp/parser.c:10509
msgid "an asm-specification is not allowed on a function-definition"
msgstr ""
-#: cp/parser.c:10599
+#: cp/parser.c:10511
msgid "attributes are not allowed on a function-definition"
msgstr ""
-#: cp/parser.c:10730
+#: cp/parser.c:10642
msgid "attributes after parenthesized initializer ignored"
msgstr ""
-#: cp/parser.c:11159
+#: cp/parser.c:11071
msgid "`%T::%D' is not a type"
msgstr ""
-#: cp/parser.c:11204
+#: cp/parser.c:11116
msgid "invalid use of constructor as a template"
msgstr ""
-#: cp/parser.c:11205
+#: cp/parser.c:11117
msgid ""
"use `%T::%D' instead of `%T::%T' to name the constructor in a qualified name"
msgstr ""
-#: cp/parser.c:11392
+#: cp/parser.c:11304
msgid "duplicate cv-qualifier"
msgstr ""
-#: cp/parser.c:11909
+#: cp/parser.c:11818
msgid "file ends in default argument"
msgstr ""
-#: cp/parser.c:11965
+#: cp/parser.c:11878
msgid "deprecated use of default argument for parameter of non-function"
msgstr ""
-#: cp/parser.c:11968
+#: cp/parser.c:11881
msgid "default arguments are only permitted for function parameters"
msgstr ""
-#: cp/parser.c:12710
+#: cp/parser.c:12623
msgid "declaration of `%D' in `%D' which does not enclose `%D'"
msgstr ""
-#: cp/parser.c:12723
+#: cp/parser.c:12636
msgid "extra qualification ignored"
msgstr ""
-#: cp/parser.c:12734
+#: cp/parser.c:12647
msgid "an explicit specialization must be preceded by 'template <>'"
msgstr ""
-#: cp/parser.c:13017
-msgid "extra semicolon"
+#: cp/parser.c:12931
+msgid "%Hextra %<;%>"
msgstr ""
-#: cp/parser.c:13035
+#: cp/parser.c:12949
msgid "a class-key must be used when declaring a friend"
msgstr ""
-#: cp/parser.c:13049
+#: cp/parser.c:12963
msgid "friend declaration does not name a class or function"
msgstr ""
-#: cp/parser.c:13222
+#: cp/parser.c:13136
msgid "pure-specifier on function-definition"
msgstr ""
-#: cp/parser.c:13495
+#: cp/parser.c:13409
msgid "keyword `typename' not allowed outside of templates"
msgstr ""
-#: cp/parser.c:13497
+#: cp/parser.c:13411
msgid ""
"keyword `typename' not allowed in this context (the base class is implicitly "
"a type)"
msgstr ""
-#: cp/parser.c:13770
+#: cp/parser.c:13684
msgid "invalid catch parameter"
msgstr ""
-#: cp/parser.c:14339
+#: cp/parser.c:14246
msgid "reference to `%D' is ambiguous"
msgstr ""
-#: cp/parser.c:14508
+#: cp/parser.c:14415
msgid "too few template-parameter-lists"
msgstr ""
@@ -15698,145 +15790,143 @@ msgstr ""
#. something like:
#.
#. template <class T> template <class U> void S::f();
-#: cp/parser.c:14523
+#: cp/parser.c:14430
msgid "too many template-parameter-lists"
msgstr ""
#. Skip the entire function.
-#: cp/parser.c:14820
+#: cp/parser.c:14654
msgid "invalid function declaration"
msgstr ""
#. Issue an error message.
-#: cp/parser.c:14857
+#: cp/parser.c:14691
msgid "named return values are no longer supported"
msgstr ""
-#: cp/parser.c:15199
-msgid "`>>' should be `> >' within a nested template argument list"
+#: cp/parser.c:15036
+msgid "%H%<>>%> should be %<> >%> within a nested template argument list"
msgstr ""
-#. If this is not a nested template argument list, the '>>' is
-#. a typo for '>'. Emit an error message and continue.
-#: cp/parser.c:15207
-msgid "spurious `>>', use `>' to terminate a template argument list"
+#: cp/parser.c:15051
+msgid "spurious %<>>%>, use %<>%> to terminate a template argument list"
msgstr ""
-#: cp/parser.c:15212
-msgid "missing `>' to terminate the template argument list"
+#: cp/parser.c:15056
+msgid "missing %<>%> to terminate the template argument list"
msgstr ""
-#: cp/parser.c:15740
+#: cp/parser.c:15575
msgid "`%s' tag used in naming `%#T'"
msgstr ""
-#: cp/parser.c:15760
+#: cp/parser.c:15595
msgid "%D redeclared with different access"
msgstr ""
-#: cp/parser.c:15777
+#: cp/parser.c:15612
msgid "`template' (as a disambiguator) is only allowed within templates"
msgstr ""
-#: cp/parser.c:16009
+#: cp/parser.c:15820
msgid "inter-module optimizations not implemented for C++"
msgstr ""
-#: cp/pt.c:247
+#: cp/pt.c:240
msgid "data member `%D' cannot be a member template"
msgstr ""
-#: cp/pt.c:259
+#: cp/pt.c:252
msgid "invalid member template declaration `%D'"
msgstr ""
-#: cp/pt.c:642
+#: cp/pt.c:635
msgid "explicit specialization in non-namespace scope `%D'"
msgstr ""
-#: cp/pt.c:654
+#: cp/pt.c:647
msgid "enclosing class templates are not explicitly specialized"
msgstr ""
-#: cp/pt.c:738
+#: cp/pt.c:731
msgid "specialization of `%D' in different namespace"
msgstr ""
-#: cp/pt.c:739 cp/pt.c:808
+#: cp/pt.c:732 cp/pt.c:801
msgid " from definition of `%#D'"
msgstr ""
-#: cp/pt.c:775
+#: cp/pt.c:768
msgid "specialization of `%T' after instantiation"
msgstr ""
-#: cp/pt.c:807
+#: cp/pt.c:800
msgid "specializing `%#T' in different namespace"
msgstr ""
-#: cp/pt.c:822
+#: cp/pt.c:815
msgid "specialization `%T' after instantiation `%T'"
msgstr ""
-#: cp/pt.c:834
+#: cp/pt.c:827
msgid "explicit specialization of non-template `%T'"
msgstr ""
-#: cp/pt.c:1091
+#: cp/pt.c:1084
msgid "specialization of %D after instantiation"
msgstr ""
-#: cp/pt.c:1221
+#: cp/pt.c:1214
msgid "%s %+#D"
msgstr ""
-#: cp/pt.c:1277
+#: cp/pt.c:1270
msgid "`%D' is not a function template"
msgstr ""
-#: cp/pt.c:1462
+#: cp/pt.c:1455
msgid "template-id `%D' for `%+D' does not match any template declaration"
msgstr ""
-#: cp/pt.c:1470
+#: cp/pt.c:1463
msgid "ambiguous template specialization `%D' for `%+D'"
msgstr ""
#. This case handles bogus declarations like template <>
#. template <class T> void f<int>();
-#: cp/pt.c:1693 cp/pt.c:1748
+#: cp/pt.c:1686 cp/pt.c:1741
msgid "template-id `%D' in declaration of primary template"
msgstr ""
-#: cp/pt.c:1706
+#: cp/pt.c:1699
msgid "template parameter list used in explicit instantiation"
msgstr ""
-#: cp/pt.c:1712
+#: cp/pt.c:1705
msgid "definition provided for explicit instantiation"
msgstr ""
-#: cp/pt.c:1720
+#: cp/pt.c:1713
msgid "too many template parameter lists in declaration of `%D'"
msgstr ""
-#: cp/pt.c:1723
+#: cp/pt.c:1716
msgid "too few template parameter lists in declaration of `%D'"
msgstr ""
-#: cp/pt.c:1726
+#: cp/pt.c:1719
msgid "explicit specialization of `%D' must be introduced by `template <>'"
msgstr ""
-#: cp/pt.c:1745
+#: cp/pt.c:1738
msgid "function template partial specialization `%D' is not allowed"
msgstr ""
-#: cp/pt.c:1777
+#: cp/pt.c:1770
msgid "default argument specified in explicit specialization"
msgstr ""
-#: cp/pt.c:1781
+#: cp/pt.c:1774
msgid "template specialization with C linkage"
msgstr ""
@@ -15848,60 +15938,60 @@ msgstr ""
#. program is ill-formed.
#.
#. Similar language is found in [temp.explicit].
-#: cp/pt.c:1865
+#: cp/pt.c:1858
msgid "specialization of implicitly-declared special member function"
msgstr ""
-#: cp/pt.c:1909
+#: cp/pt.c:1902
msgid "no member function `%D' declared in `%T'"
msgstr ""
#. There are two many template parameter lists.
-#: cp/pt.c:2060
+#: cp/pt.c:2053
msgid "too many template parameter lists in declaration of `%T'"
msgstr ""
-#: cp/pt.c:2154
+#: cp/pt.c:2147
msgid " shadows template parm `%#D'"
msgstr ""
-#: cp/pt.c:2554
+#: cp/pt.c:2547
msgid "template parameters not used in partial specialization:"
msgstr ""
-#: cp/pt.c:2558
+#: cp/pt.c:2551
msgid " `%D'"
msgstr ""
-#: cp/pt.c:2570
+#: cp/pt.c:2563
msgid "partial specialization `%T' does not specialize any template arguments"
msgstr ""
-#: cp/pt.c:2595
+#: cp/pt.c:2588
#, c-format
msgid "template argument `%E' involves template parameter(s)"
msgstr ""
-#: cp/pt.c:2639
+#: cp/pt.c:2632
msgid "type `%T' of template argument `%E' depends on template parameter(s)"
msgstr ""
-#: cp/pt.c:2724
+#: cp/pt.c:2717
msgid "no default argument for `%D'"
msgstr ""
-#: cp/pt.c:2876
+#: cp/pt.c:2869
msgid "template with C linkage"
msgstr ""
-#: cp/pt.c:2879
+#: cp/pt.c:2872
msgid "template class without a name"
msgstr ""
#. [temp.mem]
#.
#. A destructor shall not be a member template.
-#: cp/pt.c:2887
+#: cp/pt.c:2880
msgid "destructor `%D' declared as member template"
msgstr ""
@@ -15910,53 +16000,53 @@ msgstr ""
#. An allocation function can be a function
#. template. ... Template allocation functions shall
#. have two or more parameters.
-#: cp/pt.c:2902
+#: cp/pt.c:2895
msgid "invalid template declaration of `%D'"
msgstr ""
-#: cp/pt.c:2982
+#: cp/pt.c:2975
msgid "`%D' does not declare a template type"
msgstr ""
-#: cp/pt.c:2988
+#: cp/pt.c:2981
msgid "template definition of non-template `%#D'"
msgstr ""
-#: cp/pt.c:3029
+#: cp/pt.c:3022
msgid "expected %d levels of template parms for `%#D', got %d"
msgstr ""
-#: cp/pt.c:3041
+#: cp/pt.c:3034
msgid "got %d template parameters for `%#D'"
msgstr ""
-#: cp/pt.c:3044
+#: cp/pt.c:3037
msgid "got %d template parameters for `%#T'"
msgstr ""
-#: cp/pt.c:3046
+#: cp/pt.c:3039
#, c-format
msgid " but %d required"
msgstr ""
-#: cp/pt.c:3131
+#: cp/pt.c:3124
msgid "`%T' is not a template type"
msgstr ""
-#: cp/pt.c:3147
+#: cp/pt.c:3140
msgid "previous declaration `%D'"
msgstr ""
-#: cp/pt.c:3148
+#: cp/pt.c:3141
#, c-format
msgid "used %d template parameter%s instead of %d"
msgstr ""
-#: cp/pt.c:3168
+#: cp/pt.c:3161
msgid "template parameter `%#D'"
msgstr ""
-#: cp/pt.c:3169
+#: cp/pt.c:3162
msgid "redeclared here as `%#D'"
msgstr ""
@@ -15964,295 +16054,295 @@ msgstr ""
#.
#. A template-parameter may not be given default arguments
#. by two different declarations in the same scope.
-#: cp/pt.c:3179
+#: cp/pt.c:3172
msgid "redefinition of default argument for `%#D'"
msgstr ""
-#: cp/pt.c:3180
+#: cp/pt.c:3173
msgid "%J original definition appeared here"
msgstr ""
-#: cp/pt.c:3326
+#: cp/pt.c:3319
#, c-format
msgid "`%E' is not a valid template argument"
msgstr ""
-#: cp/pt.c:3330
+#: cp/pt.c:3323
msgid "it must be the address of a function with external linkage"
msgstr ""
-#: cp/pt.c:3332
+#: cp/pt.c:3325
msgid "it must be the address of an object with external linkage"
msgstr ""
-#: cp/pt.c:3335
+#: cp/pt.c:3328
msgid "it must be a pointer-to-member of the form `&X::Y'"
msgstr ""
-#: cp/pt.c:3346
+#: cp/pt.c:3339
#, c-format
msgid ""
"string literal %E is not a valid template argument because it is the address "
"of an object with static linkage"
msgstr ""
-#: cp/pt.c:3361
+#: cp/pt.c:3354
#, c-format
msgid "address of non-extern `%E' cannot be used as template argument"
msgstr ""
-#: cp/pt.c:3370
+#: cp/pt.c:3363
#, c-format
msgid "non-constant `%E' cannot be used as template argument"
msgstr ""
-#: cp/pt.c:3378
+#: cp/pt.c:3371
msgid "type '%T' cannot be used as a value for a non-type template-parameter"
msgstr ""
-#: cp/pt.c:3381
+#: cp/pt.c:3374
msgid "invalid use of '%D' as a non-type template-argument"
msgstr ""
-#: cp/pt.c:3383
+#: cp/pt.c:3376
#, c-format
msgid "invalid use of '%E' as a non-type template-argument"
msgstr ""
-#: cp/pt.c:3755
+#: cp/pt.c:3754
#, c-format
msgid "to refer to a type member of a template parameter, use `typename %E'"
msgstr ""
-#: cp/pt.c:3768 cp/pt.c:3786 cp/pt.c:3825
+#: cp/pt.c:3767 cp/pt.c:3785 cp/pt.c:3824
msgid "type/value mismatch at argument %d in template parameter list for `%D'"
msgstr ""
-#: cp/pt.c:3771
+#: cp/pt.c:3770
msgid " expected a constant of type `%T', got `%T'"
msgstr ""
-#: cp/pt.c:3775
+#: cp/pt.c:3774
#, c-format
msgid " expected a class template, got `%E'"
msgstr ""
-#: cp/pt.c:3777
+#: cp/pt.c:3776
#, c-format
msgid " expected a type, got `%E'"
msgstr ""
-#: cp/pt.c:3789
+#: cp/pt.c:3788
msgid " expected a type, got `%T'"
msgstr ""
-#: cp/pt.c:3791
+#: cp/pt.c:3790
msgid " expected a class template, got `%T'"
msgstr ""
-#: cp/pt.c:3827
+#: cp/pt.c:3826
msgid " expected a template of type `%D', got `%D'"
msgstr ""
-#: cp/pt.c:3862
+#: cp/pt.c:3861
msgid "could not convert template argument `%E' to `%T'"
msgstr ""
-#: cp/pt.c:3902
+#: cp/pt.c:3901
#, c-format
msgid "wrong number of template arguments (%d, should be %d)"
msgstr ""
-#: cp/pt.c:3906
+#: cp/pt.c:3905
msgid "provided for `%D'"
msgstr ""
-#: cp/pt.c:3934
+#: cp/pt.c:3933
#, c-format
msgid "template argument %d is invalid"
msgstr ""
-#: cp/pt.c:4155
+#: cp/pt.c:4154
msgid "non-template used as template"
msgstr ""
-#: cp/pt.c:4290
+#: cp/pt.c:4289
msgid "non-template type `%T' used as a template"
msgstr ""
-#: cp/pt.c:4292
+#: cp/pt.c:4291
msgid "for template declaration `%D'"
msgstr ""
-#: cp/pt.c:4941
+#: cp/pt.c:4940
msgid ""
"template instantiation depth exceeds maximum of %d (use -ftemplate-depth-NN "
"to increase the maximum) instantiating `%D'"
msgstr ""
-#: cp/pt.c:5379
+#: cp/pt.c:5378
msgid "ambiguous class template instantiation for `%#T'"
msgstr ""
-#: cp/pt.c:5385
+#: cp/pt.c:5384
msgid "%s %+#T"
msgstr ""
-#: cp/pt.c:6412 cp/pt.c:6532
+#: cp/pt.c:6405 cp/pt.c:6525
msgid "instantiation of `%D' as type `%T'"
msgstr ""
-#: cp/pt.c:6574
+#: cp/pt.c:6567
msgid "invalid parameter type `%T'"
msgstr ""
-#: cp/pt.c:6576
+#: cp/pt.c:6569
msgid "in declaration `%D'"
msgstr ""
-#: cp/pt.c:6650
+#: cp/pt.c:6643
msgid "creating pointer to member function of non-class type `%T'"
msgstr ""
-#: cp/pt.c:6787
+#: cp/pt.c:6780
msgid "creating array with size zero"
msgstr ""
-#: cp/pt.c:6801
+#: cp/pt.c:6794
#, c-format
msgid "creating array with size zero (`%E')"
msgstr ""
-#: cp/pt.c:7017
+#: cp/pt.c:7011
msgid "forming reference to void"
msgstr ""
-#: cp/pt.c:7019
+#: cp/pt.c:7013
msgid "forming %s to reference type `%T'"
msgstr ""
-#: cp/pt.c:7056
+#: cp/pt.c:7050
msgid "creating pointer to member of non-class type `%T'"
msgstr ""
-#: cp/pt.c:7062
+#: cp/pt.c:7056
msgid "creating pointer to member reference type `%T'"
msgstr ""
-#: cp/pt.c:7148
+#: cp/pt.c:7142
msgid "creating array of `%T'"
msgstr ""
-#: cp/pt.c:7154
+#: cp/pt.c:7148
msgid "creating array of `%T', which is an abstract class type"
msgstr ""
-#: cp/pt.c:7198
+#: cp/pt.c:7192
msgid "`%T' is not a class, struct, or union type"
msgstr ""
-#: cp/pt.c:7285
+#: cp/pt.c:7279
#, c-format
msgid "use of `%s' in template"
msgstr ""
-#: cp/pt.c:7398
+#: cp/pt.c:7404
#, c-format
msgid ""
"dependent-name `%E' is parsed as a non-type, but instantiation yields a type"
msgstr ""
-#: cp/pt.c:7400
+#: cp/pt.c:7406
#, c-format
msgid "say `typename %E' if a type is meant"
msgstr ""
-#: cp/pt.c:8537
+#: cp/pt.c:8543
msgid "`%T' is not a class or namespace"
msgstr ""
-#: cp/pt.c:8540
+#: cp/pt.c:8546
msgid "`%D' is not a class or namespace"
msgstr ""
-#: cp/pt.c:8665
+#: cp/pt.c:8671
msgid "`%T' uses anonymous type"
msgstr ""
-#: cp/pt.c:8667
+#: cp/pt.c:8673
msgid "`%T' uses local type `%T'"
msgstr ""
-#: cp/pt.c:8675
+#: cp/pt.c:8681
msgid "`%T' is a variably modified type"
msgstr ""
-#: cp/pt.c:8686
+#: cp/pt.c:8692
#, c-format
msgid "integral expression `%E' is not constant"
msgstr ""
-#: cp/pt.c:8691
+#: cp/pt.c:8697
msgid " trying to instantiate `%D'"
msgstr ""
-#: cp/pt.c:9205
+#: cp/pt.c:9211
msgid "incomplete type unification"
msgstr ""
-#: cp/pt.c:10577 cp/pt.c:10648
+#: cp/pt.c:10529 cp/pt.c:10600
msgid "explicit instantiation of non-template `%#D'"
msgstr ""
-#: cp/pt.c:10593 cp/pt.c:10643
+#: cp/pt.c:10545 cp/pt.c:10595
msgid "no matching template for `%D' found"
msgstr ""
-#: cp/pt.c:10599
+#: cp/pt.c:10551
msgid "explicit instantiation of `%#D'"
msgstr ""
-#: cp/pt.c:10635
+#: cp/pt.c:10587
msgid "duplicate explicit instantiation of `%#D'"
msgstr ""
-#: cp/pt.c:10657
+#: cp/pt.c:10609
msgid "ISO C++ forbids the use of `extern' on explicit instantiations"
msgstr ""
-#: cp/pt.c:10661 cp/pt.c:10752
+#: cp/pt.c:10613 cp/pt.c:10704
msgid "storage class `%D' applied to template instantiation"
msgstr ""
-#: cp/pt.c:10724
+#: cp/pt.c:10676
msgid "explicit instantiation of non-template type `%T'"
msgstr ""
-#: cp/pt.c:10733
+#: cp/pt.c:10685
msgid "explicit instantiation of `%#T' before definition of template"
msgstr ""
-#: cp/pt.c:10741
+#: cp/pt.c:10693
#, c-format
msgid "ISO C++ forbids the use of `%E' on explicit instantiations"
msgstr ""
-#: cp/pt.c:10786
+#: cp/pt.c:10738
msgid "duplicate explicit instantiation of `%#T'"
msgstr ""
-#: cp/pt.c:11149
+#: cp/pt.c:11101
msgid "explicit instantiation of `%D' but no definition available"
msgstr ""
-#: cp/pt.c:11293
+#: cp/pt.c:11245
msgid ""
"template instantiation depth exceeds maximum of %d (use -ftemplate-depth-NN "
"to increase the maximum) instantiating `%+D', possibly from virtual table "
"generation"
msgstr ""
-#: cp/pt.c:11572
+#: cp/pt.c:11524
msgid "`%#T' is not a valid type for a template constant parameter"
msgstr ""
@@ -16270,64 +16360,64 @@ msgstr ""
msgid "can't create repository information file `%s'"
msgstr ""
-#: cp/rtti.c:246
+#: cp/rtti.c:243
msgid "cannot use typeid with -fno-rtti"
msgstr ""
-#: cp/rtti.c:252
+#: cp/rtti.c:249
msgid "must #include <typeinfo> before using typeid"
msgstr ""
-#: cp/rtti.c:324
+#: cp/rtti.c:321
msgid ""
"cannot create type information for type `%T' because its size is variable"
msgstr ""
-#: cp/rtti.c:577 cp/rtti.c:591
+#: cp/rtti.c:573 cp/rtti.c:587
msgid "dynamic_cast of `%#D' to `%#T' can never succeed"
msgstr ""
-#: cp/rtti.c:670
+#: cp/rtti.c:666
msgid "cannot dynamic_cast `%E' (of type `%#T') to type `%#T' (%s)"
msgstr ""
-#: cp/search.c:251
+#: cp/search.c:246
msgid "`%T' is an ambiguous base of `%T'"
msgstr ""
-#: cp/search.c:269
+#: cp/search.c:264
msgid "`%T' is an inaccessible base of `%T'"
msgstr ""
-#: cp/search.c:1734
+#: cp/search.c:1645
msgid "invalid covariant return type for `%#D'"
msgstr ""
-#: cp/search.c:1735 cp/search.c:1741
+#: cp/search.c:1646 cp/search.c:1652
msgid " overriding `%#D'"
msgstr ""
-#: cp/search.c:1739
+#: cp/search.c:1650
msgid "conflicting return type specified for `%#D'"
msgstr ""
-#: cp/search.c:1750
+#: cp/search.c:1661
#, c-format
msgid "looser throw specifier for `%#F'"
msgstr ""
-#: cp/search.c:1751
+#: cp/search.c:1662
#, c-format
msgid " overriding `%#F'"
msgstr ""
#. A static member function cannot match an inherited
#. virtual member function.
-#: cp/search.c:1844
+#: cp/search.c:1755
msgid "`%#D' cannot be declared"
msgstr ""
-#: cp/search.c:1845
+#: cp/search.c:1756
msgid " since `%#D' declared in base class"
msgstr ""
@@ -16348,169 +16438,169 @@ msgstr ""
msgid "object missing in reference to `%D'"
msgstr ""
-#: cp/semantics.c:1789
+#: cp/semantics.c:1786
msgid "arguments to destructor are not allowed"
msgstr ""
-#: cp/semantics.c:1839
+#: cp/semantics.c:1836
msgid "`this' is unavailable for static member functions"
msgstr ""
-#: cp/semantics.c:1845
+#: cp/semantics.c:1842
msgid "invalid use of `this' in non-member function"
msgstr ""
-#: cp/semantics.c:1847
+#: cp/semantics.c:1844
msgid "invalid use of `this' at top level"
msgstr ""
-#: cp/semantics.c:1871
+#: cp/semantics.c:1868
msgid "invalid qualifying scope in pseudo-destructor name"
msgstr ""
-#: cp/semantics.c:1891
+#: cp/semantics.c:1888
msgid "`%E' is not of type `%T'"
msgstr ""
-#: cp/semantics.c:1985
+#: cp/semantics.c:1982
msgid "template type parameters must use the keyword `class' or `typename'"
msgstr ""
-#: cp/semantics.c:2029
+#: cp/semantics.c:2026
msgid ""
"invalid use of type `%T' as a default value for a template template-parameter"
msgstr ""
-#: cp/semantics.c:2032
+#: cp/semantics.c:2029
msgid ""
"invalid use of `%D' as a default value for a template template-parameter"
msgstr ""
-#: cp/semantics.c:2036
+#: cp/semantics.c:2033
msgid "invalid default argument for a template template parameter"
msgstr ""
-#: cp/semantics.c:2053
+#: cp/semantics.c:2050
msgid "definition of `%#T' inside template parameter list"
msgstr ""
-#: cp/semantics.c:2064
+#: cp/semantics.c:2061
msgid "invalid definition of qualified type `%T'"
msgstr ""
-#: cp/semantics.c:2079
+#: cp/semantics.c:2076
msgid "previous definition of `%#T'"
msgstr ""
-#: cp/semantics.c:2255
+#: cp/semantics.c:2252
msgid "invalid base-class specification"
msgstr ""
-#: cp/semantics.c:2264
+#: cp/semantics.c:2261
msgid "base class `%T' has cv qualifiers"
msgstr ""
-#: cp/semantics.c:2297
+#: cp/semantics.c:2294
msgid "multiple declarators in template declaration"
msgstr ""
-#: cp/semantics.c:2309
+#: cp/semantics.c:2306
msgid "incomplete type `%T' used in nested name specifier"
msgstr ""
-#: cp/semantics.c:2312
+#: cp/semantics.c:2309
msgid "reference to `%T::%D' is ambiguous"
msgstr ""
-#: cp/semantics.c:2316 cp/typeck.c:1646
+#: cp/semantics.c:2313 cp/typeck.c:1649
msgid "`%D' is not a member of `%T'"
msgstr ""
-#: cp/semantics.c:2319
+#: cp/semantics.c:2316
msgid "`%D' is not a member of `%D'"
msgstr ""
-#: cp/semantics.c:2444
+#: cp/semantics.c:2441
msgid ""
"template parameter `%D' of type `%T' is not allowed in an integral constant "
"expression because it is not of integral or enumeration type"
msgstr ""
-#: cp/semantics.c:2588
+#: cp/semantics.c:2585
msgid "`%D' cannot appear in a constant-expression"
msgstr ""
-#: cp/semantics.c:2596
+#: cp/semantics.c:2593
msgid "use of namespace `%D' as expression"
msgstr ""
-#: cp/semantics.c:2601
+#: cp/semantics.c:2598
msgid "use of class template `%T' as expression"
msgstr ""
#. Ambiguous reference to base members.
-#: cp/semantics.c:2607
+#: cp/semantics.c:2604
msgid "request for member `%D' is ambiguous in multiple inheritance lattice"
msgstr ""
-#: cp/semantics.c:2667
+#: cp/semantics.c:2665
#, c-format
msgid "use of %s from containing function"
msgstr ""
-#: cp/semantics.c:2670
+#: cp/semantics.c:2668
msgid " `%#D' declared here"
msgstr ""
-#: cp/semantics.c:2721
+#: cp/semantics.c:2719
#, c-format
msgid "type of `%E' is unknown"
msgstr ""
-#: cp/tree.c:222
+#: cp/tree.c:226
#, c-format
msgid "non-lvalue in %s"
msgstr ""
-#: cp/tree.c:535
+#: cp/tree.c:539
msgid "`%V' qualifiers cannot be applied to `%T'"
msgstr ""
-#: cp/tree.c:1763
+#: cp/tree.c:1768
#, c-format
msgid "`%E' attribute can only be applied to Java class definitions"
msgstr ""
-#: cp/tree.c:1792
+#: cp/tree.c:1797
#, c-format
msgid "`%E' attribute can only be applied to class definitions"
msgstr ""
-#: cp/tree.c:1798
+#: cp/tree.c:1803
#, c-format
msgid "`%E' is obsolete; g++ vtables are now COM-compatible by default"
msgstr ""
-#: cp/tree.c:1822
+#: cp/tree.c:1827
msgid "requested init_priority is not an integer constant"
msgstr ""
-#: cp/tree.c:1843
+#: cp/tree.c:1848
#, c-format
msgid ""
"can only use `%E' attribute on file-scope definitions of objects of class "
"type"
msgstr ""
-#: cp/tree.c:1851
+#: cp/tree.c:1856
msgid "requested init_priority is out of range"
msgstr ""
-#: cp/tree.c:1861
+#: cp/tree.c:1866
msgid "requested init_priority is reserved for internal use"
msgstr ""
-#: cp/tree.c:1871
+#: cp/tree.c:1876
#, c-format
msgid "`%E' attribute is not supported on this platform"
msgstr ""
@@ -16552,456 +16642,452 @@ msgstr ""
msgid "deprecated conversion from string constant to `%T'"
msgstr ""
-#: cp/typeck.c:1617 cp/typeck.c:1914
+#: cp/typeck.c:1620 cp/typeck.c:1918
msgid "request for member `%D' in `%E', which is of non-class type `%T'"
msgstr ""
-#: cp/typeck.c:1644
+#: cp/typeck.c:1647
#, c-format
msgid "invalid use of nonstatic data member '%E'"
msgstr ""
-#: cp/typeck.c:1696 cp/typeck.c:1723
+#: cp/typeck.c:1699 cp/typeck.c:1726
msgid "invalid access to non-static data member `%D' of NULL object"
msgstr ""
-#: cp/typeck.c:1698 cp/typeck.c:1725
+#: cp/typeck.c:1701 cp/typeck.c:1728
msgid "(perhaps the `offsetof' macro was used incorrectly)"
msgstr ""
-#: cp/typeck.c:1841
+#: cp/typeck.c:1845
msgid "the type being destroyed is `%T', but the destructor refers to `%T'"
msgstr ""
-#: cp/typeck.c:1960
+#: cp/typeck.c:1964
msgid "`%D::%D' is not a member of `%T'"
msgstr ""
-#: cp/typeck.c:1971
+#: cp/typeck.c:1975
msgid "`%T' is not a base of `%T'"
msgstr ""
-#: cp/typeck.c:1990
+#: cp/typeck.c:1994
msgid "'%D' has no member named '%E'"
msgstr ""
-#: cp/typeck.c:2005
+#: cp/typeck.c:2009
msgid "`%D' is not a member template function"
msgstr ""
#. A pointer to incomplete type (other than cv void) can be
#. dereferenced [expr.unary.op]/1
-#: cp/typeck.c:2112
+#: cp/typeck.c:2116
msgid "`%T' is not a pointer-to-object type"
msgstr ""
-#: cp/typeck.c:2137
+#: cp/typeck.c:2141
#, c-format
msgid "invalid use of `%s' on pointer to member"
msgstr ""
-#: cp/typeck.c:2141
+#: cp/typeck.c:2145
#, c-format
msgid "invalid type argument of `%s'"
msgstr ""
-#: cp/typeck.c:2143
+#: cp/typeck.c:2147
msgid "invalid type argument"
msgstr ""
-#: cp/typeck.c:2207
+#: cp/typeck.c:2211
msgid "array subscript has type `char'"
msgstr ""
-#: cp/typeck.c:2248
+#: cp/typeck.c:2252
msgid "ISO C++ forbids subscripting non-lvalue array"
msgstr ""
-#: cp/typeck.c:2259
+#: cp/typeck.c:2263
msgid "subscripting array declared `register'"
msgstr ""
-#: cp/typeck.c:2342
+#: cp/typeck.c:2346
#, c-format
msgid "object missing in use of `%E'"
msgstr ""
-#: cp/typeck.c:2443
+#: cp/typeck.c:2447
msgid "ISO C++ forbids calling `::main' from within program"
msgstr ""
-#: cp/typeck.c:2468
+#: cp/typeck.c:2472
#, c-format
msgid "must use .* or ->* to call pointer-to-member function in `%E (...)'"
msgstr ""
-#: cp/typeck.c:2481
+#: cp/typeck.c:2485
#, c-format
msgid "`%E' cannot be used as a function"
msgstr ""
-#: cp/typeck.c:2560
+#: cp/typeck.c:2564
msgid "too many arguments to %s `%+#D'"
msgstr ""
-#: cp/typeck.c:2562 cp/typeck.c:2668
+#: cp/typeck.c:2566 cp/typeck.c:2672
msgid "at this point in file"
msgstr ""
-#: cp/typeck.c:2599
+#: cp/typeck.c:2603
msgid "parameter %P of `%D' has incomplete type `%T'"
msgstr ""
-#: cp/typeck.c:2602
+#: cp/typeck.c:2606
msgid "parameter %P has incomplete type `%T'"
msgstr ""
-#: cp/typeck.c:2666
+#: cp/typeck.c:2670
msgid "too few arguments to %s `%+#D'"
msgstr ""
-#: cp/typeck.c:2813 cp/typeck.c:2823
+#: cp/typeck.c:2822 cp/typeck.c:2832
msgid "assuming cast to type `%T' from overloaded function"
msgstr ""
-#: cp/typeck.c:2884
+#: cp/typeck.c:2893
#, c-format
msgid "division by zero in `%E / 0'"
msgstr ""
-#: cp/typeck.c:2886
+#: cp/typeck.c:2895
#, c-format
msgid "division by zero in `%E / 0.'"
msgstr ""
-#: cp/typeck.c:2920
+#: cp/typeck.c:2929
#, c-format
msgid "division by zero in `%E %% 0'"
msgstr ""
-#: cp/typeck.c:2922
+#: cp/typeck.c:2931
#, c-format
msgid "division by zero in `%E %% 0.'"
msgstr ""
-#: cp/typeck.c:3002
+#: cp/typeck.c:3011
#, c-format
msgid "%s rotate count is negative"
msgstr ""
-#: cp/typeck.c:3005
+#: cp/typeck.c:3014
#, c-format
msgid "%s rotate count >= width of type"
msgstr ""
-#: cp/typeck.c:3039 cp/typeck.c:3044 cp/typeck.c:3140 cp/typeck.c:3145
+#: cp/typeck.c:3048 cp/typeck.c:3053 cp/typeck.c:3149 cp/typeck.c:3154
msgid "ISO C++ forbids comparison between pointer and integer"
msgstr ""
-#: cp/typeck.c:3326
-msgid "comparison between types `%#T' and `%#T'"
+#: cp/typeck.c:3190
+msgid "invalid operands of types `%T' and `%T' to binary `%O'"
msgstr ""
-#: cp/typeck.c:3362
-msgid "comparison between signed and unsigned integer expressions"
+#: cp/typeck.c:3352
+msgid "comparison between types `%#T' and `%#T'"
msgstr ""
-#: cp/typeck.c:3427
-msgid "invalid operands of types `%T' and `%T' to binary `%O'"
+#: cp/typeck.c:3388
+msgid "comparison between signed and unsigned integer expressions"
msgstr ""
#. Some sort of arithmetic operation involving NULL was
#. performed. Note that pointer-difference and pointer-addition
#. have already been handled above, and so we don't end up here in
#. that case.
-#: cp/typeck.c:3449
+#: cp/typeck.c:3467
msgid "NULL used in arithmetic"
msgstr ""
-#: cp/typeck.c:3507
+#: cp/typeck.c:3525
msgid "ISO C++ forbids using pointer of type `void *' in subtraction"
msgstr ""
-#: cp/typeck.c:3509
+#: cp/typeck.c:3527
msgid "ISO C++ forbids using pointer to a function in subtraction"
msgstr ""
-#: cp/typeck.c:3511
+#: cp/typeck.c:3529
msgid "ISO C++ forbids using pointer to a method in subtraction"
msgstr ""
-#: cp/typeck.c:3523
+#: cp/typeck.c:3541
msgid "invalid use of a pointer to an incomplete type in pointer arithmetic"
msgstr ""
-#: cp/typeck.c:3599
+#: cp/typeck.c:3617
#, c-format
msgid ""
"invalid use of '%E' to form a pointer-to-member-function. Use a qualified-"
"id."
msgstr ""
-#: cp/typeck.c:3605
+#: cp/typeck.c:3623
#, c-format
msgid ""
"parenthesis around '%E' cannot be used to form a pointer-to-member-function"
msgstr ""
-#: cp/typeck.c:3627
+#: cp/typeck.c:3645
msgid "taking address of temporary"
msgstr ""
-#: cp/typeck.c:3852
+#: cp/typeck.c:3876
#, c-format
msgid "ISO C++ forbids %sing an enum"
msgstr ""
-#: cp/typeck.c:3863
+#: cp/typeck.c:3887
msgid "cannot %s a pointer to incomplete type `%T'"
msgstr ""
-#: cp/typeck.c:3869
+#: cp/typeck.c:3893
msgid "ISO C++ forbids %sing a pointer of type `%T'"
msgstr ""
-#: cp/typeck.c:3894
+#: cp/typeck.c:3918
msgid "cast to non-reference type used as lvalue"
msgstr ""
-#: cp/typeck.c:3929
+#: cp/typeck.c:3953
msgid "invalid use of `--' on bool variable `%D'"
msgstr ""
#. ARM $3.4
-#: cp/typeck.c:3958
+#: cp/typeck.c:3982
msgid "ISO C++ forbids taking address of function `::main'"
msgstr ""
#. An expression like &memfn.
-#: cp/typeck.c:4012
+#: cp/typeck.c:4036
msgid ""
"ISO C++ forbids taking the address of an unqualified or parenthesized non-"
"static member function to form a pointer to member function. Say `&%T::%D'"
msgstr ""
-#: cp/typeck.c:4017
+#: cp/typeck.c:4041
msgid ""
"ISO C++ forbids taking the address of a bound member function to form a "
"pointer to member function. Say `&%T::%D'"
msgstr ""
-#: cp/typeck.c:4045
+#: cp/typeck.c:4069
msgid "ISO C++ forbids taking the address of a cast to a non-lvalue expression"
msgstr ""
-#: cp/typeck.c:4065
-msgid "unary `&'"
-msgstr ""
-
-#: cp/typeck.c:4097
+#: cp/typeck.c:4121
msgid "attempt to take address of bit-field structure member `%D'"
msgstr ""
-#: cp/typeck.c:4209
+#: cp/typeck.c:4233
msgid "taking address of destructor"
msgstr ""
-#: cp/typeck.c:4222
+#: cp/typeck.c:4246
msgid "taking address of bound pointer-to-member expression"
msgstr ""
-#: cp/typeck.c:4230
+#: cp/typeck.c:4254
msgid "cannot create pointer to reference member `%D'"
msgstr ""
-#: cp/typeck.c:4293
+#: cp/typeck.c:4317
msgid "cannot take the address of `this', which is an rvalue expression"
msgstr ""
-#: cp/typeck.c:4312
+#: cp/typeck.c:4336
msgid "address requested for `%D', which is declared `register'"
msgstr ""
-#: cp/typeck.c:4378
+#: cp/typeck.c:4402
#, c-format
msgid "%s expression list treated as compound expression"
msgstr ""
-#: cp/typeck.c:4452
+#: cp/typeck.c:4476
msgid "%s from type `%T' to type `%T' casts away constness"
msgstr ""
-#: cp/typeck.c:4654
+#: cp/typeck.c:4678
msgid "invalid static_cast from type `%T' to type `%T'"
msgstr ""
-#: cp/typeck.c:4694
+#: cp/typeck.c:4718
msgid ""
"invalid reinterpret_cast of an rvalue expression of type `%T' to type `%T'"
msgstr ""
-#: cp/typeck.c:4714
+#: cp/typeck.c:4738
msgid "reinterpret_cast from `%T' to `%T' loses precision"
msgstr ""
-#: cp/typeck.c:4733
+#: cp/typeck.c:4757
msgid ""
"ISO C++ forbids casting between pointer-to-function and pointer-to-object"
msgstr ""
-#: cp/typeck.c:4739
+#: cp/typeck.c:4763
msgid "invalid reinterpret_cast from type `%T' to type `%T'"
msgstr ""
-#: cp/typeck.c:4767
+#: cp/typeck.c:4791
msgid ""
"invalid use of const_cast with type `%T', which is not a pointer, reference, "
"nor a pointer-to-data-member type"
msgstr ""
-#: cp/typeck.c:4770
+#: cp/typeck.c:4794
msgid ""
"invalid use of const_cast with type `%T', which is a pointer or reference to "
"a function type"
msgstr ""
-#: cp/typeck.c:4793
+#: cp/typeck.c:4817
msgid "invalid const_cast of an rvalue of type `%T' to type `%T'"
msgstr ""
-#: cp/typeck.c:4810
+#: cp/typeck.c:4834
msgid "invalid const_cast from type `%T' to type `%T'"
msgstr ""
-#: cp/typeck.c:4857 cp/typeck.c:4862
+#: cp/typeck.c:4881 cp/typeck.c:4886
msgid "ISO C++ forbids casting to an array type `%T'"
msgstr ""
-#: cp/typeck.c:4870
+#: cp/typeck.c:4894
msgid "invalid cast to function type `%T'"
msgstr ""
-#: cp/typeck.c:4926
+#: cp/typeck.c:4950
msgid "cast from `%T' to `%T' discards qualifiers from pointer target type"
msgstr ""
-#: cp/typeck.c:4974
+#: cp/typeck.c:4998
msgid "cast from `%T' to `%T' increases required alignment of target type"
msgstr ""
-#: cp/typeck.c:5140
+#: cp/typeck.c:5183
msgid " in evaluation of `%Q(%#T, %#T)'"
msgstr ""
-#: cp/typeck.c:5209
+#: cp/typeck.c:5252
msgid "incompatible types in assignment of `%T' to `%T'"
msgstr ""
-#: cp/typeck.c:5216
+#: cp/typeck.c:5259
msgid "ISO C++ forbids assignment of arrays"
msgstr ""
-#: cp/typeck.c:5323
+#: cp/typeck.c:5366
msgid " in pointer to member function conversion"
msgstr ""
-#: cp/typeck.c:5329
+#: cp/typeck.c:5372
msgid " in pointer to member conversion"
msgstr ""
#. This is a reinterpret cast, we choose to do nothing.
-#: cp/typeck.c:5339 cp/typeck.c:5355
+#: cp/typeck.c:5382 cp/typeck.c:5398
msgid "pointer to member cast via virtual base `%T'"
msgstr ""
-#: cp/typeck.c:5358
+#: cp/typeck.c:5401
msgid "pointer to member conversion via virtual base `%T'"
msgstr ""
-#: cp/typeck.c:5430
+#: cp/typeck.c:5474
msgid "invalid conversion to type `%T' from type `%T'"
msgstr ""
-#: cp/typeck.c:5587
+#: cp/typeck.c:5636
msgid "passing NULL used for non-pointer %s %P of `%D'"
msgstr ""
-#: cp/typeck.c:5590
+#: cp/typeck.c:5639
msgid "%s to non-pointer type `%T' from NULL"
msgstr ""
-#: cp/typeck.c:5598
+#: cp/typeck.c:5647
msgid "passing `%T' for %s %P of `%D'"
msgstr ""
-#: cp/typeck.c:5601
+#: cp/typeck.c:5650
msgid "%s to `%T' from `%T'"
msgstr ""
-#: cp/typeck.c:5610
+#: cp/typeck.c:5659
msgid "passing negative value `%E' for %s %P of `%D'"
msgstr ""
-#: cp/typeck.c:5613
+#: cp/typeck.c:5662
msgid "%s of negative value `%E' to `%T'"
msgstr ""
-#: cp/typeck.c:5700
+#: cp/typeck.c:5749
msgid "cannot convert `%T' to `%T' for argument `%P' to `%D'"
msgstr ""
-#: cp/typeck.c:5703
+#: cp/typeck.c:5752
msgid "cannot convert `%T' to `%T' in %s"
msgstr ""
-#: cp/typeck.c:5780 cp/typeck.c:5782
+#: cp/typeck.c:5829 cp/typeck.c:5831
msgid "in passing argument %P of `%+D'"
msgstr ""
-#: cp/typeck.c:5832
+#: cp/typeck.c:5881
msgid "returning reference to temporary"
msgstr ""
-#: cp/typeck.c:5839
+#: cp/typeck.c:5888
msgid "reference to non-lvalue returned"
msgstr ""
-#: cp/typeck.c:5851
+#: cp/typeck.c:5900
msgid "reference to local variable `%D' returned"
msgstr ""
-#: cp/typeck.c:5854
+#: cp/typeck.c:5903
msgid "address of local variable `%D' returned"
msgstr ""
-#: cp/typeck.c:5878
+#: cp/typeck.c:5927
msgid "function declared `noreturn' has a `return' statement"
msgstr ""
-#: cp/typeck.c:5884
+#: cp/typeck.c:5933
msgid "returning a value from a destructor"
msgstr ""
#. If a return statement appears in a handler of the
#. function-try-block of a constructor, the program is ill-formed.
-#: cp/typeck.c:5892
+#: cp/typeck.c:5941
msgid "cannot return from a handler of a function-try-block of a constructor"
msgstr ""
#. You can't return a value from a constructor.
-#: cp/typeck.c:5895
+#: cp/typeck.c:5944
msgid "returning a value from a constructor"
msgstr ""
-#: cp/typeck.c:5918
+#: cp/typeck.c:5967
msgid "return-statement with no value, in function returning '%T'"
msgstr ""
-#: cp/typeck.c:5935
+#: cp/typeck.c:5984
msgid "return-statement with a value, in function returning 'void'"
msgstr ""
-#: cp/typeck.c:5957
+#: cp/typeck.c:6006
msgid ""
"`operator new' must not return NULL unless it is declared `throw()' (or -"
"fcheck-new is in effect)"
@@ -17011,37 +17097,37 @@ msgstr ""
msgid "type `%T' is not a base type for type `%T'"
msgstr ""
-#: cp/typeck2.c:293
+#: cp/typeck2.c:292
msgid "cannot declare variable `%+D' to be of abstract type `%T'"
msgstr ""
-#: cp/typeck2.c:296
+#: cp/typeck2.c:295
msgid "cannot declare parameter `%+D' to be of abstract type `%T'"
msgstr ""
-#: cp/typeck2.c:299
+#: cp/typeck2.c:298
msgid "cannot declare field `%+D' to be of abstract type `%T'"
msgstr ""
-#: cp/typeck2.c:303
+#: cp/typeck2.c:302
msgid "invalid abstract return type for member function `%+#D'"
msgstr ""
-#: cp/typeck2.c:306
+#: cp/typeck2.c:305
msgid "invalid abstract return type for function `%+#D'"
msgstr ""
#. Here we do not have location information, so use error instead
#. of cp_error_at.
-#: cp/typeck2.c:311
+#: cp/typeck2.c:310
msgid "invalid abstract type `%T' for `%E'"
msgstr ""
-#: cp/typeck2.c:313
+#: cp/typeck2.c:312
msgid "invalid abstract type for `%+D'"
msgstr ""
-#: cp/typeck2.c:316
+#: cp/typeck2.c:315
msgid "cannot allocate an object of abstract type `%T'"
msgstr ""
@@ -17053,141 +17139,129 @@ msgstr ""
msgid "%J\t%#D"
msgstr ""
-#: cp/typeck2.c:330
+#: cp/typeck2.c:334
msgid "%J since type `%T' has pure virtual functions"
msgstr ""
-#: cp/typeck2.c:576
+#: cp/typeck2.c:580
msgid "constructor syntax used, but no constructor declared for type `%T'"
msgstr ""
-#: cp/typeck2.c:589
+#: cp/typeck2.c:593
msgid "cannot initialize arrays using this syntax"
msgstr ""
-#: cp/typeck2.c:689
+#: cp/typeck2.c:693
msgid "initializing array with parameter list"
msgstr ""
-#: cp/typeck2.c:711
+#: cp/typeck2.c:715
msgid "int-array initialized from non-wide string"
msgstr ""
-#: cp/typeck2.c:744
+#: cp/typeck2.c:748
msgid "initializer for scalar variable requires one element"
msgstr ""
-#: cp/typeck2.c:751
+#: cp/typeck2.c:755
msgid "braces around scalar initializer for `%T'"
msgstr ""
-#: cp/typeck2.c:754
+#: cp/typeck2.c:758
msgid "ignoring extra initializers for `%T'"
msgstr ""
-#: cp/typeck2.c:766
+#: cp/typeck2.c:770
msgid "variable-sized object of type `%T' may not be initialized"
msgstr ""
-#: cp/typeck2.c:777
+#: cp/typeck2.c:781
msgid "subobject of type `%T' must be initialized by constructor, not by `%E'"
msgstr ""
-#: cp/typeck2.c:842
+#: cp/typeck2.c:846
msgid "aggregate has a partly bracketed initializer"
msgstr ""
-#: cp/typeck2.c:880 cp/typeck2.c:982
+#: cp/typeck2.c:884 cp/typeck2.c:973
msgid "non-trivial labeled initializers"
msgstr ""
-#: cp/typeck2.c:894
+#: cp/typeck2.c:898
msgid "non-empty initializer for array of empty elements"
msgstr ""
-#: cp/typeck2.c:948
-msgid "initializer list for object of class with virtual base classes"
-msgstr ""
-
-#: cp/typeck2.c:954
-msgid "initializer list for object of class with base classes"
-msgstr ""
-
-#: cp/typeck2.c:960
-msgid "initializer list for object using virtual functions"
-msgstr ""
-
-#: cp/typeck2.c:1021 cp/typeck2.c:1037
+#: cp/typeck2.c:1012 cp/typeck2.c:1028
msgid "missing initializer for member `%D'"
msgstr ""
-#: cp/typeck2.c:1026
+#: cp/typeck2.c:1017
msgid "uninitialized const member `%D'"
msgstr ""
-#: cp/typeck2.c:1028
+#: cp/typeck2.c:1019
msgid "member `%D' with uninitialized const fields"
msgstr ""
-#: cp/typeck2.c:1031
+#: cp/typeck2.c:1022
msgid "member `%D' is uninitialized reference"
msgstr ""
-#: cp/typeck2.c:1078
+#: cp/typeck2.c:1069
msgid "index value instead of field name in union initializer"
msgstr ""
-#: cp/typeck2.c:1090
+#: cp/typeck2.c:1081
msgid "no field `%D' in union being initialized"
msgstr ""
-#: cp/typeck2.c:1098
+#: cp/typeck2.c:1089
msgid "union `%T' with no named members cannot be initialized"
msgstr ""
-#: cp/typeck2.c:1133
+#: cp/typeck2.c:1124
msgid "excess elements in aggregate initializer"
msgstr ""
-#: cp/typeck2.c:1247
+#: cp/typeck2.c:1238
msgid "circular pointer delegation detected"
msgstr ""
-#: cp/typeck2.c:1260
+#: cp/typeck2.c:1251
msgid "base operand of `->' has non-pointer type `%T'"
msgstr ""
-#: cp/typeck2.c:1284
+#: cp/typeck2.c:1275
msgid "result of `operator->()' yields non-pointer result"
msgstr ""
-#: cp/typeck2.c:1286
+#: cp/typeck2.c:1277
msgid "base operand of `->' is not a pointer"
msgstr ""
-#: cp/typeck2.c:1310
+#: cp/typeck2.c:1301
msgid "`%E' cannot be used as a member pointer, since it is of type `%T'"
msgstr ""
-#: cp/typeck2.c:1318
+#: cp/typeck2.c:1309
msgid ""
"cannot apply member pointer `%E' to `%E', which is of non-aggregate type `%T'"
msgstr ""
-#: cp/typeck2.c:1339
+#: cp/typeck2.c:1330
msgid "pointer to member type `%T' incompatible with object type `%T'"
msgstr ""
-#: cp/typeck2.c:1561
+#: cp/typeck2.c:1552
msgid "call to function `%D' which throws incomplete type `%#T'"
msgstr ""
-#: cp/typeck2.c:1564
+#: cp/typeck2.c:1555
msgid "call to function which throws incomplete type `%#T'"
msgstr ""
#. XXX Not i18n clean.
-#: cp/cp-tree.h:3839
+#: cp/cp-tree.h:3801
#, c-format
msgid "%s is deprecated, please see the documentation for details"
msgstr ""
@@ -17263,32 +17337,32 @@ msgstr ""
msgid "intrinsic variable which isn't a procedure"
msgstr ""
-#: fortran/trans-decl.c:1913
+#: fortran/trans-decl.c:1896
msgid "Function does not return a value"
msgstr ""
#. I don't think this should ever happen.
-#: fortran/trans-decl.c:2012
+#: fortran/trans-decl.c:1995
#, c-format
msgid "module symbol %s in wrong namespace"
msgstr ""
-#: fortran/trans-decl.c:2026
+#: fortran/trans-decl.c:2009
#, c-format
msgid "backend decl for module variable %s already exists"
msgstr ""
-#: fortran/trans-decl.c:2110
+#: fortran/trans-decl.c:2093
#, c-format
msgid "unused parameter `%s'"
msgstr ""
-#: fortran/trans-decl.c:2116
+#: fortran/trans-decl.c:2099
#, c-format
msgid "unused variable `%s'"
msgstr ""
-#: fortran/trans-decl.c:2260
+#: fortran/trans-decl.c:2243
msgid "Function return value not set"
msgstr ""
@@ -17310,7 +17384,7 @@ msgstr ""
msgid "A format cannot be specified with a namelist"
msgstr ""
-#: fortran/trans-io.c:1211
+#: fortran/trans-io.c:1309
#, c-format
msgid "Bad IO basetype (%d)"
msgstr ""
@@ -17337,12 +17411,12 @@ msgstr ""
msgid "gfc_todo: Not Implemented: "
msgstr ""
-#: java/check-init.c:892
+#: java/check-init.c:896
#, c-format
msgid "internal error in check-init: tree code not implemented: %s"
msgstr ""
-#: java/check-init.c:964
+#: java/check-init.c:968
msgid "%Jfinal field `%D' may not have been initialized"
msgstr ""
@@ -17373,41 +17447,41 @@ msgstr ""
msgid "%Jabstract method in non-abstract class"
msgstr ""
-#: java/class.c:2284
+#: java/class.c:2286
msgid "%Jnon-static method '%D' overrides static method"
msgstr ""
-#: java/decl.c:1156
+#: java/decl.c:1158
msgid "%J'%D' used prior to declaration"
msgstr ""
-#: java/decl.c:1197
+#: java/decl.c:1199
#, c-format
msgid "declaration of `%s' shadows a parameter"
msgstr ""
-#: java/decl.c:1200
+#: java/decl.c:1202
#, c-format
msgid "declaration of `%s' shadows a symbol from the parameter list"
msgstr ""
-#: java/decl.c:1528
+#: java/decl.c:1530
msgid "%Jlabel '%D' used but not defined"
msgstr ""
-#: java/decl.c:1533
+#: java/decl.c:1535
msgid "%Jlabel '%D' defined but not used"
msgstr ""
-#: java/decl.c:1655
+#: java/decl.c:1657
msgid "%JIn %D: overlapped variable and exception ranges at %d"
msgstr ""
-#: java/decl.c:1719
+#: java/decl.c:1721
msgid "bad type in parameter debug info"
msgstr ""
-#: java/decl.c:1728
+#: java/decl.c:1730
msgid "%Jbad PC range for debug info for local '%D'"
msgstr ""
@@ -17498,211 +17572,211 @@ msgstr ""
msgid "unrecogized wide sub-instruction"
msgstr ""
-#: java/gjavah.c:675
+#: java/gjavah.c:691
msgid "static field has same name as method"
msgstr ""
#. FIXME: i18n bug here. Order of prints should not be
#. fixed.
-#: java/gjavah.c:833
+#: java/gjavah.c:849
#, c-format
msgid "ignored method `"
msgstr ""
-#: java/gjavah.c:835
+#: java/gjavah.c:851
#, c-format
msgid "' marked virtual\n"
msgstr ""
-#: java/gjavah.c:1183
+#: java/gjavah.c:1199
#, c-format
msgid "couldn't find class %s"
msgstr ""
-#: java/gjavah.c:1190
+#: java/gjavah.c:1206
#, c-format
msgid "parse error while reading %s"
msgstr ""
-#: java/gjavah.c:1416 java/gjavah.c:1518 java/gjavah.c:1593
+#: java/gjavah.c:1432 java/gjavah.c:1534 java/gjavah.c:1609
#, c-format
msgid "unparseable signature: `%s'"
msgstr ""
-#: java/gjavah.c:1983
+#: java/gjavah.c:1999
msgid "Not a valid Java .class file."
msgstr ""
-#: java/gjavah.c:1991 java/jcf-parse.c:625
+#: java/gjavah.c:2007 java/jcf-parse.c:626
msgid "error while parsing constant pool"
msgstr ""
-#: java/gjavah.c:1997
+#: java/gjavah.c:2013
#, c-format
msgid "error in constant pool entry #%d"
msgstr ""
-#: java/gjavah.c:2140
+#: java/gjavah.c:2156
msgid "class is of array type\n"
msgstr ""
-#: java/gjavah.c:2148
+#: java/gjavah.c:2164
msgid "base class is of array type"
msgstr ""
-#: java/gjavah.c:2264
+#: java/gjavah.c:2280
#, c-format
msgid "Try `gcjh --help' for more information.\n"
msgstr ""
-#: java/gjavah.c:2271
+#: java/gjavah.c:2287
#, c-format
msgid ""
"Usage: gcjh [OPTION]... CLASS...\n"
"\n"
msgstr ""
-#: java/gjavah.c:2272
+#: java/gjavah.c:2288
#, c-format
msgid ""
"Generate C++ header files from .class files\n"
"\n"
msgstr ""
-#: java/gjavah.c:2273
+#: java/gjavah.c:2289
#, c-format
msgid " -stubs Generate an implementation stub file\n"
msgstr ""
-#: java/gjavah.c:2274
+#: java/gjavah.c:2290
#, c-format
msgid " -jni Generate a JNI header or stub\n"
msgstr ""
-#: java/gjavah.c:2276
+#: java/gjavah.c:2292
#, c-format
msgid " -add TEXT Insert TEXT into class body\n"
msgstr ""
-#: java/gjavah.c:2277
+#: java/gjavah.c:2293
#, c-format
msgid " -append TEXT Insert TEXT after class declaration\n"
msgstr ""
-#: java/gjavah.c:2278
+#: java/gjavah.c:2294
#, c-format
msgid " -friend TEXT Insert TEXT as `friend' declaration\n"
msgstr ""
-#: java/gjavah.c:2279
+#: java/gjavah.c:2295
#, c-format
msgid " -prepend TEXT Insert TEXT before start of class\n"
msgstr ""
-#: java/gjavah.c:2281 java/jcf-dump.c:897
+#: java/gjavah.c:2297 java/jcf-dump.c:897
#, c-format
msgid " --classpath PATH Set path to find .class files\n"
msgstr ""
-#: java/gjavah.c:2282 java/jcf-dump.c:898
+#: java/gjavah.c:2298 java/jcf-dump.c:898
#, c-format
msgid " -IDIR Append directory to class path\n"
msgstr ""
-#: java/gjavah.c:2283 java/jcf-dump.c:899
+#: java/gjavah.c:2299 java/jcf-dump.c:899
#, c-format
msgid " --bootclasspath PATH Override built-in class path\n"
msgstr ""
-#: java/gjavah.c:2284 java/jcf-dump.c:900
+#: java/gjavah.c:2300 java/jcf-dump.c:900
#, c-format
msgid " --extdirs PATH Set extensions directory path\n"
msgstr ""
-#: java/gjavah.c:2285
+#: java/gjavah.c:2301
#, c-format
msgid " -d DIRECTORY Set output directory name\n"
msgstr ""
-#: java/gjavah.c:2286 java/jcf-dump.c:901 java/jv-scan.c:112
+#: java/gjavah.c:2302 java/jcf-dump.c:901 java/jv-scan.c:112
#, c-format
msgid " -o FILE Set output file name\n"
msgstr ""
-#: java/gjavah.c:2287
+#: java/gjavah.c:2303
#, c-format
msgid " -td DIRECTORY Set temporary directory name\n"
msgstr ""
-#: java/gjavah.c:2289 java/jcf-dump.c:903 java/jv-scan.c:114
+#: java/gjavah.c:2305 java/jcf-dump.c:903 java/jv-scan.c:114
#, c-format
msgid " --help Print this help, then exit\n"
msgstr ""
-#: java/gjavah.c:2290 java/jcf-dump.c:904 java/jv-scan.c:115
+#: java/gjavah.c:2306 java/jcf-dump.c:904 java/jv-scan.c:115
#, c-format
msgid " --version Print version number, then exit\n"
msgstr ""
-#: java/gjavah.c:2291 java/jcf-dump.c:905
+#: java/gjavah.c:2307 java/jcf-dump.c:905
#, c-format
msgid " -v, --verbose Print extra information while running\n"
msgstr ""
-#: java/gjavah.c:2293
+#: java/gjavah.c:2309
#, c-format
msgid ""
" -M Print all dependencies to stdout;\n"
" suppress ordinary output\n"
msgstr ""
-#: java/gjavah.c:2295
+#: java/gjavah.c:2311
#, c-format
msgid ""
" -MM Print non-system dependencies to stdout;\n"
" suppress ordinary output\n"
msgstr ""
-#: java/gjavah.c:2297
+#: java/gjavah.c:2313
#, c-format
msgid " -MD Print all dependencies to stdout\n"
msgstr ""
-#: java/gjavah.c:2298
+#: java/gjavah.c:2314
#, c-format
msgid " -MMD Print non-system dependencies to stdout\n"
msgstr ""
-#: java/gjavah.c:2301 java/jcf-dump.c:907 java/jv-scan.c:117
+#: java/gjavah.c:2317 java/jcf-dump.c:907 java/jv-scan.c:117
#, c-format
msgid ""
"For bug reporting instructions, please see:\n"
"%s.\n"
msgstr ""
-#: java/gjavah.c:2329 java/gjavah.c:2443
+#: java/gjavah.c:2345 java/gjavah.c:2459
msgid "no classes specified"
msgstr ""
-#: java/gjavah.c:2422
+#: java/gjavah.c:2438
msgid "`-MG' option is unimplemented"
msgstr ""
-#: java/gjavah.c:2451
+#: java/gjavah.c:2467
msgid "can't specify both -o and -MD"
msgstr ""
-#: java/gjavah.c:2462
+#: java/gjavah.c:2478
#, c-format
msgid "Processing %s\n"
msgstr ""
-#: java/gjavah.c:2468
+#: java/gjavah.c:2484
#, c-format
msgid "%s: no such class"
msgstr ""
-#: java/gjavah.c:2472
+#: java/gjavah.c:2488
#, c-format
msgid "Found in %s\n"
msgstr ""
@@ -17717,7 +17791,7 @@ msgstr ""
msgid "error while parsing constant pool\n"
msgstr ""
-#: java/jcf-dump.c:826 java/jcf-parse.c:628
+#: java/jcf-dump.c:826 java/jcf-parse.c:629
#, c-format
msgid "error in constant pool entry #%d\n"
msgstr ""
@@ -17812,34 +17886,34 @@ msgstr ""
msgid "can't close %s: %m"
msgstr ""
-#: java/jcf-parse.c:611
+#: java/jcf-parse.c:612
#, c-format
msgid "cannot find file for class %s"
msgstr ""
-#: java/jcf-parse.c:622
+#: java/jcf-parse.c:623
msgid "not a valid Java .class file"
msgstr ""
#. FIXME - where was first time
-#: java/jcf-parse.c:640
+#: java/jcf-parse.c:641
#, c-format
msgid "reading class %s for the second time from %s"
msgstr ""
-#: java/jcf-parse.c:658
+#: java/jcf-parse.c:659
msgid "error while parsing fields"
msgstr ""
-#: java/jcf-parse.c:661
+#: java/jcf-parse.c:662
msgid "error while parsing methods"
msgstr ""
-#: java/jcf-parse.c:664
+#: java/jcf-parse.c:665
msgid "error while parsing final attributes"
msgstr ""
-#: java/jcf-parse.c:678
+#: java/jcf-parse.c:679
#, c-format
msgid ""
"the `java.lang.Object' that was found in `%s' didn't have the special zero-"
@@ -17848,54 +17922,54 @@ msgid ""
"info page describing how to set the classpath"
msgstr ""
-#: java/jcf-parse.c:756
+#: java/jcf-parse.c:757
msgid "missing Code attribute"
msgstr ""
-#: java/jcf-parse.c:1015
+#: java/jcf-parse.c:1016
msgid "%Hsource file seen twice on command line and will be compiled only once"
msgstr ""
-#: java/jcf-parse.c:1030
+#: java/jcf-parse.c:1031
msgid "no input file specified"
msgstr ""
-#: java/jcf-parse.c:1061
+#: java/jcf-parse.c:1062
#, c-format
msgid "can't close input file %s: %m"
msgstr ""
-#: java/jcf-parse.c:1099
+#: java/jcf-parse.c:1100
#, c-format
msgid "bad zip/jar file %s"
msgstr ""
-#: java/jcf-parse.c:1275
+#: java/jcf-parse.c:1276
#, c-format
msgid "error while reading %s from zip file"
msgstr ""
-#: java/jcf-write.c:2655
+#: java/jcf-write.c:2658
#, c-format
msgid ""
"internal error in generate_bytecode_insn - tree code not implemented: %s"
msgstr ""
-#: java/jcf-write.c:3027
+#: java/jcf-write.c:3030
msgid "field initializer type mismatch"
msgstr ""
-#: java/jcf-write.c:3484
+#: java/jcf-write.c:3487
#, c-format
msgid "can't create directory %s: %m"
msgstr ""
-#: java/jcf-write.c:3517
+#: java/jcf-write.c:3520
#, c-format
msgid "can't open %s for writing: %m"
msgstr ""
-#: java/jcf-write.c:3537
+#: java/jcf-write.c:3540
#, c-format
msgid "can't create %s: %m"
msgstr ""
@@ -18022,11 +18096,11 @@ msgstr ""
msgid "cannot specify `main' class when not linking"
msgstr ""
-#: java/lang.c:621
+#: java/lang.c:619
msgid "can't do dependency tracking with input from stdin"
msgstr ""
-#: java/lang.c:637
+#: java/lang.c:635
msgid "couldn't determine target name for dependency tracking"
msgstr ""
@@ -18056,23 +18130,23 @@ msgstr ""
#: ../../gcc-cvs/gcc/java/parse.y:1808 ../../gcc-cvs/gcc/java/parse.y:1820
#: ../../gcc-cvs/gcc/java/parse.y:1835 ../../gcc-cvs/gcc/java/parse.y:1852
#: ../../gcc-cvs/gcc/java/parse.y:1854 ../../gcc-cvs/gcc/java/parse.y:1935
-#: ../../gcc-cvs/gcc/java/parse.y:2107 ../../gcc-cvs/gcc/java/parse.y:2176
-#: ../../gcc-cvs/gcc/java/parse.y:2340 ../../gcc-cvs/gcc/java/parse.y:2352
-#: ../../gcc-cvs/gcc/java/parse.y:2359 ../../gcc-cvs/gcc/java/parse.y:2366
-#: ../../gcc-cvs/gcc/java/parse.y:2377 ../../gcc-cvs/gcc/java/parse.y:2379
-#: ../../gcc-cvs/gcc/java/parse.y:2417 ../../gcc-cvs/gcc/java/parse.y:2419
-#: ../../gcc-cvs/gcc/java/parse.y:2421 ../../gcc-cvs/gcc/java/parse.y:2442
-#: ../../gcc-cvs/gcc/java/parse.y:2444 ../../gcc-cvs/gcc/java/parse.y:2446
-#: ../../gcc-cvs/gcc/java/parse.y:2462 ../../gcc-cvs/gcc/java/parse.y:2464
-#: ../../gcc-cvs/gcc/java/parse.y:2485 ../../gcc-cvs/gcc/java/parse.y:2487
-#: ../../gcc-cvs/gcc/java/parse.y:2489 ../../gcc-cvs/gcc/java/parse.y:2517
-#: ../../gcc-cvs/gcc/java/parse.y:2519 ../../gcc-cvs/gcc/java/parse.y:2521
-#: ../../gcc-cvs/gcc/java/parse.y:2523 ../../gcc-cvs/gcc/java/parse.y:2541
-#: ../../gcc-cvs/gcc/java/parse.y:2543 ../../gcc-cvs/gcc/java/parse.y:2554
-#: ../../gcc-cvs/gcc/java/parse.y:2565 ../../gcc-cvs/gcc/java/parse.y:2576
-#: ../../gcc-cvs/gcc/java/parse.y:2587 ../../gcc-cvs/gcc/java/parse.y:2598
-#: ../../gcc-cvs/gcc/java/parse.y:2611 ../../gcc-cvs/gcc/java/parse.y:2615
-#: ../../gcc-cvs/gcc/java/parse.y:2617 ../../gcc-cvs/gcc/java/parse.y:2630
+#: ../../gcc-cvs/gcc/java/parse.y:2112 ../../gcc-cvs/gcc/java/parse.y:2181
+#: ../../gcc-cvs/gcc/java/parse.y:2345 ../../gcc-cvs/gcc/java/parse.y:2358
+#: ../../gcc-cvs/gcc/java/parse.y:2365 ../../gcc-cvs/gcc/java/parse.y:2372
+#: ../../gcc-cvs/gcc/java/parse.y:2383 ../../gcc-cvs/gcc/java/parse.y:2385
+#: ../../gcc-cvs/gcc/java/parse.y:2423 ../../gcc-cvs/gcc/java/parse.y:2425
+#: ../../gcc-cvs/gcc/java/parse.y:2427 ../../gcc-cvs/gcc/java/parse.y:2448
+#: ../../gcc-cvs/gcc/java/parse.y:2450 ../../gcc-cvs/gcc/java/parse.y:2452
+#: ../../gcc-cvs/gcc/java/parse.y:2468 ../../gcc-cvs/gcc/java/parse.y:2470
+#: ../../gcc-cvs/gcc/java/parse.y:2491 ../../gcc-cvs/gcc/java/parse.y:2493
+#: ../../gcc-cvs/gcc/java/parse.y:2495 ../../gcc-cvs/gcc/java/parse.y:2523
+#: ../../gcc-cvs/gcc/java/parse.y:2525 ../../gcc-cvs/gcc/java/parse.y:2527
+#: ../../gcc-cvs/gcc/java/parse.y:2529 ../../gcc-cvs/gcc/java/parse.y:2547
+#: ../../gcc-cvs/gcc/java/parse.y:2549 ../../gcc-cvs/gcc/java/parse.y:2560
+#: ../../gcc-cvs/gcc/java/parse.y:2571 ../../gcc-cvs/gcc/java/parse.y:2582
+#: ../../gcc-cvs/gcc/java/parse.y:2593 ../../gcc-cvs/gcc/java/parse.y:2604
+#: ../../gcc-cvs/gcc/java/parse.y:2617 ../../gcc-cvs/gcc/java/parse.y:2621
+#: ../../gcc-cvs/gcc/java/parse.y:2623 ../../gcc-cvs/gcc/java/parse.y:2636
msgid "Missing term"
msgstr ""
@@ -18127,10 +18201,10 @@ msgid "Invalid declaration"
msgstr ""
#: ../../gcc-cvs/gcc/java/parse.y:983 ../../gcc-cvs/gcc/java/parse.y:1068
-#: ../../gcc-cvs/gcc/java/parse.y:2122 ../../gcc-cvs/gcc/java/parse.y:2151
-#: ../../gcc-cvs/gcc/java/parse.y:2173 ../../gcc-cvs/gcc/java/parse.y:2177
-#: ../../gcc-cvs/gcc/java/parse.y:2212 ../../gcc-cvs/gcc/java/parse.y:2291
-#: ../../gcc-cvs/gcc/java/parse.y:2301 ../../gcc-cvs/gcc/java/parse.y:2311
+#: ../../gcc-cvs/gcc/java/parse.y:2127 ../../gcc-cvs/gcc/java/parse.y:2156
+#: ../../gcc-cvs/gcc/java/parse.y:2178 ../../gcc-cvs/gcc/java/parse.y:2182
+#: ../../gcc-cvs/gcc/java/parse.y:2217 ../../gcc-cvs/gcc/java/parse.y:2296
+#: ../../gcc-cvs/gcc/java/parse.y:2306 ../../gcc-cvs/gcc/java/parse.y:2316
msgid "']' expected"
msgstr ""
@@ -18143,7 +18217,7 @@ msgid "Invalid method declaration, method name required"
msgstr ""
#: ../../gcc-cvs/gcc/java/parse.y:1028 ../../gcc-cvs/gcc/java/parse.y:1033
-#: ../../gcc-cvs/gcc/java/parse.y:1038 ../../gcc-cvs/gcc/java/parse.y:2027
+#: ../../gcc-cvs/gcc/java/parse.y:1038 ../../gcc-cvs/gcc/java/parse.y:2030
msgid "Identifier expected"
msgstr ""
@@ -18189,8 +18263,8 @@ msgstr ""
#: ../../gcc-cvs/gcc/java/parse.y:1593 ../../gcc-cvs/gcc/java/parse.y:1661
#: ../../gcc-cvs/gcc/java/parse.y:1729 ../../gcc-cvs/gcc/java/parse.y:1850
#: ../../gcc-cvs/gcc/java/parse.y:1928 ../../gcc-cvs/gcc/java/parse.y:2019
-#: ../../gcc-cvs/gcc/java/parse.y:2021 ../../gcc-cvs/gcc/java/parse.y:2029
-#: ../../gcc-cvs/gcc/java/parse.y:2272 ../../gcc-cvs/gcc/java/parse.y:2274
+#: ../../gcc-cvs/gcc/java/parse.y:2021 ../../gcc-cvs/gcc/java/parse.y:2034
+#: ../../gcc-cvs/gcc/java/parse.y:2277 ../../gcc-cvs/gcc/java/parse.y:2279
msgid "'(' expected"
msgstr ""
@@ -18234,79 +18308,79 @@ msgstr ""
msgid "')' or term expected"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:2120 ../../gcc-cvs/gcc/java/parse.y:2149
+#: ../../gcc-cvs/gcc/java/parse.y:2125 ../../gcc-cvs/gcc/java/parse.y:2154
msgid "'[' expected"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:2227
+#: ../../gcc-cvs/gcc/java/parse.y:2232
msgid "Field expected"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:2286 ../../gcc-cvs/gcc/java/parse.y:2296
-#: ../../gcc-cvs/gcc/java/parse.y:2306
+#: ../../gcc-cvs/gcc/java/parse.y:2291 ../../gcc-cvs/gcc/java/parse.y:2301
+#: ../../gcc-cvs/gcc/java/parse.y:2311
msgid "Missing term and ']' expected"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:2410
+#: ../../gcc-cvs/gcc/java/parse.y:2416
msgid "']' expected, invalid type expression"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:2413
+#: ../../gcc-cvs/gcc/java/parse.y:2419
msgid "Invalid type expression"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:2525
+#: ../../gcc-cvs/gcc/java/parse.y:2531
msgid "Invalid reference type"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:2993
+#: ../../gcc-cvs/gcc/java/parse.y:2999
msgid "Constructor invocation must be first thing in a constructor"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:2995
+#: ../../gcc-cvs/gcc/java/parse.y:3001
msgid "Only constructors can invoke constructors"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:3003
+#: ../../gcc-cvs/gcc/java/parse.y:3009
#, c-format
msgid ": `%s' JDK1.1(TM) feature"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:3062 ../../gcc-cvs/gcc/java/parse.y:3064
+#: ../../gcc-cvs/gcc/java/parse.y:3068 ../../gcc-cvs/gcc/java/parse.y:3070
#, c-format
msgid ""
"%s.\n"
"%s"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:6921
+#: ../../gcc-cvs/gcc/java/parse.y:6928
#, c-format
msgid "malformed .zip archive in CLASSPATH: %s"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:6992
+#: ../../gcc-cvs/gcc/java/parse.y:6999
#, c-format
msgid ""
"Can't find default package `%s'. Check the CLASSPATH environment variable "
"and the access to the archives"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:12090
+#: ../../gcc-cvs/gcc/java/parse.y:12113
#, c-format
msgid "missing static field `%s'"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:12095
+#: ../../gcc-cvs/gcc/java/parse.y:12118
#, c-format
msgid "not a static field `%s'"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:12138
+#: ../../gcc-cvs/gcc/java/parse.y:12161
#, c-format
msgid "No case for %s"
msgstr ""
-#: ../../gcc-cvs/gcc/java/parse.y:13075
+#: ../../gcc-cvs/gcc/java/parse.y:13098
#, c-format
msgid "unregistered operator %s"
msgstr ""
@@ -18329,171 +18403,170 @@ msgstr ""
msgid "verification error at PC=%d"
msgstr ""
-#: objc/objc-act.c:751
+#: objc/objc-act.c:753
msgid "`@end' must appear in an @implementation context"
msgstr ""
-#: objc/objc-act.c:778
+#: objc/objc-act.c:780
msgid "method declaration not in @interface context"
msgstr ""
-#: objc/objc-act.c:789
+#: objc/objc-act.c:791
msgid "method definition not in @implementation context"
msgstr ""
-#: objc/objc-act.c:894
+#: objc/objc-act.c:896
#, c-format
msgid "object does not conform to the `%s' protocol"
msgstr ""
-#: objc/objc-act.c:980 objc/objc-act.c:1053
+#: objc/objc-act.c:982 objc/objc-act.c:1055
#, c-format
msgid "class `%s' does not implement the `%s' protocol"
msgstr ""
-#: objc/objc-act.c:1159
+#: objc/objc-act.c:1161
#, c-format
msgid "statically allocated instance of Objective-C class `%s'"
msgstr ""
-#: objc/objc-act.c:1216
+#: objc/objc-act.c:1218
#, c-format
msgid "protocol `%s' has circular dependency"
msgstr ""
-#: objc/objc-act.c:1238 objc/objc-act.c:5792
+#: objc/objc-act.c:1240 objc/objc-act.c:5793
#, c-format
msgid "cannot find protocol declaration for `%s'"
msgstr ""
-#: objc/objc-act.c:1634 objc/objc-act.c:2767 objc/objc-act.c:6317
-#: objc/objc-act.c:6643 objc/objc-act.c:6696 objc/objc-act.c:6721
+#: objc/objc-act.c:1636 objc/objc-act.c:2764 objc/objc-act.c:6318
+#: objc/objc-act.c:6644 objc/objc-act.c:6697 objc/objc-act.c:6722
#, c-format
msgid "cannot find interface declaration for `%s'"
msgstr ""
-#: objc/objc-act.c:1638
+#: objc/objc-act.c:1640
#, c-format
msgid "interface `%s' does not have valid constant string layout"
msgstr ""
-#: objc/objc-act.c:1643
+#: objc/objc-act.c:1645
#, c-format
msgid "cannot find reference tag for class `%s'"
msgstr ""
-#: objc/objc-act.c:2313
-#, c-format
-msgid "creating selector for non existant method %s"
+#: objc/objc-act.c:2312
+msgid "%Jcreating selector for nonexistent method %qE"
msgstr ""
-#: objc/objc-act.c:2503
+#: objc/objc-act.c:2500
#, c-format
msgid "`%s' is not an Objective-C class name or alias"
msgstr ""
-#: objc/objc-act.c:2618 objc/objc-act.c:2636 objc/objc-act.c:6580
-#: objc/objc-act.c:6894 objc/objc-act.c:6924
+#: objc/objc-act.c:2615 objc/objc-act.c:2633 objc/objc-act.c:6581
+#: objc/objc-act.c:6895 objc/objc-act.c:6925
msgid "Objective-C declarations may only appear in global scope"
msgstr ""
-#: objc/objc-act.c:2623
+#: objc/objc-act.c:2620
#, c-format
msgid "cannot find class `%s'"
msgstr ""
-#: objc/objc-act.c:2625
+#: objc/objc-act.c:2622
#, c-format
msgid "class `%s' already exists"
msgstr ""
-#: objc/objc-act.c:2650 objc/objc-act.c:6612
+#: objc/objc-act.c:2647 objc/objc-act.c:6613
#, c-format
msgid "`%s' redeclared as different kind of symbol"
msgstr ""
-#: objc/objc-act.c:2652 objc/objc-act.c:6614
+#: objc/objc-act.c:2649 objc/objc-act.c:6615
msgid "%Jprevious declaration of '%D'"
msgstr ""
-#: objc/objc-act.c:2877
+#: objc/objc-act.c:2874
msgid "use %<-fobjc-exceptions%> to enable Objective-C exception syntax"
msgstr ""
-#: objc/objc-act.c:3206
+#: objc/objc-act.c:3203
msgid "@catch parameter is not a known Objective-C class type"
msgstr ""
-#: objc/objc-act.c:3222
+#: objc/objc-act.c:3219
msgid "exception of type %<%T%> will be caught"
msgstr ""
-#: objc/objc-act.c:3224
+#: objc/objc-act.c:3221
msgid "%H by earlier handler for %<%T%>"
msgstr ""
-#: objc/objc-act.c:3277
+#: objc/objc-act.c:3274
msgid "`@try' without `@catch' or `@finally'"
msgstr ""
-#: objc/objc-act.c:3324
+#: objc/objc-act.c:3321
msgid "%<@throw%> (rethrow) used outside of a @catch block"
msgstr ""
-#: objc/objc-act.c:3700
+#: objc/objc-act.c:3697
msgid "%Jtype '%D' does not have a known size"
msgstr ""
-#: objc/objc-act.c:4218
+#: objc/objc-act.c:4215
msgid "%J%s `%s'"
msgstr ""
-#: objc/objc-act.c:4241 objc/objc-act.c:4260
+#: objc/objc-act.c:4238 objc/objc-act.c:4257
msgid "inconsistent instance variable specification"
msgstr ""
-#: objc/objc-act.c:5120
+#: objc/objc-act.c:5121
msgid "can not use an object as parameter to a method"
msgstr ""
-#: objc/objc-act.c:5322
+#: objc/objc-act.c:5323
#, c-format
msgid "multiple %s named `%c%s' found"
msgstr ""
-#: objc/objc-act.c:5547
+#: objc/objc-act.c:5548
#, c-format
msgid "no super class declared in @interface for `%s'"
msgstr ""
-#: objc/objc-act.c:5637
+#: objc/objc-act.c:5638
#, c-format
msgid "invalid receiver type `%s'"
msgstr ""
-#: objc/objc-act.c:5648
+#: objc/objc-act.c:5649
#, c-format
msgid "`%s' may not respond to `%c%s'"
msgstr ""
-#: objc/objc-act.c:5653
+#: objc/objc-act.c:5654
#, c-format
msgid "`%c%s' not implemented by protocol(s)"
msgstr ""
-#: objc/objc-act.c:5658
+#: objc/objc-act.c:5659
msgid "(Messages without a matching method signature"
msgstr ""
-#: objc/objc-act.c:5659
+#: objc/objc-act.c:5660
msgid "will be assumed to return `id' and accept"
msgstr ""
-#: objc/objc-act.c:5660
+#: objc/objc-act.c:5661
msgid "`...' as arguments.)"
msgstr ""
-#: objc/objc-act.c:5891
+#: objc/objc-act.c:5892
#, c-format
msgid "undeclared selector `%s'"
msgstr ""
@@ -18507,1913 +18580,1913 @@ msgstr ""
#. to an instance variable. It's better to catch the cases
#. where this is done unknowingly than to support the above
#. paradigm.
-#: objc/objc-act.c:5933
+#: objc/objc-act.c:5934
#, c-format
msgid "instance variable `%s' accessed in class method"
msgstr ""
-#: objc/objc-act.c:6145
+#: objc/objc-act.c:6146
#, c-format
msgid "duplicate declaration of method `%c%s'"
msgstr ""
-#: objc/objc-act.c:6187
+#: objc/objc-act.c:6188
#, c-format
msgid "duplicate interface declaration for category `%s(%s)'"
msgstr ""
-#: objc/objc-act.c:6214
+#: objc/objc-act.c:6215
#, c-format
msgid "illegal reference type specified for instance variable `%s'"
msgstr ""
-#: objc/objc-act.c:6225
+#: objc/objc-act.c:6226
#, c-format
msgid "instance variable `%s' has unknown size"
msgstr ""
#. vtable pointers are Real Bad(tm), since Obj-C cannot initialize them
-#: objc/objc-act.c:6239
+#: objc/objc-act.c:6240
#, c-format
msgid "type `%s' has virtual member functions"
msgstr ""
-#: objc/objc-act.c:6240
+#: objc/objc-act.c:6241
#, c-format
msgid "illegal aggregate type `%s' specified for instance variable `%s'"
msgstr ""
-#: objc/objc-act.c:6248
+#: objc/objc-act.c:6249
#, c-format
msgid "type `%s' has a user-defined constructor"
msgstr ""
-#: objc/objc-act.c:6250
+#: objc/objc-act.c:6251
#, c-format
msgid "type `%s' has a user-defined destructor"
msgstr ""
-#: objc/objc-act.c:6251
+#: objc/objc-act.c:6252
msgid ""
"C++ constructors and destructors will not be invoked for Objective-C fields"
msgstr ""
-#: objc/objc-act.c:6341
+#: objc/objc-act.c:6342
#, c-format
msgid "instance variable `%s' is declared private"
msgstr ""
-#: objc/objc-act.c:6350
+#: objc/objc-act.c:6351
#, c-format
msgid "instance variable `%s' is %s; this will be a hard error in the future"
msgstr ""
-#: objc/objc-act.c:6357
+#: objc/objc-act.c:6358
#, c-format
msgid "instance variable `%s' is declared %s"
msgstr ""
-#: objc/objc-act.c:6367
+#: objc/objc-act.c:6368
msgid "static access to object of type `id'"
msgstr ""
-#: objc/objc-act.c:6389 objc/objc-act.c:6477
+#: objc/objc-act.c:6390 objc/objc-act.c:6478
#, c-format
msgid "incomplete implementation of class `%s'"
msgstr ""
-#: objc/objc-act.c:6393 objc/objc-act.c:6482
+#: objc/objc-act.c:6394 objc/objc-act.c:6483
#, c-format
msgid "incomplete implementation of category `%s'"
msgstr ""
-#: objc/objc-act.c:6398 objc/objc-act.c:6487
+#: objc/objc-act.c:6399 objc/objc-act.c:6488
#, c-format
msgid "method definition for `%c%s' not found"
msgstr ""
-#: objc/objc-act.c:6528
+#: objc/objc-act.c:6529
#, c-format
msgid "%s `%s' does not fully implement the `%s' protocol"
msgstr ""
-#: objc/objc-act.c:6586 objc/objc-act.c:8124
+#: objc/objc-act.c:6587 objc/objc-act.c:8152
msgid "`@end' missing in implementation context"
msgstr ""
-#: objc/objc-act.c:6599
+#: objc/objc-act.c:6600
#, c-format
msgid "cannot find interface declaration for `%s', superclass of `%s'"
msgstr ""
-#: objc/objc-act.c:6626
+#: objc/objc-act.c:6627
#, c-format
msgid "reimplementation of class `%s'"
msgstr ""
-#: objc/objc-act.c:6657
+#: objc/objc-act.c:6658
#, c-format
msgid "conflicting super class name `%s'"
msgstr ""
-#: objc/objc-act.c:6659
+#: objc/objc-act.c:6660
#, c-format
msgid "previous declaration of `%s'"
msgstr ""
-#: objc/objc-act.c:6673 objc/objc-act.c:6675
+#: objc/objc-act.c:6674 objc/objc-act.c:6676
#, c-format
msgid "duplicate interface declaration for class `%s'"
msgstr ""
-#: objc/objc-act.c:6952
+#: objc/objc-act.c:6953
#, c-format
msgid "duplicate declaration for protocol `%s'"
msgstr ""
#. Add a readable method name to the warning.
-#: objc/objc-act.c:7468
+#: objc/objc-act.c:7469
msgid "%J%s `%c%s'"
msgstr ""
-#: objc/objc-act.c:7731
+#: objc/objc-act.c:7759
#, c-format
msgid "no super class declared in interface for `%s'"
msgstr ""
-#: objc/objc-act.c:7779
+#: objc/objc-act.c:7807
msgid "[super ...] must appear in a method context"
msgstr ""
-#: objc/objc-parse.y:2704
+#: objc/objc-parse.y:2710
msgid "extra semicolon in method definition specified"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:931
+#: /home/jsm28/src/gcc-build/gcc/options.c:935
msgid "Display this information"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:937
+#: /home/jsm28/src/gcc-build/gcc/options.c:941
msgid ""
"--param <param>=<value>\tSet paramter <param> to value. See below for a "
"complete list of parameters"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:946
+#: /home/jsm28/src/gcc-build/gcc/options.c:950
msgid ""
"-A<question>=<answer>\tAssert the <answer> to <question>. Putting '-' "
"before <question> disables the <answer> to <question>"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:949
+#: /home/jsm28/src/gcc-build/gcc/options.c:953
msgid "Do not discard comments"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:952
+#: /home/jsm28/src/gcc-build/gcc/options.c:956
msgid "Do not discard comments in macro expansions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:955
+#: /home/jsm28/src/gcc-build/gcc/options.c:959
msgid ""
"-D<macro>[=<val>]\tDefine a <macro> with <val> as its value. If just "
"<macro> is given, <val> is taken to be 1"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:961
+#: /home/jsm28/src/gcc-build/gcc/options.c:965
msgid "-F <dir>\tAdd <dir> to the end of the main framework include path "
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:964
+#: /home/jsm28/src/gcc-build/gcc/options.c:968
msgid ""
"-G<number>\tPut global and static data smaller than <number> bytes into a "
"special section (on some targets)"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:967
+#: /home/jsm28/src/gcc-build/gcc/options.c:971
msgid "Print the name of header files as they are used"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:973
+#: /home/jsm28/src/gcc-build/gcc/options.c:977
msgid "-J<directory>\tPut MODULE files in 'directory'"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:979
+#: /home/jsm28/src/gcc-build/gcc/options.c:983
msgid "Generate make dependencies and compile"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:988
+#: /home/jsm28/src/gcc-build/gcc/options.c:992
msgid "Treat missing header files as generated files"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:994
+#: /home/jsm28/src/gcc-build/gcc/options.c:998
msgid "Like -MD but ignore system header files"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1003
+#: /home/jsm28/src/gcc-build/gcc/options.c:1007
msgid "-MQ <target>\tAdd a MAKE-quoted target"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1009
+#: /home/jsm28/src/gcc-build/gcc/options.c:1013
msgid "-O<number>\tSet optimization level to <number>"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1012
+#: /home/jsm28/src/gcc-build/gcc/options.c:1016
msgid "Optimize for space rather than speed"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1015
+#: /home/jsm28/src/gcc-build/gcc/options.c:1019
msgid "Do not generate #line directives"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1018
+#: /home/jsm28/src/gcc-build/gcc/options.c:1022
msgid "-U<macro>\tUndefine <macro>"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1021
+#: /home/jsm28/src/gcc-build/gcc/options.c:1025
msgid "This switch is deprecated; use -Wextra instead"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1024
+#: /home/jsm28/src/gcc-build/gcc/options.c:1028
msgid ""
"Warn about things that will change when compiling with an ABI-compliant "
"compiler"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1027
+#: /home/jsm28/src/gcc-build/gcc/options.c:1031
msgid "Warn about returning structures, unions or arrays"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1030
+#: /home/jsm28/src/gcc-build/gcc/options.c:1034
msgid "Warn about possible aliasing of dummy arguments"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1036
+#: /home/jsm28/src/gcc-build/gcc/options.c:1040
msgid "Warn about casting functions to incompatible types"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1039
+#: /home/jsm28/src/gcc-build/gcc/options.c:1043
msgid "Warn about pointer casts which increase alignment"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1042
+#: /home/jsm28/src/gcc-build/gcc/options.c:1046
msgid "Warn about casts which discard qualifiers"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1045
+#: /home/jsm28/src/gcc-build/gcc/options.c:1049
msgid "Warn about subscripts whose type is \"char\""
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1048
+#: /home/jsm28/src/gcc-build/gcc/options.c:1052
msgid ""
"Warn about possibly nested block comments, and C++ comments spanning more "
"than one physical line"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1051
+#: /home/jsm28/src/gcc-build/gcc/options.c:1055
msgid "Synonym for -Wcomment"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1054
+#: /home/jsm28/src/gcc-build/gcc/options.c:1058
msgid "Warn about implicit conversion"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1057
+#: /home/jsm28/src/gcc-build/gcc/options.c:1061
msgid "Warn when all constructors and destructors are private"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1060
+#: /home/jsm28/src/gcc-build/gcc/options.c:1064
msgid "Warn when a declaration is found after a statement"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1063
+#: /home/jsm28/src/gcc-build/gcc/options.c:1067
msgid "Warn if a deprecated compiler feature, class, method, or field is used"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1066
+#: /home/jsm28/src/gcc-build/gcc/options.c:1070
msgid "Warn about uses of __attribute__((deprecated)) declarations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1069
+#: /home/jsm28/src/gcc-build/gcc/options.c:1073
msgid "Warn when an optimization pass is disabled"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1072
+#: /home/jsm28/src/gcc-build/gcc/options.c:1076
msgid "Warn about compile-time integer division by zero"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1075
+#: /home/jsm28/src/gcc-build/gcc/options.c:1079
msgid "Warn about violations of Effective C++ style rules"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1078
+#: /home/jsm28/src/gcc-build/gcc/options.c:1082
msgid "Warn about stray tokens after #elif and #endif"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1081
+#: /home/jsm28/src/gcc-build/gcc/options.c:1085
msgid "Treat all warnings as errors"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1084
+#: /home/jsm28/src/gcc-build/gcc/options.c:1088
msgid "Make implicit function declarations an error"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1087
+#: /home/jsm28/src/gcc-build/gcc/options.c:1091
msgid "Print extra (possibly unwanted) warnings"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1090
+#: /home/jsm28/src/gcc-build/gcc/options.c:1094
msgid "Warn if deprecated empty statements are found"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1093
+#: /home/jsm28/src/gcc-build/gcc/options.c:1097
msgid "Exit on the first error occurred"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1096
+#: /home/jsm28/src/gcc-build/gcc/options.c:1100
msgid "Warn if testing floating point numbers for equality"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1099
+#: /home/jsm28/src/gcc-build/gcc/options.c:1103
msgid "Warn about printf/scanf/strftime/strfmon format string anomalies"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1102
+#: /home/jsm28/src/gcc-build/gcc/options.c:1106
msgid "Warn if passing too many arguments to a function for its format string"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1105
+#: /home/jsm28/src/gcc-build/gcc/options.c:1109
msgid "Warn about format strings that are not literals"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1108
+#: /home/jsm28/src/gcc-build/gcc/options.c:1112
msgid "Warn about possible security problems with format functions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1111
+#: /home/jsm28/src/gcc-build/gcc/options.c:1115
msgid "Warn about strftime formats yielding 2-digit years"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1114
+#: /home/jsm28/src/gcc-build/gcc/options.c:1118
msgid "Warn about zero-length formats"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1123
+#: /home/jsm28/src/gcc-build/gcc/options.c:1127
msgid "Warn about implicit function declarations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1126
+#: /home/jsm28/src/gcc-build/gcc/options.c:1130
msgid "Warn when a declaration does not specify a type"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1129
+#: /home/jsm28/src/gcc-build/gcc/options.c:1133
msgid "Warn about calls with implicit interface"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1132
+#: /home/jsm28/src/gcc-build/gcc/options.c:1136
msgid "Deprecated. This switch has no effect."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1135
+#: /home/jsm28/src/gcc-build/gcc/options.c:1139
msgid "Warn about variables which are initialized to themselves."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1138
+#: /home/jsm28/src/gcc-build/gcc/options.c:1142
msgid "Warn when an inlined function cannot be inlined"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1141
+#: /home/jsm28/src/gcc-build/gcc/options.c:1145
msgid "Warn about invalid uses of the \"offsetof\" macro"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1144
+#: /home/jsm28/src/gcc-build/gcc/options.c:1148
msgid "Warn about PCH files that are found but not used"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1147
+#: /home/jsm28/src/gcc-build/gcc/options.c:1151
msgid "-Wlarger-than-<number>\tWarn if an object is larger than <number> bytes"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1150
+#: /home/jsm28/src/gcc-build/gcc/options.c:1154
msgid "Warn about truncated source lines"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1153
+#: /home/jsm28/src/gcc-build/gcc/options.c:1157
msgid "Do not warn about using \"long long\" when -pedantic"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1156
+#: /home/jsm28/src/gcc-build/gcc/options.c:1160
msgid "Warn about suspicious declarations of \"main\""
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1159
+#: /home/jsm28/src/gcc-build/gcc/options.c:1163
msgid "Warn about possibly missing braces around initializers"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1162
+#: /home/jsm28/src/gcc-build/gcc/options.c:1166
msgid "Warn about global functions without previous declarations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1165
+#: /home/jsm28/src/gcc-build/gcc/options.c:1169
msgid "Warn about missing fields in struct initializers"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1168
+#: /home/jsm28/src/gcc-build/gcc/options.c:1172
msgid "Warn about functions which might be candidates for format attributes"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1171
+#: /home/jsm28/src/gcc-build/gcc/options.c:1175
msgid "Warn about user-specified include directories that do not exist"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1174
+#: /home/jsm28/src/gcc-build/gcc/options.c:1178
msgid ""
"Warn about functions which might be candidates for __attribute__((noreturn))"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1177
+#: /home/jsm28/src/gcc-build/gcc/options.c:1181
msgid "Warn about global functions without prototypes"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1180
+#: /home/jsm28/src/gcc-build/gcc/options.c:1184
msgid "Warn about use of multi-character character constants"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1183
+#: /home/jsm28/src/gcc-build/gcc/options.c:1187
msgid "Warn about \"extern\" declarations not at file scope"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1186
+#: /home/jsm28/src/gcc-build/gcc/options.c:1190
msgid ""
"Warn when non-templatized friend functions are declared within a template"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1189
+#: /home/jsm28/src/gcc-build/gcc/options.c:1193
msgid "Warn about non-virtual destructors"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1192
+#: /home/jsm28/src/gcc-build/gcc/options.c:1196
msgid ""
"Warn about NULL being passed to argument slots marked as requiring non-NULL"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1195
+#: /home/jsm28/src/gcc-build/gcc/options.c:1199
msgid "Warn if a C-style cast is used in a program"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1198
+#: /home/jsm28/src/gcc-build/gcc/options.c:1202
msgid "Warn if an old-style parameter definition is used"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1201
+#: /home/jsm28/src/gcc-build/gcc/options.c:1205
msgid "Warn if .class files are out of date"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1204
+#: /home/jsm28/src/gcc-build/gcc/options.c:1208
msgid "Warn about overloaded virtual function names"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1207
+#: /home/jsm28/src/gcc-build/gcc/options.c:1211
msgid "Warn when the packed attribute has no effect on struct layout"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1210
+#: /home/jsm28/src/gcc-build/gcc/options.c:1214
msgid "Warn when padding is required to align structure members"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1213
+#: /home/jsm28/src/gcc-build/gcc/options.c:1217
msgid "Warn about possibly missing parentheses"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1216
+#: /home/jsm28/src/gcc-build/gcc/options.c:1220
msgid "Warn when converting the type of pointers to member functions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1219
+#: /home/jsm28/src/gcc-build/gcc/options.c:1223
msgid "Warn about function pointer arithmetic"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1222
+#: /home/jsm28/src/gcc-build/gcc/options.c:1226
msgid "Warn if inherited methods are unimplemented"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1225
+#: /home/jsm28/src/gcc-build/gcc/options.c:1229
msgid "Warn about multiple declarations of the same object"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1228
+#: /home/jsm28/src/gcc-build/gcc/options.c:1232
msgid "Warn if modifiers are specified when not necessary"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1231
+#: /home/jsm28/src/gcc-build/gcc/options.c:1235
msgid "Warn when the compiler reorders code"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1234
+#: /home/jsm28/src/gcc-build/gcc/options.c:1238
msgid ""
"Warn whenever a function's return type defaults to \"int\" (C), or about "
"inconsistent return types (C++)"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1237
+#: /home/jsm28/src/gcc-build/gcc/options.c:1241
msgid "Warn if a selector has multiple methods"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1240
+#: /home/jsm28/src/gcc-build/gcc/options.c:1244
msgid "Warn about possible violations of sequence point rules"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1243
+#: /home/jsm28/src/gcc-build/gcc/options.c:1247
msgid "Warn when one local variable shadows another"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1246
+#: /home/jsm28/src/gcc-build/gcc/options.c:1250
msgid "Warn about signed-unsigned comparisons"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1249
+#: /home/jsm28/src/gcc-build/gcc/options.c:1253
msgid "Warn when overload promotes from unsigned to signed"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1252
-#: /home/jsm28/src/gcc-build/gcc/options.c:1255
+#: /home/jsm28/src/gcc-build/gcc/options.c:1256
+#: /home/jsm28/src/gcc-build/gcc/options.c:1259
msgid "Warn about code which might break strict aliasing rules"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1258
+#: /home/jsm28/src/gcc-build/gcc/options.c:1262
msgid "Warn about unprototyped function declarations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1261
+#: /home/jsm28/src/gcc-build/gcc/options.c:1265
msgid "Warn about \"suspicious\" constructs"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1264
+#: /home/jsm28/src/gcc-build/gcc/options.c:1268
msgid "Warn about enumerated switches, with no default, missing a case"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1267
+#: /home/jsm28/src/gcc-build/gcc/options.c:1271
msgid "Warn about enumerated switches missing a \"default:\" statement"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1270
+#: /home/jsm28/src/gcc-build/gcc/options.c:1274
msgid "Warn about all enumerated switches missing a specific case"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1273
+#: /home/jsm28/src/gcc-build/gcc/options.c:1277
msgid "Warn when synthesis behavior differs from Cfront"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1276
+#: /home/jsm28/src/gcc-build/gcc/options.c:1280
msgid "Do not suppress warnings from system headers"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1279
+#: /home/jsm28/src/gcc-build/gcc/options.c:1283
msgid "Warn about features not present in traditional C"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1282
+#: /home/jsm28/src/gcc-build/gcc/options.c:1286
msgid ""
"Warn if trigraphs are encountered that might affect the meaning of the "
"program"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1285
+#: /home/jsm28/src/gcc-build/gcc/options.c:1289
msgid "Warn about @selector()s without previously declared methods"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1288
+#: /home/jsm28/src/gcc-build/gcc/options.c:1292
msgid "Warn if an undefined macro is used in an #if directive"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1291
+#: /home/jsm28/src/gcc-build/gcc/options.c:1295
msgid "Warn about underflow of numerical constant expressions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1294
+#: /home/jsm28/src/gcc-build/gcc/options.c:1298
msgid "Warn about uninitialized automatic variables"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1297
+#: /home/jsm28/src/gcc-build/gcc/options.c:1301
msgid "Warn about unrecognized pragmas"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1300
+#: /home/jsm28/src/gcc-build/gcc/options.c:1304
msgid "Warn about code that will never be executed"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1303
+#: /home/jsm28/src/gcc-build/gcc/options.c:1307
msgid "Enable all -Wunused- warnings"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1306
+#: /home/jsm28/src/gcc-build/gcc/options.c:1310
msgid "Warn when a function is unused"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1309
-#: /home/jsm28/src/gcc-build/gcc/options.c:1312
+#: /home/jsm28/src/gcc-build/gcc/options.c:1313
+#: /home/jsm28/src/gcc-build/gcc/options.c:1316
msgid "Warn when a label is unused"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1315
+#: /home/jsm28/src/gcc-build/gcc/options.c:1319
msgid "Warn about macros defined in the main file that are not used"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1318
+#: /home/jsm28/src/gcc-build/gcc/options.c:1322
msgid "Warn when a function parameter is unused"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1321
+#: /home/jsm28/src/gcc-build/gcc/options.c:1325
msgid "Warn when an expression value is unused"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1324
+#: /home/jsm28/src/gcc-build/gcc/options.c:1328
msgid "Warn when a variable is unused"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1327
+#: /home/jsm28/src/gcc-build/gcc/options.c:1331
msgid "Do not warn about using variadic macros when -pedantic"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1330
+#: /home/jsm28/src/gcc-build/gcc/options.c:1334
msgid "Give strings the type \"array of char\""
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1333
+#: /home/jsm28/src/gcc-build/gcc/options.c:1337
msgid ""
"A synonym for -std=c89. In a future version of GCC it will become "
"synonymous with -std=c99 instead"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1336
+#: /home/jsm28/src/gcc-build/gcc/options.c:1340
msgid "-aux-info <file>\tEmit declaration information into <file>"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1348
+#: /home/jsm28/src/gcc-build/gcc/options.c:1352
msgid "-d<letters>\tEnable dumps from specific passes of the compiler"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1351
+#: /home/jsm28/src/gcc-build/gcc/options.c:1355
msgid "Set the default real and integer kinds to double precision"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1354
+#: /home/jsm28/src/gcc-build/gcc/options.c:1358
msgid "-dumpbase <file>\tSet the file basename to be used for dumps"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1357
+#: /home/jsm28/src/gcc-build/gcc/options.c:1361
msgid "--CLASSPATH\tDeprecated; use --classpath instead"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1360
+#: /home/jsm28/src/gcc-build/gcc/options.c:1364
msgid "Generate position-independent code if possible (large mode)"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1363
+#: /home/jsm28/src/gcc-build/gcc/options.c:1367
msgid ""
"Generate position-independent code for executables if possible (large mode)"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1369
+#: /home/jsm28/src/gcc-build/gcc/options.c:1373
msgid "Enforce class member access control semantics"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1372
+#: /home/jsm28/src/gcc-build/gcc/options.c:1376
msgid "Align the start of functions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1378
+#: /home/jsm28/src/gcc-build/gcc/options.c:1382
msgid "Align labels which are only reached by jumping"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1384
+#: /home/jsm28/src/gcc-build/gcc/options.c:1388
msgid "Align all labels"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1390
+#: /home/jsm28/src/gcc-build/gcc/options.c:1394
msgid "Align the start of loops"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1399
+#: /home/jsm28/src/gcc-build/gcc/options.c:1403
msgid "Change when template instances are emitted"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1402
+#: /home/jsm28/src/gcc-build/gcc/options.c:1406
msgid "Specify that arguments may alias each other and globals"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1405
+#: /home/jsm28/src/gcc-build/gcc/options.c:1409
msgid "Assume arguments may alias globals but not each other"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1408
+#: /home/jsm28/src/gcc-build/gcc/options.c:1412
msgid "Assume arguments alias neither each other nor globals"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1411
+#: /home/jsm28/src/gcc-build/gcc/options.c:1415
msgid "Recognize the \"asm\" keyword"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1414
+#: /home/jsm28/src/gcc-build/gcc/options.c:1418
msgid "Permit the use of the assert keyword"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1423
+#: /home/jsm28/src/gcc-build/gcc/options.c:1427
msgid "Generate unwind tables that are exact at each instruction boundary"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1426
+#: /home/jsm28/src/gcc-build/gcc/options.c:1430
msgid "--bootclasspath=<path>\tReplace system path"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1429
+#: /home/jsm28/src/gcc-build/gcc/options.c:1433
msgid "Generate code to check bounds before indexing arrays"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1432
+#: /home/jsm28/src/gcc-build/gcc/options.c:1436
msgid "Replace add, compare, branch with branch on count register"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1435
+#: /home/jsm28/src/gcc-build/gcc/options.c:1439
msgid "Use profiling information for branch probabilities"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1438
+#: /home/jsm28/src/gcc-build/gcc/options.c:1442
msgid ""
"Perform branch target load optimization before prologue / epilogue threading"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1441
+#: /home/jsm28/src/gcc-build/gcc/options.c:1445
msgid ""
"Perform branch target load optimization after prologue / epilogue threading"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1444
+#: /home/jsm28/src/gcc-build/gcc/options.c:1448
msgid ""
"Restrict target load migration not to re-use registers in any basic block"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1447
+#: /home/jsm28/src/gcc-build/gcc/options.c:1451
msgid "Recognize built-in functions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1453
+#: /home/jsm28/src/gcc-build/gcc/options.c:1457
msgid ""
"-fcall-saved-<register>\tMark <register> as being preserved across functions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1456
+#: /home/jsm28/src/gcc-build/gcc/options.c:1460
msgid ""
"-fcall-used-<register>\tMark <register> as being corrupted by function calls"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1459
+#: /home/jsm28/src/gcc-build/gcc/options.c:1463
msgid "Save registers around function calls"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1462
+#: /home/jsm28/src/gcc-build/gcc/options.c:1466
msgid "Check the return value of new"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1465
+#: /home/jsm28/src/gcc-build/gcc/options.c:1469
msgid "Generate checks for references to NULL"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1468
+#: /home/jsm28/src/gcc-build/gcc/options.c:1472
msgid "--classpath=<path>\tSet class path"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1471
+#: /home/jsm28/src/gcc-build/gcc/options.c:1475
msgid "Do not put uninitialized globals in the common section"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1477
+#: /home/jsm28/src/gcc-build/gcc/options.c:1481
msgid "Allow the arguments of the '?' operator to have different types"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1480
+#: /home/jsm28/src/gcc-build/gcc/options.c:1484
msgid "Reduce the size of object files"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1483
+#: /home/jsm28/src/gcc-build/gcc/options.c:1487
msgid "Make string literals \"const char[]\" not \"char[]\""
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1486
+#: /home/jsm28/src/gcc-build/gcc/options.c:1490
msgid "-fconst-string-class=<name>\tUse class <name> for constant strings"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1489
+#: /home/jsm28/src/gcc-build/gcc/options.c:1493
msgid "Perform a register copy-propagation optimization pass"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1492
+#: /home/jsm28/src/gcc-build/gcc/options.c:1496
msgid "Perform cross-jumping optimization"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1495
+#: /home/jsm28/src/gcc-build/gcc/options.c:1499
msgid "When running CSE, follow jumps to their targets"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1498
+#: /home/jsm28/src/gcc-build/gcc/options.c:1502
msgid "When running CSE, follow conditional jumps"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1501
+#: /home/jsm28/src/gcc-build/gcc/options.c:1505
msgid "Place data items into their own section"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1504
+#: /home/jsm28/src/gcc-build/gcc/options.c:1508
msgid "Inline member functions by default"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1507
+#: /home/jsm28/src/gcc-build/gcc/options.c:1511
msgid "Defer popping functions args from stack until later"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1510
+#: /home/jsm28/src/gcc-build/gcc/options.c:1514
msgid "Attempt to fill delay slots of branch instructions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1513
+#: /home/jsm28/src/gcc-build/gcc/options.c:1517
msgid "Delete useless null pointer checks"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1516
+#: /home/jsm28/src/gcc-build/gcc/options.c:1520
msgid ""
"-fdiagnostics-show-location=[once|every-line]\tHow often to emit source "
"location at the beginning of line-wrapped diagnostics"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1525
+#: /home/jsm28/src/gcc-build/gcc/options.c:1529
msgid "Allow dollar signs in entity names"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1528
+#: /home/jsm28/src/gcc-build/gcc/options.c:1532
msgid "Permit '$' as an identifier character"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1531
+#: /home/jsm28/src/gcc-build/gcc/options.c:1535
msgid "-fdump-<type>\tDump various compiler internals to a file"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1534
+#: /home/jsm28/src/gcc-build/gcc/options.c:1538
msgid "Display the code tree after parsing."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1537
+#: /home/jsm28/src/gcc-build/gcc/options.c:1541
msgid ""
"Suppress output of instruction numbers and line number notes in debugging "
"dumps"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1543
+#: /home/jsm28/src/gcc-build/gcc/options.c:1547
msgid "Perform DWARF2 duplicate elimination"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1546
-#: /home/jsm28/src/gcc-build/gcc/options.c:1549
+#: /home/jsm28/src/gcc-build/gcc/options.c:1550
+#: /home/jsm28/src/gcc-build/gcc/options.c:1553
msgid "Perform unused type elimination in debug info"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1552
+#: /home/jsm28/src/gcc-build/gcc/options.c:1556
msgid "Output a class file"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1555
+#: /home/jsm28/src/gcc-build/gcc/options.c:1559
msgid "Alias for -femit-class-file"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1564
+#: /home/jsm28/src/gcc-build/gcc/options.c:1568
msgid ""
"--encoding=<encoding>\tChoose input encoding (defaults from your locale)"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1567
+#: /home/jsm28/src/gcc-build/gcc/options.c:1571
msgid "Generate code to check exception specifications"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1573
+#: /home/jsm28/src/gcc-build/gcc/options.c:1577
msgid "Enable exception handling"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1576
+#: /home/jsm28/src/gcc-build/gcc/options.c:1580
msgid ""
"-fexec-charset=<cset>\tConvert all strings and character constants to "
"character set <cset>"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1579
+#: /home/jsm28/src/gcc-build/gcc/options.c:1583
msgid "Perform a number of minor, expensive optimizations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1591
+#: /home/jsm28/src/gcc-build/gcc/options.c:1595
msgid "Input file is a file with a list of filenames to compile"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1594
+#: /home/jsm28/src/gcc-build/gcc/options.c:1598
msgid "Assume no NaNs or infinities are generated"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1597
+#: /home/jsm28/src/gcc-build/gcc/options.c:1601
msgid ""
"-ffixed-<register>\tMark <register> as being unavailable to the compiler"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1600
+#: /home/jsm28/src/gcc-build/gcc/options.c:1604
msgid "Assume that the source file is fixed form"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1603
+#: /home/jsm28/src/gcc-build/gcc/options.c:1607
msgid "-ffixed-line-length-<n>\t\tUse n as character line width in fixed mode"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1606
+#: /home/jsm28/src/gcc-build/gcc/options.c:1610
msgid "Allow arbitrary character line width in fixed mode"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1609
+#: /home/jsm28/src/gcc-build/gcc/options.c:1613
msgid "Don't allocate floats and doubles in extended-precision registers"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1612
+#: /home/jsm28/src/gcc-build/gcc/options.c:1616
msgid "Scope of for-init-statement variables is local to the loop"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1615
+#: /home/jsm28/src/gcc-build/gcc/options.c:1619
msgid "Copy memory address constants into registers before use"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1618
+#: /home/jsm28/src/gcc-build/gcc/options.c:1622
msgid "Always check for non gcj generated classes archives"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1621
+#: /home/jsm28/src/gcc-build/gcc/options.c:1625
msgid "Copy memory operands into registers before use"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1624
+#: /home/jsm28/src/gcc-build/gcc/options.c:1628
msgid "Assume that the source file is free form"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1627
+#: /home/jsm28/src/gcc-build/gcc/options.c:1631
msgid "Do not assume that standard C libraries and \"main\" exist"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1630
+#: /home/jsm28/src/gcc-build/gcc/options.c:1634
msgid "Allow function addresses to be held in registers"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1633
+#: /home/jsm28/src/gcc-build/gcc/options.c:1637
msgid "Place each function into its own section"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1636
+#: /home/jsm28/src/gcc-build/gcc/options.c:1640
msgid "Perform global common subexpression elimination"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1639
+#: /home/jsm28/src/gcc-build/gcc/options.c:1643
msgid ""
"Perform global common subexpression elimination after register allocation"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1642
+#: /home/jsm28/src/gcc-build/gcc/options.c:1646
msgid ""
"Perform redundant load after store elimination in global common subexpression"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1645
+#: /home/jsm28/src/gcc-build/gcc/options.c:1649
msgid ""
"Perform enhanced load motion during global common subexpression elimination"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1648
+#: /home/jsm28/src/gcc-build/gcc/options.c:1652
msgid "Perform store motion after global common subexpression elimination"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1651
+#: /home/jsm28/src/gcc-build/gcc/options.c:1655
msgid "Recognize GNU-defined keywords"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1654
+#: /home/jsm28/src/gcc-build/gcc/options.c:1658
msgid "Generate code for GNU runtime environment"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1657
+#: /home/jsm28/src/gcc-build/gcc/options.c:1661
msgid "Enable guessing of branch probabilities"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1666
+#: /home/jsm28/src/gcc-build/gcc/options.c:1670
msgid ""
"Assume the runtime uses a hash table to map an object to its synchronization "
"structure"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1672
+#: /home/jsm28/src/gcc-build/gcc/options.c:1676
msgid "Assume normal C execution environment"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1675
+#: /home/jsm28/src/gcc-build/gcc/options.c:1679
msgid "Enable support for huge objects"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1678
+#: /home/jsm28/src/gcc-build/gcc/options.c:1682
msgid "Process #ident directives"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1681
+#: /home/jsm28/src/gcc-build/gcc/options.c:1685
msgid "Perform conversion of conditional jumps to branchless equivalents"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1684
+#: /home/jsm28/src/gcc-build/gcc/options.c:1688
msgid "Perform conversion of conditional jumps to conditional execution"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1687
+#: /home/jsm28/src/gcc-build/gcc/options.c:1691
msgid "Export functions even if they can be inlined"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1690
+#: /home/jsm28/src/gcc-build/gcc/options.c:1694
msgid "Emit implicit instantiations of inline templates"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1693
+#: /home/jsm28/src/gcc-build/gcc/options.c:1697
msgid ""
"Specify that no implicit typing is allowed, unless overridden by explicit "
"IMPLICIT statements"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1696
+#: /home/jsm28/src/gcc-build/gcc/options.c:1700
msgid "Emit implicit instantiations of templates"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1699
+#: /home/jsm28/src/gcc-build/gcc/options.c:1703
msgid "Use offset tables for virtual method calls"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1702
+#: /home/jsm28/src/gcc-build/gcc/options.c:1706
msgid "Do not generate .size directives"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1705
+#: /home/jsm28/src/gcc-build/gcc/options.c:1709
msgid "Pay attention to the \"inline\" keyword"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1714
+#: /home/jsm28/src/gcc-build/gcc/options.c:1718
msgid ""
"-finline-limit=<number>\tLimit the size of inlined functions to <number>"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1717
+#: /home/jsm28/src/gcc-build/gcc/options.c:1721
msgid ""
"-finput-charset=<cset> Specify the default character set for source "
"files."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1720
+#: /home/jsm28/src/gcc-build/gcc/options.c:1724
msgid "Instrument function entry and exit with profiling calls"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1723
+#: /home/jsm28/src/gcc-build/gcc/options.c:1727
msgid "Optimize induction variables on trees"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1726
+#: /home/jsm28/src/gcc-build/gcc/options.c:1730
msgid "Assume native functions are implemented using JNI"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1729
+#: /home/jsm28/src/gcc-build/gcc/options.c:1733
msgid "Generate code for functions even if they are fully inlined"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1732
+#: /home/jsm28/src/gcc-build/gcc/options.c:1736
msgid "Emit static const variables even if they are not used"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1738
+#: /home/jsm28/src/gcc-build/gcc/options.c:1742
msgid "Give external symbols a leading underscore"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1741
+#: /home/jsm28/src/gcc-build/gcc/options.c:1745
msgid "Perform loop optimizations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1744
+#: /home/jsm28/src/gcc-build/gcc/options.c:1748
msgid "Perform loop optimizations using the new loop optimizer"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1747
+#: /home/jsm28/src/gcc-build/gcc/options.c:1751
msgid "Set errno after built-in math functions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1750
+#: /home/jsm28/src/gcc-build/gcc/options.c:1754
msgid "-fmax-identifier-length=<n>\tMaximum identifier length."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1753
+#: /home/jsm28/src/gcc-build/gcc/options.c:1757
msgid ""
"-fmax-stack-var-size=<n>\tSize in bytes of the largest array that will be "
"put on the stack"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1756
+#: /home/jsm28/src/gcc-build/gcc/options.c:1760
msgid "Report on permanent memory allocation"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1759
+#: /home/jsm28/src/gcc-build/gcc/options.c:1763
msgid "Attempt to merge identical constants and constant variables"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1762
+#: /home/jsm28/src/gcc-build/gcc/options.c:1766
msgid "Attempt to merge identical constants across compilation units"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1765
+#: /home/jsm28/src/gcc-build/gcc/options.c:1769
msgid ""
"-fmessage-length=<number>\tLimit diagnostics to <number> characters per "
"line. 0 suppresses line-wrapping"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1768
+#: /home/jsm28/src/gcc-build/gcc/options.c:1772
msgid "Set default accessibility of module entities to PRIVATE"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1771
+#: /home/jsm28/src/gcc-build/gcc/options.c:1775
msgid "Perform SMS based modulo scheduling before the first scheduling pass"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1774
+#: /home/jsm28/src/gcc-build/gcc/options.c:1778
msgid "Move loop invariant computations out of loops"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1777
+#: /home/jsm28/src/gcc-build/gcc/options.c:1781
msgid "Don't warn about uses of Microsoft extensions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1780
+#: /home/jsm28/src/gcc-build/gcc/options.c:1784
msgid ""
"Add mudflap bounds-checking instrumentation for single-threaded program."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1783
+#: /home/jsm28/src/gcc-build/gcc/options.c:1787
msgid "Ignore read operations when inserting mudflap instrumentation."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1786
+#: /home/jsm28/src/gcc-build/gcc/options.c:1790
msgid "Add mudflap bounds-checking instrumentation for multi-threaded program."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1795
+#: /home/jsm28/src/gcc-build/gcc/options.c:1799
msgid "Use graph-coloring register allocation"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1798
+#: /home/jsm28/src/gcc-build/gcc/options.c:1802
msgid "Generate code for NeXT (Apple Mac OS X) runtime environment"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1801
+#: /home/jsm28/src/gcc-build/gcc/options.c:1805
msgid "Assume that receivers of Objective-C messages may be nil"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1804
+#: /home/jsm28/src/gcc-build/gcc/options.c:1808
msgid "Don't generate code, just do syntax and semantics checking"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1807
+#: /home/jsm28/src/gcc-build/gcc/options.c:1811
msgid "Support synchronous non-call exceptions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1816
+#: /home/jsm28/src/gcc-build/gcc/options.c:1820
msgid "Enable Objective-C exception and synchronization syntax"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1819
+#: /home/jsm28/src/gcc-build/gcc/options.c:1823
msgid "Enable Objective-C setjmp exception handling runtime"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1822
+#: /home/jsm28/src/gcc-build/gcc/options.c:1826
msgid "When possible do not generate stack frames"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1825
+#: /home/jsm28/src/gcc-build/gcc/options.c:1829
msgid "Recognize C++ kewords like \"compl\" and \"xor\""
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1828
+#: /home/jsm28/src/gcc-build/gcc/options.c:1832
msgid "Do the full register move optimization pass"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1831
+#: /home/jsm28/src/gcc-build/gcc/options.c:1835
msgid "Optimize sibling and tail recursive calls"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1834
+#: /home/jsm28/src/gcc-build/gcc/options.c:1838
msgid "Enable optimization of static class initialization code"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1837
+#: /home/jsm28/src/gcc-build/gcc/options.c:1841
msgid "Enable optional diagnostics"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1843
+#: /home/jsm28/src/gcc-build/gcc/options.c:1847
msgid "Try to layout derived types as compact as possible"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1846
+#: /home/jsm28/src/gcc-build/gcc/options.c:1850
msgid "Pack structure members together without holes"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1849
+#: /home/jsm28/src/gcc-build/gcc/options.c:1853
msgid "-fpack-struct=<number>\tSet initial maximum structure member alignment"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1852
+#: /home/jsm28/src/gcc-build/gcc/options.c:1856
msgid "Return small aggregates in memory, not registers"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1858
+#: /home/jsm28/src/gcc-build/gcc/options.c:1862
msgid "Look for and use PCH files even when preprocessing"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1861
+#: /home/jsm28/src/gcc-build/gcc/options.c:1865
msgid "Perform loop peeling"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1864
+#: /home/jsm28/src/gcc-build/gcc/options.c:1868
msgid "Enable machine specific peephole optimizations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1867
+#: /home/jsm28/src/gcc-build/gcc/options.c:1871
msgid "Enable an RTL peephole pass before sched2"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1870
+#: /home/jsm28/src/gcc-build/gcc/options.c:1874
msgid "Downgrade conformance errors to warnings"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1873
+#: /home/jsm28/src/gcc-build/gcc/options.c:1877
msgid "Generate position-independent code if possible (small mode)"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1876
+#: /home/jsm28/src/gcc-build/gcc/options.c:1880
msgid ""
"Generate position-independent code for executables if possible (small mode)"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1879
+#: /home/jsm28/src/gcc-build/gcc/options.c:1883
msgid "Generate prefetch instructions, if available, for arrays in loops"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1882
+#: /home/jsm28/src/gcc-build/gcc/options.c:1886
msgid "Treat the input file as already preprocessed"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1885
+#: /home/jsm28/src/gcc-build/gcc/options.c:1889
msgid "Enable basic program profiling code"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1888
+#: /home/jsm28/src/gcc-build/gcc/options.c:1892
msgid "Insert arc-based program profiling code"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1891
+#: /home/jsm28/src/gcc-build/gcc/options.c:1895
msgid ""
"Enable common options for generating profile info for profile feedback "
"directed optimizations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1894
+#: /home/jsm28/src/gcc-build/gcc/options.c:1898
msgid ""
"Enable common options for performing profile feedback directed optimizations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1897
+#: /home/jsm28/src/gcc-build/gcc/options.c:1901
msgid "Insert code to profile values of expressions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1903
+#: /home/jsm28/src/gcc-build/gcc/options.c:1907
msgid "-frandom-seed=<string>\tMake compile reproducible using <string>"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1906
+#: /home/jsm28/src/gcc-build/gcc/options.c:1910
msgid "Return small aggregates in registers"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1909
+#: /home/jsm28/src/gcc-build/gcc/options.c:1913
msgid "Enables a register move optimization"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1912
+#: /home/jsm28/src/gcc-build/gcc/options.c:1916
msgid "Perform a register renaming optimization pass"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1915
+#: /home/jsm28/src/gcc-build/gcc/options.c:1919
msgid "Reorder basic blocks to improve code placement"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1918
+#: /home/jsm28/src/gcc-build/gcc/options.c:1922
msgid "Reorder basic blocks and partition into hot and cold sections"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1921
+#: /home/jsm28/src/gcc-build/gcc/options.c:1925
msgid "Reorder functions to improve code placement"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1924
+#: /home/jsm28/src/gcc-build/gcc/options.c:1928
msgid "Copy array sections into a contiguous block on procedure entry"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1927
+#: /home/jsm28/src/gcc-build/gcc/options.c:1931
msgid ""
"Used in Fix-and-Continue mode to indicate that object files may be swapped "
"in at runtime"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1930
+#: /home/jsm28/src/gcc-build/gcc/options.c:1934
msgid "Enable automatic template instantiation"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1933
+#: /home/jsm28/src/gcc-build/gcc/options.c:1937
msgid "Add a common subexpression elimination pass after loop optimizations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1936
+#: /home/jsm28/src/gcc-build/gcc/options.c:1940
msgid "Run the loop optimizer twice"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1939
+#: /home/jsm28/src/gcc-build/gcc/options.c:1943
msgid ""
"Enable/Disable the traditional scheduling in loops that already passed "
"modulo scheduling"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1942
+#: /home/jsm28/src/gcc-build/gcc/options.c:1946
msgid "Disable optimizations that assume default FP rounding behavior"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1945
+#: /home/jsm28/src/gcc-build/gcc/options.c:1949
msgid "Generate run time type descriptor information"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1948
+#: /home/jsm28/src/gcc-build/gcc/options.c:1952
msgid "Enable scheduling across basic blocks"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1951
+#: /home/jsm28/src/gcc-build/gcc/options.c:1955
msgid "Allow speculative motion of non-loads"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1954
+#: /home/jsm28/src/gcc-build/gcc/options.c:1958
msgid "Allow speculative motion of some loads"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1957
+#: /home/jsm28/src/gcc-build/gcc/options.c:1961
msgid "Allow speculative motion of more loads"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1960
+#: /home/jsm28/src/gcc-build/gcc/options.c:1964
msgid "Allow premature scheduling of queued insns"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1963
+#: /home/jsm28/src/gcc-build/gcc/options.c:1967
msgid ""
"Set dependence distance checking in premature scheduling of queued insns"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1966
+#: /home/jsm28/src/gcc-build/gcc/options.c:1970
msgid ""
"-fsched-stalled-insns-dep=<number> Set dependence distance checking in "
"premature scheduling of queued insns"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1969
+#: /home/jsm28/src/gcc-build/gcc/options.c:1973
msgid ""
"-fsched-stalled-insns=<number> Set number of queued insns that can be "
"prematurely scheduled"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1972
+#: /home/jsm28/src/gcc-build/gcc/options.c:1976
msgid "-fsched-verbose=<number>\tSet the verbosity level of the scheduler"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1975
+#: /home/jsm28/src/gcc-build/gcc/options.c:1979
msgid "If scheduling post reload, do superblock scheduling"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1978
+#: /home/jsm28/src/gcc-build/gcc/options.c:1982
msgid "If scheduling post reload, do trace scheduling"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1981
+#: /home/jsm28/src/gcc-build/gcc/options.c:1985
msgid "Reschedule instructions before register allocation"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1984
+#: /home/jsm28/src/gcc-build/gcc/options.c:1988
msgid "Reschedule instructions after register allocation"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1987
+#: /home/jsm28/src/gcc-build/gcc/options.c:1991
msgid "Append a second underscore if the name already contains an underscore"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1990
+#: /home/jsm28/src/gcc-build/gcc/options.c:1994
msgid "Mark data as shared rather than private"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1993
+#: /home/jsm28/src/gcc-build/gcc/options.c:1997
msgid "Use the same size for double as for float"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1996
+#: /home/jsm28/src/gcc-build/gcc/options.c:2000
msgid "Use the narrowest integer type possible for enumeration types"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:1999
+#: /home/jsm28/src/gcc-build/gcc/options.c:2003
msgid "Force the underlying type for \"wchar_t\" to be \"unsigned short\""
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2005
+#: /home/jsm28/src/gcc-build/gcc/options.c:2009
msgid "Disable optimizations observable by IEEE signaling NaNs"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2008
+#: /home/jsm28/src/gcc-build/gcc/options.c:2012
msgid "When \"signed\" or \"unsigned\" is not given make the bitfield signed"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2011
+#: /home/jsm28/src/gcc-build/gcc/options.c:2015
msgid "Make \"char\" signed by default"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2014
+#: /home/jsm28/src/gcc-build/gcc/options.c:2018
msgid "Convert floating point constants to single precision constants"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2017
+#: /home/jsm28/src/gcc-build/gcc/options.c:2021
msgid "Use value profiling for speculative prefetching"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2020
+#: /home/jsm28/src/gcc-build/gcc/options.c:2024
msgid "Split lifetimes of induction variables when loops are unrolled."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2026
+#: /home/jsm28/src/gcc-build/gcc/options.c:2030
msgid "Insert stack checking code into the program"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2032
+#: /home/jsm28/src/gcc-build/gcc/options.c:2036
msgid ""
"-fstack-limit-register=<register>\tTrap if the stack goes past <register>"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2035
+#: /home/jsm28/src/gcc-build/gcc/options.c:2039
msgid "-fstack-limit-symbol=<name>\tTrap if the stack goes past symbol <name>"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2038
+#: /home/jsm28/src/gcc-build/gcc/options.c:2042
msgid "Display statistics accumulated during compilation"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2041
+#: /home/jsm28/src/gcc-build/gcc/options.c:2045
msgid "Enable assignability checks for stores into object arrays"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2044
+#: /home/jsm28/src/gcc-build/gcc/options.c:2048
msgid "Perform strength reduction optimizations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2047
+#: /home/jsm28/src/gcc-build/gcc/options.c:2051
msgid "Assume strict aliasing rules apply"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2053
+#: /home/jsm28/src/gcc-build/gcc/options.c:2057
msgid "Check for syntax errors, then stop"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2056
+#: /home/jsm28/src/gcc-build/gcc/options.c:2060
msgid "-ftabstop=<number>\tDistance between tab stops for column reporting"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2059
+#: /home/jsm28/src/gcc-build/gcc/options.c:2063
msgid "-ftemplate-depth-<number>\tSpecify maximum template instantiation depth"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2062
+#: /home/jsm28/src/gcc-build/gcc/options.c:2066
msgid "Create data files needed by \"gcov\""
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2068
+#: /home/jsm28/src/gcc-build/gcc/options.c:2072
msgid "Perform jump threading optimizations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2071
+#: /home/jsm28/src/gcc-build/gcc/options.c:2075
msgid ""
"-fno-threadsafe-statics\tDo not generate thread-safe code for initializing "
"local statics."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2074
+#: /home/jsm28/src/gcc-build/gcc/options.c:2078
msgid "Report the time taken by each compiler pass"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2077
+#: /home/jsm28/src/gcc-build/gcc/options.c:2081
msgid ""
"-ftls-model=[global-dynamic|local-dynamic|initial-exec|local-exec]\tSet the "
"default thread-local storage code generation model"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2080
+#: /home/jsm28/src/gcc-build/gcc/options.c:2084
msgid "Perform superblock formation via tail duplication"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2083
+#: /home/jsm28/src/gcc-build/gcc/options.c:2087
msgid "Assume floating-point operations can trap"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2086
+#: /home/jsm28/src/gcc-build/gcc/options.c:2090
msgid "Trap for signed overflow in addition, subtraction and multiplication"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2089
+#: /home/jsm28/src/gcc-build/gcc/options.c:2093
msgid "Use tree-ssa based implementation of profiling"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2092
+#: /home/jsm28/src/gcc-build/gcc/options.c:2096
msgid "Enable SSA-CCP optimization on trees"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2095
+#: /home/jsm28/src/gcc-build/gcc/options.c:2099
msgid "Enable loop header copying on trees"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2098
+#: /home/jsm28/src/gcc-build/gcc/options.c:2102
msgid "Coalesce memory temporaries in the SSA->normal pass"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2101
+#: /home/jsm28/src/gcc-build/gcc/options.c:2105
msgid "Replace SSA temporaries with better names in copies."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2104
+#: /home/jsm28/src/gcc-build/gcc/options.c:2108
msgid "Enable SSA dead code elimination optimization on trees"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2107
+#: /home/jsm28/src/gcc-build/gcc/options.c:2111
msgid "Enable dominator optimizations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2110
+#: /home/jsm28/src/gcc-build/gcc/options.c:2114
msgid "Enable dead store elimination"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2113
+#: /home/jsm28/src/gcc-build/gcc/options.c:2117
msgid "Enable Full Redundancy Elimination (FRE) on trees"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2116
+#: /home/jsm28/src/gcc-build/gcc/options.c:2120
msgid "Enable loop invariant motion on trees"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2119
+#: /home/jsm28/src/gcc-build/gcc/options.c:2123
msgid "Create canonical induction variables in loops"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2122
+#: /home/jsm28/src/gcc-build/gcc/options.c:2126
msgid "Enable linear loop transforms on trees"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2125
+#: /home/jsm28/src/gcc-build/gcc/options.c:2129
msgid "Enable loop optimizations on tree level"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2128
+#: /home/jsm28/src/gcc-build/gcc/options.c:2132
msgid "Perform live range splitting during the SSA->normal pass."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2131
+#: /home/jsm28/src/gcc-build/gcc/options.c:2135
msgid "Enable SSA-PRE optimization on trees"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2134
+#: /home/jsm28/src/gcc-build/gcc/options.c:2138
msgid "Perform scalar replacement of aggregates"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2137
+#: /home/jsm28/src/gcc-build/gcc/options.c:2141
msgid "Replace temporary expressions in the SSA->normal pass"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2140
+#: /home/jsm28/src/gcc-build/gcc/options.c:2144
msgid "Enable loop vectorization on trees"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2143
+#: /home/jsm28/src/gcc-build/gcc/options.c:2147
msgid "Append underscores to externally visible names"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2146
+#: /home/jsm28/src/gcc-build/gcc/options.c:2150
msgid "Compile whole compilation unit at a time"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2149
+#: /home/jsm28/src/gcc-build/gcc/options.c:2153
msgid "Perform loop unrolling for all loops"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2152
+#: /home/jsm28/src/gcc-build/gcc/options.c:2156
msgid "Perform loop unrolling when iteration count is known"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2155
+#: /home/jsm28/src/gcc-build/gcc/options.c:2159
msgid "Allow math optimizations that may violate IEEE or ISO standards"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2158
+#: /home/jsm28/src/gcc-build/gcc/options.c:2162
msgid "When \"signed\" or \"unsigned\" is not given make the bitfield unsigned"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2161
+#: /home/jsm28/src/gcc-build/gcc/options.c:2165
msgid "Make \"char\" unsigned by default"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2164
+#: /home/jsm28/src/gcc-build/gcc/options.c:2168
msgid "Perform loop unswitching"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2167
+#: /home/jsm28/src/gcc-build/gcc/options.c:2171
msgid "Just generate unwind tables for exception handling"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2170
+#: /home/jsm28/src/gcc-build/gcc/options.c:2174
msgid "Generate code for the Boehm GC"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2173
+#: /home/jsm28/src/gcc-build/gcc/options.c:2177
msgid "Use __cxa_atexit to register destructors"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2176
+#: /home/jsm28/src/gcc-build/gcc/options.c:2180
msgid "Call a library routine to do integer divisions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2179
+#: /home/jsm28/src/gcc-build/gcc/options.c:2183
msgid "Perform variable tracking"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2182
+#: /home/jsm28/src/gcc-build/gcc/options.c:2186
msgid "Add extra commentary to assembler output"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2185
+#: /home/jsm28/src/gcc-build/gcc/options.c:2189
msgid "Marks all inlined methods as having hidden visibility"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2188
+#: /home/jsm28/src/gcc-build/gcc/options.c:2192
msgid ""
"-fvisibility=[default|internal|hidden|protected]\tSet the default symbol "
"visibility"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2191
+#: /home/jsm28/src/gcc-build/gcc/options.c:2195
msgid "Use expression value profiles in optimizations"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2194
+#: /home/jsm28/src/gcc-build/gcc/options.c:2198
msgid "Discard unused virtual functions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2197
+#: /home/jsm28/src/gcc-build/gcc/options.c:2201
msgid "Implement vtables using thunks"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2200
+#: /home/jsm28/src/gcc-build/gcc/options.c:2204
msgid "Emit common-like symbols as weak symbols"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2203
+#: /home/jsm28/src/gcc-build/gcc/options.c:2207
msgid "Construct webs and split unrelated uses of single variable"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2206
+#: /home/jsm28/src/gcc-build/gcc/options.c:2210
msgid ""
"-fwide-exec-charset=<cset>\tConvert all wide strings and character constants "
"to character set <cset>"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2209
+#: /home/jsm28/src/gcc-build/gcc/options.c:2213
msgid "Generate a #line directive pointing at the current working directory"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2212
+#: /home/jsm28/src/gcc-build/gcc/options.c:2216
msgid "Assume signed arithmetic overflow wraps around"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2215
+#: /home/jsm28/src/gcc-build/gcc/options.c:2219
msgid "Emit cross referencing information"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2218
+#: /home/jsm28/src/gcc-build/gcc/options.c:2222
msgid "Put zero initialized data in the bss section"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2221
+#: /home/jsm28/src/gcc-build/gcc/options.c:2225
msgid ""
"Generate lazy class lookup (via objc_getClass()) for use in Zero-Link mode"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2224
+#: /home/jsm28/src/gcc-build/gcc/options.c:2228
msgid "Generate debug information in default format"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2227
+#: /home/jsm28/src/gcc-build/gcc/options.c:2231
msgid "Generate debug information in COFF format"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2230
+#: /home/jsm28/src/gcc-build/gcc/options.c:2234
msgid "Generate debug information in DWARF v2 format"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2233
+#: /home/jsm28/src/gcc-build/gcc/options.c:2237
msgid "Dump declarations to a .decl file"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2236
+#: /home/jsm28/src/gcc-build/gcc/options.c:2240
msgid "Generate debug information in default extended format"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2239
+#: /home/jsm28/src/gcc-build/gcc/options.c:2243
msgid "Generate debug information in STABS format"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2242
+#: /home/jsm28/src/gcc-build/gcc/options.c:2246
msgid "Generate debug information in extended STABS format"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2245
+#: /home/jsm28/src/gcc-build/gcc/options.c:2249
msgid "Generate debug information in VMS format"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2248
+#: /home/jsm28/src/gcc-build/gcc/options.c:2252
msgid "Generate debug information in XCOFF format"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2251
+#: /home/jsm28/src/gcc-build/gcc/options.c:2255
msgid "Generate debug information in extended XCOFF format"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2254
+#: /home/jsm28/src/gcc-build/gcc/options.c:2258
msgid "Set the default integer kind to double precision"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2257
+#: /home/jsm28/src/gcc-build/gcc/options.c:2261
msgid "-idirafter <dir>\tAdd <dir> to the end of the system include path"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2260
+#: /home/jsm28/src/gcc-build/gcc/options.c:2264
msgid "-imacros <file>\tAccept definition of macros in <file>"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2263
+#: /home/jsm28/src/gcc-build/gcc/options.c:2267
msgid "-include <file>\tInclude the contents of <file> before other files"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2266
+#: /home/jsm28/src/gcc-build/gcc/options.c:2270
msgid "-iprefix <path>\tSpecify <path> as a prefix for next two options"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2269
+#: /home/jsm28/src/gcc-build/gcc/options.c:2273
msgid "-iquote <dir>\tAdd <dir> to the end of the quote include path"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2272
+#: /home/jsm28/src/gcc-build/gcc/options.c:2276
msgid "-isysroot <dir>\tSet <dir> to be the system root directory"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2275
+#: /home/jsm28/src/gcc-build/gcc/options.c:2279
msgid "-isystem <dir>\tAdd <dir> to the start of the system include path"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2278
+#: /home/jsm28/src/gcc-build/gcc/options.c:2282
msgid "-iwithprefix <dir>\tAdd <dir> to the end of the system include path"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2281
+#: /home/jsm28/src/gcc-build/gcc/options.c:2285
msgid "-iwithprefixbefore <dir>\tAdd <dir> to the end of the main include path"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2293
+#: /home/jsm28/src/gcc-build/gcc/options.c:2297
msgid ""
"Do not search standard system include directories (those specified with -"
"isystem will still be used)"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2296
+#: /home/jsm28/src/gcc-build/gcc/options.c:2300
msgid "Do not search standard system include directories for C++"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2299
+#: /home/jsm28/src/gcc-build/gcc/options.c:2303
msgid "-o <file>\tPlace output into <file>"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2302
+#: /home/jsm28/src/gcc-build/gcc/options.c:2306
msgid "Enable function profiling"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2305
+#: /home/jsm28/src/gcc-build/gcc/options.c:2309
msgid "Issue warnings needed for strict compliance to the standard"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2308
+#: /home/jsm28/src/gcc-build/gcc/options.c:2312
msgid "Like -pedantic but issue them as errors"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2311
+#: /home/jsm28/src/gcc-build/gcc/options.c:2315
msgid "Generate C header of platform-specific features"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2314
+#: /home/jsm28/src/gcc-build/gcc/options.c:2318
msgid "-qkind=<n>\tSet the kind for a real with the 'q' exponent to 'n'"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2317
+#: /home/jsm28/src/gcc-build/gcc/options.c:2321
msgid "Do not display functions compiled or elapsed time"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2320
+#: /home/jsm28/src/gcc-build/gcc/options.c:2324
msgid "Set the default real kind to double precision"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2323
+#: /home/jsm28/src/gcc-build/gcc/options.c:2327
msgid "Remap file names when including files"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2326
+#: /home/jsm28/src/gcc-build/gcc/options.c:2330
msgid "Conform to the ISO 1998 C++ standard"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2329
+#: /home/jsm28/src/gcc-build/gcc/options.c:2333
msgid "Conform to the ISO 1990 C standard"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2332
+#: /home/jsm28/src/gcc-build/gcc/options.c:2336
msgid "Conform to the ISO 1999 C standard"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2335
-#: /home/jsm28/src/gcc-build/gcc/options.c:2365
-#: /home/jsm28/src/gcc-build/gcc/options.c:2368
+#: /home/jsm28/src/gcc-build/gcc/options.c:2339
+#: /home/jsm28/src/gcc-build/gcc/options.c:2369
+#: /home/jsm28/src/gcc-build/gcc/options.c:2372
msgid "Deprecated in favor of -std=c99"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2338
+#: /home/jsm28/src/gcc-build/gcc/options.c:2342
msgid "Conform to the ISO Fortran 2003 standard."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2341
+#: /home/jsm28/src/gcc-build/gcc/options.c:2345
msgid "Conform to the ISO Fortran 95 standard."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2344
+#: /home/jsm28/src/gcc-build/gcc/options.c:2348
msgid "Conform nothing in particular."
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2347
+#: /home/jsm28/src/gcc-build/gcc/options.c:2351
msgid "Conform to the ISO 1998 C++ standard with GNU extensions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2350
+#: /home/jsm28/src/gcc-build/gcc/options.c:2354
msgid "Conform to the ISO 1990 C standard with GNU extensions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2353
+#: /home/jsm28/src/gcc-build/gcc/options.c:2357
msgid "Conform to the ISO 1999 C standard with GNU extensions"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2356
+#: /home/jsm28/src/gcc-build/gcc/options.c:2360
msgid "Deprecated in favor of -std=gnu99"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2359
+#: /home/jsm28/src/gcc-build/gcc/options.c:2363
msgid "Deprecated in favor of -std=c89"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2362
+#: /home/jsm28/src/gcc-build/gcc/options.c:2366
msgid "Conform to the ISO 1990 C standard as amended in 1994"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2371
+#: /home/jsm28/src/gcc-build/gcc/options.c:2375
msgid "Enable traditional preprocessing"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2374
+#: /home/jsm28/src/gcc-build/gcc/options.c:2378
msgid "-trigraphs\tSupport ISO C trigraphs"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2377
+#: /home/jsm28/src/gcc-build/gcc/options.c:2381
msgid "Do not predefine system-specific and GCC-specific macros"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2380
+#: /home/jsm28/src/gcc-build/gcc/options.c:2384
msgid "Enable verbose output"
msgstr ""
-#: /home/jsm28/src/gcc-build/gcc/options.c:2386
+#: /home/jsm28/src/gcc-build/gcc/options.c:2390
msgid "Suppress warnings"
msgstr ""
@@ -20433,14 +20506,6 @@ msgstr ""
msgid "SH2a does not support little-endian"
msgstr ""
-#: config/arm/arm.h:151
-msgid "-msoft-float and -mhard_float may not be used together"
-msgstr ""
-
-#: config/arm/arm.h:153
-msgid "-mbig-endian and -mlittle-endian may not be used together"
-msgstr ""
-
#: java/lang-specs.h:34
msgid "-fjni and -femit-class-files are incompatible"
msgstr ""
@@ -20453,10 +20518,6 @@ msgstr ""
msgid "-femit-class-file should used along with -fsyntax-only"
msgstr ""
-#: config/i386/mingw32.h:58 config/i386/cygwin.h:70
-msgid "shared and mdll are not compatible"
-msgstr ""
-
#: config/darwin.h:248
msgid "-current_version only allowed with -dynamiclib"
msgstr ""
@@ -20493,39 +20554,42 @@ msgstr ""
msgid "-private_bundle not allowed with -dynamiclib"
msgstr ""
-#: config/sparc/linux64.h:207 config/sparc/linux64.h:218
-#: config/sparc/netbsd-elf.h:136 config/sparc/netbsd-elf.h:155
-#: config/sparc/sol2-bi.h:195 config/sparc/sol2-bi.h:205
-msgid "may not use both -m32 and -m64"
+#: config/arm/arm.h:151
+msgid "-msoft-float and -mhard_float may not be used together"
msgstr ""
-#: treelang/lang-specs.h:52
-msgid "-pg or -p and -fomit-frame-pointer are incompatible"
+#: config/arm/arm.h:153
+msgid "-mbig-endian and -mlittle-endian may not be used together"
msgstr ""
-#: java/jvspec.c:80 ada/lang-specs.h:34 gcc.c:796
-msgid "-pg and -fomit-frame-pointer are incompatible"
+#: config/i386/mingw32.h:58 config/i386/cygwin.h:70
+msgid "shared and mdll are not compatible"
msgstr ""
#: config/vax/netbsd-elf.h:42
msgid "The -shared option is not currently supported for VAX ELF."
msgstr ""
-#: config/vax/vax.h:50 config/vax/vax.h:51
-msgid "profiling not supported with -mg\n"
-msgstr ""
-
#: config/i386/nwld.h:34
msgid "Static linking is not supported.\n"
msgstr ""
-#: config/mcore/mcore.h:57
-msgid "the m210 does not have little endian support"
+#: config/sparc/linux64.h:207 config/sparc/linux64.h:218
+#: config/sparc/netbsd-elf.h:136 config/sparc/netbsd-elf.h:155
+#: config/sparc/sol2-bi.h:195 config/sparc/sol2-bi.h:205
+msgid "may not use both -m32 and -m64"
msgstr ""
-#: config/sparc/sol2-bi.h:167 config/sparc/sol2-bi.h:172
-#: config/sparc/sol2-gld-bi.h:17 config/sparc/sol2-gld-bi.h:22
-msgid "does not support multilib"
+#: treelang/lang-specs.h:52
+msgid "-pg or -p and -fomit-frame-pointer are incompatible"
+msgstr ""
+
+#: java/jvspec.c:80 ada/lang-specs.h:34 gcc.c:796
+msgid "-pg and -fomit-frame-pointer are incompatible"
+msgstr ""
+
+#: config/vax/vax.h:50 config/vax/vax.h:51
+msgid "profiling not supported with -mg\n"
msgstr ""
#: ada/lang-specs.h:35
@@ -20548,12 +20612,8 @@ msgstr ""
msgid "mno-cygwin and mno-win32 are not compatible"
msgstr ""
-#: config/lynx.h:71
-msgid "Cannot use mthreads and mlegacy-threads together."
-msgstr ""
-
-#: config/lynx.h:96
-msgid "Cannot use mshared and static together."
+#: config/mcore/mcore.h:57
+msgid "the m210 does not have little endian support"
msgstr ""
#: gcc.c:769
@@ -20564,6 +20624,19 @@ msgstr ""
msgid "-E required when input is from standard input"
msgstr ""
+#: config/lynx.h:71
+msgid "Cannot use mthreads and mlegacy-threads together."
+msgstr ""
+
+#: config/lynx.h:96
+msgid "Cannot use mshared and static together."
+msgstr ""
+
+#: config/sparc/sol2-bi.h:167 config/sparc/sol2-bi.h:172
+#: config/sparc/sol2-gld-bi.h:17 config/sparc/sol2-gld-bi.h:22
+msgid "does not support multilib"
+msgstr ""
+
#: config/rs6000/darwin.h:132
msgid " conflicting code gen style switches are used"
msgstr ""
diff --git a/gcc/postreload-gcse.c b/gcc/postreload-gcse.c
index 0238acefccf..144cc5f67b6 100644
--- a/gcc/postreload-gcse.c
+++ b/gcc/postreload-gcse.c
@@ -968,11 +968,12 @@ static bool
bb_has_well_behaved_predecessors (basic_block bb)
{
edge pred;
+ edge_iterator ei;
- if (! bb->pred)
+ if (EDGE_COUNT (bb->preds) == 0)
return false;
- for (pred = bb->pred; pred != NULL; pred = pred->pred_next)
+ FOR_EACH_EDGE (pred, ei, bb->preds)
{
if ((pred->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (pred))
return false;
@@ -1023,6 +1024,7 @@ eliminate_partially_redundant_load (basic_block bb, rtx insn,
int npred_ok = 0;
gcov_type ok_count = 0; /* Redundant load execution count. */
gcov_type critical_count = 0; /* Execution count of critical edges. */
+ edge_iterator ei;
/* The execution count of the loads to be added to make the
load fully redundant. */
@@ -1038,7 +1040,7 @@ eliminate_partially_redundant_load (basic_block bb, rtx insn,
return;
/* Check potential for replacing load with copy for predecessors. */
- for (pred = bb->pred; pred; pred = pred->pred_next)
+ FOR_EACH_EDGE (pred, ei, bb->preds)
{
rtx next_pred_bb_end;
diff --git a/gcc/predict.c b/gcc/predict.c
index 18b6b90814c..8611f30d8aa 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -248,7 +248,7 @@ can_predict_insn_p (rtx insn)
{
return (JUMP_P (insn)
&& any_condjump_p (insn)
- && BLOCK_FOR_INSN (insn)->succ->succ_next);
+ && EDGE_COUNT (BLOCK_FOR_INSN (insn)->succs) >= 2);
}
/* Predict edge E by given predictor if possible. */
@@ -287,13 +287,15 @@ static void
dump_prediction (FILE *file, enum br_predictor predictor, int probability,
basic_block bb, int used)
{
- edge e = bb->succ;
+ edge e;
+ edge_iterator ei;
if (!file)
return;
- while (e && (e->flags & EDGE_FALLTHRU))
- e = e->succ_next;
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ if (! (e->flags & EDGE_FALLTHRU))
+ break;
fprintf (file, " %s heuristics%s: %.1f%%",
predictor_info[predictor].name,
@@ -321,11 +323,12 @@ set_even_probabilities (basic_block bb)
{
int nedges = 0;
edge e;
+ edge_iterator ei;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (!(e->flags & (EDGE_EH | EDGE_FAKE)))
nedges ++;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (!(e->flags & (EDGE_EH | EDGE_FAKE)))
e->probability = (REG_BR_PROB_BASE + nedges / 2) / nedges;
else
@@ -430,14 +433,14 @@ combine_predictions_for_insn (rtx insn, basic_block bb)
/* Save the prediction into CFG in case we are seeing non-degenerated
conditional jump. */
- if (bb->succ->succ_next)
+ if (EDGE_COUNT (bb->succs) > 1)
{
BRANCH_EDGE (bb)->probability = combined_probability;
FALLTHRU_EDGE (bb)->probability
= REG_BR_PROB_BASE - combined_probability;
}
}
- else if (bb->succ->succ_next)
+ else if (EDGE_COUNT (bb->succs) > 1)
{
int prob = INTVAL (XEXP (prob_note, 0));
@@ -445,7 +448,7 @@ combine_predictions_for_insn (rtx insn, basic_block bb)
FALLTHRU_EDGE (bb)->probability = REG_BR_PROB_BASE - prob;
}
else
- bb->succ->probability = REG_BR_PROB_BASE;
+ EDGE_SUCC (bb, 0)->probability = REG_BR_PROB_BASE;
}
/* Combine predictions into single probability and store them into CFG.
@@ -463,11 +466,12 @@ combine_predictions_for_bb (FILE *file, basic_block bb)
struct edge_prediction *pred;
int nedges = 0;
edge e, first = NULL, second = NULL;
+ edge_iterator ei;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (!(e->flags & (EDGE_EH | EDGE_FAKE)))
{
- nedges ++;
+ nedges ++;
if (first && !second)
second = e;
if (!first)
@@ -547,7 +551,7 @@ combine_predictions_for_bb (FILE *file, basic_block bb)
int predictor = pred->predictor;
int probability = pred->probability;
- if (pred->edge != bb->succ)
+ if (pred->edge != EDGE_SUCC (bb, 0))
probability = REG_BR_PROB_BASE - probability;
dump_prediction (file, predictor, probability, bb,
!first_match || best_predictor == predictor);
@@ -651,6 +655,7 @@ predict_loops (struct loops *loops_info, bool rtlsimpleloops)
{
int header_found = 0;
edge e;
+ edge_iterator ei;
bb = bbs[j];
@@ -664,7 +669,7 @@ predict_loops (struct loops *loops_info, bool rtlsimpleloops)
/* Loop branch heuristics - predict an edge back to a
loop's head as taken. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->dest == loop->header
&& e->src == loop->latch)
{
@@ -675,7 +680,7 @@ predict_loops (struct loops *loops_info, bool rtlsimpleloops)
/* Loop exit heuristics - predict an edge exiting the loop if the
conditional has no loop header successors as not taken. */
if (!header_found)
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->dest->index < 0
|| !flow_bb_inside_loop_p (loop, e->dest))
predict_edge
@@ -814,18 +819,19 @@ estimate_probability (struct loops *loops_info)
{
rtx last_insn = BB_END (bb);
edge e;
+ edge_iterator ei;
if (! can_predict_insn_p (last_insn))
continue;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
/* Predict early returns to be probable, as we've already taken
care for error returns and other are often used for fast paths
trought function. */
if ((e->dest == EXIT_BLOCK_PTR
- || (e->dest->succ && !e->dest->succ->succ_next
- && e->dest->succ->dest == EXIT_BLOCK_PTR))
+ || (EDGE_COUNT (e->dest->succs) == 1
+ && EDGE_SUCC (e->dest, 0)->dest == EXIT_BLOCK_PTR))
&& !predicted_by_p (bb, PRED_NULL_RETURN)
&& !predicted_by_p (bb, PRED_CONST_RETURN)
&& !predicted_by_p (bb, PRED_NEGATIVE_RETURN)
@@ -1021,12 +1027,13 @@ tree_predict_by_opcode (basic_block bb)
tree type;
tree val;
bitmap visited;
+ edge_iterator ei;
if (!stmt || TREE_CODE (stmt) != COND_EXPR)
return;
- for (then_edge = bb->succ; then_edge; then_edge = then_edge->succ_next)
+ FOR_EACH_EDGE (then_edge, ei, bb->succs)
if (then_edge->flags & EDGE_TRUE_VALUE)
- break;
+ break;
cond = TREE_OPERAND (stmt, 0);
if (!COMPARISON_CLASS_P (cond))
return;
@@ -1180,8 +1187,9 @@ apply_return_prediction (int *heads)
int phi_num_args, i;
enum br_predictor pred;
enum prediction direction;
+ edge_iterator ei;
- for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
{
return_stmt = last_stmt (e->src);
if (TREE_CODE (return_stmt) == RETURN_EXPR)
@@ -1297,19 +1305,21 @@ tree_estimate_probability (void)
FOR_EACH_BB (bb)
{
edge e;
+ edge_iterator ei;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
/* Predict early returns to be probable, as we've already taken
care for error returns and other cases are often used for
fast paths trought function. */
if (e->dest == EXIT_BLOCK_PTR
&& TREE_CODE (last_stmt (bb)) == RETURN_EXPR
- && bb->pred && bb->pred->pred_next)
+ && EDGE_COUNT (bb->preds) > 1)
{
edge e1;
+ edge_iterator ei1;
- for (e1 = bb->pred; e1; e1 = e1->pred_next)
+ FOR_EACH_EDGE (e1, ei1, bb->preds)
if (!predicted_by_p (e1->src, PRED_NULL_RETURN)
&& !predicted_by_p (e1->src, PRED_CONST_RETURN)
&& !predicted_by_p (e1->src, PRED_NEGATIVE_RETURN)
@@ -1447,8 +1457,8 @@ last_basic_block_p (basic_block bb)
return (bb->next_bb == EXIT_BLOCK_PTR
|| (bb->next_bb->next_bb == EXIT_BLOCK_PTR
- && bb->succ && !bb->succ->succ_next
- && bb->succ->dest->next_bb == EXIT_BLOCK_PTR));
+ && EDGE_COUNT (bb->succs) == 1
+ && EDGE_SUCC (bb, 0)->dest->next_bb == EXIT_BLOCK_PTR));
}
/* Sets branch probabilities according to PREDiction and
@@ -1462,6 +1472,7 @@ predict_paths_leading_to (basic_block bb, int *heads, enum br_predictor pred,
enum prediction taken)
{
edge e;
+ edge_iterator ei;
int y;
if (heads[bb->index] < 0)
@@ -1501,7 +1512,7 @@ predict_paths_leading_to (basic_block bb, int *heads, enum br_predictor pred,
if (y == last_basic_block)
return;
- for (e = BASIC_BLOCK (y)->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, BASIC_BLOCK (y)->succs)
if (e->dest->index >= 0
&& dominated_by_p (CDI_POST_DOMINATORS, e->dest, bb))
predict_edge_def (e, pred, taken);
@@ -1557,9 +1568,10 @@ propagate_freq (struct loop *loop)
{
if (BLOCK_INFO (bb)->tovisit)
{
+ edge_iterator ei;
int count = 0;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (BLOCK_INFO (e->src)->tovisit && !(e->flags & EDGE_DFS_BACK))
count++;
else if (BLOCK_INFO (e->src)->tovisit
@@ -1575,6 +1587,7 @@ propagate_freq (struct loop *loop)
last = head;
for (bb = head; bb; bb = nextbb)
{
+ edge_iterator ei;
sreal cyclic_probability, frequency;
memcpy (&cyclic_probability, &real_zero, sizeof (real_zero));
@@ -1587,12 +1600,12 @@ propagate_freq (struct loop *loop)
if (bb != head)
{
#ifdef ENABLE_CHECKING
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (BLOCK_INFO (e->src)->tovisit && !(e->flags & EDGE_DFS_BACK))
abort ();
#endif
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (EDGE_INFO (e)->back_edge)
{
sreal_add (&cyclic_probability, &cyclic_probability,
@@ -1637,15 +1650,15 @@ propagate_freq (struct loop *loop)
BLOCK_INFO (bb)->tovisit = 0;
/* Compute back edge frequencies. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->dest == head)
{
sreal tmp;
-
+
/* EDGE_INFO (e)->back_edge_prob
- = ((e->probability * BLOCK_INFO (bb)->frequency)
- / REG_BR_PROB_BASE); */
-
+ = ((e->probability * BLOCK_INFO (bb)->frequency)
+ / REG_BR_PROB_BASE); */
+
sreal_init (&tmp, e->probability, 0);
sreal_mul (&tmp, &tmp, &BLOCK_INFO (bb)->frequency);
sreal_mul (&EDGE_INFO (e)->back_edge_prob,
@@ -1653,7 +1666,7 @@ propagate_freq (struct loop *loop)
}
/* Propagate to successor blocks. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (!(e->flags & EDGE_DFS_BACK)
&& BLOCK_INFO (e->dest)->npredecessors)
{
@@ -1664,10 +1677,10 @@ propagate_freq (struct loop *loop)
nextbb = e->dest;
else
BLOCK_INFO (last)->next = e->dest;
-
+
last = e->dest;
}
- }
+ }
}
}
@@ -1686,7 +1699,8 @@ estimate_loops_at_level (struct loop *first_loop)
estimate_loops_at_level (loop->inner);
- if (loop->latch->succ) /* Do not do this for dummy function loop. */
+ /* Do not do this for dummy function loop. */
+ if (EDGE_COUNT (loop->latch->succs) > 0)
{
/* Find current loop back edge and mark it. */
e = loop_latch_edge (loop);
@@ -1787,7 +1801,7 @@ estimate_bb_frequencies (struct loops *loops)
mark_dfs_back_edges ();
- ENTRY_BLOCK_PTR->succ->probability = REG_BR_PROB_BASE;
+ EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->probability = REG_BR_PROB_BASE;
/* Set up block info for each basic block. */
alloc_aux_for_blocks (sizeof (struct block_info_def));
@@ -1795,9 +1809,10 @@ estimate_bb_frequencies (struct loops *loops)
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
{
edge e;
+ edge_iterator ei;
BLOCK_INFO (bb)->tovisit = 0;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
sreal_init (&EDGE_INFO (e)->back_edge_prob, e->probability, 0);
sreal_mul (&EDGE_INFO (e)->back_edge_prob,
diff --git a/gcc/profile.c b/gcc/profile.c
index d7e6f58104d..ff85544e595 100644
--- a/gcc/profile.c
+++ b/gcc/profile.c
@@ -142,8 +142,9 @@ instrument_edges (struct edge_list *el)
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
{
edge e;
+ edge_iterator ei;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
struct edge_info *inf = EDGE_INFO (e);
@@ -239,7 +240,9 @@ get_exec_counts (void)
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
{
edge e;
- for (e = bb->succ; e; e = e->succ_next)
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (!EDGE_INFO (e)->ignore && !EDGE_INFO (e)->on_tree)
num_edges++;
}
@@ -295,11 +298,12 @@ compute_branch_probabilities (void)
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
{
edge e;
+ edge_iterator ei;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (!EDGE_INFO (e)->ignore)
BB_INFO (bb)->succ_count++;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (!EDGE_INFO (e)->ignore)
BB_INFO (bb)->pred_count++;
}
@@ -317,7 +321,9 @@ compute_branch_probabilities (void)
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
{
edge e;
- for (e = bb->succ; e; e = e->succ_next)
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (!EDGE_INFO (e)->ignore && !EDGE_INFO (e)->on_tree)
{
num_edges++;
@@ -380,9 +386,10 @@ compute_branch_probabilities (void)
if (bi->succ_count == 0)
{
edge e;
+ edge_iterator ei;
gcov_type total = 0;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
total += e->count;
bb->count = total;
bi->count_valid = 1;
@@ -391,9 +398,10 @@ compute_branch_probabilities (void)
else if (bi->pred_count == 0)
{
edge e;
+ edge_iterator ei;
gcov_type total = 0;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
total += e->count;
bb->count = total;
bi->count_valid = 1;
@@ -405,15 +413,16 @@ compute_branch_probabilities (void)
if (bi->succ_count == 1)
{
edge e;
+ edge_iterator ei;
gcov_type total = 0;
/* One of the counts will be invalid, but it is zero,
so adding it in also doesn't hurt. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
total += e->count;
/* Seedgeh for the invalid edge, and set its count. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (! EDGE_INFO (e)->count_valid && ! EDGE_INFO (e)->ignore)
break;
@@ -432,15 +441,16 @@ compute_branch_probabilities (void)
if (bi->pred_count == 1)
{
edge e;
+ edge_iterator ei;
gcov_type total = 0;
/* One of the counts will be invalid, but it is zero,
so adding it in also doesn't hurt. */
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
total += e->count;
/* Search for the invalid edge, and set its count. */
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (!EDGE_INFO (e)->count_valid && !EDGE_INFO (e)->ignore)
break;
@@ -485,6 +495,7 @@ compute_branch_probabilities (void)
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
{
edge e;
+ edge_iterator ei;
rtx note;
if (bb->count < 0)
@@ -493,7 +504,7 @@ compute_branch_probabilities (void)
bb->index, (int)bb->count);
bb->count = 0;
}
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
/* Function may return twice in the cased the called function is
setjmp or calls fork, but we can't represent this by extra
@@ -518,11 +529,11 @@ compute_branch_probabilities (void)
}
if (bb->count)
{
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
e->probability = (e->count * REG_BR_PROB_BASE + bb->count / 2) / bb->count;
if (bb->index >= 0
&& block_ends_with_condjump_p (bb)
- && bb->succ->succ_next)
+ && EDGE_COUNT (bb->succs) >= 2)
{
int prob;
edge e;
@@ -530,9 +541,9 @@ compute_branch_probabilities (void)
/* Find the branch edge. It is possible that we do have fake
edges here. */
- for (e = bb->succ; e->flags & (EDGE_FAKE | EDGE_FALLTHRU);
- e = e->succ_next)
- continue; /* Loop body has been intentionally left blank. */
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ if (!(e->flags & (EDGE_FAKE | EDGE_FALLTHRU)))
+ break;
prob = e->probability;
index = prob * 20 / REG_BR_PROB_BASE;
@@ -561,7 +572,7 @@ compute_branch_probabilities (void)
tree based profile guessing put into code. */
else if (profile_status == PROFILE_ABSENT
&& !ir_type ()
- && bb->succ && bb->succ->succ_next
+ && EDGE_COUNT (bb->succs) > 1
&& (note = find_reg_note (BB_END (bb), REG_BR_PROB, 0)))
{
int prob = INTVAL (XEXP (note, 0));
@@ -578,12 +589,12 @@ compute_branch_probabilities (void)
{
int total = 0;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (!(e->flags & (EDGE_COMPLEX | EDGE_FAKE)))
total ++;
if (total)
{
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (!(e->flags & (EDGE_COMPLEX | EDGE_FAKE)))
e->probability = REG_BR_PROB_BASE / total;
else
@@ -591,14 +602,13 @@ compute_branch_probabilities (void)
}
else
{
- for (e = bb->succ; e; e = e->succ_next)
- total ++;
- for (e = bb->succ; e; e = e->succ_next)
+ total += EDGE_COUNT (bb->succs);
+ FOR_EACH_EDGE (e, ei, bb->succs)
e->probability = REG_BR_PROB_BASE / total;
}
if (bb->index >= 0
&& block_ends_with_condjump_p (bb)
- && bb->succ->succ_next)
+ && EDGE_COUNT (bb->succs) >= 2)
num_branches++, num_never_executed;
}
}
@@ -789,6 +799,7 @@ branch_prob (void)
int need_exit_edge = 0, need_entry_edge = 0;
int have_exit_edge = 0, have_entry_edge = 0;
edge e;
+ edge_iterator ei;
/* Functions returning multiple times are not handled by extra edges.
Instead we simply allow negative counts on edges from exit to the
@@ -796,7 +807,7 @@ branch_prob (void)
with the extra edges because that would result in flowgraph that
needs to have fake edges outside the spanning tree. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if ((e->flags & (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL))
&& e->dest != EXIT_BLOCK_PTR)
@@ -804,7 +815,7 @@ branch_prob (void)
if (e->dest == EXIT_BLOCK_PTR)
have_exit_edge = 1;
}
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
if ((e->flags & (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL))
&& e->src != ENTRY_BLOCK_PTR)
@@ -915,11 +926,12 @@ branch_prob (void)
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
{
edge e;
+ edge_iterator ei;
offset = gcov_write_tag (GCOV_TAG_ARCS);
gcov_write_unsigned (BB_TO_GCOV_INDEX (bb));
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
struct edge_info *i = EDGE_INFO (e);
if (!i->ignore)
@@ -992,7 +1004,7 @@ branch_prob (void)
{
expanded_location s;
NOTE_EXPANDED_LOCATION (s, insn);
- output_location (s.file, NOTE_LINE_NUMBER (insn), &offset, bb);
+ output_location (s.file, s.line, &offset, bb);
}
}
insn = NEXT_INSN (insn);
@@ -1037,10 +1049,10 @@ branch_prob (void)
/* Notice GOTO expressions we eliminated while constructing the
CFG. */
- if (bb->succ && !bb->succ->succ_next && bb->succ->goto_locus)
+ if (EDGE_COUNT (bb->succs) == 1 && EDGE_SUCC (bb, 0)->goto_locus)
{
/* ??? source_locus type is marked deprecated in input.h. */
- source_locus curr_location = bb->succ->goto_locus;
+ source_locus curr_location = EDGE_SUCC (bb, 0)->goto_locus;
/* ??? The FILE/LINE API is inconsistent for these cases. */
#ifdef USE_MAPPED_LOCATION
output_location (LOCATION_FILE (curr_location),
diff --git a/gcc/protoize.c b/gcc/protoize.c
index 937f21cfbde..e48089272dd 100644
--- a/gcc/protoize.c
+++ b/gcc/protoize.c
@@ -970,7 +970,7 @@ free_def_dec (def_dec_info *p)
free (p);
}
-/* Unexpand as many macro symbol as we can find.
+/* Unexpand as many macro symbols as we can find.
If the given line must be unexpanded, make a copy of it in the heap and
return a pointer to the unexpanded copy. Otherwise return NULL. */
diff --git a/gcc/ra-build.c b/gcc/ra-build.c
index 69f6aaa5872..b66e0972c7d 100644
--- a/gcc/ra-build.c
+++ b/gcc/ra-build.c
@@ -924,6 +924,7 @@ live_in (struct df *df, struct curr_use *use, rtx insn)
are allowed. */
while (1)
{
+ unsigned int i;
int uid = INSN_UID (insn);
basic_block bb = BLOCK_FOR_INSN (insn);
number_seen[uid]++;
@@ -940,7 +941,7 @@ live_in (struct df *df, struct curr_use *use, rtx insn)
edge e;
unsigned HOST_WIDE_INT undef = use->undefined;
struct ra_bb_info *info = (struct ra_bb_info *) bb->aux;
- if ((e = bb->pred) == NULL)
+ if (EDGE_COUNT (bb->preds) == 0)
return;
/* We now check, if we already traversed the predecessors of this
block for the current pass and the current set of undefined
@@ -952,8 +953,9 @@ live_in (struct df *df, struct curr_use *use, rtx insn)
info->pass = loc_vpass;
info->undefined = undef;
/* All but the last predecessor are handled recursively. */
- for (; e->pred_next; e = e->pred_next)
+ for (e = NULL, i = 0; i < EDGE_COUNT (bb->preds) - 1; i++)
{
+ e = EDGE_PRED (bb, i);
insn = live_in_edge (df, use, e);
if (insn)
live_in (df, use, insn);
diff --git a/gcc/ra-rewrite.c b/gcc/ra-rewrite.c
index 23c26ba9c3f..fa00e370648 100644
--- a/gcc/ra-rewrite.c
+++ b/gcc/ra-rewrite.c
@@ -1350,13 +1350,17 @@ rewrite_program2 (bitmap new_deaths)
int in_ir = 0;
edge e;
int num = 0;
+ edge_iterator ei;
bitmap_iterator bi;
HARD_REG_SET cum_colors, colors;
CLEAR_HARD_REG_SET (cum_colors);
- for (e = bb->pred; e && num < 5; e = e->pred_next, num++)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
int j;
+
+ if (num >= 5)
+ break;
CLEAR_HARD_REG_SET (colors);
EXECUTE_IF_SET_IN_BITMAP (live_at_end[e->src->index], 0, j, bi)
{
@@ -1366,6 +1370,7 @@ rewrite_program2 (bitmap new_deaths)
update_spill_colors (&colors, web, 1);
}
IOR_HARD_REG_SET (cum_colors, colors);
+ num++;
}
if (num == 5)
in_ir = 1;
diff --git a/gcc/ra.c b/gcc/ra.c
index a821623ba52..0b84dfc90b0 100644
--- a/gcc/ra.c
+++ b/gcc/ra.c
@@ -682,7 +682,9 @@ reg_alloc (void)
if (last)
{
edge e;
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
{
basic_block bb = e->src;
last = BB_END (bb);
diff --git a/gcc/read-rtl.c b/gcc/read-rtl.c
index 2cd4e22a4c1..c9a3fee81dd 100644
--- a/gcc/read-rtl.c
+++ b/gcc/read-rtl.c
@@ -245,13 +245,13 @@ apply_macro_to_string (const char *string, struct mapping *macro, int value)
return string;
base = p = copy = ASTRDUP (string);
- while ((start = index (p, '<')) && (end = index (start, '>')))
+ while ((start = strchr (p, '<')) && (end = strchr (start, '>')))
{
p = start + 1;
/* If there's a "macro:" prefix, check whether the macro name matches.
Set ATTR to the start of the attribute name. */
- attr = index (p, ':');
+ attr = strchr (p, ':');
if (attr == 0 || attr > end)
attr = p;
else
diff --git a/gcc/recog.c b/gcc/recog.c
index 7d6ce19c943..61e1186d07a 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -3116,9 +3116,9 @@ peephole2_optimize (FILE *dump_file ATTRIBUTE_UNUSED)
if (note || (was_call && nonlocal_goto_handler_labels))
{
edge eh_edge;
+ edge_iterator ei;
- for (eh_edge = bb->succ; eh_edge
- ; eh_edge = eh_edge->succ_next)
+ FOR_EACH_EDGE (eh_edge, ei, bb->succs)
if (eh_edge->flags & (EDGE_EH | EDGE_ABNORMAL_CALL))
break;
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c
index ee9c1e90402..b13753863a4 100644
--- a/gcc/reg-stack.c
+++ b/gcc/reg-stack.c
@@ -442,7 +442,9 @@ reg_to_stack (FILE *file)
FOR_EACH_BB_REVERSE (bb)
{
edge e;
- for (e = bb->pred; e; e = e->pred_next)
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (!(e->flags & EDGE_DFS_BACK)
&& e->src != ENTRY_BLOCK_PTR)
BLOCK_INFO (bb)->predecessors++;
@@ -2528,6 +2530,7 @@ convert_regs_entry (void)
{
int inserted = 0;
edge e;
+ edge_iterator ei;
basic_block block;
FOR_EACH_BB_REVERSE (block)
@@ -2557,7 +2560,7 @@ convert_regs_entry (void)
Note that we are inserting converted code here. This code is
never seen by the convert_regs pass. */
- for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
{
basic_block block = e->dest;
block_info bi = BLOCK_INFO (block);
@@ -2717,7 +2720,7 @@ compensate_edge (edge e, FILE *file)
instead of to the edge, because emit_swap can do minimal
insn scheduling. We can do this when there is only one
edge out, and it is not abnormal. */
- else if (block->succ->succ_next == NULL && !(e->flags & EDGE_ABNORMAL))
+ else if (EDGE_COUNT (block->succs) == 1 && !(e->flags & EDGE_ABNORMAL))
{
/* change_stack kills values in regstack. */
tmpstack = regstack;
@@ -2764,6 +2767,7 @@ convert_regs_1 (FILE *file, basic_block block)
rtx insn, next;
edge e, beste = NULL;
bool control_flow_insn_deleted = false;
+ edge_iterator ei;
inserted = 0;
deleted = 0;
@@ -2774,7 +2778,7 @@ convert_regs_1 (FILE *file, basic_block block)
if multiple such exists, take one with largest count, prefer critical
one (as splitting critical edges is more expensive), or one with lowest
index, to avoid random changes with different orders of the edges. */
- for (e = block->pred; e ; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, block->preds)
{
if (e->flags & EDGE_DFS_BACK)
;
@@ -2923,7 +2927,7 @@ convert_regs_1 (FILE *file, basic_block block)
bi->stack_out = regstack;
/* Compensate the back edges, as those wasn't visited yet. */
- for (e = block->succ; e ; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, block->succs)
{
if (e->flags & EDGE_DFS_BACK
|| (e->dest == EXIT_BLOCK_PTR))
@@ -2933,7 +2937,7 @@ convert_regs_1 (FILE *file, basic_block block)
inserted |= compensate_edge (e, file);
}
}
- for (e = block->pred; e ; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, block->preds)
{
if (e != beste && !(e->flags & EDGE_DFS_BACK)
&& e->src != ENTRY_BLOCK_PTR)
@@ -2967,6 +2971,7 @@ convert_regs_2 (FILE *file, basic_block block)
do
{
edge e;
+ edge_iterator ei;
block = *--sp;
@@ -2983,12 +2988,12 @@ convert_regs_2 (FILE *file, basic_block block)
stack the successor in all cases and hand over the task of
fixing up the discrepancy to convert_regs_1. */
- for (e = block->succ; e ; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, block->succs)
if (! (e->flags & EDGE_DFS_BACK))
{
BLOCK_INFO (e->dest)->predecessors--;
if (!BLOCK_INFO (e->dest)->predecessors)
- *sp++ = e->dest;
+ *sp++ = e->dest;
}
inserted |= convert_regs_1 (file, block);
@@ -3009,6 +3014,7 @@ convert_regs (FILE *file)
int inserted;
basic_block b;
edge e;
+ edge_iterator ei;
/* Initialize uninitialized registers on function entry. */
inserted = convert_regs_entry ();
@@ -3022,7 +3028,7 @@ convert_regs (FILE *file)
prevent double fxch that often appears at the head of a loop. */
/* Process all blocks reachable from all entry points. */
- for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
inserted |= convert_regs_2 (file, e->dest);
/* ??? Process all unreachable blocks. Though there's no excuse
diff --git a/gcc/regrename.c b/gcc/regrename.c
index c2e773d875f..330ed3b4284 100644
--- a/gcc/regrename.c
+++ b/gcc/regrename.c
@@ -1750,14 +1750,13 @@ copyprop_hardreg_forward (void)
processed, begin with the value data that was live at
the end of the predecessor block. */
/* ??? Ought to use more intelligent queuing of blocks. */
- if (bb->pred)
- for (bbp = bb; bbp && bbp != bb->pred->src; bbp = bbp->prev_bb);
- if (bb->pred
- && ! bb->pred->pred_next
- && ! (bb->pred->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
- && bb->pred->src != ENTRY_BLOCK_PTR
+ if (EDGE_COUNT (bb->preds) > 0)
+ for (bbp = bb; bbp && bbp != EDGE_PRED (bb, 0)->src; bbp = bbp->prev_bb);
+ if (EDGE_COUNT (bb->preds) == 1
+ && ! (EDGE_PRED (bb, 0)->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
+ && EDGE_PRED (bb, 0)->src != ENTRY_BLOCK_PTR
&& bbp)
- all_vd[bb->index] = all_vd[bb->pred->src->index];
+ all_vd[bb->index] = all_vd[EDGE_PRED (bb, 0)->src->index];
else
init_value_data (all_vd + bb->index);
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 052acc092ff..7fc23bc9a71 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -7008,25 +7008,25 @@ emit_reload_insns (struct insn_chain *chain)
reloads for the operand. The RELOAD_OTHER output reloads are
output in descending order by reload number. */
- emit_insn_before_sameloc (other_input_address_reload_insns, insn);
- emit_insn_before_sameloc (other_input_reload_insns, insn);
+ emit_insn_before (other_input_address_reload_insns, insn);
+ emit_insn_before (other_input_reload_insns, insn);
for (j = 0; j < reload_n_operands; j++)
{
- emit_insn_before_sameloc (inpaddr_address_reload_insns[j], insn);
- emit_insn_before_sameloc (input_address_reload_insns[j], insn);
- emit_insn_before_sameloc (input_reload_insns[j], insn);
+ emit_insn_before (inpaddr_address_reload_insns[j], insn);
+ emit_insn_before (input_address_reload_insns[j], insn);
+ emit_insn_before (input_reload_insns[j], insn);
}
- emit_insn_before_sameloc (other_operand_reload_insns, insn);
- emit_insn_before_sameloc (operand_reload_insns, insn);
+ emit_insn_before (other_operand_reload_insns, insn);
+ emit_insn_before (operand_reload_insns, insn);
for (j = 0; j < reload_n_operands; j++)
{
- rtx x = emit_insn_after_sameloc (outaddr_address_reload_insns[j], insn);
- x = emit_insn_after_sameloc (output_address_reload_insns[j], x);
- x = emit_insn_after_sameloc (output_reload_insns[j], x);
- emit_insn_after_sameloc (other_output_reload_insns[j], x);
+ rtx x = emit_insn_after (outaddr_address_reload_insns[j], insn);
+ x = emit_insn_after (output_address_reload_insns[j], x);
+ x = emit_insn_after (output_reload_insns[j], x);
+ emit_insn_after (other_output_reload_insns[j], x);
}
/* For all the spill regs newly reloaded in this instruction,
@@ -8033,10 +8033,11 @@ fixup_abnormal_edges (void)
FOR_EACH_BB (bb)
{
edge e;
+ edge_iterator ei;
/* Look for cases we are interested in - calls or instructions causing
exceptions. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->flags & EDGE_ABNORMAL_CALL)
break;
@@ -8049,7 +8050,7 @@ fixup_abnormal_edges (void)
{
rtx insn = BB_END (bb), stop = NEXT_INSN (BB_END (bb));
rtx next;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->flags & EDGE_FALLTHRU)
break;
/* Get past the new insns generated. Allow notes, as the insns may
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 8f7274a3c1b..ffc7ef5cb11 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1455,19 +1455,25 @@ extern rtx assign_temp (tree, int, int, int);
/* In emit-rtl.c */
extern rtx emit_insn_before (rtx, rtx);
+extern rtx emit_insn_before_noloc (rtx, rtx);
extern rtx emit_insn_before_setloc (rtx, rtx, int);
extern rtx emit_jump_insn_before (rtx, rtx);
+extern rtx emit_jump_insn_before_noloc (rtx, rtx);
extern rtx emit_jump_insn_before_setloc (rtx, rtx, int);
extern rtx emit_call_insn_before (rtx, rtx);
+extern rtx emit_call_insn_before_noloc (rtx, rtx);
extern rtx emit_call_insn_before_setloc (rtx, rtx, int);
extern rtx emit_barrier_before (rtx);
extern rtx emit_label_before (rtx, rtx);
extern rtx emit_note_before (int, rtx);
extern rtx emit_insn_after (rtx, rtx);
+extern rtx emit_insn_after_noloc (rtx, rtx);
extern rtx emit_insn_after_setloc (rtx, rtx, int);
extern rtx emit_jump_insn_after (rtx, rtx);
+extern rtx emit_jump_insn_after_noloc (rtx, rtx);
extern rtx emit_jump_insn_after_setloc (rtx, rtx, int);
extern rtx emit_call_insn_after (rtx, rtx);
+extern rtx emit_call_insn_after_noloc (rtx, rtx);
extern rtx emit_call_insn_after_setloc (rtx, rtx, int);
extern rtx emit_barrier_after (rtx);
extern rtx emit_label_after (rtx, rtx);
@@ -1499,19 +1505,6 @@ extern rtx skip_consecutive_labels (rtx);
extern rtx next_cc0_user (rtx);
extern rtx prev_cc0_setter (rtx);
-#define emit_insn_before_sameloc(INSN, BEFORE) \
- emit_insn_before_setloc (INSN, BEFORE, INSN_LOCATOR (BEFORE))
-#define emit_jump_insn_before_sameloc(INSN, BEFORE) \
- emit_jump_insn_before_setloc (INSN, BEFORE, INSN_LOCATOR (BEFORE))
-#define emit_call_insn_before_sameloc(INSN, BEFORE) \
- emit_call_insn_before_setloc (INSN, BEFORE, INSN_LOCATOR (BEFORE))
-#define emit_insn_after_sameloc(INSN, AFTER) \
- emit_insn_after_setloc (INSN, AFTER, INSN_LOCATOR (AFTER))
-#define emit_jump_insn_after_sameloc(INSN, AFTER) \
- emit_jump_insn_after_setloc (INSN, AFTER, INSN_LOCATOR (AFTER))
-#define emit_call_insn_after_sameloc(INSN, AFTER) \
- emit_call_insn_after_setloc (INSN, AFTER, INSN_LOCATOR (AFTER))
-
/* In cfglayout.c */
extern tree choose_inner_scope (tree, tree);
extern int insn_line (rtx);
diff --git a/gcc/sbitmap.c b/gcc/sbitmap.c
index f1d9c86ee30..554a4258076 100644
--- a/gcc/sbitmap.c
+++ b/gcc/sbitmap.c
@@ -514,12 +514,14 @@ sbitmap_intersection_of_succs (sbitmap dst, sbitmap *src, int bb)
basic_block b = BASIC_BLOCK (bb);
unsigned int set_size = dst->size;
edge e;
+ unsigned ix;
- for (e = b->succ; e != 0; e = e->succ_next)
+ for (e = NULL, ix = 0; ix < EDGE_COUNT (b->succs); ix++)
{
+ e = EDGE_SUCC (b, ix);
if (e->dest == EXIT_BLOCK_PTR)
continue;
-
+
sbitmap_copy (dst, src[e->dest->index]);
break;
}
@@ -527,11 +529,12 @@ sbitmap_intersection_of_succs (sbitmap dst, sbitmap *src, int bb)
if (e == 0)
sbitmap_ones (dst);
else
- for (e = e->succ_next; e != 0; e = e->succ_next)
+ for (++ix; ix < EDGE_COUNT (b->succs); ix++)
{
unsigned int i;
sbitmap_ptr p, r;
+ e = EDGE_SUCC (b, ix);
if (e->dest == EXIT_BLOCK_PTR)
continue;
@@ -551,9 +554,11 @@ sbitmap_intersection_of_preds (sbitmap dst, sbitmap *src, int bb)
basic_block b = BASIC_BLOCK (bb);
unsigned int set_size = dst->size;
edge e;
+ unsigned ix;
- for (e = b->pred; e != 0; e = e->pred_next)
+ for (e = NULL, ix = 0; ix < EDGE_COUNT (b->preds); ix++)
{
+ e = EDGE_PRED (b, ix);
if (e->src == ENTRY_BLOCK_PTR)
continue;
@@ -564,11 +569,12 @@ sbitmap_intersection_of_preds (sbitmap dst, sbitmap *src, int bb)
if (e == 0)
sbitmap_ones (dst);
else
- for (e = e->pred_next; e != 0; e = e->pred_next)
+ for (++ix; ix < EDGE_COUNT (b->preds); ix++)
{
unsigned int i;
sbitmap_ptr p, r;
+ e = EDGE_PRED (b, ix);
if (e->src == ENTRY_BLOCK_PTR)
continue;
@@ -588,9 +594,11 @@ sbitmap_union_of_succs (sbitmap dst, sbitmap *src, int bb)
basic_block b = BASIC_BLOCK (bb);
unsigned int set_size = dst->size;
edge e;
+ unsigned ix;
- for (e = b->succ; e != 0; e = e->succ_next)
+ for (ix = 0; ix < EDGE_COUNT (b->succs); ix++)
{
+ e = EDGE_SUCC (b, ix);
if (e->dest == EXIT_BLOCK_PTR)
continue;
@@ -598,14 +606,15 @@ sbitmap_union_of_succs (sbitmap dst, sbitmap *src, int bb)
break;
}
- if (e == 0)
+ if (ix == EDGE_COUNT (b->succs))
sbitmap_zero (dst);
else
- for (e = e->succ_next; e != 0; e = e->succ_next)
+ for (ix++; ix < EDGE_COUNT (b->succs); ix++)
{
unsigned int i;
sbitmap_ptr p, r;
+ e = EDGE_SUCC (b, ix);
if (e->dest == EXIT_BLOCK_PTR)
continue;
@@ -625,8 +634,9 @@ sbitmap_union_of_preds (sbitmap dst, sbitmap *src, int bb)
basic_block b = BASIC_BLOCK (bb);
unsigned int set_size = dst->size;
edge e;
+ unsigned ix;
- for (e = b->pred; e != 0; e = e->pred_next)
+ for (e = NULL, ix = 0; ix < EDGE_COUNT (b->preds); ix++)
{
if (e->src== ENTRY_BLOCK_PTR)
continue;
@@ -635,14 +645,15 @@ sbitmap_union_of_preds (sbitmap dst, sbitmap *src, int bb)
break;
}
- if (e == 0)
+ if (ix == EDGE_COUNT (b->preds))
sbitmap_zero (dst);
else
- for (e = e->pred_next; e != 0; e = e->pred_next)
+ for (ix++; ix < EDGE_COUNT (b->preds); ix++)
{
unsigned int i;
sbitmap_ptr p, r;
+ e = EDGE_PRED (b, ix);
if (e->src == ENTRY_BLOCK_PTR)
continue;
diff --git a/gcc/sched-ebb.c b/gcc/sched-ebb.c
index 2344d1e9de4..286d047a245 100644
--- a/gcc/sched-ebb.c
+++ b/gcc/sched-ebb.c
@@ -175,7 +175,9 @@ compute_jump_reg_dependencies (rtx insn, regset cond_set, regset used,
{
basic_block b = BLOCK_FOR_INSN (insn);
edge e;
- for (e = b->succ; e; e = e->succ_next)
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, b->succs)
if (e->flags & EDGE_FALLTHRU)
/* The jump may be a by-product of a branch that has been merged
in the main codepath after being conditionalized. Therefore
@@ -280,6 +282,7 @@ fix_basic_block_boundaries (basic_block bb, basic_block last, rtx head,
{
edge f;
rtx h;
+ edge_iterator ei;
/* An obscure special case, where we do have partially dead
instruction scheduled after last control flow instruction.
@@ -291,9 +294,10 @@ fix_basic_block_boundaries (basic_block bb, basic_block last, rtx head,
A safer solution can be to bring the code into sequence,
do the split and re-emit it back in case this will ever
trigger problem. */
- f = bb->prev_bb->succ;
- while (f && !(f->flags & EDGE_FALLTHRU))
- f = f->succ_next;
+
+ FOR_EACH_EDGE (f, ei, bb->prev_bb->succs)
+ if (f->flags & EDGE_FALLTHRU)
+ break;
if (f)
{
@@ -588,11 +592,12 @@ schedule_ebbs (FILE *dump_file)
for (;;)
{
edge e;
+ edge_iterator ei;
tail = BB_END (bb);
if (bb->next_bb == EXIT_BLOCK_PTR
|| LABEL_P (BB_HEAD (bb->next_bb)))
break;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if ((e->flags & EDGE_FALLTHRU) != 0)
break;
if (! e)
diff --git a/gcc/sched-rgn.c b/gcc/sched-rgn.c
index 4da38c530c6..50b48c24a0f 100644
--- a/gcc/sched-rgn.c
+++ b/gcc/sched-rgn.c
@@ -87,36 +87,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
/* nr_inter/spec counts interblock/speculative motion for the function. */
static int nr_inter, nr_spec;
-/* Control flow graph edges are kept in circular lists. */
-typedef struct
-{
- int from_block;
- int to_block;
- int next_in;
- int next_out;
-}
-haifa_edge;
-static haifa_edge *edge_table;
-
-#define NEXT_IN(edge) (edge_table[edge].next_in)
-#define NEXT_OUT(edge) (edge_table[edge].next_out)
-#define FROM_BLOCK(edge) (edge_table[edge].from_block)
-#define TO_BLOCK(edge) (edge_table[edge].to_block)
-
-/* Number of edges in the control flow graph. (In fact, larger than
- that by 1, since edge 0 is unused.) */
-static int nr_edges;
-
-/* Circular list of incoming/outgoing edges of a block. */
-static int *in_edges;
-static int *out_edges;
-
-#define IN_EDGES(block) (in_edges[block])
-#define OUT_EDGES(block) (out_edges[block])
-
static int is_cfg_nonregular (void);
-static int build_control_flow (struct edge_list *);
-static void new_edge (int, int);
static bool sched_is_disabled_for_current_region_p (void);
/* A region is the main entity for interblock scheduling: insns
@@ -154,7 +125,7 @@ static int *containing_rgn;
void debug_regions (void);
static void find_single_block_region (void);
-static void find_rgns (struct edge_list *);
+static void find_rgns (void);
static bool too_large (int, int *, int *);
extern void debug_live (int, int);
@@ -166,25 +137,19 @@ static int current_blocks;
/* The mapping from bb to block. */
#define BB_TO_BLOCK(bb) (rgn_bb_table[current_blocks + (bb)])
-typedef struct
-{
- int *first_member; /* Pointer to the list start in bitlst_table. */
- int nr_members; /* The number of members of the bit list. */
-}
-bitlst;
-
-static int bitlst_table_last;
-static int *bitlst_table;
-
-static void extract_bitlst (sbitmap, bitlst *);
-
/* Target info declarations.
The block currently being scheduled is referred to as the "target" block,
while other blocks in the region from which insns can be moved to the
target are called "source" blocks. The candidate structure holds info
about such sources: are they valid? Speculative? Etc. */
-typedef bitlst bblst;
+typedef struct
+{
+ basic_block *first_member;
+ int nr_members;
+}
+bblst;
+
typedef struct
{
char is_valid;
@@ -204,7 +169,8 @@ static candidate *candidate_table;
Lists of split and update blocks for each candidate of the current
target are in array bblst_table. */
-static int *bblst_table, bblst_size, bblst_last;
+static basic_block *bblst_table;
+static int bblst_size, bblst_last;
#define IS_VALID(src) ( candidate_table[src].is_valid )
#define IS_SPECULATIVE(src) ( candidate_table[src].is_speculative )
@@ -214,7 +180,18 @@ static int *bblst_table, bblst_size, bblst_last;
static int target_bb;
/* List of edges. */
-typedef bitlst edgelst;
+typedef struct
+{
+ edge *first_member;
+ int nr_members;
+}
+edgelst;
+
+static edge *edgelst_table;
+static int edgelst_last;
+
+static void extract_edgelst (sbitmap, edgelst *);
+
/* Target info functions. */
static void split_edges (int, int, edgelst *);
@@ -250,12 +227,11 @@ typedef sbitmap edgeset;
static int rgn_nr_edges;
/* Array of size rgn_nr_edges. */
-static int *rgn_edges;
-
+static edge *rgn_edges;
/* Mapping from each edge in the graph to its number in the rgn. */
-static int *edge_to_bit;
-#define EDGE_TO_BIT(edge) (edge_to_bit[edge])
+#define EDGE_TO_BIT(edge) ((int)(size_t)(edge)->aux)
+#define SET_EDGE_TO_BIT(edge,nr) ((edge)->aux = (void *)(size_t)(nr))
/* The split edges of a source bb is different for each target
bb. In order to compute this efficiently, the 'potential-split edges'
@@ -308,8 +284,8 @@ static void free_pending_lists (void);
/* Return 1 if control flow graph should not be constructed, 0 otherwise.
We decide not to build the control flow graph if there is possibly more
- than one entry to the function, if computed branches exist, of if we
- have nonlocal gotos. */
+ than one entry to the function, if computed branches exist, if we
+ have nonlocal gotos, or if we have an unreachable loop. */
static int
is_cfg_nonregular (void)
@@ -360,141 +336,43 @@ is_cfg_nonregular (void)
break;
}
- /* All the tests passed. Consider the cfg well structured. */
- return 0;
-}
-
-/* Build the control flow graph and set nr_edges.
-
- Instead of trying to build a cfg ourselves, we rely on flow to
- do it for us. Stamp out useless code (and bug) duplication.
-
- Return nonzero if an irregularity in the cfg is found which would
- prevent cross block scheduling. */
-
-static int
-build_control_flow (struct edge_list *edge_list)
-{
- int i, unreachable, num_edges;
- basic_block b;
-
- /* This already accounts for entry/exit edges. */
- num_edges = NUM_EDGES (edge_list);
-
/* Unreachable loops with more than one basic block are detected
during the DFS traversal in find_rgns.
Unreachable loops with a single block are detected here. This
test is redundant with the one in find_rgns, but it's much
- cheaper to go ahead and catch the trivial case here. */
- unreachable = 0;
+ cheaper to go ahead and catch the trivial case here. */
FOR_EACH_BB (b)
{
- if (b->pred == NULL
- || (b->pred->src == b
- && b->pred->pred_next == NULL))
- unreachable = 1;
- }
-
- /* ??? We can kill these soon. */
- in_edges = xcalloc (last_basic_block, sizeof (int));
- out_edges = xcalloc (last_basic_block, sizeof (int));
- edge_table = xcalloc (num_edges, sizeof (haifa_edge));
-
- nr_edges = 0;
- for (i = 0; i < num_edges; i++)
- {
- edge e = INDEX_EDGE (edge_list, i);
-
- if (e->dest != EXIT_BLOCK_PTR
- && e->src != ENTRY_BLOCK_PTR)
- new_edge (e->src->index, e->dest->index);
- }
-
- /* Increment by 1, since edge 0 is unused. */
- nr_edges++;
-
- return unreachable;
-}
-
-/* Record an edge in the control flow graph from SOURCE to TARGET.
-
- In theory, this is redundant with the s_succs computed above, but
- we have not converted all of haifa to use information from the
- integer lists. */
-
-static void
-new_edge (int source, int target)
-{
- int e, next_edge;
- int curr_edge, fst_edge;
-
- /* Check for duplicates. */
- fst_edge = curr_edge = OUT_EDGES (source);
- while (curr_edge)
- {
- if (FROM_BLOCK (curr_edge) == source
- && TO_BLOCK (curr_edge) == target)
- {
- return;
- }
-
- curr_edge = NEXT_OUT (curr_edge);
-
- if (fst_edge == curr_edge)
- break;
- }
-
- e = ++nr_edges;
-
- FROM_BLOCK (e) = source;
- TO_BLOCK (e) = target;
-
- if (OUT_EDGES (source))
- {
- next_edge = NEXT_OUT (OUT_EDGES (source));
- NEXT_OUT (OUT_EDGES (source)) = e;
- NEXT_OUT (e) = next_edge;
- }
- else
- {
- OUT_EDGES (source) = e;
- NEXT_OUT (e) = e;
+ if (EDGE_COUNT (b->preds) == 0
+ || (EDGE_PRED (b, 0)->src == b
+ && EDGE_COUNT (b->preds) == 1))
+ return 1;
}
- if (IN_EDGES (target))
- {
- next_edge = NEXT_IN (IN_EDGES (target));
- NEXT_IN (IN_EDGES (target)) = e;
- NEXT_IN (e) = next_edge;
- }
- else
- {
- IN_EDGES (target) = e;
- NEXT_IN (e) = e;
- }
+ /* All the tests passed. Consider the cfg well structured. */
+ return 0;
}
-/* Translate a bit-set SET to a list BL of the bit-set members. */
+/* Extract list of edges from a bitmap containing EDGE_TO_BIT bits. */
static void
-extract_bitlst (sbitmap set, bitlst *bl)
+extract_edgelst (sbitmap set, edgelst *el)
{
int i;
- /* bblst table space is reused in each call to extract_bitlst. */
- bitlst_table_last = 0;
+ /* edgelst table space is reused in each call to extract_edgelst. */
+ edgelst_last = 0;
- bl->first_member = &bitlst_table[bitlst_table_last];
- bl->nr_members = 0;
+ el->first_member = &edgelst_table[edgelst_last];
+ el->nr_members = 0;
/* Iterate over each word in the bitset. */
EXECUTE_IF_SET_IN_SBITMAP (set, 0, i,
{
- bitlst_table[bitlst_table_last++] = i;
- (bl->nr_members)++;
+ edgelst_table[edgelst_last++] = rgn_edges[i];
+ el->nr_members++;
});
-
}
/* Functions for the construction of regions. */
@@ -609,20 +487,18 @@ too_large (int block, int *num_bbs, int *num_insns)
of edge tables. That would simplify it somewhat. */
static void
-find_rgns (struct edge_list *edge_list)
+find_rgns (void)
{
- int *max_hdr, *dfs_nr, *stack, *degree;
+ int *max_hdr, *dfs_nr, *degree;
char no_loops = 1;
int node, child, loop_head, i, head, tail;
int count = 0, sp, idx = 0;
- int current_edge = out_edges[ENTRY_BLOCK_PTR->succ->dest->index];
+ edge_iterator current_edge;
+ edge_iterator *stack;
int num_bbs, num_insns, unreachable;
int too_large_failure;
basic_block bb;
- /* Note if an edge has been passed. */
- sbitmap passed;
-
/* Note if a block is a natural loop header. */
sbitmap header;
@@ -635,8 +511,6 @@ find_rgns (struct edge_list *edge_list)
/* Note if a block is in the block queue. */
sbitmap in_stack;
- int num_edges = NUM_EDGES (edge_list);
-
/* Perform a DFS traversal of the cfg. Identify loop headers, inner loops
and a mapping from block to its loop header (if the block is contained
in a loop, else -1).
@@ -649,7 +523,7 @@ find_rgns (struct edge_list *edge_list)
/* Allocate and initialize variables for the first traversal. */
max_hdr = xmalloc (last_basic_block * sizeof (int));
dfs_nr = xcalloc (last_basic_block, sizeof (int));
- stack = xmalloc (nr_edges * sizeof (int));
+ stack = xmalloc (n_edges * sizeof (edge_iterator));
inner = sbitmap_alloc (last_basic_block);
sbitmap_ones (inner);
@@ -657,9 +531,6 @@ find_rgns (struct edge_list *edge_list)
header = sbitmap_alloc (last_basic_block);
sbitmap_zero (header);
- passed = sbitmap_alloc (nr_edges);
- sbitmap_zero (passed);
-
in_queue = sbitmap_alloc (last_basic_block);
sbitmap_zero (in_queue);
@@ -669,31 +540,37 @@ find_rgns (struct edge_list *edge_list)
for (i = 0; i < last_basic_block; i++)
max_hdr[i] = -1;
+ #define EDGE_PASSED(E) (ei_end_p ((E)) || ei_edge ((E))->aux)
+ #define SET_EDGE_PASSED(E) (ei_edge ((E))->aux = ei_edge ((E)))
+
/* DFS traversal to find inner loops in the cfg. */
+ current_edge = ei_start (EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest->succs);
sp = -1;
+
while (1)
{
- if (current_edge == 0 || TEST_BIT (passed, current_edge))
+ if (EDGE_PASSED (current_edge))
{
/* We have reached a leaf node or a node that was already
processed. Pop edges off the stack until we find
an edge that has not yet been processed. */
- while (sp >= 0
- && (current_edge == 0 || TEST_BIT (passed, current_edge)))
+ while (sp >= 0 && EDGE_PASSED (current_edge))
{
/* Pop entry off the stack. */
current_edge = stack[sp--];
- node = FROM_BLOCK (current_edge);
- child = TO_BLOCK (current_edge);
+ node = ei_edge (current_edge)->src->index;
+ gcc_assert (node != ENTRY_BLOCK);
+ child = ei_edge (current_edge)->dest->index;
+ gcc_assert (child != EXIT_BLOCK);
RESET_BIT (in_stack, child);
if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
- current_edge = NEXT_OUT (current_edge);
+ ei_next (&current_edge);
}
/* See if have finished the DFS tree traversal. */
- if (sp < 0 && TEST_BIT (passed, current_edge))
+ if (sp < 0 && EDGE_PASSED (current_edge))
break;
/* Nope, continue the traversal with the popped node. */
@@ -701,11 +578,20 @@ find_rgns (struct edge_list *edge_list)
}
/* Process a node. */
- node = FROM_BLOCK (current_edge);
- child = TO_BLOCK (current_edge);
+ node = ei_edge (current_edge)->src->index;
+ gcc_assert (node != ENTRY_BLOCK);
SET_BIT (in_stack, node);
dfs_nr[node] = ++count;
+ /* We don't traverse to the exit block. */
+ child = ei_edge (current_edge)->dest->index;
+ if (child == EXIT_BLOCK)
+ {
+ SET_EDGE_PASSED (current_edge);
+ ei_next (&current_edge);
+ continue;
+ }
+
/* If the successor is in the stack, then we've found a loop.
Mark the loop, if it is not a natural loop, then it will
be rejected during the second traversal. */
@@ -714,8 +600,8 @@ find_rgns (struct edge_list *edge_list)
no_loops = 0;
SET_BIT (header, child);
UPDATE_LOOP_RELATIONS (node, child);
- SET_BIT (passed, current_edge);
- current_edge = NEXT_OUT (current_edge);
+ SET_EDGE_PASSED (current_edge);
+ ei_next (&current_edge);
continue;
}
@@ -726,32 +612,27 @@ find_rgns (struct edge_list *edge_list)
{
if (max_hdr[child] >= 0 && TEST_BIT (in_stack, max_hdr[child]))
UPDATE_LOOP_RELATIONS (node, max_hdr[child]);
- SET_BIT (passed, current_edge);
- current_edge = NEXT_OUT (current_edge);
+ SET_EDGE_PASSED (current_edge);
+ ei_next (&current_edge);
continue;
}
/* Push an entry on the stack and continue DFS traversal. */
stack[++sp] = current_edge;
- SET_BIT (passed, current_edge);
- current_edge = OUT_EDGES (child);
-
- /* This is temporary until haifa is converted to use rth's new
- cfg routines which have true entry/exit blocks and the
- appropriate edges from/to those blocks.
-
- Generally we update dfs_nr for a node when we process its
- out edge. However, if the node has no out edge then we will
- not set dfs_nr for that node. This can confuse the scheduler
- into thinking that we have unreachable blocks, which in turn
- disables cross block scheduling.
-
- So, if we have a node with no out edges, go ahead and mark it
- as reachable now. */
- if (current_edge == 0)
- dfs_nr[child] = ++count;
+ SET_EDGE_PASSED (current_edge);
+ current_edge = ei_start (ei_edge (current_edge)->dest->succs);
+ }
+
+ /* Reset ->aux field used by EDGE_PASSED. */
+ FOR_ALL_BB (bb)
+ {
+ edge_iterator ei;
+ edge e;
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ e->aux = NULL;
}
+
/* Another check for unreachable blocks. The earlier test in
is_cfg_nonregular only finds unreachable blocks that do not
form a loop.
@@ -772,14 +653,7 @@ find_rgns (struct edge_list *edge_list)
degree = dfs_nr;
FOR_EACH_BB (bb)
- degree[bb->index] = 0;
- for (i = 0; i < num_edges; i++)
- {
- edge e = INDEX_EDGE (edge_list, i);
-
- if (e->dest != EXIT_BLOCK_PTR)
- degree[e->dest->index]++;
- }
+ degree[bb->index] = EDGE_COUNT (bb->preds);
/* Do not perform region scheduling if there are any unreachable
blocks. */
@@ -802,6 +676,7 @@ find_rgns (struct edge_list *edge_list)
if (TEST_BIT (header, bb->index) && TEST_BIT (inner, bb->index))
{
edge e;
+ edge_iterator ei;
basic_block jbb;
/* Now check that the loop is reducible. We do this separate
@@ -842,7 +717,7 @@ find_rgns (struct edge_list *edge_list)
/* Decrease degree of all I's successors for topological
ordering. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->dest != EXIT_BLOCK_PTR)
--degree[e->dest->index];
@@ -860,9 +735,8 @@ find_rgns (struct edge_list *edge_list)
FOR_EACH_BB (jbb)
/* Leaf nodes have only a single successor which must
be EXIT_BLOCK. */
- if (jbb->succ
- && jbb->succ->dest == EXIT_BLOCK_PTR
- && jbb->succ->succ_next == NULL)
+ if (EDGE_COUNT (jbb->succs) == 1
+ && EDGE_SUCC (jbb, 0)->dest == EXIT_BLOCK_PTR)
{
queue[++tail] = jbb->index;
SET_BIT (in_queue, jbb->index);
@@ -878,7 +752,7 @@ find_rgns (struct edge_list *edge_list)
{
edge e;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
if (e->src == ENTRY_BLOCK_PTR)
continue;
@@ -935,7 +809,7 @@ find_rgns (struct edge_list *edge_list)
edge e;
child = queue[++head];
- for (e = BASIC_BLOCK (child)->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, BASIC_BLOCK (child)->preds)
{
node = e->src->index;
@@ -990,9 +864,7 @@ find_rgns (struct edge_list *edge_list)
CONTAINING_RGN (child) = nr_regions;
queue[head] = queue[tail--];
- for (e = BASIC_BLOCK (child)->succ;
- e;
- e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, BASIC_BLOCK (child)->succs)
if (e->dest != EXIT_BLOCK_PTR)
--degree[e->dest->index];
}
@@ -1021,7 +893,6 @@ find_rgns (struct edge_list *edge_list)
free (max_hdr);
free (dfs_nr);
free (stack);
- sbitmap_free (passed);
sbitmap_free (header);
sbitmap_free (inner);
sbitmap_free (in_queue);
@@ -1036,8 +907,10 @@ find_rgns (struct edge_list *edge_list)
static void
compute_dom_prob_ps (int bb)
{
- int nxt_in_edge, fst_in_edge, pred;
- int fst_out_edge, nxt_out_edge, nr_out_edges, nr_rgn_out_edges;
+ int pred_bb;
+ int nr_out_edges, nr_rgn_out_edges;
+ edge_iterator in_ei, out_ei;
+ edge in_edge, out_edge;
prob[bb] = 0.0;
if (IS_RGN_ENTRY (bb))
@@ -1047,43 +920,37 @@ compute_dom_prob_ps (int bb)
return;
}
- fst_in_edge = nxt_in_edge = IN_EDGES (BB_TO_BLOCK (bb));
-
/* Initialize dom[bb] to '111..1'. */
sbitmap_ones (dom[bb]);
- do
+ FOR_EACH_EDGE (in_edge, in_ei, BASIC_BLOCK (BB_TO_BLOCK (bb))->preds)
{
- pred = FROM_BLOCK (nxt_in_edge);
- sbitmap_a_and_b (dom[bb], dom[bb], dom[BLOCK_TO_BB (pred)]);
- sbitmap_a_or_b (ancestor_edges[bb], ancestor_edges[bb], ancestor_edges[BLOCK_TO_BB (pred)]);
-
- SET_BIT (ancestor_edges[bb], EDGE_TO_BIT (nxt_in_edge));
+ if (in_edge->src == ENTRY_BLOCK_PTR)
+ continue;
- nr_out_edges = 1;
- nr_rgn_out_edges = 0;
- fst_out_edge = OUT_EDGES (pred);
- nxt_out_edge = NEXT_OUT (fst_out_edge);
+ pred_bb = BLOCK_TO_BB (in_edge->src->index);
+ sbitmap_a_and_b (dom[bb], dom[bb], dom[pred_bb]);
+ sbitmap_a_or_b (ancestor_edges[bb],
+ ancestor_edges[bb], ancestor_edges[pred_bb]);
- sbitmap_a_or_b (pot_split[bb], pot_split[bb], pot_split[BLOCK_TO_BB (pred)]);
+ SET_BIT (ancestor_edges[bb], EDGE_TO_BIT (in_edge));
- SET_BIT (pot_split[bb], EDGE_TO_BIT (fst_out_edge));
+ sbitmap_a_or_b (pot_split[bb], pot_split[bb], pot_split[pred_bb]);
- /* The successor doesn't belong in the region? */
- if (CONTAINING_RGN (TO_BLOCK (fst_out_edge)) !=
- CONTAINING_RGN (BB_TO_BLOCK (bb)))
- ++nr_rgn_out_edges;
+ nr_out_edges = 0;
+ nr_rgn_out_edges = 0;
- while (fst_out_edge != nxt_out_edge)
+ FOR_EACH_EDGE (out_edge, out_ei, in_edge->src->succs)
{
++nr_out_edges;
+
/* The successor doesn't belong in the region? */
- if (CONTAINING_RGN (TO_BLOCK (nxt_out_edge)) !=
- CONTAINING_RGN (BB_TO_BLOCK (bb)))
+ if (out_edge->dest != EXIT_BLOCK_PTR
+ && CONTAINING_RGN (out_edge->dest->index)
+ != CONTAINING_RGN (BB_TO_BLOCK (bb)))
++nr_rgn_out_edges;
- SET_BIT (pot_split[bb], EDGE_TO_BIT (nxt_out_edge));
- nxt_out_edge = NEXT_OUT (nxt_out_edge);
+ SET_BIT (pot_split[bb], EDGE_TO_BIT (out_edge));
}
/* Now nr_rgn_out_edges is the number of region-exit edges from
@@ -1091,12 +958,10 @@ compute_dom_prob_ps (int bb)
not leaving the region. */
nr_out_edges -= nr_rgn_out_edges;
if (nr_rgn_out_edges > 0)
- prob[bb] += 0.9 * prob[BLOCK_TO_BB (pred)] / nr_out_edges;
+ prob[bb] += 0.9 * prob[pred_bb] / nr_out_edges;
else
- prob[bb] += prob[BLOCK_TO_BB (pred)] / nr_out_edges;
- nxt_in_edge = NEXT_IN (nxt_in_edge);
+ prob[bb] += prob[pred_bb] / nr_out_edges;
}
- while (fst_in_edge != nxt_in_edge);
SET_BIT (dom[bb], bb);
sbitmap_difference (pot_split[bb], pot_split[bb], ancestor_edges[bb]);
@@ -1118,7 +983,7 @@ split_edges (int bb_src, int bb_trg, edgelst *bl)
sbitmap_copy (src, pot_split[bb_src]);
sbitmap_difference (src, src, pot_split[bb_trg]);
- extract_bitlst (src, bl);
+ extract_edgelst (src, bl);
sbitmap_free (src);
}
@@ -1131,8 +996,10 @@ compute_trg_info (int trg)
{
candidate *sp;
edgelst el;
- int check_block, update_idx;
- int i, j, k, fst_edge, nxt_edge;
+ int i, j, k, update_idx;
+ basic_block block;
+ edge_iterator ei;
+ edge e;
/* Define some of the fields for the target bb as well. */
sp = candidate_table + trg;
@@ -1161,15 +1028,12 @@ compute_trg_info (int trg)
if (sp->is_valid)
{
- char *update_blocks;
-
/* Compute split blocks and store them in bblst_table.
The TO block of every split edge is a split block. */
sp->split_bbs.first_member = &bblst_table[bblst_last];
sp->split_bbs.nr_members = el.nr_members;
for (j = 0; j < el.nr_members; bblst_last++, j++)
- bblst_table[bblst_last] =
- TO_BLOCK (rgn_edges[el.first_member[j]]);
+ bblst_table[bblst_last] = el.first_member[j]->dest;
sp->update_bbs.first_member = &bblst_table[bblst_last];
/* Compute update blocks and store them in bblst_table.
@@ -1178,36 +1042,33 @@ compute_trg_info (int trg)
add the TO block to the update block list. This list can end
up with a lot of duplicates. We need to weed them out to avoid
overrunning the end of the bblst_table. */
- update_blocks = alloca (last_basic_block);
- memset (update_blocks, 0, last_basic_block);
update_idx = 0;
for (j = 0; j < el.nr_members; j++)
{
- check_block = FROM_BLOCK (rgn_edges[el.first_member[j]]);
- fst_edge = nxt_edge = OUT_EDGES (check_block);
- do
+ block = el.first_member[j]->src;
+ FOR_EACH_EDGE (e, ei, block->succs)
{
- if (! update_blocks[TO_BLOCK (nxt_edge)])
+ if (!(e->dest->flags & BB_VISITED))
{
for (k = 0; k < el.nr_members; k++)
- if (EDGE_TO_BIT (nxt_edge) == el.first_member[k])
+ if (e == el.first_member[k])
break;
if (k >= el.nr_members)
{
- bblst_table[bblst_last++] = TO_BLOCK (nxt_edge);
- update_blocks[TO_BLOCK (nxt_edge)] = 1;
+ bblst_table[bblst_last++] = e->dest;
+ e->dest->flags |= BB_VISITED;
update_idx++;
}
}
-
- nxt_edge = NEXT_OUT (nxt_edge);
}
- while (fst_edge != nxt_edge);
}
sp->update_bbs.nr_members = update_idx;
+ FOR_ALL_BB (block)
+ block->flags &= ~BB_VISITED;
+
/* Make sure we didn't overrun the end of bblst_table. */
gcc_assert (bblst_last <= bblst_size);
}
@@ -1237,7 +1098,7 @@ debug_candidate (int i)
fprintf (sched_dump, "split path: ");
for (j = 0; j < candidate_table[i].split_bbs.nr_members; j++)
{
- int b = candidate_table[i].split_bbs.first_member[j];
+ int b = candidate_table[i].split_bbs.first_member[j]->index;
fprintf (sched_dump, " %d ", b);
}
@@ -1246,7 +1107,7 @@ debug_candidate (int i)
fprintf (sched_dump, "update path: ");
for (j = 0; j < candidate_table[i].update_bbs.nr_members; j++)
{
- int b = candidate_table[i].update_bbs.first_member[j];
+ int b = candidate_table[i].update_bbs.first_member[j]->index;
fprintf (sched_dump, " %d ", b);
}
@@ -1323,10 +1184,9 @@ check_live_1 (int src, rtx x)
{
for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
{
- int b = candidate_table[src].split_bbs.first_member[i];
+ basic_block b = candidate_table[src].split_bbs.first_member[i];
- if (REGNO_REG_SET_P (BASIC_BLOCK (b)->global_live_at_start,
- regno + j))
+ if (REGNO_REG_SET_P (b->global_live_at_start, regno + j))
{
return 0;
}
@@ -1338,9 +1198,9 @@ check_live_1 (int src, rtx x)
/* Check for pseudo registers. */
for (i = 0; i < candidate_table[src].split_bbs.nr_members; i++)
{
- int b = candidate_table[src].split_bbs.first_member[i];
+ basic_block b = candidate_table[src].split_bbs.first_member[i];
- if (REGNO_REG_SET_P (BASIC_BLOCK (b)->global_live_at_start, regno))
+ if (REGNO_REG_SET_P (b->global_live_at_start, regno))
{
return 0;
}
@@ -1397,10 +1257,9 @@ update_live_1 (int src, rtx x)
{
for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
{
- int b = candidate_table[src].update_bbs.first_member[i];
+ basic_block b = candidate_table[src].update_bbs.first_member[i];
- SET_REGNO_REG_SET (BASIC_BLOCK (b)->global_live_at_start,
- regno + j);
+ SET_REGNO_REG_SET (b->global_live_at_start, regno + j);
}
}
}
@@ -1408,9 +1267,9 @@ update_live_1 (int src, rtx x)
{
for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
{
- int b = candidate_table[src].update_bbs.first_member[i];
+ basic_block b = candidate_table[src].update_bbs.first_member[i];
- SET_REGNO_REG_SET (BASIC_BLOCK (b)->global_live_at_start, regno);
+ SET_REGNO_REG_SET (b->global_live_at_start, regno);
}
}
}
@@ -1467,7 +1326,7 @@ update_live (rtx insn, int src)
(bb_from == bb_to \
|| IS_RGN_ENTRY (bb_from) \
|| (TEST_BIT (ancestor_edges[bb_to], \
- EDGE_TO_BIT (IN_EDGES (BB_TO_BLOCK (bb_from))))))
+ EDGE_TO_BIT (EDGE_PRED (BASIC_BLOCK (BB_TO_BLOCK (bb_from)), 0)))))
/* Turns on the fed_by_spec_load flag for insns fed by load_insn. */
@@ -1604,7 +1463,7 @@ is_pfree (rtx load_insn, int bb_src, int bb_trg)
/* insn2 is the similar load, in the target block. */
return 1;
- if (*(candp->split_bbs.first_member) == BLOCK_NUM (insn2))
+ if (*(candp->split_bbs.first_member) == BLOCK_FOR_INSN (insn2))
/* insn2 is a similar load, in a split-block. */
return 1;
}
@@ -1738,10 +1597,10 @@ init_ready_list (struct ready_list *ready)
the TO blocks of region edges, so there can be at most rgn_nr_edges
of them. */
bblst_size = (current_nr_blocks - target_bb) * rgn_nr_edges;
- bblst_table = xmalloc (bblst_size * sizeof (int));
+ bblst_table = xmalloc (bblst_size * sizeof (basic_block));
- bitlst_table_last = 0;
- bitlst_table = xmalloc (rgn_nr_edges * sizeof (int));
+ edgelst_last = 0;
+ edgelst_table = xmalloc (rgn_nr_edges * sizeof (edge));
compute_trg_info (target_bb);
}
@@ -2119,72 +1978,66 @@ concat_insn_mem_list (rtx copy_insns, rtx copy_mems, rtx *old_insns_p,
static void
propagate_deps (int bb, struct deps *pred_deps)
{
- int b = BB_TO_BLOCK (bb);
- int e, first_edge;
+ basic_block block = BASIC_BLOCK (BB_TO_BLOCK (bb));
+ edge_iterator ei;
+ edge e;
/* bb's structures are inherited by its successors. */
- first_edge = e = OUT_EDGES (b);
- if (e > 0)
- do
- {
- int b_succ = TO_BLOCK (e);
- int bb_succ = BLOCK_TO_BB (b_succ);
- struct deps *succ_deps = bb_deps + bb_succ;
- int reg;
-
- /* Only bbs "below" bb, in the same region, are interesting. */
- if (CONTAINING_RGN (b) != CONTAINING_RGN (b_succ)
- || bb_succ <= bb)
- {
- e = NEXT_OUT (e);
- continue;
- }
+ FOR_EACH_EDGE (e, ei, block->succs)
+ {
+ struct deps *succ_deps;
+ int reg;
- /* The reg_last lists are inherited by bb_succ. */
- EXECUTE_IF_SET_IN_REG_SET (&pred_deps->reg_last_in_use, 0, reg,
- {
- struct deps_reg *pred_rl = &pred_deps->reg_last[reg];
- struct deps_reg *succ_rl = &succ_deps->reg_last[reg];
-
- succ_rl->uses = concat_INSN_LIST (pred_rl->uses, succ_rl->uses);
- succ_rl->sets = concat_INSN_LIST (pred_rl->sets, succ_rl->sets);
- succ_rl->clobbers = concat_INSN_LIST (pred_rl->clobbers,
- succ_rl->clobbers);
- succ_rl->uses_length += pred_rl->uses_length;
- succ_rl->clobbers_length += pred_rl->clobbers_length;
- });
- IOR_REG_SET (&succ_deps->reg_last_in_use, &pred_deps->reg_last_in_use);
-
- /* Mem read/write lists are inherited by bb_succ. */
- concat_insn_mem_list (pred_deps->pending_read_insns,
- pred_deps->pending_read_mems,
- &succ_deps->pending_read_insns,
- &succ_deps->pending_read_mems);
- concat_insn_mem_list (pred_deps->pending_write_insns,
- pred_deps->pending_write_mems,
- &succ_deps->pending_write_insns,
- &succ_deps->pending_write_mems);
-
- succ_deps->last_pending_memory_flush
- = concat_INSN_LIST (pred_deps->last_pending_memory_flush,
- succ_deps->last_pending_memory_flush);
-
- succ_deps->pending_lists_length += pred_deps->pending_lists_length;
- succ_deps->pending_flush_length += pred_deps->pending_flush_length;
-
- /* last_function_call is inherited by bb_succ. */
- succ_deps->last_function_call
- = concat_INSN_LIST (pred_deps->last_function_call,
- succ_deps->last_function_call);
+ /* Only bbs "below" bb, in the same region, are interesting. */
+ if (e->dest == EXIT_BLOCK_PTR
+ || CONTAINING_RGN (block->index) != CONTAINING_RGN (e->dest->index)
+ || BLOCK_TO_BB (e->dest->index) <= bb)
+ continue;
- /* sched_before_next_call is inherited by bb_succ. */
- succ_deps->sched_before_next_call
- = concat_INSN_LIST (pred_deps->sched_before_next_call,
- succ_deps->sched_before_next_call);
+ succ_deps = bb_deps + BLOCK_TO_BB (e->dest->index);
- e = NEXT_OUT (e);
- }
- while (e != first_edge);
+ /* The reg_last lists are inherited by successor. */
+ EXECUTE_IF_SET_IN_REG_SET (&pred_deps->reg_last_in_use, 0, reg,
+ {
+ struct deps_reg *pred_rl = &pred_deps->reg_last[reg];
+ struct deps_reg *succ_rl = &succ_deps->reg_last[reg];
+
+ succ_rl->uses = concat_INSN_LIST (pred_rl->uses, succ_rl->uses);
+ succ_rl->sets = concat_INSN_LIST (pred_rl->sets, succ_rl->sets);
+ succ_rl->clobbers = concat_INSN_LIST (pred_rl->clobbers,
+ succ_rl->clobbers);
+ succ_rl->uses_length += pred_rl->uses_length;
+ succ_rl->clobbers_length += pred_rl->clobbers_length;
+ });
+ IOR_REG_SET (&succ_deps->reg_last_in_use, &pred_deps->reg_last_in_use);
+
+ /* Mem read/write lists are inherited by successor. */
+ concat_insn_mem_list (pred_deps->pending_read_insns,
+ pred_deps->pending_read_mems,
+ &succ_deps->pending_read_insns,
+ &succ_deps->pending_read_mems);
+ concat_insn_mem_list (pred_deps->pending_write_insns,
+ pred_deps->pending_write_mems,
+ &succ_deps->pending_write_insns,
+ &succ_deps->pending_write_mems);
+
+ succ_deps->last_pending_memory_flush
+ = concat_INSN_LIST (pred_deps->last_pending_memory_flush,
+ succ_deps->last_pending_memory_flush);
+
+ succ_deps->pending_lists_length += pred_deps->pending_lists_length;
+ succ_deps->pending_flush_length += pred_deps->pending_flush_length;
+
+ /* last_function_call is inherited by successor. */
+ succ_deps->last_function_call
+ = concat_INSN_LIST (pred_deps->last_function_call,
+ succ_deps->last_function_call);
+
+ /* sched_before_next_call is inherited by successor. */
+ succ_deps->sched_before_next_call
+ = concat_INSN_LIST (pred_deps->sched_before_next_call,
+ succ_deps->sched_before_next_call);
+ }
/* These lists should point to the right place, for correct
freeing later. */
@@ -2351,6 +2204,9 @@ sched_is_disabled_for_current_region_p (void)
static void
schedule_region (int rgn)
{
+ basic_block block;
+ edge_iterator ei;
+ edge e;
int bb;
int rgn_n_insns = 0;
int sched_rgn_n_insns = 0;
@@ -2400,24 +2256,30 @@ schedule_region (int rgn)
/* Compute interblock info: probabilities, split-edges, dominators, etc. */
if (current_nr_blocks > 1)
{
- int i;
-
prob = xmalloc ((current_nr_blocks) * sizeof (float));
dom = sbitmap_vector_alloc (current_nr_blocks, current_nr_blocks);
sbitmap_vector_zero (dom, current_nr_blocks);
- /* Edge to bit. */
+
+ /* Use ->aux to implement EDGE_TO_BIT mapping. */
rgn_nr_edges = 0;
- edge_to_bit = xmalloc (nr_edges * sizeof (int));
- for (i = 1; i < nr_edges; i++)
- if (CONTAINING_RGN (FROM_BLOCK (i)) == rgn)
- EDGE_TO_BIT (i) = rgn_nr_edges++;
- rgn_edges = xmalloc (rgn_nr_edges * sizeof (int));
+ FOR_EACH_BB (block)
+ {
+ if (CONTAINING_RGN (block->index) != rgn)
+ continue;
+ FOR_EACH_EDGE (e, ei, block->succs)
+ SET_EDGE_TO_BIT (e, rgn_nr_edges++);
+ }
+ rgn_edges = xmalloc (rgn_nr_edges * sizeof (edge));
rgn_nr_edges = 0;
- for (i = 1; i < nr_edges; i++)
- if (CONTAINING_RGN (FROM_BLOCK (i)) == (rgn))
- rgn_edges[rgn_nr_edges++] = i;
+ FOR_EACH_BB (block)
+ {
+ if (CONTAINING_RGN (block->index) != rgn)
+ continue;
+ FOR_EACH_EDGE (e, ei, block->succs)
+ rgn_edges[rgn_nr_edges++] = e;
+ }
/* Split edges. */
pot_split = sbitmap_vector_alloc (current_nr_blocks, rgn_nr_edges);
@@ -2493,7 +2355,7 @@ schedule_region (int rgn)
{
free (candidate_table);
free (bblst_table);
- free (bitlst_table);
+ free (edgelst_table);
}
}
@@ -2520,11 +2382,19 @@ schedule_region (int rgn)
if (current_nr_blocks > 1)
{
+ /* Cleanup ->aux used for EDGE_TO_BIT mapping. */
+ FOR_EACH_BB (block)
+ {
+ if (CONTAINING_RGN (block->index) != rgn)
+ continue;
+ FOR_EACH_EDGE (e, ei, block->succs)
+ e->aux = NULL;
+ }
+
free (prob);
sbitmap_vector_free (dom);
sbitmap_vector_free (pot_split);
sbitmap_vector_free (ancestor_edges);
- free (edge_to_bit);
free (rgn_edges);
}
}
@@ -2550,48 +2420,25 @@ init_regions (void)
/* Compute regions for scheduling. */
if (reload_completed
|| n_basic_blocks == 1
- || !flag_schedule_interblock)
+ || !flag_schedule_interblock
+ || is_cfg_nonregular ())
{
find_single_block_region ();
}
else
{
- /* Verify that a 'good' control flow graph can be built. */
- if (is_cfg_nonregular ())
- {
- find_single_block_region ();
- }
- else
- {
- struct edge_list *edge_list;
-
- /* The scheduler runs after estimate_probabilities; therefore, we
- can't blindly call back into find_basic_blocks since doing so
- could invalidate the branch probability info. We could,
- however, call cleanup_cfg. */
- edge_list = create_edge_list ();
-
- /* Compute the dominators and post dominators. */
- calculate_dominance_info (CDI_DOMINATORS);
-
- /* build_control_flow will return nonzero if it detects unreachable
- blocks or any other irregularity with the cfg which prevents
- cross block scheduling. */
- if (build_control_flow (edge_list) != 0)
- find_single_block_region ();
- else
- find_rgns (edge_list);
+ /* Compute the dominators and post dominators. */
+ calculate_dominance_info (CDI_DOMINATORS);
- if (sched_verbose >= 3)
- debug_regions ();
+ /* Find regions. */
+ find_rgns ();
- /* We are done with flow's edge list. */
- free_edge_list (edge_list);
+ if (sched_verbose >= 3)
+ debug_regions ();
- /* For now. This will move as more and more of haifa is converted
- to using the cfg code in flow.c. */
- free_dominance_info (CDI_DOMINATORS);
- }
+ /* For now. This will move as more and more of haifa is converted
+ to using the cfg code in flow.c. */
+ free_dominance_info (CDI_DOMINATORS);
}
@@ -2740,23 +2587,6 @@ schedule_insns (FILE *dump_file)
sched_finish ();
- if (edge_table)
- {
- free (edge_table);
- edge_table = NULL;
- }
-
- if (in_edges)
- {
- free (in_edges);
- in_edges = NULL;
- }
- if (out_edges)
- {
- free (out_edges);
- out_edges = NULL;
- }
-
sbitmap_free (blocks);
sbitmap_free (large_region_blocks);
}
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index 4ac93404a8e..c86dd549700 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -330,8 +330,8 @@ layout_decl (tree decl, unsigned int known_align)
}
else if (DECL_SIZE_UNIT (decl) == 0)
DECL_SIZE_UNIT (decl)
- = convert (sizetype, size_binop (CEIL_DIV_EXPR, DECL_SIZE (decl),
- bitsize_unit_node));
+ = fold_convert (sizetype, size_binop (CEIL_DIV_EXPR, DECL_SIZE (decl),
+ bitsize_unit_node));
if (code != FIELD_DECL)
/* For non-fields, update the alignment from the type. */
@@ -540,7 +540,8 @@ tree
bit_from_pos (tree offset, tree bitpos)
{
return size_binop (PLUS_EXPR, bitpos,
- size_binop (MULT_EXPR, convert (bitsizetype, offset),
+ size_binop (MULT_EXPR,
+ fold_convert (bitsizetype, offset),
bitsize_unit_node));
}
@@ -548,9 +549,9 @@ tree
byte_from_pos (tree offset, tree bitpos)
{
return size_binop (PLUS_EXPR, offset,
- convert (sizetype,
- size_binop (TRUNC_DIV_EXPR, bitpos,
- bitsize_unit_node)));
+ fold_convert (sizetype,
+ size_binop (TRUNC_DIV_EXPR, bitpos,
+ bitsize_unit_node)));
}
void
@@ -558,9 +559,9 @@ pos_from_bit (tree *poffset, tree *pbitpos, unsigned int off_align,
tree pos)
{
*poffset = size_binop (MULT_EXPR,
- convert (sizetype,
- size_binop (FLOOR_DIV_EXPR, pos,
- bitsize_int (off_align))),
+ fold_convert (sizetype,
+ size_binop (FLOOR_DIV_EXPR, pos,
+ bitsize_int (off_align))),
size_int (off_align / BITS_PER_UNIT));
*pbitpos = size_binop (FLOOR_MOD_EXPR, pos, bitsize_int (off_align));
}
@@ -580,7 +581,8 @@ normalize_offset (tree *poffset, tree *pbitpos, unsigned int off_align)
*poffset
= size_binop (PLUS_EXPR, *poffset,
- size_binop (MULT_EXPR, convert (sizetype, extra_aligns),
+ size_binop (MULT_EXPR,
+ fold_convert (sizetype, extra_aligns),
size_int (off_align / BITS_PER_UNIT)));
*pbitpos
@@ -869,9 +871,9 @@ place_field (record_layout_info rli, tree field)
/* First adjust OFFSET by the partial bits, then align. */
rli->offset
= size_binop (PLUS_EXPR, rli->offset,
- convert (sizetype,
- size_binop (CEIL_DIV_EXPR, rli->bitpos,
- bitsize_unit_node)));
+ fold_convert (sizetype,
+ size_binop (CEIL_DIV_EXPR, rli->bitpos,
+ bitsize_unit_node)));
rli->bitpos = bitsize_zero_node;
rli->offset = round_up (rli->offset, desired_align / BITS_PER_UNIT);
@@ -1147,9 +1149,9 @@ place_field (record_layout_info rli, tree field)
{
rli->offset
= size_binop (PLUS_EXPR, rli->offset,
- convert (sizetype,
- size_binop (CEIL_DIV_EXPR, rli->bitpos,
- bitsize_unit_node)));
+ fold_convert (sizetype,
+ size_binop (CEIL_DIV_EXPR, rli->bitpos,
+ bitsize_unit_node)));
rli->offset
= size_binop (PLUS_EXPR, rli->offset, DECL_SIZE_UNIT (field));
rli->bitpos = bitsize_zero_node;
@@ -1353,9 +1355,9 @@ finalize_type_size (tree type)
result will fit in sizetype. We will get more efficient code using
sizetype, so we force a conversion. */
TYPE_SIZE_UNIT (type)
- = convert (sizetype,
- size_binop (FLOOR_DIV_EXPR, TYPE_SIZE (type),
- bitsize_unit_node));
+ = fold_convert (sizetype,
+ size_binop (FLOOR_DIV_EXPR, TYPE_SIZE (type),
+ bitsize_unit_node));
if (TYPE_SIZE (type) != 0)
{
@@ -1638,10 +1640,10 @@ layout_type (tree type)
/* The initial subtraction should happen in the original type so
that (possible) negative values are handled appropriately. */
length = size_binop (PLUS_EXPR, size_one_node,
- convert (sizetype,
- fold (build2 (MINUS_EXPR,
- TREE_TYPE (lb),
- ub, lb))));
+ fold_convert (sizetype,
+ fold (build2 (MINUS_EXPR,
+ TREE_TYPE (lb),
+ ub, lb))));
/* Special handling for arrays of bits (for Chill). */
element_size = TYPE_SIZE (element);
@@ -1670,7 +1672,8 @@ layout_type (tree type)
length = size_binop (MAX_EXPR, length, size_zero_node);
TYPE_SIZE (type) = size_binop (MULT_EXPR, element_size,
- convert (bitsizetype, length));
+ fold_convert (bitsizetype,
+ length));
/* If we know the size of the element, calculate the total
size directly, rather than do some division thing below.
diff --git a/gcc/system.h b/gcc/system.h
index 191e1b102c6..7e002a1157c 100644
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -303,8 +303,8 @@ extern char *getenv (const char *);
extern int getopt (int, char * const *, const char *);
#endif
-#if defined(HAVE_DECL_GETPAGESIZE) && !HAVE_DECL_GETPAGESIZE
-extern long getpagesize (void);
+#if defined (HAVE_DECL_GETPAGESIZE) && !HAVE_DECL_GETPAGESIZE
+extern int getpagesize (void);
#endif
#if defined (HAVE_DECL_GETWD) && !HAVE_DECL_GETWD
diff --git a/gcc/target-def.h b/gcc/target-def.h
index e8262decb86..700d5db51ec 100644
--- a/gcc/target-def.h
+++ b/gcc/target-def.h
@@ -379,6 +379,8 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define TARGET_MD_ASM_CLOBBERS hook_tree_tree_identity
+#define TARGET_DWARF_CALLING_CONVENTION hook_int_tree_0
+
#define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_false
#define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_false
#define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_false
@@ -523,6 +525,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
TARGET_DEFAULT_SHORT_ENUMS, \
TARGET_BUILTIN_SETJMP_FRAME_VALUE, \
TARGET_MD_ASM_CLOBBERS, \
+ TARGET_DWARF_CALLING_CONVENTION, \
TARGET_CALLS, \
TARGET_CXX, \
TARGET_HAVE_NAMED_SECTIONS, \
diff --git a/gcc/target.h b/gcc/target.h
index 9f766ae18dd..49a7f9d7f92 100644
--- a/gcc/target.h
+++ b/gcc/target.h
@@ -488,6 +488,13 @@ struct gcc_target
the port wishes to automatically clobber for all asms. */
tree (* md_asm_clobbers) (tree);
+ /* This target hook allows the backend to specify a calling convention
+ in the debug information. This function actually returns an
+ enum dwarf_calling_convention, but because of forward declarations
+ and not wanting to include dwarf2.h everywhere target.h is included
+ the function is being declared as an int. */
+ int (* dwarf_calling_convention) (tree);
+
/* Functions relating to calls - argument passing, returns, etc. */
struct calls {
bool (*promote_function_args) (tree fntype);
diff --git a/gcc/targhooks.c b/gcc/targhooks.c
index 3bf938c1828..852421cb9e3 100644
--- a/gcc/targhooks.c
+++ b/gcc/targhooks.c
@@ -129,7 +129,7 @@ default_pretend_outgoing_varargs_named (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
!= default_setup_incoming_varargs);
}
-enum machine_mode
+enum machine_mode
default_eh_return_filter_mode (void)
{
return word_mode;
@@ -173,7 +173,7 @@ default_cxx_get_cookie_size (tree type)
(true_type)) bytes. */
tree sizetype_size;
tree type_align;
-
+
sizetype_size = size_in_bytes (sizetype);
type_align = size_int (TYPE_ALIGN_UNIT (type));
if (INT_CST_LT_UNSIGNED (type_align, sizetype_size))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index da84e65a5be..1b02395d852 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,82 @@
+2004-10-01 Andrew Pinski <pinskia@physics.uc.edu>
+
+ * gcc.dg/tree-ssa/pr17343.c: Remove.
+
+2004-10-01 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR tree-opt/17343
+ * gcc.dg/tree-ssa/pr17343.c: New test.
+
+2004-10-01 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.dg/tree-ssa/stdarg-1.c: Removed.
+ * gcc.dg/tree-ssa/stdarg-2.c: Removed.
+ * gcc.dg/tree-ssa/stdarg-3.c: Removed.
+ * gcc.dg/tree-ssa/stdarg-4.c: Removed.
+ * gcc.dg/tree-ssa/stdarg-5.c: Removed.
+
+2004-09-30 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ * gcc.dg/lvalue-2.c: New test.
+
+2004-09-30 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ PR c/17730
+ * gcc.dg/pr17730-1.c: New test
+
+2004-09-29 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ PR c/7425
+ * gcc.dg/deprecated-3.c, g++.dg/warn/deprecated-2.C: New tests.
+
+2004-09-29 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.c-torture/execute/stdarg-1.c: New test.
+ * gcc.c-torture/execute/stdarg-2.c: New test.
+ * gcc.c-torture/execute/stdarg-3.c: New test.
+ * gcc.dg/tree-ssa/stdarg-1.c: New test.
+ * gcc.dg/tree-ssa/stdarg-2.c: New test.
+ * gcc.dg/tree-ssa/stdarg-3.c: New test.
+ * gcc.dg/tree-ssa/stdarg-4.c: New test.
+ * gcc.dg/tree-ssa/stdarg-5.c: New test.
+
+2004-09-29 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/17697
+ * g++.dg/opt/pr17697-1.C: New test.
+ * g++.dg/opt/pr17697-2.C: New test.
+ * g++.dg/opt/pr17697-3.C: New test.
+
+2004-09-28 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ PR c/16409
+ * gcc.dg/vla-init-2.c, gcc.dg/vla-init-3.c, gcc.dg/vla-init-4.c,
+ gcc.dg/vla-init-5.c: New tests.
+
+2004-09-27 Joseph S. Myers <jsm@polyomino.org.uk>
+
+ PR c/13804
+ * gcc.dg/pr13804-1.c: New test.
+
+2004-09-27 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
+
+ PR fortran/16938
+ * gfortran.dg/pr16938.f90: New test.
+
+2004-09-27 Mark Mitchell <mark@codesourcery.com>
+
+ * g++.dg/template/crash23.C: New test.
+
+2004-09-27 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/17585
+ * g++.dg/template/static8.C: New test.
+
+2004-09-27 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/17681
+ * g++.dg/other/error9.C: New test.
+
2004-09-26 Ulrich Weigand <uweigand@de.ibm.com>
* gcc.dg/tree-ssa/loop-1.c: Use -msmall-exec on s390-*-* targets.
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 848bfca570b..eaeeecaca4d 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -270,12 +270,6 @@ int flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
int flag_complex_divide_method = 0;
-/* Nonzero means performs web construction pass. When flag_web ==
- AUTODETECT_FLAG_VAR_TRACKING it will be set according to optimize
- and default_debug_hooks in process_options (). */
-
-int flag_web = AUTODETECT_FLAG_VAR_TRACKING;
-
/* Nonzero means that we don't want inlining by virtue of -fno-inline,
not just because the tree inliner turned us off. */
@@ -1827,7 +1821,7 @@ process_options (void)
debug_type_names[write_symbols]);
/* Now we know which debug output will be used so we can set
- flag_var_tracking, flag_rename_registers and flag_web if the user has
+ flag_var_tracking, flag_rename_registers if the user has
not specified them. */
if (debug_info_level < DINFO_LEVEL_NORMAL
|| debug_hooks->var_location == do_nothing_debug_hooks.var_location)
@@ -1848,10 +1842,6 @@ process_options (void)
flag_rename_registers = default_debug_hooks->var_location
!= do_nothing_debug_hooks.var_location;
- if (flag_web == AUTODETECT_FLAG_VAR_TRACKING)
- flag_web = optimize >= 2 && (default_debug_hooks->var_location
- != do_nothing_debug_hooks.var_location);
-
if (flag_var_tracking == AUTODETECT_FLAG_VAR_TRACKING)
flag_var_tracking = optimize >= 1;
diff --git a/gcc/toplev.h b/gcc/toplev.h
index a657036548e..f0dfaa9eae6 100644
--- a/gcc/toplev.h
+++ b/gcc/toplev.h
@@ -76,7 +76,7 @@ extern void inform (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2);
extern void rest_of_decl_compilation (tree, int, int);
extern void rest_of_type_compilation (tree, int);
extern void rest_of_compilation (void);
-extern void tree_rest_of_compilation (tree, bool);
+extern void tree_rest_of_compilation (tree);
extern void init_tree_optimization_passes (void);
extern void finish_optimization_passes (void);
extern bool enable_rtl_dump_file (int);
diff --git a/gcc/tracer.c b/gcc/tracer.c
index 4fcedca153a..968d093b723 100644
--- a/gcc/tracer.c
+++ b/gcc/tracer.c
@@ -118,8 +118,9 @@ find_best_successor (basic_block bb)
{
edge e;
edge best = NULL;
+ edge_iterator ei;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (!best || better_p (e, best))
best = e;
if (!best || ignore_bb_p (best->dest))
@@ -136,8 +137,9 @@ find_best_predecessor (basic_block bb)
{
edge e;
edge best = NULL;
+ edge_iterator ei;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (!best || better_p (e, best))
best = e;
if (!best || ignore_bb_p (best->src))
@@ -269,14 +271,17 @@ tail_duplicate (void)
blocks[bb2->index] = NULL;
}
traced_insns += bb2->frequency * counts [bb2->index];
- if (bb2->pred && bb2->pred->pred_next
+ if (EDGE_COUNT (bb2->preds) > 1
&& can_duplicate_block_p (bb2))
{
- edge e = bb2->pred;
+ edge e;
+ edge_iterator ei;
basic_block old = bb2;
- while (e->src != bb)
- e = e->pred_next;
+ FOR_EACH_EDGE (e, ei, bb2->preds)
+ if (e->src == bb)
+ break;
+
nduplicated += counts [bb2->index];
bb2 = duplicate_block (bb2, e);
@@ -319,18 +324,19 @@ tail_duplicate (void)
static void
layout_superblocks (void)
{
- basic_block end = ENTRY_BLOCK_PTR->succ->dest;
- basic_block bb = ENTRY_BLOCK_PTR->succ->dest->next_bb;
+ basic_block end = EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest;
+ basic_block bb = EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest->next_bb;
while (bb != EXIT_BLOCK_PTR)
{
+ edge_iterator ei;
edge e, best = NULL;
while (end->rbi->next)
end = end->rbi->next;
- for (e = end->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, end->succs)
if (e->dest != EXIT_BLOCK_PTR
- && e->dest != ENTRY_BLOCK_PTR->succ->dest
+ && e->dest != EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest
&& !e->dest->rbi->visited
&& (!best || EDGE_FREQUENCY (e) > EDGE_FREQUENCY (best)))
best = e;
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 6f5284ec10c..e047943cb42 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -441,7 +441,7 @@ make_edges (void)
/* Finally, if no edges were created above, this is a regular
basic block that only needs a fallthru edge. */
- if (bb->succ == NULL)
+ if (EDGE_COUNT (bb->succs) == 0)
make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
}
@@ -483,7 +483,7 @@ make_ctrl_stmt_edges (basic_block bb)
case RESX_EXPR:
make_eh_edges (last);
/* Yet another NORETURN hack. */
- if (bb->succ == NULL)
+ if (EDGE_COUNT (bb->succs) == 0)
make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
break;
@@ -698,7 +698,7 @@ make_goto_expr_edges (basic_block bb)
}
/* Degenerate case of computed goto with no labels. */
- if (!for_call && !bb->succ)
+ if (!for_call && EDGE_COUNT (bb->succs) == 0)
make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
}
@@ -717,16 +717,22 @@ cleanup_tree_cfg (void)
timevar_push (TV_TREE_CLEANUP_CFG);
- /* These three transformations can cascade, so we iterate on them until
+ retval = cleanup_control_flow ();
+
+ /* These two transformations can cascade, so we iterate on them until
nothing changes. */
while (something_changed)
{
- something_changed = cleanup_control_flow ();
- something_changed |= delete_unreachable_blocks ();
+ something_changed = delete_unreachable_blocks ();
something_changed |= thread_jumps ();
retval |= something_changed;
}
+#ifdef ENABLE_CHECKING
+ if (retval)
+ gcc_assert (!cleanup_control_flow ());
+#endif
+
/* Merging the blocks creates no new opportunities for the other
optimizations, so do it here. */
merge_seq_blocks ();
@@ -935,7 +941,12 @@ group_case_labels (void)
tree labels = SWITCH_LABELS (stmt);
int old_size = TREE_VEC_LENGTH (labels);
int i, j, new_size = old_size;
- tree default_label = TREE_VEC_ELT (labels, old_size - 1);
+ tree default_case = TREE_VEC_ELT (labels, old_size - 1);
+ tree default_label;
+
+ /* The default lable is always the last case in a switch
+ statement after gimplification. */
+ default_label = CASE_LABEL (default_case);
/* Look for possible opportunities to merge cases.
Ignore the last element of the label vector because it
@@ -955,6 +966,7 @@ group_case_labels (void)
{
TREE_VEC_ELT (labels, i) = NULL_TREE;
i++;
+ new_size--;
continue;
}
@@ -1009,20 +1021,19 @@ tree_can_merge_blocks_p (basic_block a, basic_block b)
tree stmt;
block_stmt_iterator bsi;
- if (!a->succ
- || a->succ->succ_next)
+ if (EDGE_COUNT (a->succs) != 1)
return false;
- if (a->succ->flags & EDGE_ABNORMAL)
+ if (EDGE_SUCC (a, 0)->flags & EDGE_ABNORMAL)
return false;
- if (a->succ->dest != b)
+ if (EDGE_SUCC (a, 0)->dest != b)
return false;
if (b == EXIT_BLOCK_PTR)
return false;
- if (b->pred->pred_next)
+ if (EDGE_COUNT (b->preds) > 1)
return false;
/* If A ends by a statement causing exceptions or something similar, we
@@ -1069,7 +1080,7 @@ tree_merge_blocks (basic_block a, basic_block b)
/* Ensure that B follows A. */
move_block_after (b, a);
- gcc_assert (a->succ->flags & EDGE_FALLTHRU);
+ gcc_assert (EDGE_SUCC (a, 0)->flags & EDGE_FALLTHRU);
gcc_assert (!last_stmt (a) || !stmt_ends_bb_p (last_stmt (a)));
/* Remove labels from B and set bb_for_stmt to A for other statements. */
@@ -1650,17 +1661,16 @@ cfg_remove_useless_stmts_bb (basic_block bb)
/* Check whether we come here from a condition, and if so, get the
condition. */
- if (!bb->pred
- || bb->pred->pred_next
- || !(bb->pred->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
+ if (EDGE_COUNT (bb->preds) != 1
+ || !(EDGE_PRED (bb, 0)->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
return;
- cond = COND_EXPR_COND (last_stmt (bb->pred->src));
+ cond = COND_EXPR_COND (last_stmt (EDGE_PRED (bb, 0)->src));
if (TREE_CODE (cond) == VAR_DECL || TREE_CODE (cond) == PARM_DECL)
{
var = cond;
- val = (bb->pred->flags & EDGE_FALSE_VALUE
+ val = (EDGE_PRED (bb, 0)->flags & EDGE_FALSE_VALUE
? boolean_false_node : boolean_true_node);
}
else if (TREE_CODE (cond) == TRUTH_NOT_EXPR
@@ -1668,12 +1678,12 @@ cfg_remove_useless_stmts_bb (basic_block bb)
|| TREE_CODE (TREE_OPERAND (cond, 0)) == PARM_DECL))
{
var = TREE_OPERAND (cond, 0);
- val = (bb->pred->flags & EDGE_FALSE_VALUE
+ val = (EDGE_PRED (bb, 0)->flags & EDGE_FALSE_VALUE
? boolean_true_node : boolean_false_node);
}
else
{
- if (bb->pred->flags & EDGE_FALSE_VALUE)
+ if (EDGE_PRED (bb, 0)->flags & EDGE_FALSE_VALUE)
cond = invert_truthvalue (cond);
if (TREE_CODE (cond) == EQ_EXPR
&& (TREE_CODE (TREE_OPERAND (cond, 0)) == VAR_DECL
@@ -1776,8 +1786,8 @@ remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
}
/* Remove edges to BB's successors. */
- while (bb->succ != NULL)
- ssa_remove_edge (bb->succ);
+ while (EDGE_COUNT (bb->succs) > 0)
+ ssa_remove_edge (EDGE_SUCC (bb, 0));
}
@@ -1859,12 +1869,11 @@ tree_block_forwards_to (basic_block bb)
single successor has phi nodes. */
if (bb == EXIT_BLOCK_PTR
|| bb == ENTRY_BLOCK_PTR
- || !bb->succ
- || bb->succ->succ_next
- || bb->succ->dest == EXIT_BLOCK_PTR
- || (bb->succ->flags & EDGE_ABNORMAL) != 0
+ || EDGE_COUNT (bb->succs) != 1
+ || EDGE_SUCC (bb, 0)->dest == EXIT_BLOCK_PTR
+ || (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL) != 0
|| phi_nodes (bb)
- || phi_nodes (bb->succ->dest))
+ || phi_nodes (EDGE_SUCC (bb, 0)->dest))
return NULL;
/* Walk past any labels at the start of this block. */
@@ -1882,11 +1891,11 @@ tree_block_forwards_to (basic_block bb)
edge dest;
/* Recursive call to pick up chains of forwarding blocks. */
- dest = tree_block_forwards_to (bb->succ->dest);
+ dest = tree_block_forwards_to (EDGE_SUCC (bb, 0)->dest);
- /* If none found, we forward to bb->succ at minimum. */
+ /* If none found, we forward to bb->succs[0] at minimum. */
if (!dest)
- dest = bb->succ;
+ dest = EDGE_SUCC (bb, 0);
ann->forwardable = 1;
return dest;
@@ -1933,9 +1942,10 @@ cleanup_control_expr_graph (basic_block bb, block_stmt_iterator bsi)
bool retval = false;
tree expr = bsi_stmt (bsi), val;
- if (bb->succ->succ_next)
+ if (EDGE_COUNT (bb->succs) > 1)
{
- edge e, next;
+ edge e;
+ edge_iterator ei;
switch (TREE_CODE (expr))
{
@@ -1958,9 +1968,8 @@ cleanup_control_expr_graph (basic_block bb, block_stmt_iterator bsi)
return false;
/* Remove all the edges except the one that is always executed. */
- for (e = bb->succ; e; e = next)
+ for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
{
- next = e->succ_next;
if (e != taken_edge)
{
taken_edge->probability += e->probability;
@@ -1968,12 +1977,14 @@ cleanup_control_expr_graph (basic_block bb, block_stmt_iterator bsi)
ssa_remove_edge (e);
retval = true;
}
+ else
+ ei_next (&ei);
}
if (taken_edge->probability > REG_BR_PROB_BASE)
taken_edge->probability = REG_BR_PROB_BASE;
}
else
- taken_edge = bb->succ;
+ taken_edge = EDGE_SUCC (bb, 0);
bsi_remove (&bsi);
taken_edge->flags = EDGE_FALLTHRU;
@@ -2016,7 +2027,7 @@ find_taken_edge (basic_block bb, tree val)
if (TREE_CODE (stmt) == SWITCH_EXPR)
return find_taken_edge_switch_expr (bb, val);
- return bb->succ;
+ return EDGE_SUCC (bb, 0);
}
@@ -2248,11 +2259,7 @@ dump_cfg_stats (FILE *file)
n_edges = 0;
FOR_EACH_BB (bb)
- {
- edge e;
- for (e = bb->succ; e; e = e->succ_next)
- n_edges++;
- }
+ n_edges += EDGE_COUNT (bb->succs);
size = n_edges * sizeof (struct edge_def);
total += size;
fprintf (file, fmt_str_1, "Edges", n_edges, SCALE (size), LABEL (size));
@@ -2294,6 +2301,7 @@ static void
tree_cfg2vcg (FILE *file)
{
edge e;
+ edge_iterator ei;
basic_block bb;
const char *funcname
= lang_hooks.decl_printable_name (current_function_decl, 2);
@@ -2304,7 +2312,7 @@ tree_cfg2vcg (FILE *file)
fprintf (file, "node: { title: \"EXIT\" label: \"EXIT\" }\n");
/* Write blocks and edges. */
- for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
{
fprintf (file, "edge: { sourcename: \"ENTRY\" targetname: \"%d\"",
e->dest->index);
@@ -2349,7 +2357,7 @@ tree_cfg2vcg (FILE *file)
bb->index, bb->index, head_name, head_line, end_name,
end_line);
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->dest == EXIT_BLOCK_PTR)
fprintf (file, "edge: { sourcename: \"%d\" targetname: \"EXIT\"", bb->index);
@@ -2497,6 +2505,7 @@ disband_implicit_edges (void)
basic_block bb;
block_stmt_iterator last;
edge e;
+ edge_iterator ei;
tree stmt, label;
FOR_EACH_BB (bb)
@@ -2510,7 +2519,7 @@ disband_implicit_edges (void)
from cfg_remove_useless_stmts here since it violates the
invariants for tree--cfg correspondence and thus fits better
here where we do it anyway. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->dest != bb->next_bb)
continue;
@@ -2531,15 +2540,14 @@ disband_implicit_edges (void)
{
/* Remove the RETURN_EXPR if we may fall though to the exit
instead. */
- gcc_assert (bb->succ);
- gcc_assert (!bb->succ->succ_next);
- gcc_assert (bb->succ->dest == EXIT_BLOCK_PTR);
+ gcc_assert (EDGE_COUNT (bb->succs) == 1);
+ gcc_assert (EDGE_SUCC (bb, 0)->dest == EXIT_BLOCK_PTR);
if (bb->next_bb == EXIT_BLOCK_PTR
&& !TREE_OPERAND (stmt, 0))
{
bsi_remove (&last);
- bb->succ->flags |= EDGE_FALLTHRU;
+ EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
}
continue;
}
@@ -2550,7 +2558,7 @@ disband_implicit_edges (void)
continue;
/* Find a fallthru edge and emit the goto if necessary. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->flags & EDGE_FALLTHRU)
break;
@@ -2834,7 +2842,7 @@ tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi,
would have to examine the PHIs to prove that none of them used
the value set by the statement we want to insert on E. That
hardly seems worth the effort. */
- if (dest->pred->pred_next == NULL
+ if (EDGE_COUNT (dest->preds) == 1
&& ! phi_nodes (dest)
&& dest != EXIT_BLOCK_PTR)
{
@@ -2866,7 +2874,7 @@ tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi,
Except for the entry block. */
src = e->src;
if ((e->flags & EDGE_ABNORMAL) == 0
- && src->succ->succ_next == NULL
+ && EDGE_COUNT (src->succs) == 1
&& src != ENTRY_BLOCK_PTR)
{
*bsi = bsi_last (src);
@@ -2897,7 +2905,7 @@ tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi,
dest = split_edge (e);
if (new_bb)
*new_bb = dest;
- e = dest->pred;
+ e = EDGE_PRED (dest, 0);
goto restart;
}
@@ -2914,13 +2922,14 @@ bsi_commit_edge_inserts (int *new_blocks)
basic_block bb;
edge e;
int blocks;
+ edge_iterator ei;
blocks = n_basic_blocks;
- bsi_commit_edge_inserts_1 (ENTRY_BLOCK_PTR->succ);
+ bsi_commit_edge_inserts_1 (EDGE_SUCC (ENTRY_BLOCK_PTR, 0));
FOR_EACH_BB (bb)
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
bsi_commit_edge_inserts_1 (e);
if (new_blocks)
@@ -2990,6 +2999,7 @@ tree_split_edge (edge edge_in)
edge new_edge, e;
tree phi;
int i, num_elem;
+ edge_iterator ei;
/* Abnormal edges cannot be split. */
gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
@@ -3000,7 +3010,7 @@ tree_split_edge (edge edge_in)
/* Place the new block in the block list. Try to keep the new block
near its "logical" location. This is of most help to humans looking
at debugging dumps. */
- for (e = dest->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, dest->preds)
if (e->src->next_bb == dest)
break;
if (!e)
@@ -3424,6 +3434,7 @@ tree_verify_flow_info (void)
block_stmt_iterator bsi;
tree stmt;
edge e;
+ edge_iterator ei;
if (ENTRY_BLOCK_PTR->stmt_list)
{
@@ -3437,7 +3448,7 @@ tree_verify_flow_info (void)
err = 1;
}
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
if (e->flags & EDGE_FALLTHRU)
{
error ("Fallthru to exit from bb %d\n", e->src->index);
@@ -3503,7 +3514,7 @@ tree_verify_flow_info (void)
if (is_ctrl_stmt (stmt))
{
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->flags & EDGE_FALLTHRU)
{
error ("Fallthru edge after a control statement in bb %d \n",
@@ -3532,7 +3543,7 @@ tree_verify_flow_info (void)
|| !(false_edge->flags & EDGE_FALSE_VALUE)
|| (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
|| (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
- || bb->succ->succ_next->succ_next)
+ || EDGE_COUNT (bb->succs) >= 3)
{
error ("Wrong outgoing edge flags at end of bb %d\n",
bb->index);
@@ -3567,7 +3578,7 @@ tree_verify_flow_info (void)
{
/* FIXME. We should double check that the labels in the
destination blocks have their address taken. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
| EDGE_FALSE_VALUE))
|| !(e->flags & EDGE_ABNORMAL))
@@ -3580,14 +3591,14 @@ tree_verify_flow_info (void)
break;
case RETURN_EXPR:
- if (!bb->succ || bb->succ->succ_next
- || (bb->succ->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
+ if (EDGE_COUNT (bb->succs) != 1
+ || (EDGE_SUCC (bb, 0)->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
| EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
{
error ("Wrong outgoing edge flags at end of bb %d\n", bb->index);
err = 1;
}
- if (bb->succ->dest != EXIT_BLOCK_PTR)
+ if (EDGE_SUCC (bb, 0)->dest != EXIT_BLOCK_PTR)
{
error ("Return edge does not point to exit in bb %d\n",
bb->index);
@@ -3643,7 +3654,7 @@ tree_verify_flow_info (void)
err = 1;
}
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (!e->dest->aux)
{
@@ -3675,7 +3686,7 @@ tree_verify_flow_info (void)
}
}
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
e->dest->aux = (void *)0;
}
@@ -3697,13 +3708,14 @@ static void
tree_make_forwarder_block (edge fallthru)
{
edge e;
+ edge_iterator ei;
basic_block dummy, bb;
tree phi, new_phi, var, prev, next;
dummy = fallthru->src;
bb = fallthru->dest;
- if (!bb->pred->pred_next)
+ if (EDGE_COUNT (bb->preds) == 1)
return;
/* If we redirected a branch we must create new phi nodes at the
@@ -3728,7 +3740,7 @@ tree_make_forwarder_block (edge fallthru)
set_phi_nodes (bb, prev);
/* Add the arguments we have stored on edges. */
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
if (e == fallthru)
continue;
@@ -3752,6 +3764,7 @@ tree_forwarder_block_p (basic_block bb)
{
block_stmt_iterator bsi;
edge e;
+ edge_iterator ei;
/* If we have already determined that this block is not forwardable,
then no further checks are necessary. */
@@ -3760,10 +3773,9 @@ tree_forwarder_block_p (basic_block bb)
/* BB must have a single outgoing normal edge. Otherwise it can not be
a forwarder block. */
- if (!bb->succ
- || bb->succ->succ_next
- || bb->succ->dest == EXIT_BLOCK_PTR
- || (bb->succ->flags & EDGE_ABNORMAL)
+ if (EDGE_COUNT (bb->succs) != 1
+ || EDGE_SUCC (bb, 0)->dest == EXIT_BLOCK_PTR
+ || (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL)
|| bb == ENTRY_BLOCK_PTR)
{
bb_ann (bb)->forwardable = 0;
@@ -3771,7 +3783,7 @@ tree_forwarder_block_p (basic_block bb)
}
/* Successors of the entry block are not forwarders. */
- for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
if (e->dest == bb)
{
bb_ann (bb)->forwardable = 0;
@@ -3818,9 +3830,9 @@ tree_forwarder_block_p (basic_block bb)
static bool
thread_jumps (void)
{
- edge e, next, last, old;
+ edge e, last, old;
basic_block bb, dest, tmp, old_dest, curr, dom;
- tree phi;
+ tree phi;
int arg;
bool retval = false;
@@ -3829,8 +3841,10 @@ thread_jumps (void)
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
{
+ edge_iterator ei;
+
/* Don't waste time on unreachable blocks. */
- if (!bb->pred)
+ if (EDGE_COUNT (bb->preds) == 0)
continue;
/* Nor on forwarders. */
@@ -3844,37 +3858,39 @@ thread_jumps (void)
/* Examine each of our block's successors to see if it is
forwardable. */
- for (e = bb->succ; e; e = next)
+ for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
{
int freq;
gcov_type count;
- next = e->succ_next;
/* If the edge is abnormal or its destination is not
forwardable, then there's nothing to do. */
if ((e->flags & EDGE_ABNORMAL)
|| !tree_forwarder_block_p (e->dest))
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
count = e->count;
freq = EDGE_FREQUENCY (e);
- /* Now walk through as many forwarder block as possible to
+ /* Now walk through as many forwarder blocks as possible to
find the ultimate destination we want to thread our jump
to. */
- last = e->dest->succ;
+ last = EDGE_SUCC (e->dest, 0);
bb_ann (e->dest)->forwardable = 0;
- for (dest = e->dest->succ->dest;
+ for (dest = EDGE_SUCC (e->dest, 0)->dest;
tree_forwarder_block_p (dest);
- last = dest->succ,
- dest = dest->succ->dest)
+ last = EDGE_SUCC (dest, 0),
+ dest = EDGE_SUCC (dest, 0)->dest)
{
/* An infinite loop detected. We redirect the edge anyway, so
that the loop is shrunk into single basic block. */
if (!bb_ann (dest)->forwardable)
break;
- if (dest->succ->dest == EXIT_BLOCK_PTR)
+ if (EDGE_SUCC (dest, 0)->dest == EXIT_BLOCK_PTR)
break;
bb_ann (dest)->forwardable = 0;
@@ -3883,11 +3899,14 @@ thread_jumps (void)
/* Reset the forwardable marks to 1. */
for (tmp = e->dest;
tmp != dest;
- tmp = tmp->succ->dest)
+ tmp = EDGE_SUCC (tmp, 0)->dest)
bb_ann (tmp)->forwardable = 1;
if (dest == e->dest)
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
old = find_edge (bb, dest);
if (old)
@@ -3903,7 +3922,10 @@ thread_jumps (void)
/* That might mean that no forwarding at all is possible. */
if (dest == e->dest)
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
old = find_edge (bb, dest);
}
@@ -3916,7 +3938,7 @@ thread_jumps (void)
/* Update the profile. */
if (profile_status != PROFILE_ABSENT)
- for (curr = old_dest; curr != dest; curr = curr->succ->dest)
+ for (curr = old_dest; curr != dest; curr = EDGE_SUCC (curr, 0)->dest)
{
curr->frequency -= freq;
if (curr->frequency < 0)
@@ -3924,9 +3946,9 @@ thread_jumps (void)
curr->count -= count;
if (curr->count < 0)
curr->count = 0;
- curr->succ->count -= count;
- if (curr->succ->count < 0)
- curr->succ->count = 0;
+ EDGE_SUCC (curr, 0)->count -= count;
+ if (EDGE_SUCC (curr, 0)->count < 0)
+ EDGE_SUCC (curr, 0)->count = 0;
}
if (!old)
@@ -3951,9 +3973,9 @@ thread_jumps (void)
become unreachable). */
for (; old_dest != dest; old_dest = tmp)
{
- tmp = old_dest->succ->dest;
+ tmp = EDGE_SUCC (old_dest, 0)->dest;
- if (old_dest->pred)
+ if (EDGE_COUNT (old_dest->preds) > 0)
break;
delete_basic_block (old_dest);
@@ -3974,7 +3996,7 @@ thread_jumps (void)
for (; old_dest != dest; old_dest = tmp)
{
- tmp = old_dest->succ->dest;
+ tmp = EDGE_SUCC (old_dest, 0)->dest;
if (get_immediate_dominator (CDI_DOMINATORS, tmp) == old_dest
&& !dominated_by_p (CDI_DOMINATORS, bb, tmp))
@@ -4042,9 +4064,10 @@ tree_try_redirect_by_replacing_jump (edge e, basic_block target)
edge tmp;
block_stmt_iterator b;
tree stmt;
+ edge_iterator ei;
/* Verify that all targets will be TARGET. */
- for (tmp = src->succ; tmp; tmp = tmp->succ_next)
+ FOR_EACH_EDGE (tmp, ei, src->succs)
if (tmp->dest != target && tmp != e)
break;
@@ -4166,13 +4189,14 @@ tree_split_block (basic_block bb, void *stmt)
tree act;
basic_block new_bb;
edge e;
+ edge_iterator ei;
new_bb = create_empty_bb (bb);
/* Redirect the outgoing edges. */
- new_bb->succ = bb->succ;
- bb->succ = NULL;
- for (e = new_bb->succ; e; e = e->succ_next)
+ new_bb->succs = bb->succs;
+ bb->succs = NULL;
+ FOR_EACH_EDGE (e, ei, new_bb->succs)
e->src = new_bb;
if (stmt && TREE_CODE ((tree) stmt) == LABEL_EXPR)
@@ -4289,11 +4313,12 @@ add_phi_args_after_copy_bb (basic_block bb_copy)
{
basic_block bb, dest;
edge e, e_copy;
+ edge_iterator ei;
tree phi, phi_copy, phi_next, def;
bb = bb_copy->rbi->original;
- for (e_copy = bb_copy->succ; e_copy; e_copy = e_copy->succ_next)
+ FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
{
if (!phi_nodes (e_copy->dest))
continue;
@@ -4309,7 +4334,7 @@ add_phi_args_after_copy_bb (basic_block bb_copy)
/* During loop unrolling the target of the latch edge is copied.
In this case we are not looking for edge to dest, but to
duplicated block whose original was dest. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->dest->rbi->duplicated
&& e->dest->rbi->original == dest)
break;
@@ -4453,6 +4478,7 @@ rewrite_to_new_ssa_names_bb (basic_block bb, htab_t map)
{
unsigned i;
edge e;
+ edge_iterator ei;
tree phi, stmt;
block_stmt_iterator bsi;
use_optype uses;
@@ -4462,7 +4488,7 @@ rewrite_to_new_ssa_names_bb (basic_block bb, htab_t map)
v_must_def_optype v_must_defs;
stmt_ann_t ann;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (e->flags & EDGE_ABNORMAL)
break;
@@ -4506,7 +4532,7 @@ rewrite_to_new_ssa_names_bb (basic_block bb, htab_t map)
(V_MUST_DEF_OP_PTR (v_must_defs, i), stmt, map);
}
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
for (phi = phi_nodes (e->dest); phi; phi = TREE_CHAIN (phi))
{
rewrite_to_new_ssa_names_use
@@ -4771,43 +4797,33 @@ dump_function_to_file (tree fn, FILE *file, int flags)
/* Pretty print of the loops intermediate representation. */
static void print_loop (FILE *, struct loop *, int);
-static void print_pred_bbs (FILE *, edge);
-static void print_succ_bbs (FILE *, edge);
+static void print_pred_bbs (FILE *, basic_block bb);
+static void print_succ_bbs (FILE *, basic_block bb);
/* Print the predecessors indexes of edge E on FILE. */
static void
-print_pred_bbs (FILE *file, edge e)
+print_pred_bbs (FILE *file, basic_block bb)
{
- if (e == NULL)
- return;
-
- else if (e->pred_next == NULL)
+ edge e;
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, bb->preds)
fprintf (file, "bb_%d", e->src->index);
-
- else
- {
- fprintf (file, "bb_%d, ", e->src->index);
- print_pred_bbs (file, e->pred_next);
- }
}
/* Print the successors indexes of edge E on FILE. */
static void
-print_succ_bbs (FILE *file, edge e)
+print_succ_bbs (FILE *file, basic_block bb)
{
- if (e == NULL)
- return;
- else if (e->succ_next == NULL)
- fprintf (file, "bb_%d", e->dest->index);
- else
- {
- fprintf (file, "bb_%d, ", e->dest->index);
- print_succ_bbs (file, e->succ_next);
- }
+ edge e;
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ fprintf (file, "bb_%d", e->src->index);
}
@@ -4836,9 +4852,9 @@ print_loop (FILE *file, struct loop *loop, int indent)
{
/* Print the basic_block's header. */
fprintf (file, "%s bb_%d (preds = {", s_indent, bb->index);
- print_pred_bbs (file, bb->pred);
+ print_pred_bbs (file, bb);
fprintf (file, "}, succs = {");
- print_succ_bbs (file, bb->succ);
+ print_succ_bbs (file, bb);
fprintf (file, "})\n");
/* Print the basic_block's body. */
@@ -4966,6 +4982,7 @@ tree_flow_call_edges_add (sbitmap blocks)
Handle this by adding a dummy instruction in a new last basic block. */
if (check_last_block)
{
+ edge_iterator ei;
basic_block bb = EXIT_BLOCK_PTR->prev_bb;
block_stmt_iterator bsi = bsi_last (bb);
tree t = NULL_TREE;
@@ -4976,7 +4993,7 @@ tree_flow_call_edges_add (sbitmap blocks)
{
edge e;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->dest == EXIT_BLOCK_PTR)
{
bsi_insert_on_edge (e, build_empty_stmt ());
@@ -5018,8 +5035,11 @@ tree_flow_call_edges_add (sbitmap blocks)
mark that edge as fake and remove it later. */
#ifdef ENABLE_CHECKING
if (stmt == last_stmt)
- for (e = bb->succ; e; e = e->succ_next)
- gcc_assert (e->dest != EXIT_BLOCK_PTR);
+ {
+ edge_iterator ei;
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ gcc_assert (e->dest != EXIT_BLOCK_PTR);
+ }
#endif
/* Note that the following may create a new basic block
@@ -5048,20 +5068,22 @@ bool
tree_purge_dead_eh_edges (basic_block bb)
{
bool changed = false;
- edge e, next;
+ edge e;
+ edge_iterator ei;
tree stmt = last_stmt (bb);
if (stmt && tree_can_throw_internal (stmt))
return false;
- for (e = bb->succ; e ; e = next)
+ for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
{
- next = e->succ_next;
if (e->flags & EDGE_EH)
{
ssa_remove_edge (e);
changed = true;
}
+ else
+ ei_next (&ei);
}
return changed;
@@ -5114,10 +5136,11 @@ split_critical_edges (void)
{
basic_block bb;
edge e;
+ edge_iterator ei;
FOR_ALL_BB (bb)
{
- for (e = bb->succ; e ; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
{
split_edge (e);
@@ -5227,10 +5250,11 @@ execute_warn_function_return (void)
#endif
tree last;
edge e;
+ edge_iterator ei;
if (warn_missing_noreturn
&& !TREE_THIS_VOLATILE (cfun->decl)
- && EXIT_BLOCK_PTR->pred == NULL
+ && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0
&& !lang_hooks.function.missing_noreturn_ok_p (cfun->decl))
warning ("%Jfunction might be possible candidate for "
"attribute %<noreturn%>",
@@ -5238,14 +5262,14 @@ execute_warn_function_return (void)
/* If we have a path to EXIT, then we do return. */
if (TREE_THIS_VOLATILE (cfun->decl)
- && EXIT_BLOCK_PTR->pred != NULL)
+ && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
{
#ifdef USE_MAPPED_LOCATION
location = UNKNOWN_LOCATION;
#else
locus = NULL;
#endif
- for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
{
last = last_stmt (e->src);
if (TREE_CODE (last) == RETURN_EXPR
@@ -5270,10 +5294,10 @@ execute_warn_function_return (void)
/* If we see "return;" in some basic block, then we do reach the end
without returning a value. */
else if (warn_return_type
- && EXIT_BLOCK_PTR->pred != NULL
+ && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
&& !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
{
- for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
{
tree last = last_stmt (e->src);
if (TREE_CODE (last) == RETURN_EXPR
@@ -5307,17 +5331,17 @@ extract_true_false_edges_from_block (basic_block b,
edge *true_edge,
edge *false_edge)
{
- edge e = b->succ;
+ edge e = EDGE_SUCC (b, 0);
if (e->flags & EDGE_TRUE_VALUE)
{
*true_edge = e;
- *false_edge = e->succ_next;
+ *false_edge = EDGE_SUCC (b, 1);
}
else
{
*false_edge = e;
- *true_edge = e->succ_next;
+ *true_edge = EDGE_SUCC (b, 1);
}
}
diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c
index 2d48093c0e2..00f3b5f285c 100644
--- a/gcc/tree-chrec.c
+++ b/gcc/tree-chrec.c
@@ -117,7 +117,7 @@ chrec_fold_plus_poly_poly (enum tree_code code,
(CHREC_VARIABLE (poly1),
chrec_fold_minus (type, poly0, CHREC_LEFT (poly1)),
chrec_fold_multiply (type, CHREC_RIGHT (poly1),
- convert (type, integer_minus_one_node)));
+ build_int_cst_type (type, -1)));
}
if (CHREC_VARIABLE (poly0) > CHREC_VARIABLE (poly1))
@@ -282,9 +282,8 @@ chrec_fold_plus_1 (enum tree_code code,
return build_polynomial_chrec
(CHREC_VARIABLE (op1),
chrec_fold_minus (type, op0, CHREC_LEFT (op1)),
- chrec_fold_multiply (type, CHREC_RIGHT (op1),
- convert (type,
- integer_minus_one_node)));
+ chrec_fold_multiply (type, CHREC_RIGHT (op1),
+ build_int_cst_type (type, -1)));
default:
if (tree_contains_chrecs (op0)
@@ -347,7 +346,7 @@ chrec_fold_multiply (tree type,
if (integer_onep (op1))
return op0;
if (integer_zerop (op1))
- return convert (type, integer_zero_node);
+ return build_int_cst_type (type, 0);
return build_polynomial_chrec
(CHREC_VARIABLE (op0),
@@ -360,7 +359,7 @@ chrec_fold_multiply (tree type,
return op1;
if (integer_zerop (op0))
- return convert (type, integer_zero_node);
+ return build_int_cst_type (type, 0);
switch (TREE_CODE (op1))
{
@@ -374,7 +373,7 @@ chrec_fold_multiply (tree type,
if (integer_onep (op1))
return op0;
if (integer_zerop (op1))
- return convert (type, integer_zero_node);
+ return build_int_cst_type (type, 0);
return fold (build (MULT_EXPR, type, op0, op1));
}
}
diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
index 679ffef06aa..29de6704041 100644
--- a/gcc/tree-dfa.c
+++ b/gcc/tree-dfa.c
@@ -891,12 +891,11 @@ add_referenced_var (tree var, struct walk_state *walk_state)
if (is_global_var (var))
mark_call_clobbered (var);
- /* If an initialized global variable then register the initializer
- as well. */
- if (POINTER_TYPE_P (TREE_TYPE (var))
- && TREE_READONLY (var)
- && DECL_INITIAL (var)
- && TREE_CODE (DECL_INITIAL (var)) == ADDR_EXPR)
+ /* Scan DECL_INITIAL for pointer variables as they may contain
+ address arithmetic referencing the address of other
+ variables. */
+ if (DECL_INITIAL (var)
+ && POINTER_TYPE_P (TREE_TYPE (var)))
walk_tree (&DECL_INITIAL (var), find_vars_r, walk_state, 0);
}
}
diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h
index eb2a1cbe1df..96b62d3d962 100644
--- a/gcc/tree-flow.h
+++ b/gcc/tree-flow.h
@@ -343,10 +343,6 @@ struct bb_ann_d GTY(())
/* Chain of PHI nodes for this block. */
tree phi_nodes;
- /* Number of predecessors for this block. This is only valid during
- SSA rewriting. It is not maintained after conversion into SSA form. */
- int num_preds;
-
/* Nonzero if this block is forwardable during cfg cleanups. This is also
used to detect loops during cfg cleanups. */
unsigned forwardable: 1;
@@ -619,6 +615,7 @@ extern void propagate_value (use_operand_p, tree);
extern void propagate_tree_value (tree *, tree);
extern void replace_exp (use_operand_p, tree);
extern bool may_propagate_copy (tree, tree);
+extern bool may_propagate_copy_into_asm (tree);
/* Description of number of iterations of a loop. All the expressions inside
the structure can be evaluated at the end of the loop's preheader
diff --git a/gcc/tree-gimple.c b/gcc/tree-gimple.c
index 818ec1378aa..b2a2ad9a2bd 100644
--- a/gcc/tree-gimple.c
+++ b/gcc/tree-gimple.c
@@ -170,9 +170,8 @@ is_gimple_addressable (tree t)
return (is_gimple_id (t) || handled_component_p (t)
|| TREE_CODE (t) == REALPART_EXPR
|| TREE_CODE (t) == IMAGPART_EXPR
- || TREE_CODE (t) == INDIRECT_REF
- || TREE_CODE (t) == ALIGN_INDIRECT_REF
- || TREE_CODE (t) == MISALIGNED_INDIRECT_REF);
+ || INDIRECT_REF_P (t));
+
}
/* Return true if T is function invariant. Or rather a restricted
@@ -283,12 +282,35 @@ is_gimple_reg (tree t)
if (TREE_CODE (t) == SSA_NAME)
t = SSA_NAME_VAR (t);
- return (is_gimple_variable (t)
- && is_gimple_reg_type (TREE_TYPE (t))
- /* A volatile decl is not acceptable because we can't reuse it as
- needed. We need to copy it into a temp first. */
- && ! TREE_THIS_VOLATILE (t)
- && ! needs_to_live_in_memory (t));
+ if (!is_gimple_variable (t))
+ return false;
+ if (!is_gimple_reg_type (TREE_TYPE (t)))
+ return false;
+
+ /* A volatile decl is not acceptable because we can't reuse it as
+ needed. We need to copy it into a temp first. */
+ if (TREE_THIS_VOLATILE (t))
+ return false;
+
+ /* We define "registers" as things that can be renamed as needed,
+ which with our infrastructure does not apply to memory. */
+ if (needs_to_live_in_memory (t))
+ return false;
+
+ /* Hard register variables are an interesting case. For those that
+ are call-clobbered, we don't know where all the calls are, since
+ we don't (want to) take into account which operations will turn
+ into libcalls at the rtl level. For those that are call-saved,
+ we don't currently model the fact that calls may in fact change
+ global hard registers, nor do we examine ASM_CLOBBERS at the tree
+ level, and so miss variable changes that might imply. All around,
+ it seems safest to not do too much optimization with these at the
+ tree level at all. We'll have to rely on the rtl optimizers to
+ clean this up, as there we've got all the appropriate bits exposed. */
+ if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
+ return false;
+
+ return true;
}
/* Returns true if T is a GIMPLE formal temporary variable. */
@@ -350,6 +372,16 @@ is_gimple_val (tree t)
return (is_gimple_variable (t) || is_gimple_min_invariant (t));
}
+/* Similarly, but accept hard registers as inputs to asm statements. */
+
+bool
+is_gimple_asm_val (tree t)
+{
+ if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
+ return true;
+
+ return is_gimple_val (t);
+}
/* Return true if T is a GIMPLE minimal lvalue. */
@@ -412,9 +444,7 @@ get_base_address (tree t)
if (SSA_VAR_P (t)
|| TREE_CODE (t) == STRING_CST
|| TREE_CODE (t) == CONSTRUCTOR
- || TREE_CODE (t) == MISALIGNED_INDIRECT_REF
- || TREE_CODE (t) == ALIGN_INDIRECT_REF
- || TREE_CODE (t) == INDIRECT_REF)
+ || INDIRECT_REF_P (t))
return t;
else
return NULL_TREE;
diff --git a/gcc/tree-gimple.h b/gcc/tree-gimple.h
index d0f8ff5ed90..b3fb9c69c91 100644
--- a/gcc/tree-gimple.h
+++ b/gcc/tree-gimple.h
@@ -64,6 +64,8 @@ extern bool is_gimple_lvalue (tree);
extern bool is_gimple_min_invariant (tree);
/* Returns true iff T is a GIMPLE rvalue. */
extern bool is_gimple_val (tree);
+/* Returns true iff T is a GIMPLE asm statement input. */
+extern bool is_gimple_asm_val (tree);
/* Returns true iff T is a valid rhs for a MODIFY_EXPR where the LHS is a
GIMPLE temporary, a renamed user variable, or something else,
respectively. */
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index 3ee16739cf8..88696465856 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -187,9 +187,9 @@ tree_if_conversion (struct loop *loop, bool for_vectorizer)
/* If current bb has only one successor, then consider it as an
unconditional goto. */
- if (bb->succ && !bb->succ->succ_next)
+ if (EDGE_COUNT (bb->succs) == 1)
{
- basic_block bb_n = bb->succ->dest;
+ basic_block bb_n = EDGE_SUCC (bb, 0)->dest;
if (cond != NULL_TREE)
add_to_predicate_list (bb_n, cond);
cond = NULL_TREE;
@@ -472,6 +472,7 @@ static bool
if_convertable_bb_p (struct loop *loop, basic_block bb, bool exit_bb_seen)
{
edge e;
+ edge_iterator ei;
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "----------[%d]-------------\n", bb->index);
@@ -493,7 +494,7 @@ if_convertable_bb_p (struct loop *loop, basic_block bb, bool exit_bb_seen)
}
/* Be less adventurous and handle only normal edges. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->flags &
(EDGE_ABNORMAL_CALL | EDGE_EH | EDGE_ABNORMAL | EDGE_IRREDUCIBLE_LOOP))
{
@@ -524,6 +525,7 @@ if_convertable_loop_p (struct loop *loop, bool for_vectorizer ATTRIBUTE_UNUSED)
block_stmt_iterator itr;
unsigned int i;
edge e;
+ edge_iterator ei;
bool exit_bb_seen = false;
/* Handle only inner most loop. */
@@ -556,7 +558,7 @@ if_convertable_loop_p (struct loop *loop, bool for_vectorizer ATTRIBUTE_UNUSED)
/* If one of the loop header's edge is exit edge then do not apply
if-conversion. */
- for (e = loop->header->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, loop->header->succs)
if ( e->flags & EDGE_LOOP_EXIT)
return false;
@@ -679,11 +681,12 @@ find_phi_replacement_condition (basic_block bb, tree *cond,
basic_block p2 = NULL;
basic_block true_bb = NULL;
tree tmp_cond;
+ edge_iterator ei;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
if (p1 == NULL)
- p1 = e->src;
+ p1 = e->src;
else
{
gcc_assert (!p2);
@@ -869,6 +872,7 @@ combine_blocks (struct loop *loop)
if (bb == exit_bb)
{
edge new_e;
+ edge_iterator ei;
/* Connect this node with loop header. */
new_e = make_edge (ifc_bbs[0], bb, EDGE_FALLTHRU);
@@ -877,7 +881,7 @@ combine_blocks (struct loop *loop)
if (exit_bb != loop->latch)
{
/* Redirect non-exit edge to loop->latch. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (!(e->flags & EDGE_LOOP_EXIT))
{
redirect_edge_and_branch (e, loop->latch);
@@ -888,10 +892,10 @@ combine_blocks (struct loop *loop)
}
/* It is time to remove this basic block. First remove edges. */
- while (bb->succ != NULL)
- ssa_remove_edge (bb->succ);
- while (bb->pred != NULL)
- ssa_remove_edge (bb->pred);
+ while (EDGE_COUNT (bb->succs) > 0)
+ ssa_remove_edge (EDGE_SUCC (bb, 0));
+ while (EDGE_COUNT (bb->preds) > 0)
+ ssa_remove_edge (EDGE_PRED (bb, 0));
/* Remove labels and make stmts member of loop->header. */
for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
@@ -970,7 +974,8 @@ static bool
pred_blocks_visited_p (basic_block bb, bitmap *visited)
{
edge e;
- for (e = bb->pred; e; e = e->pred_next)
+ edge_iterator ei;
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (!bitmap_bit_p (*visited, e->src->index))
return false;
@@ -1041,11 +1046,15 @@ static bool
bb_with_exit_edge_p (basic_block bb)
{
edge e;
+ edge_iterator ei;
bool exit_edge_found = false;
- for (e = bb->succ; e && !exit_edge_found ; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->flags & EDGE_LOOP_EXIT)
- exit_edge_found = true;
+ {
+ exit_edge_found = true;
+ break;
+ }
return exit_edge_found;
}
diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c
index fa57f06030a..fa0d1b788a1 100644
--- a/gcc/tree-into-ssa.c
+++ b/gcc/tree-into-ssa.c
@@ -245,12 +245,13 @@ compute_global_livein (bitmap livein, bitmap def_blocks)
while (tos != worklist)
{
edge e;
+ edge_iterator ei;
/* Pull a block off the worklist. */
bb = *--tos;
/* For each predecessor block. */
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
basic_block pred = e->src;
int pred_index = pred->index;
@@ -320,8 +321,9 @@ ssa_mark_phi_uses (struct dom_walk_data *walk_data, basic_block bb)
edge e;
tree phi, use;
unsigned uid;
+ edge_iterator ei;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->dest == EXIT_BLOCK_PTR)
continue;
@@ -699,6 +701,7 @@ ssa_rewrite_initialize_block (struct dom_walk_data *walk_data, basic_block bb)
sbitmap names_to_rename = walk_data->global_data;
edge e;
bool abnormal_phi;
+ edge_iterator ei;
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "\n\nRenaming block #%d\n\n", bb->index);
@@ -706,7 +709,7 @@ ssa_rewrite_initialize_block (struct dom_walk_data *walk_data, basic_block bb)
/* Mark the unwind point for this block. */
VARRAY_PUSH_GENERIC_PTR (block_defs_stack, NULL);
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (e->flags & EDGE_ABNORMAL)
break;
abnormal_phi = (e != NULL);
@@ -743,8 +746,9 @@ rewrite_add_phi_arguments (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
basic_block bb)
{
edge e;
+ edge_iterator ei;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
tree phi;
@@ -772,8 +776,9 @@ ssa_rewrite_phi_arguments (struct dom_walk_data *walk_data, basic_block bb)
edge e;
sbitmap names_to_rename = walk_data->global_data;
use_operand_p op;
+ edge_iterator ei;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
tree phi;
@@ -958,7 +963,8 @@ insert_phi_nodes_for (tree var, bitmap *dfs, varray_type *work_stack)
/* If we are rewriting ssa names, add also the phi arguments. */
if (TREE_CODE (var) == SSA_NAME)
{
- for (e = bb->pred; e; e = e->pred_next)
+ edge_iterator ei;
+ FOR_EACH_EDGE (e, ei, bb->preds)
add_phi_arg (&phi, var, e);
}
}
@@ -1500,16 +1506,7 @@ rewrite_into_ssa (bool all)
can save significant time during PHI insertion for large graphs. */
dfs = (bitmap *) xmalloc (last_basic_block * sizeof (bitmap *));
FOR_EACH_BB (bb)
- {
- edge e;
- int count = 0;
-
- for (e = bb->pred; e; e = e->pred_next)
- count++;
-
- bb_ann (bb)->num_preds = count;
- dfs[bb->index] = BITMAP_XMALLOC ();
- }
+ dfs[bb->index] = BITMAP_XMALLOC ();
for (i = 0; i < num_referenced_vars; i++)
set_current_def (referenced_var (i), NULL_TREE);
@@ -1635,16 +1632,7 @@ rewrite_ssa_into_ssa (void)
can save significant time during PHI insertion for large graphs. */
dfs = (bitmap *) xmalloc (last_basic_block * sizeof (bitmap *));
FOR_EACH_BB (bb)
- {
- edge e;
- int count = 0;
-
- for (e = bb->pred; e; e = e->pred_next)
- count++;
-
- bb_ann (bb)->num_preds = count;
- dfs[bb->index] = BITMAP_XMALLOC ();
- }
+ dfs[bb->index] = BITMAP_XMALLOC ();
/* Ensure that the dominance information is OK. */
calculate_dominance_info (CDI_DOMINATORS);
diff --git a/gcc/tree-mudflap.c b/gcc/tree-mudflap.c
index 659a5cc0f06..a61a7ad935c 100644
--- a/gcc/tree-mudflap.c
+++ b/gcc/tree-mudflap.c
@@ -538,7 +538,7 @@ mf_build_check_statement_for (tree addr, tree size,
/* We expect that the conditional jump we will construct will not
be taken very often as it basically is an exception condition. */
- predict_edge_def (then_bb->pred, PRED_MUDFLAP, NOT_TAKEN);
+ predict_edge_def (EDGE_PRED (then_bb, 0), PRED_MUDFLAP, NOT_TAKEN);
/* Mark the pseudo-fallthrough edge from cond_bb to join_bb. */
e = find_edge (cond_bb, join_bb);
diff --git a/gcc/tree-optimize.c b/gcc/tree-optimize.c
index dc048f5b09d..0b003f32482 100644
--- a/gcc/tree-optimize.c
+++ b/gcc/tree-optimize.c
@@ -569,7 +569,7 @@ update_inlined_to_pointers (struct cgraph_node *node,
compilation for FNDECL. */
void
-tree_rest_of_compilation (tree fndecl, bool nested_p)
+tree_rest_of_compilation (tree fndecl)
{
location_t saved_loc;
struct cgraph_node *saved_node = NULL, *node;
@@ -633,11 +633,6 @@ tree_rest_of_compilation (tree fndecl, bool nested_p)
if (!vars_to_rename)
vars_to_rename = BITMAP_XMALLOC ();
- /* If this is a nested function, protect the local variables in the stack
- above us from being collected while we're compiling this function. */
- if (nested_p)
- ggc_push_context ();
-
/* Perform all tree transforms and optimizations. */
execute_pass_list (all_passes);
@@ -693,7 +688,7 @@ tree_rest_of_compilation (tree fndecl, bool nested_p)
}
}
- if (!nested_p && !flag_inline_trees)
+ if (!flag_inline_trees)
{
DECL_SAVED_TREE (fndecl) = NULL;
if (DECL_STRUCT_FUNCTION (fndecl) == 0
@@ -712,9 +707,5 @@ tree_rest_of_compilation (tree fndecl, bool nested_p)
input_location = saved_loc;
ggc_collect ();
-
- /* Undo the GC context switch. */
- if (nested_p)
- ggc_pop_context ();
timevar_pop (TV_EXPAND);
}
diff --git a/gcc/tree-outof-ssa.c b/gcc/tree-outof-ssa.c
index e23f0a182b6..827f91d1511 100644
--- a/gcc/tree-outof-ssa.c
+++ b/gcc/tree-outof-ssa.c
@@ -581,13 +581,14 @@ coalesce_abnormal_edges (var_map map, conflict_graph graph, root_var_p rv)
edge e;
tree phi, var, tmp;
int x, y;
+ edge_iterator ei;
/* Code cannot be inserted on abnormal edges. Look for all abnormal
edges, and coalesce any PHI results with their arguments across
that edge. */
FOR_EACH_BB (bb)
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->dest != EXIT_BLOCK_PTR && e->flags & EDGE_ABNORMAL)
for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
{
@@ -1475,11 +1476,6 @@ check_replaceable (temp_expr_table_p tab, tree stmt)
if (version_ref_count (map, def) != 1)
return false;
- /* Assignments to variables assigned to hard registers are not
- replaceable. */
- if (DECL_HARD_REGISTER (SSA_NAME_VAR (def)))
- return false;
-
/* There must be no V_MAY_DEFS. */
if (NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann)) != 0)
return false;
@@ -1930,7 +1926,8 @@ rewrite_trees (var_map map, tree *values)
phi = phi_nodes (bb);
if (phi)
{
- for (e = bb->pred; e; e = e->pred_next)
+ edge_iterator ei;
+ FOR_EACH_EDGE (e, ei, bb->preds)
eliminate_phi (e, phi_arg_from_edge (phi, e), g);
}
}
diff --git a/gcc/tree-phinodes.c b/gcc/tree-phinodes.c
index 712e3f91c7a..6dc5c7692de 100644
--- a/gcc/tree-phinodes.c
+++ b/gcc/tree-phinodes.c
@@ -291,7 +291,7 @@ create_phi_node (tree var, basic_block bb)
{
tree phi;
- phi = make_phi_node (var, bb_ann (bb)->num_preds);
+ phi = make_phi_node (var, EDGE_COUNT (bb->preds));
/* This is a new phi node, so note that is has not yet been
rewritten. */
diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c
index 661e2e7fcc3..4c793973e6d 100644
--- a/gcc/tree-pretty-print.c
+++ b/gcc/tree-pretty-print.c
@@ -331,7 +331,13 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
&& DECL_NAME (TYPE_NAME (node)))
dump_decl_name (buffer, TYPE_NAME (node), flags);
else
- pp_string (buffer, "<unnamed type>");
+ pp_string (buffer, "<unnamed type>");
+ }
+ else if (TREE_CODE (node) == VECTOR_TYPE)
+ {
+ pp_string (buffer, "vector ");
+ dump_generic_node (buffer, TREE_TYPE (node),
+ spc, flags, false);
}
else
pp_string (buffer, "<unnamed type>");
@@ -1470,6 +1476,16 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
pp_string (buffer, ">");
break;
+ case VEC_COND_EXPR:
+ pp_string (buffer, " VEC_COND_EXPR < ");
+ dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+ pp_string (buffer, " , ");
+ dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+ pp_string (buffer, " , ");
+ dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
+ pp_string (buffer, " > ");
+ break;
+
default:
NIY;
}
@@ -1550,6 +1566,14 @@ print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
dump_generic_node (buffer, t, spc, flags, false);
}
+ if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
+ {
+ pp_string (buffer, " __asm__ ");
+ pp_character (buffer, '(');
+ dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
+ pp_character (buffer, ')');
+ }
+
/* The initial value of a function serves to determine wether the function
is declared or defined. So the following does not apply to function
nodes. */
@@ -2152,6 +2176,7 @@ dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
{
edge e;
tree stmt;
+ edge_iterator ei;
if (flags & TDF_BLOCKS)
{
@@ -2175,8 +2200,8 @@ dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
pp_string (buffer, "# PRED:");
pp_write_text_to_stream (buffer);
- for (e = bb->pred; e; e = e->pred_next)
- if (flags & TDF_SLIM)
+ FOR_EACH_EDGE (e, ei, bb->preds)
+ if (flags & TDF_SLIM)
{
pp_string (buffer, " ");
if (e->src == ENTRY_BLOCK_PTR)
@@ -2211,11 +2236,12 @@ static void
dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags)
{
edge e;
+ edge_iterator ei;
INDENT (indent);
pp_string (buffer, "# SUCC:");
pp_write_text_to_stream (buffer);
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (flags & TDF_SLIM)
{
pp_string (buffer, " ");
@@ -2281,10 +2307,11 @@ dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent,
int flags)
{
edge e;
+ edge_iterator ei;
/* If there is a fallthru edge, we may need to add an artificial goto to the
dump. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->flags & EDGE_FALLTHRU)
break;
if (e && e->dest != bb->next_bb)
diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c
index 35d2fe9ca8b..e2d42979091 100644
--- a/gcc/tree-scalar-evolution.c
+++ b/gcc/tree-scalar-evolution.c
@@ -506,9 +506,8 @@ compute_overall_effect_of_inner_loop (struct loop *loop, tree evolution_fn)
/* Number of iterations is off by one (the ssa name we
analyze must be defined before the exit). */
nb_iter = chrec_fold_minus (chrec_type (nb_iter),
- nb_iter,
- fold_convert (chrec_type (nb_iter),
- integer_one_node));
+ nb_iter,
+ build_int_cst_type (chrec_type (nb_iter), 1));
/* evolution_fn is the evolution function in LOOP. Get
its value in the nb_iter-th iteration. */
@@ -896,7 +895,7 @@ add_to_evolution (unsigned loop_nb,
if (code == MINUS_EXPR)
to_add = chrec_fold_multiply (type, to_add,
- fold_convert (type, integer_minus_one_node));
+ build_int_cst_type (type, -1));
res = add_to_evolution_1 (loop_nb, chrec_before, to_add);
@@ -916,7 +915,9 @@ static inline tree
set_nb_iterations_in_loop (struct loop *loop,
tree res)
{
- res = chrec_fold_plus (chrec_type (res), res, integer_one_node);
+ res = chrec_fold_plus (chrec_type (res), res,
+ build_int_cst_type (chrec_type (res), 1));
+
/* FIXME HWI: However we want to store one iteration less than the
count of the loop in order to be compatible with the other
nb_iter computations in loop-iv. This also allows the
@@ -1209,8 +1210,7 @@ follow_ssa_edge_in_rhs (struct loop *loop,
(loop->num,
chrec_fold_multiply (type_rhs,
*evolution_of_loop,
- fold_convert (type_rhs,
- integer_minus_one_node)),
+ build_int_cst_type (type_rhs, -1)),
PLUS_EXPR, rhs0);
}
}
@@ -1241,7 +1241,7 @@ follow_ssa_edge_in_rhs (struct loop *loop,
(loop->num,
chrec_fold_multiply (type_rhs,
*evolution_of_loop,
- fold_convert (type_rhs, integer_minus_one_node)),
+ build_int_cst_type (type_rhs, -1)),
PLUS_EXPR, rhs0);
}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 53c125c698d..c6e1c4ed872 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -1639,10 +1639,11 @@ void
insert_edge_copies (tree stmt, basic_block bb)
{
edge e;
+ edge_iterator ei;
bool first_copy;
first_copy = true;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
/* We don't need to insert copies on abnormal edges. The
value of the scalar replacement is not guaranteed to
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 883c53d935e..9dab4c676ac 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -147,7 +147,6 @@ static void setup_pointers_and_addressables (struct alias_info *);
static bool collect_points_to_info_r (tree, tree, void *);
static bool is_escape_site (tree, size_t *);
static void add_pointed_to_var (struct alias_info *, tree, tree);
-static void add_pointed_to_expr (tree, tree);
static void create_global_var (void);
static void collect_points_to_info_for (struct alias_info *, tree);
static bool ptr_is_dereferenced_by (tree, tree, bool *);
@@ -503,9 +502,7 @@ find_ptr_dereference (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
{
tree ptr = (tree) data;
- if ((TREE_CODE (*tp) == INDIRECT_REF
- || TREE_CODE (*tp) == ALIGN_INDIRECT_REF
- || TREE_CODE (*tp) == MISALIGNED_INDIRECT_REF)
+ if (INDIRECT_REF_P (*tp)
&& TREE_OPERAND (*tp, 0) == ptr)
return *tp;
@@ -809,6 +806,9 @@ create_name_tags (struct alias_info *ai)
continue;
}
+ TREE_THIS_VOLATILE (pi->name_mem_tag)
+ |= TREE_THIS_VOLATILE (TREE_TYPE (TREE_TYPE (ptr)));
+
/* Mark the new name tag for renaming. */
bitmap_set_bit (vars_to_rename, var_ann (pi->name_mem_tag)->uid);
}
@@ -1752,41 +1752,78 @@ merge_pointed_to_info (struct alias_info *ai, tree dest, tree orig)
}
-/* Add VALUE to the list of expressions pointed-to by PTR. */
+/* Add EXPR to the list of expressions pointed-to by PTR. */
static void
-add_pointed_to_expr (tree ptr, tree value)
+add_pointed_to_expr (struct alias_info *ai, tree ptr, tree expr)
{
- if (TREE_CODE (value) == WITH_SIZE_EXPR)
- value = TREE_OPERAND (value, 0);
-
- /* Pointer variables should have been handled by merge_pointed_to_info. */
- gcc_assert (TREE_CODE (value) != SSA_NAME
- || !POINTER_TYPE_P (TREE_TYPE (value)));
+ if (TREE_CODE (expr) == WITH_SIZE_EXPR)
+ expr = TREE_OPERAND (expr, 0);
get_ptr_info (ptr);
- /* If VALUE is the result of a malloc-like call, then the area pointed to
- PTR is guaranteed to not alias with anything else. */
- if (TREE_CODE (value) == CALL_EXPR
- && (call_expr_flags (value) & (ECF_MALLOC | ECF_MAY_BE_ALLOCA)))
- set_pt_malloc (ptr);
- else
- set_pt_anything (ptr);
-
- if (dump_file)
+ if (TREE_CODE (expr) == CALL_EXPR
+ && (call_expr_flags (expr) & (ECF_MALLOC | ECF_MAY_BE_ALLOCA)))
{
- struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
+ /* If EXPR is a malloc-like call, then the area pointed to PTR
+ is guaranteed to not alias with anything else. */
+ set_pt_malloc (ptr);
+ }
+ else if (TREE_CODE (expr) == ADDR_EXPR)
+ {
+ /* Found P_i = ADDR_EXPR */
+ add_pointed_to_var (ai, ptr, expr);
+ }
+ else if (TREE_CODE (expr) == SSA_NAME && POINTER_TYPE_P (TREE_TYPE (expr)))
+ {
+ /* Found P_i = Q_j. */
+ merge_pointed_to_info (ai, ptr, expr);
+ }
+ else if (TREE_CODE (expr) == PLUS_EXPR || TREE_CODE (expr) == MINUS_EXPR)
+ {
+ /* Found P_i = PLUS_EXPR or P_i = MINUS_EXPR */
+ tree op0 = TREE_OPERAND (expr, 0);
+ tree op1 = TREE_OPERAND (expr, 1);
+
+ /* Both operands may be of pointer type. FIXME: Shouldn't
+ we just expect PTR + OFFSET always? */
+ if (POINTER_TYPE_P (TREE_TYPE (op0))
+ && TREE_CODE (op0) != INTEGER_CST)
+ {
+ if (TREE_CODE (op0) == SSA_NAME)
+ merge_pointed_to_info (ai, ptr, op0);
+ else if (TREE_CODE (op0) == ADDR_EXPR)
+ add_pointed_to_var (ai, ptr, op0);
+ else
+ set_pt_anything (ptr);
+ }
- fprintf (dump_file, "Pointer ");
- print_generic_expr (dump_file, ptr, dump_flags);
- fprintf (dump_file, " points to ");
- if (pi->pt_malloc)
- fprintf (dump_file, "malloc space: ");
- else
- fprintf (dump_file, "an arbitrary address: ");
- print_generic_expr (dump_file, value, dump_flags);
- fprintf (dump_file, "\n");
+ if (POINTER_TYPE_P (TREE_TYPE (op1))
+ && TREE_CODE (op1) != INTEGER_CST)
+ {
+ if (TREE_CODE (op1) == SSA_NAME)
+ merge_pointed_to_info (ai, ptr, op1);
+ else if (TREE_CODE (op1) == ADDR_EXPR)
+ add_pointed_to_var (ai, ptr, op1);
+ else
+ set_pt_anything (ptr);
+ }
+
+ /* Neither operand is a pointer? VAR can be pointing anywhere.
+ FIXME: Shouldn't we abort here? If we get here, we found
+ PTR = INT_CST + INT_CST, which should not be a valid pointer
+ expression. */
+ if (!(POINTER_TYPE_P (TREE_TYPE (op0))
+ && TREE_CODE (op0) != INTEGER_CST)
+ && !(POINTER_TYPE_P (TREE_TYPE (op1))
+ && TREE_CODE (op1) != INTEGER_CST))
+ set_pt_anything (ptr);
+ }
+ else
+ {
+ /* If we can't recognize the expression, assume that PTR may
+ point anywhere. */
+ set_pt_anything (ptr);
}
}
@@ -1859,62 +1896,10 @@ collect_points_to_info_r (tree var, tree stmt, void *data)
{
tree rhs = TREE_OPERAND (stmt, 1);
STRIP_NOPS (rhs);
-
- /* Found P_i = ADDR_EXPR */
- if (TREE_CODE (rhs) == ADDR_EXPR)
- add_pointed_to_var (ai, var, rhs);
-
- /* Found P_i = Q_j. */
- else if (TREE_CODE (rhs) == SSA_NAME
- && POINTER_TYPE_P (TREE_TYPE (rhs)))
- merge_pointed_to_info (ai, var, rhs);
-
- /* Found P_i = PLUS_EXPR or P_i = MINUS_EXPR */
- else if (TREE_CODE (rhs) == PLUS_EXPR
- || TREE_CODE (rhs) == MINUS_EXPR)
- {
- tree op0 = TREE_OPERAND (rhs, 0);
- tree op1 = TREE_OPERAND (rhs, 1);
-
- /* Both operands may be of pointer type. FIXME: Shouldn't
- we just expect PTR + OFFSET always? */
- if (POINTER_TYPE_P (TREE_TYPE (op0))
- && TREE_CODE (op0) != INTEGER_CST)
- {
- if (TREE_CODE (op0) == SSA_NAME)
- merge_pointed_to_info (ai, var, op0);
- else if (TREE_CODE (op0) == ADDR_EXPR)
- add_pointed_to_var (ai, var, op0);
- else
- add_pointed_to_expr (var, op0);
- }
-
- if (POINTER_TYPE_P (TREE_TYPE (op1))
- && TREE_CODE (op1) != INTEGER_CST)
- {
- if (TREE_CODE (op1) == SSA_NAME)
- merge_pointed_to_info (ai, var, op1);
- else if (TREE_CODE (op1) == ADDR_EXPR)
- add_pointed_to_var (ai, var, op1);
- else
- add_pointed_to_expr (var, op1);
- }
-
- /* Neither operand is a pointer? VAR can be pointing
- anywhere. FIXME: Is this right? If we get here, we
- found PTR = INT_CST + INT_CST. */
- if (!(POINTER_TYPE_P (TREE_TYPE (op0))
- && TREE_CODE (op0) != INTEGER_CST)
- && !(POINTER_TYPE_P (TREE_TYPE (op1))
- && TREE_CODE (op1) != INTEGER_CST))
- add_pointed_to_expr (var, rhs);
- }
-
- /* Something else. */
- else
- add_pointed_to_expr (var, rhs);
+ add_pointed_to_expr (ai, var, rhs);
break;
}
+
case ASM_EXPR:
/* Pointers defined by __asm__ statements can point anywhere. */
set_pt_anything (var);
@@ -1926,13 +1911,14 @@ collect_points_to_info_r (tree var, tree stmt, void *data)
tree decl = SSA_NAME_VAR (var);
if (TREE_CODE (decl) == PARM_DECL)
- add_pointed_to_expr (var, decl);
+ add_pointed_to_expr (ai, var, decl);
else if (DECL_INITIAL (decl))
- add_pointed_to_var (ai, var, DECL_INITIAL (decl));
+ add_pointed_to_expr (ai, var, DECL_INITIAL (decl));
else
- add_pointed_to_expr (var, decl);
+ add_pointed_to_expr (ai, var, decl);
}
break;
+
case PHI_NODE:
{
/* It STMT is a PHI node, then VAR is one of its arguments. The
@@ -1951,11 +1937,12 @@ collect_points_to_info_r (tree var, tree stmt, void *data)
default:
gcc_assert (is_gimple_min_invariant (var));
- add_pointed_to_expr (lhs, var);
+ add_pointed_to_expr (ai, lhs, var);
break;
}
break;
}
+
default:
gcc_unreachable ();
}
@@ -2138,7 +2125,7 @@ get_tmt_for (tree ptr, struct alias_info *ai)
}
/* If the pointed-to type is volatile, so is the tag. */
- TREE_THIS_VOLATILE (tag) = TREE_THIS_VOLATILE (tag_type);
+ TREE_THIS_VOLATILE (tag) |= TREE_THIS_VOLATILE (tag_type);
/* Make sure that the type tag has the same alias set as the
pointed-to type. */
diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c
index dd8e36a6c8b..bdd0411f12f 100644
--- a/gcc/tree-ssa-ccp.c
+++ b/gcc/tree-ssa-ccp.c
@@ -454,16 +454,21 @@ replace_uses_in (tree stmt, bool *replaced_addresses_p)
FOR_EACH_SSA_USE_OPERAND (use, stmt, iter, SSA_OP_USE)
{
- value *val = get_value (USE_FROM_PTR (use));
+ tree tuse = USE_FROM_PTR (use);
+ value *val = get_value (tuse);
- if (val->lattice_val == CONSTANT)
- {
- SET_USE (use, val->const_val);
- replaced = true;
- if (POINTER_TYPE_P (TREE_TYPE (USE_FROM_PTR (use)))
- && replaced_addresses_p)
- *replaced_addresses_p = true;
- }
+ if (val->lattice_val != CONSTANT)
+ continue;
+
+ if (TREE_CODE (stmt) == ASM_EXPR
+ && !may_propagate_copy_into_asm (tuse))
+ continue;
+
+ SET_USE (use, val->const_val);
+
+ replaced = true;
+ if (POINTER_TYPE_P (TREE_TYPE (tuse)) && replaced_addresses_p)
+ *replaced_addresses_p = true;
}
return replaced;
@@ -2141,6 +2146,7 @@ convert_to_gimple_builtin (block_stmt_iterator *si_p, tree expr)
static void
execute_fold_all_builtins (void)
{
+ bool cfg_changed = false;
basic_block bb;
FOR_EACH_BB (bb)
{
@@ -2185,6 +2191,9 @@ execute_fold_all_builtins (void)
abort ();
}
modify_stmt (*stmtp);
+ if (maybe_clean_eh_stmt (*stmtp)
+ && tree_purge_dead_eh_edges (bb))
+ cfg_changed = true;
if (dump_file && (dump_flags & TDF_DETAILS))
{
@@ -2194,6 +2203,10 @@ execute_fold_all_builtins (void)
}
}
}
+
+ /* Delete unreachable blocks. */
+ if (cfg_changed)
+ cleanup_tree_cfg ();
}
diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c
index 447f149ab4a..dc41e8e058e 100644
--- a/gcc/tree-ssa-copy.c
+++ b/gcc/tree-ssa-copy.c
@@ -145,17 +145,27 @@ may_propagate_copy (tree dest, tree orig)
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (orig))
return false;
- /* If DEST is an SSA_NAME that flows from an abnormal edge or if it
- represents a hard register, then it cannot be replaced. */
+ /* If DEST is an SSA_NAME that flows from an abnormal edge, then it
+ cannot be replaced. */
if (TREE_CODE (dest) == SSA_NAME
- && (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (dest)
- || DECL_HARD_REGISTER (SSA_NAME_VAR (dest))))
+ && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (dest))
return false;
/* Anything else is OK. */
return true;
}
+/* Similarly, but we know that we're propagating into an ASM_EXPR. */
+
+bool
+may_propagate_copy_into_asm (tree dest)
+{
+ /* Hard register operands of asms are special. Do not bypass. */
+ return !(TREE_CODE (dest) == SSA_NAME
+ && TREE_CODE (SSA_NAME_VAR (dest)) == VAR_DECL
+ && DECL_HARD_REGISTER (SSA_NAME_VAR (dest)));
+}
+
/* Given two SSA_NAMEs pointers ORIG and NEW such that we are copy
propagating NEW into ORIG, consolidate aliasing information so that
diff --git a/gcc/tree-ssa-copyrename.c b/gcc/tree-ssa-copyrename.c
index 4ef5b3dbd1c..7495c6b8753 100644
--- a/gcc/tree-ssa-copyrename.c
+++ b/gcc/tree-ssa-copyrename.c
@@ -146,19 +146,6 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug)
root1 = SSA_NAME_VAR (rep1);
root2 = SSA_NAME_VAR (rep2);
- if (DECL_HARD_REGISTER (root1) || DECL_HARD_REGISTER (root2))
- {
- if (debug)
- {
- if (DECL_HARD_REGISTER (root1))
- print_generic_expr (debug, var1, TDF_SLIM);
- else
- print_generic_expr (debug, var2, TDF_SLIM);
- fprintf (debug, " is a hardware register. No Coalescing.\n");
- }
- return;
- }
-
ann1 = var_ann (root1);
ann2 = var_ann (root2);
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index dfa719a446e..341b7683040 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -425,9 +425,7 @@ mark_stmt_if_obviously_necessary (tree stmt, bool aggressive)
if (is_global_var (lhs))
mark_stmt_necessary (stmt, true);
}
- else if (TREE_CODE (lhs) == INDIRECT_REF
- || TREE_CODE (lhs) == ALIGN_INDIRECT_REF
- || TREE_CODE (lhs) == MISALIGNED_INDIRECT_REF)
+ else if (INDIRECT_REF_P (lhs))
{
tree ptr = TREE_OPERAND (lhs, 0);
struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
@@ -504,7 +502,8 @@ find_obviously_necessary_stmts (struct edge_list *el)
and we currently do not have a means to recognize the finite ones. */
FOR_EACH_BB (bb)
{
- for (e = bb->succ; e; e = e->succ_next)
+ edge_iterator ei;
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->flags & EDGE_DFS_BACK)
mark_control_dependent_edges_necessary (e->dest, el);
}
@@ -731,7 +730,6 @@ remove_dead_stmt (block_stmt_iterator *i, basic_block bb)
if (is_ctrl_stmt (t))
{
basic_block post_dom_bb;
- edge e;
/* The post dominance info has to be up-to-date. */
gcc_assert (dom_computed[CDI_POST_DOMINATORS] == DOM_OK);
/* Get the immediate post dominator of bb. */
@@ -746,30 +744,26 @@ remove_dead_stmt (block_stmt_iterator *i, basic_block bb)
}
/* Redirect the first edge out of BB to reach POST_DOM_BB. */
- redirect_edge_and_branch (bb->succ, post_dom_bb);
- PENDING_STMT (bb->succ) = NULL;
- bb->succ->probability = REG_BR_PROB_BASE;
- bb->succ->count = bb->count;
+ redirect_edge_and_branch (EDGE_SUCC (bb, 0), post_dom_bb);
+ PENDING_STMT (EDGE_SUCC (bb, 0)) = NULL;
+ EDGE_SUCC (bb, 0)->probability = REG_BR_PROB_BASE;
+ EDGE_SUCC (bb, 0)->count = bb->count;
/* The edge is no longer associated with a conditional, so it does
not have TRUE/FALSE flags. */
- bb->succ->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
+ EDGE_SUCC (bb, 0)->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
/* If the edge reaches any block other than the exit, then it is a
fallthru edge; if it reaches the exit, then it is not a fallthru
edge. */
if (post_dom_bb != EXIT_BLOCK_PTR)
- bb->succ->flags |= EDGE_FALLTHRU;
+ EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
else
- bb->succ->flags &= ~EDGE_FALLTHRU;
+ EDGE_SUCC (bb, 0)->flags &= ~EDGE_FALLTHRU;
/* Remove the remaining the outgoing edges. */
- for (e = bb->succ->succ_next; e != NULL;)
- {
- edge tmp = e;
- e = e->succ_next;
- remove_edge (tmp);
- }
+ while (EDGE_COUNT (bb->succs) != 1)
+ remove_edge (EDGE_SUCC (bb, 1));
}
bsi_remove (i);
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index c0f5c95a857..5c245fcb1b2 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -591,6 +591,7 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e)
{
tree cond, cached_lhs;
edge e1;
+ edge_iterator ei;
/* Do not forward entry edges into the loop. In the case loop
has multiple entry edges we may end up in constructing irreducible
@@ -599,7 +600,7 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e)
edges forward to the same destination block. */
if (!e->flags & EDGE_DFS_BACK)
{
- for (e1 = e->dest->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e1, ei, e->dest->preds)
if (e1->flags & EDGE_DFS_BACK)
break;
if (e1)
@@ -861,24 +862,21 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb)
the edge from BB through its successor.
Do this before we remove entries from our equivalence tables. */
- if (bb->succ
- && ! bb->succ->succ_next
- && (bb->succ->flags & EDGE_ABNORMAL) == 0
- && (get_immediate_dominator (CDI_DOMINATORS, bb->succ->dest) != bb
- || phi_nodes (bb->succ->dest)))
+ if (EDGE_COUNT (bb->succs) == 1
+ && (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL) == 0
+ && (get_immediate_dominator (CDI_DOMINATORS, EDGE_SUCC (bb, 0)->dest) != bb
+ || phi_nodes (EDGE_SUCC (bb, 0)->dest)))
{
- thread_across_edge (walk_data, bb->succ);
+ thread_across_edge (walk_data, EDGE_SUCC (bb, 0));
}
else if ((last = last_stmt (bb))
&& TREE_CODE (last) == COND_EXPR
&& (COMPARISON_CLASS_P (COND_EXPR_COND (last))
|| TREE_CODE (COND_EXPR_COND (last)) == SSA_NAME)
- && bb->succ
- && (bb->succ->flags & EDGE_ABNORMAL) == 0
- && bb->succ->succ_next
- && (bb->succ->succ_next->flags & EDGE_ABNORMAL) == 0
- && ! bb->succ->succ_next->succ_next)
+ && EDGE_COUNT (bb->succs) == 2
+ && (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL) == 0
+ && (EDGE_SUCC (bb, 1)->flags & EDGE_ABNORMAL) == 0)
{
edge true_edge, false_edge;
tree cond, inverted = NULL;
@@ -1093,8 +1091,9 @@ single_incoming_edge_ignoring_loop_edges (basic_block bb)
{
edge retval = NULL;
edge e;
+ edge_iterator ei;
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
/* A loop back edge can be identified by the destination of
the edge dominating the source of the edge. */
@@ -1143,7 +1142,7 @@ record_equivalences_from_incoming_edge (struct dom_walk_data *walk_data ATTRIBUT
/* If we have a single predecessor (ignoring loop backedges), then extract
EDGE_FLAGS from the single incoming edge. Otherwise just return as
there is nothing to do. */
- if (bb->pred
+ if (EDGE_COUNT (bb->preds) >= 1
&& parent_block_last_stmt)
{
edge e = single_incoming_edge_ignoring_loop_edges (bb);
@@ -1174,7 +1173,7 @@ record_equivalences_from_incoming_edge (struct dom_walk_data *walk_data ATTRIBUT
/* Similarly when the parent block ended in a SWITCH_EXPR.
We can only know the value of the switch's condition if the dominator
parent is also the only predecessor of this block. */
- else if (bb->pred->src == parent
+ else if (EDGE_PRED (bb, 0)->src == parent
&& TREE_CODE (parent_block_last_stmt) == SWITCH_EXPR)
{
tree switch_cond = SWITCH_COND (parent_block_last_stmt);
@@ -2167,10 +2166,11 @@ static void
cprop_into_successor_phis (basic_block bb, bitmap nonzero_vars)
{
edge e;
+ edge_iterator ei;
/* This can get rather expensive if the implementation is naive in
how it finds the phi alternative associated with a particular edge. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
tree phi;
int phi_num_args;
@@ -2417,9 +2417,7 @@ record_equivalences_from_stmt (tree stmt,
t = TREE_OPERAND (t, 0);
/* Now see if this is a pointer dereference. */
- if (TREE_CODE (t) == INDIRECT_REF
- || TREE_CODE (t) == ALIGN_INDIRECT_REF
- || TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
+ if (INDIRECT_REF_P (t))
{
tree op = TREE_OPERAND (t, 0);
@@ -2518,6 +2516,11 @@ cprop_operand (tree stmt, use_operand_p op_p)
|| TREE_CODE (val) != SSA_NAME))
return false;
+ /* Do not replace hard register operands in asm statements. */
+ if (TREE_CODE (stmt) == ASM_EXPR
+ && !may_propagate_copy_into_asm (op))
+ return false;
+
/* Get the toplevel type of each operand. */
op_type = TREE_TYPE (op);
val_type = TREE_TYPE (val);
diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c
index 41b970f1720..3a6e603e0a9 100644
--- a/gcc/tree-ssa-live.c
+++ b/gcc/tree-ssa-live.c
@@ -488,6 +488,7 @@ live_worklist (tree_live_info_p live, varray_type stack, int i)
basic_block def_bb = NULL;
edge e;
var_map map = live->map;
+ edge_iterator ei;
bitmap_iterator bi;
var = partition_to_var (map, i);
@@ -504,15 +505,15 @@ live_worklist (tree_live_info_p live, varray_type stack, int i)
b = VARRAY_TOP_INT (stack);
VARRAY_POP (stack);
- for (e = BASIC_BLOCK (b)->pred; e; e = e->pred_next)
- if (e->src != ENTRY_BLOCK_PTR)
+ FOR_EACH_EDGE (e, ei, BASIC_BLOCK (b)->preds)
+ if (e->src != ENTRY_BLOCK_PTR)
{
/* Its not live on entry to the block its defined in. */
if (e->src == def_bb)
continue;
if (!bitmap_bit_p (live->livein[i], e->src->index))
{
- bitmap_set_bit (live->livein[i], e->src->index);
+ bitmap_set_bit (live->livein[i], e->src->index);
VARRAY_PUSH_INT (stack, e->src->index);
}
}
@@ -569,9 +570,9 @@ calculate_live_on_entry (var_map map)
bitmap_iterator bi;
#ifdef ENABLE_CHECKING
int num;
+ edge_iterator ei;
#endif
-
saw_def = BITMAP_XMALLOC ();
live = new_tree_live_info (map);
@@ -642,7 +643,7 @@ calculate_live_on_entry (var_map map)
bb = ENTRY_BLOCK_PTR;
num = 0;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
int entry_block = e->dest->index;
if (e->dest == EXIT_BLOCK_PTR)
@@ -765,7 +766,8 @@ calculate_live_on_exit (tree_live_info_p liveinfo)
on_entry = live_entry_blocks (liveinfo, i);
EXECUTE_IF_SET_IN_BITMAP (on_entry, 0, b, bi)
{
- for (e = BASIC_BLOCK(b)->pred; e; e = e->pred_next)
+ edge_iterator ei;
+ FOR_EACH_EDGE (e, ei, BASIC_BLOCK (b)->preds)
if (e->src != ENTRY_BLOCK_PTR)
bitmap_set_bit (on_exit[e->src->index], i);
}
diff --git a/gcc/tree-ssa-loop-ch.c b/gcc/tree-ssa-loop-ch.c
index 4d25d0f5b31..ecdf6f2cc2c 100644
--- a/gcc/tree-ssa-loop-ch.c
+++ b/gcc/tree-ssa-loop-ch.c
@@ -59,19 +59,16 @@ should_duplicate_loop_header_p (basic_block header, struct loop *loop,
if (header->aux)
return false;
- gcc_assert (header->succ);
- if (!header->succ->succ_next)
+ gcc_assert (EDGE_COUNT (header->succs) > 0);
+ if (EDGE_COUNT (header->succs) == 1)
return false;
- if (header->succ->succ_next->succ_next)
- return false;
- if (flow_bb_inside_loop_p (loop, header->succ->dest)
- && flow_bb_inside_loop_p (loop, header->succ->succ_next->dest))
+ if (flow_bb_inside_loop_p (loop, EDGE_SUCC (header, 0)->dest)
+ && flow_bb_inside_loop_p (loop, EDGE_SUCC (header, 1)->dest))
return false;
/* If this is not the original loop header, we want it to have just
one predecessor in order to match the && pattern. */
- if (header != loop->header
- && header->pred->pred_next)
+ if (header != loop->header && EDGE_COUNT (header->preds) >= 2)
return false;
last = last_stmt (header);
@@ -176,10 +173,10 @@ copy_loop_headers (void)
{
/* Find a successor of header that is inside a loop; i.e. the new
header after the condition is copied. */
- if (flow_bb_inside_loop_p (loop, header->succ->dest))
- exit = header->succ;
+ if (flow_bb_inside_loop_p (loop, EDGE_SUCC (header, 0)->dest))
+ exit = EDGE_SUCC (header, 0);
else
- exit = header->succ->succ_next;
+ exit = EDGE_SUCC (header, 1);
bbs[n_bbs++] = header;
header = exit->dest;
}
@@ -194,8 +191,8 @@ copy_loop_headers (void)
/* Ensure that the header will have just the latch as a predecessor
inside the loop. */
- if (exit->dest->pred->pred_next)
- exit = loop_split_edge_with (exit, NULL)->succ;
+ if (EDGE_COUNT (exit->dest->preds) > 1)
+ exit = EDGE_SUCC (loop_split_edge_with (exit, NULL), 0);
if (!tree_duplicate_sese_region (loop_preheader_edge (loop), exit,
bbs, n_bbs, NULL))
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index 0330a278009..27bc1c01d95 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -603,8 +603,8 @@ loop_commit_inserts (void)
{
bb = BASIC_BLOCK (i);
add_bb_to_loop (bb,
- find_common_loop (bb->succ->dest->loop_father,
- bb->pred->src->loop_father));
+ find_common_loop (EDGE_SUCC (bb, 0)->dest->loop_father,
+ EDGE_PRED (bb, 0)->src->loop_father));
}
}
@@ -982,8 +982,9 @@ single_reachable_address (struct loop *loop, tree stmt,
case PHI_NODE:
for (i = 0; i < (unsigned) PHI_NUM_ARGS (stmt); i++)
- maybe_queue_var (PHI_ARG_DEF (stmt, i), loop,
- seen, queue, &in_queue);
+ if (TREE_CODE (PHI_ARG_DEF (stmt, i)) == SSA_NAME)
+ maybe_queue_var (PHI_ARG_DEF (stmt, i), loop,
+ seen, queue, &in_queue);
break;
default:
@@ -1113,9 +1114,7 @@ is_call_clobbered_ref (tree ref)
if (DECL_P (base))
return is_call_clobbered (base);
- if (TREE_CODE (base) == INDIRECT_REF
- || TREE_CODE (base) == ALIGN_INDIRECT_REF
- || TREE_CODE (base) == MISALIGNED_INDIRECT_REF)
+ if (INDIRECT_REF_P (base))
{
/* Check whether the alias tags associated with the pointer
are call clobbered. */
@@ -1316,6 +1315,7 @@ fill_always_executed_in (struct loop *loop, sbitmap contains_call)
for (i = 0; i < loop->num_nodes; i++)
{
+ edge_iterator ei;
bb = bbs[i];
if (dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
@@ -1324,7 +1324,7 @@ fill_always_executed_in (struct loop *loop, sbitmap contains_call)
if (TEST_BIT (contains_call, bb->index))
break;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (!flow_bb_inside_loop_p (loop, e->dest))
break;
if (e)
diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c
index 733cdd2e76b..66fee03b1a1 100644
--- a/gcc/tree-ssa-loop-ivcanon.c
+++ b/gcc/tree-ssa-loop-ivcanon.c
@@ -74,9 +74,9 @@ create_canonical_iv (struct loop *loop, edge exit, tree niter)
}
cond = last_stmt (exit->src);
- in = exit->src->succ;
+ in = EDGE_SUCC (exit->src, 0);
if (in == exit)
- in = in->succ_next;
+ in = EDGE_SUCC (exit->src, 1);
/* Note that we do not need to worry about overflows, since
type of niter is always unsigned and all comparisons are
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index 2c5d3a9ee52..9e9c0f9d11c 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -104,6 +104,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
struct iv
{
tree base; /* Initial value of the iv. */
+ tree base_object; /* A memory object to that the induction variable points. */
tree step; /* Step of the iv (constant only). */
tree ssa_name; /* The ssa name with the value. */
bool biv_p; /* Is it a biv? */
@@ -301,9 +302,12 @@ extern void dump_iv (FILE *, struct iv *);
void
dump_iv (FILE *file, struct iv *iv)
{
- fprintf (file, "ssa name ");
- print_generic_expr (file, iv->ssa_name, TDF_SLIM);
- fprintf (file, "\n");
+ if (iv->ssa_name)
+ {
+ fprintf (file, "ssa name ");
+ print_generic_expr (file, iv->ssa_name, TDF_SLIM);
+ fprintf (file, "\n");
+ }
fprintf (file, " type ");
print_generic_expr (file, TREE_TYPE (iv->base), TDF_SLIM);
@@ -326,6 +330,13 @@ dump_iv (FILE *file, struct iv *iv)
fprintf (file, "\n");
}
+ if (iv->base_object)
+ {
+ fprintf (file, " base object ");
+ print_generic_expr (file, iv->base_object, TDF_SLIM);
+ fprintf (file, "\n");
+ }
+
if (iv->biv_p)
fprintf (file, " is a biv\n");
}
@@ -336,8 +347,6 @@ extern void dump_use (FILE *, struct iv_use *);
void
dump_use (FILE *file, struct iv_use *use)
{
- struct iv *iv = use->iv;
-
fprintf (file, "use %d\n", use->id);
switch (use->type)
@@ -371,26 +380,7 @@ dump_use (FILE *file, struct iv_use *use)
print_generic_expr (file, *use->op_p, TDF_SLIM);
fprintf (file, "\n");
- fprintf (file, " type ");
- print_generic_expr (file, TREE_TYPE (iv->base), TDF_SLIM);
- fprintf (file, "\n");
-
- if (iv->step)
- {
- fprintf (file, " base ");
- print_generic_expr (file, iv->base, TDF_SLIM);
- fprintf (file, "\n");
-
- fprintf (file, " step ");
- print_generic_expr (file, iv->step, TDF_SLIM);
- fprintf (file, "\n");
- }
- else
- {
- fprintf (file, " invariant ");
- print_generic_expr (file, iv->base, TDF_SLIM);
- fprintf (file, "\n");
- }
+ dump_iv (file, use->iv);
fprintf (file, " related candidates ");
dump_bitmap (file, use->related_cands);
@@ -446,26 +436,7 @@ dump_cand (FILE *file, struct iv_cand *cand)
break;
}
- fprintf (file, " type ");
- print_generic_expr (file, TREE_TYPE (iv->base), TDF_SLIM);
- fprintf (file, "\n");
-
- if (iv->step)
- {
- fprintf (file, " base ");
- print_generic_expr (file, iv->base, TDF_SLIM);
- fprintf (file, "\n");
-
- fprintf (file, " step ");
- print_generic_expr (file, iv->step, TDF_SLIM);
- fprintf (file, "\n");
- }
- else
- {
- fprintf (file, " invariant ");
- print_generic_expr (file, iv->base, TDF_SLIM);
- fprintf (file, "\n");
- }
+ dump_iv (file, iv);
}
/* Returns the info for ssa version VER. */
@@ -626,6 +597,52 @@ tree_ssa_iv_optimize_init (struct loops *loops, struct ivopts_data *data)
VARRAY_GENERIC_PTR_NOGC_INIT (decl_rtl_to_reset, 20, "decl_rtl_to_reset");
}
+/* Returns a memory object to that EXPR points. In case we are able to
+ determine that it does not point to any such object, NULL is returned. */
+
+static tree
+determine_base_object (tree expr)
+{
+ enum tree_code code = TREE_CODE (expr);
+ tree base, obj, op0, op1;
+
+ if (!POINTER_TYPE_P (TREE_TYPE (expr)))
+ return NULL_TREE;
+
+ switch (code)
+ {
+ case INTEGER_CST:
+ return NULL_TREE;
+
+ case ADDR_EXPR:
+ obj = TREE_OPERAND (expr, 0);
+ base = get_base_address (obj);
+
+ if (!base)
+ return fold_convert (ptr_type_node, expr);
+
+ return fold (build1 (ADDR_EXPR, ptr_type_node, base));
+
+ case PLUS_EXPR:
+ case MINUS_EXPR:
+ op0 = determine_base_object (TREE_OPERAND (expr, 0));
+ op1 = determine_base_object (TREE_OPERAND (expr, 1));
+
+ if (!op1)
+ return op0;
+
+ if (!op0)
+ return (code == PLUS_EXPR
+ ? op1
+ : fold (build1 (NEGATE_EXPR, ptr_type_node, op1)));
+
+ return fold (build (code, ptr_type_node, op0, op1));
+
+ default:
+ return fold_convert (ptr_type_node, expr);
+ }
+}
+
/* Allocates an induction variable with given initial value BASE and step STEP
for loop LOOP. */
@@ -638,6 +655,7 @@ alloc_iv (tree base, tree step)
step = NULL_TREE;
iv->base = base;
+ iv->base_object = determine_base_object (base);
iv->step = step;
iv->biv_p = false;
iv->have_use_for = false;
@@ -1001,6 +1019,10 @@ record_use (struct ivopts_data *data, tree *use_p, struct iv *iv,
use->op_p = use_p;
use->related_cands = BITMAP_XMALLOC ();
+ /* To avoid showing ssa name in the dumps, if it was not reset by the
+ caller. */
+ iv->ssa_name = NULL_TREE;
+
if (dump_file && (dump_flags & TDF_DETAILS))
dump_use (dump_file, use);
@@ -1510,9 +1532,10 @@ find_interesting_uses (struct ivopts_data *data)
for (i = 0; i < data->current_loop->num_nodes; i++)
{
+ edge_iterator ei;
bb = body[i];
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
if (e->dest != EXIT_BLOCK_PTR
&& !flow_bb_inside_loop_p (data->current_loop, e->dest))
find_interesting_uses_outside (data, e);
@@ -2793,6 +2816,19 @@ get_computation_cost_at (struct ivopts_data *data,
return INFTY;
}
+ if (address_p)
+ {
+ /* Do not try to express address of an object with computation based
+ on address of a different object. This may cause problems in rtl
+ level alias analysis (that does not expect this to be happening,
+ as this is illegal in C), and would be unlikely to be useful
+ anyway. */
+ if (use->iv->base_object
+ && cand->iv->base_object
+ && !operand_equal_p (use->iv->base_object, cand->iv->base_object, 0))
+ return INFTY;
+ }
+
if (!cst_and_fits_in_hwi (ustep)
|| !cst_and_fits_in_hwi (cstep))
return INFTY;
@@ -2973,23 +3009,31 @@ may_eliminate_iv (struct loop *loop,
struct iv_use *use, struct iv_cand *cand,
enum tree_code *compare, tree *bound)
{
+ basic_block ex_bb;
edge exit;
- struct tree_niter_desc *niter, new_niter;
+ struct tree_niter_desc niter, new_niter;
tree wider_type, type, base;
-
- /* For now just very primitive -- we work just for the single exit condition,
- and are quite conservative about the possible overflows. TODO -- both of
- these can be improved. */
- exit = single_dom_exit (loop);
- if (!exit)
+
+ /* For now works only for exits that dominate the loop latch. TODO -- extend
+ for other conditions inside loop body. */
+ ex_bb = bb_for_stmt (use->stmt);
+ if (use->stmt != last_stmt (ex_bb)
+ || TREE_CODE (use->stmt) != COND_EXPR)
return false;
- if (use->stmt != last_stmt (exit->src))
+ if (!dominated_by_p (CDI_DOMINATORS, loop->latch, ex_bb))
return false;
- niter = &loop_data (loop)->niter;
- if (!niter->niter
- || !integer_nonzerop (niter->assumptions)
- || !integer_zerop (niter->may_be_zero))
+ exit = EDGE_SUCC (ex_bb, 0);
+ if (flow_bb_inside_loop_p (loop, exit->dest))
+ exit = EDGE_SUCC (ex_bb, 1);
+ if (flow_bb_inside_loop_p (loop, exit->dest))
+ return false;
+
+ niter.niter = NULL_TREE;
+ number_of_iterations_exit (loop, exit, &niter);
+ if (!niter.niter
+ || !integer_nonzerop (niter.assumptions)
+ || !integer_zerop (niter.may_be_zero))
return false;
if (exit->flags & EDGE_TRUE_VALUE)
@@ -2997,7 +3041,7 @@ may_eliminate_iv (struct loop *loop,
else
*compare = NE_EXPR;
- *bound = cand_value_at (loop, cand, use->stmt, niter->niter);
+ *bound = cand_value_at (loop, cand, use->stmt, niter.niter);
/* Let us check there is not some problem with overflows, by checking that
the number of iterations is unchanged. */
@@ -3016,9 +3060,9 @@ may_eliminate_iv (struct loop *loop,
return false;
wider_type = TREE_TYPE (new_niter.niter);
- if (TYPE_PRECISION (wider_type) < TYPE_PRECISION (TREE_TYPE (niter->niter)))
- wider_type = TREE_TYPE (niter->niter);
- if (!operand_equal_p (fold_convert (wider_type, niter->niter),
+ if (TYPE_PRECISION (wider_type) < TYPE_PRECISION (TREE_TYPE (niter.niter)))
+ wider_type = TREE_TYPE (niter.niter);
+ if (!operand_equal_p (fold_convert (wider_type, niter.niter),
fold_convert (wider_type, new_niter.niter), 0))
return false;
@@ -4129,7 +4173,7 @@ compute_phi_arg_on_exit (edge exit, tree stmts, tree op)
block_stmt_iterator bsi;
tree phi, stmt, def, next;
- if (exit->dest->pred->pred_next)
+ if (EDGE_COUNT (exit->dest->preds) > 1)
split_loop_exit_edge (exit);
if (TREE_CODE (stmts) == STATEMENT_LIST)
diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c
index 78572580af7..25c366c1284 100644
--- a/gcc/tree-ssa-loop-manip.c
+++ b/gcc/tree-ssa-loop-manip.c
@@ -123,10 +123,11 @@ add_exit_phis_edge (basic_block exit, tree use)
basic_block def_bb = bb_for_stmt (def_stmt);
struct loop *def_loop;
edge e;
+ edge_iterator ei;
/* Check that some of the edges entering the EXIT block exits a loop in
that USE is defined. */
- for (e = exit->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, exit->preds)
{
def_loop = find_common_loop (def_bb->loop_father, e->src->loop_father);
if (!flow_bb_inside_loop_p (def_loop, e->dest))
@@ -138,7 +139,7 @@ add_exit_phis_edge (basic_block exit, tree use)
phi = create_phi_node (use, exit);
- for (e = exit->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, exit->preds)
add_phi_arg (&phi, use, e);
SSA_NAME_DEF_STMT (use) = def_stmt;
@@ -192,10 +193,11 @@ get_loops_exits (void)
bitmap exits = BITMAP_XMALLOC ();
basic_block bb;
edge e;
+ edge_iterator ei;
FOR_EACH_BB (bb)
{
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (e->src != ENTRY_BLOCK_PTR
&& !flow_bb_inside_loop_p (e->src->loop_father, bb))
{
@@ -404,7 +406,7 @@ split_loop_exit_edge (edge exit)
for (phi = phi_nodes (dest); phi; phi = TREE_CHAIN (phi))
{
- op_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, bb->succ);
+ op_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, EDGE_SUCC (bb, 0));
name = USE_FROM_PTR (op_p);
@@ -468,17 +470,17 @@ ip_normal_pos (struct loop *loop)
basic_block bb;
edge exit;
- if (loop->latch->pred->pred_next)
+ if (EDGE_COUNT (loop->latch->preds) > 1)
return NULL;
- bb = loop->latch->pred->src;
+ bb = EDGE_PRED (loop->latch, 0)->src;
last = last_stmt (bb);
if (TREE_CODE (last) != COND_EXPR)
return NULL;
- exit = bb->succ;
+ exit = EDGE_SUCC (bb, 0);
if (exit->dest == loop->latch)
- exit = exit->succ_next;
+ exit = EDGE_SUCC (bb, 1);
if (flow_bb_inside_loop_p (loop, exit->dest))
return NULL;
@@ -732,7 +734,7 @@ lv_adjust_loop_entry_edge (basic_block first_head,
/* Adjust edges appropriately to connect new head with first head
as well as second head. */
- e0 = new_head->succ;
+ e0 = EDGE_SUCC (new_head, 0);
e0->flags &= ~EDGE_FALLTHRU;
e0->flags |= EDGE_FALSE_VALUE;
e1 = make_edge (new_head, first_head, EDGE_TRUE_VALUE);
@@ -816,10 +818,10 @@ tree_ssa_loop_version (struct loops *loops, struct loop * loop,
*condition_bb = lv_adjust_loop_entry_edge (first_head, second_head, entry,
cond_expr);
- latch_edge = loop->latch->rbi->copy->succ;
+ latch_edge = EDGE_SUCC (loop->latch->rbi->copy, 0);
nloop = loopify (loops,
latch_edge,
- loop->header->rbi->copy->pred,
+ EDGE_PRED (loop->header->rbi->copy, 0),
*condition_bb,
false /* Do not redirect all edges. */);
@@ -839,7 +841,7 @@ tree_ssa_loop_version (struct loops *loops, struct loop * loop,
(*condition_bb)->flags |= BB_IRREDUCIBLE_LOOP;
loop_preheader_edge (loop)->flags |= EDGE_IRREDUCIBLE_LOOP;
loop_preheader_edge (nloop)->flags |= EDGE_IRREDUCIBLE_LOOP;
- (*condition_bb)->pred->flags |= EDGE_IRREDUCIBLE_LOOP;
+ EDGE_PRED ((*condition_bb), 0)->flags |= EDGE_IRREDUCIBLE_LOOP;
}
/* At this point condition_bb is loop predheader with two successors,
diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c
index 686545bf26f..6eb44e15ea1 100644
--- a/gcc/tree-ssa-loop-niter.c
+++ b/gcc/tree-ssa-loop-niter.c
@@ -52,7 +52,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
*/
-/* Returns true if ARG is either NULL_TREE or constant zero. */
+/* Returns true if ARG is either NULL_TREE or constant zero. Unlike
+ integer_zerop, it does not care about overflow flags. */
bool
zero_p (tree arg)
@@ -60,7 +61,25 @@ zero_p (tree arg)
if (!arg)
return true;
- return integer_zerop (arg);
+ if (TREE_CODE (arg) != INTEGER_CST)
+ return false;
+
+ return (TREE_INT_CST_LOW (arg) == 0 && TREE_INT_CST_HIGH (arg) == 0);
+}
+
+/* Returns true if ARG a nonzero constant. Unlike integer_nonzerop, it does
+ not care about overflow flags. */
+
+static bool
+nonzero_p (tree arg)
+{
+ if (!arg)
+ return false;
+
+ if (TREE_CODE (arg) != INTEGER_CST)
+ return false;
+
+ return (TREE_INT_CST_LOW (arg) != 0 || TREE_INT_CST_HIGH (arg) != 0);
}
/* Returns inverse of X modulo 2^s, where MASK = 2^s-1. */
@@ -70,9 +89,9 @@ inverse (tree x, tree mask)
{
tree type = TREE_TYPE (x);
tree ctr = EXEC_BINARY (RSHIFT_EXPR, type, mask, integer_one_node);
- tree rslt = convert (type, integer_one_node);
+ tree rslt = build_int_cst_type (type, 1);
- while (integer_nonzerop (ctr))
+ while (nonzero_p (ctr))
{
rslt = EXEC_BINARY (MULT_EXPR, type, rslt, x);
rslt = EXEC_BINARY (BIT_AND_EXPR, type, rslt, mask);
@@ -180,24 +199,24 @@ number_of_iterations_cond (tree type, tree base0, tree step0,
if (zero_p (step0))
{
if (mmax)
- assumption = fold (build (EQ_EXPR, boolean_type_node, base0, mmax));
+ assumption = fold (build2 (EQ_EXPR, boolean_type_node, base0, mmax));
else
assumption = boolean_false_node;
- if (integer_nonzerop (assumption))
+ if (nonzero_p (assumption))
goto zero_iter;
- base0 = fold (build (PLUS_EXPR, type, base0,
- convert (type, integer_one_node)));
+ base0 = fold (build2 (PLUS_EXPR, type, base0,
+ build_int_cst_type (type, 1)));
}
else
{
if (mmin)
- assumption = fold (build (EQ_EXPR, boolean_type_node, base1, mmin));
+ assumption = fold (build2 (EQ_EXPR, boolean_type_node, base1, mmin));
else
assumption = boolean_false_node;
- if (integer_nonzerop (assumption))
+ if (nonzero_p (assumption))
goto zero_iter;
- base1 = fold (build (MINUS_EXPR, type, base1,
- convert (type, integer_one_node)));
+ base1 = fold (build2 (MINUS_EXPR, type, base1,
+ build_int_cst_type (type, 1)));
}
noloop_assumptions = assumption;
code = LE_EXPR;
@@ -232,14 +251,14 @@ number_of_iterations_cond (tree type, tree base0, tree step0,
step = EXEC_UNARY (NEGATE_EXPR, type, step1);
else
step = step0;
- delta = build (MINUS_EXPR, type, base1, base0);
- delta = fold (build (FLOOR_MOD_EXPR, type, delta, step));
+ delta = build2 (MINUS_EXPR, type, base1, base0);
+ delta = fold (build2 (FLOOR_MOD_EXPR, type, delta, step));
may_xform = boolean_false_node;
if (TREE_CODE (delta) == INTEGER_CST)
{
tmp = EXEC_BINARY (MINUS_EXPR, type, step,
- convert (type, integer_one_node));
+ build_int_cst_type (type, 1));
if (was_sharp
&& operand_equal_p (delta, tmp, 0))
{
@@ -262,7 +281,7 @@ number_of_iterations_cond (tree type, tree base0, tree step0,
{
bound = EXEC_BINARY (PLUS_EXPR, type, mmin, step);
bound = EXEC_BINARY (MINUS_EXPR, type, bound, delta);
- may_xform = fold (build (LE_EXPR, boolean_type_node,
+ may_xform = fold (build2 (LE_EXPR, boolean_type_node,
bound, base0));
}
}
@@ -274,33 +293,33 @@ number_of_iterations_cond (tree type, tree base0, tree step0,
{
bound = EXEC_BINARY (MINUS_EXPR, type, mmax, step);
bound = EXEC_BINARY (PLUS_EXPR, type, bound, delta);
- may_xform = fold (build (LE_EXPR, boolean_type_node,
+ may_xform = fold (build2 (LE_EXPR, boolean_type_node,
base1, bound));
}
}
}
- if (!integer_zerop (may_xform))
+ if (!zero_p (may_xform))
{
/* We perform the transformation always provided that it is not
completely senseless. This is OK, as we would need this assumption
to determine the number of iterations anyway. */
- if (!integer_nonzerop (may_xform))
+ if (!nonzero_p (may_xform))
assumptions = may_xform;
if (zero_p (step0))
{
- base0 = build (PLUS_EXPR, type, base0, delta);
- base0 = fold (build (MINUS_EXPR, type, base0, step));
+ base0 = build2 (PLUS_EXPR, type, base0, delta);
+ base0 = fold (build2 (MINUS_EXPR, type, base0, step));
}
else
{
- base1 = build (MINUS_EXPR, type, base1, delta);
- base1 = fold (build (PLUS_EXPR, type, base1, step));
+ base1 = build2 (MINUS_EXPR, type, base1, delta);
+ base1 = fold (build2 (PLUS_EXPR, type, base1, step));
}
- assumption = fold (build (GT_EXPR, boolean_type_node, base0, base1));
- noloop_assumptions = fold (build (TRUTH_OR_EXPR, boolean_type_node,
+ assumption = fold (build2 (GT_EXPR, boolean_type_node, base0, base1));
+ noloop_assumptions = fold (build2 (TRUTH_OR_EXPR, boolean_type_node,
noloop_assumptions, assumption));
code = NE_EXPR;
}
@@ -316,39 +335,39 @@ number_of_iterations_cond (tree type, tree base0, tree step0,
makes us able to do more involved computations of number of iterations
than in other cases. First transform the condition into shape
s * i <> c, with s positive. */
- base1 = fold (build (MINUS_EXPR, type, base1, base0));
+ base1 = fold (build2 (MINUS_EXPR, type, base1, base0));
base0 = NULL_TREE;
if (!zero_p (step1))
step0 = EXEC_UNARY (NEGATE_EXPR, type, step1);
step1 = NULL_TREE;
- if (!tree_expr_nonnegative_p (convert (signed_niter_type, step0)))
+ if (!tree_expr_nonnegative_p (fold_convert (signed_niter_type, step0)))
{
step0 = EXEC_UNARY (NEGATE_EXPR, type, step0);
base1 = fold (build1 (NEGATE_EXPR, type, base1));
}
- base1 = convert (niter_type, base1);
- step0 = convert (niter_type, step0);
+ base1 = fold_convert (niter_type, base1);
+ step0 = fold_convert (niter_type, step0);
/* Let nsd (s, size of mode) = d. If d does not divide c, the loop
is infinite. Otherwise, the number of iterations is
(inverse(s/d) * (c/d)) mod (size of mode/d). */
s = step0;
d = integer_one_node;
- bound = convert (niter_type, build_int_cst (NULL_TREE, -1));
+ bound = build_int_cst (niter_type, -1);
while (1)
{
tmp = EXEC_BINARY (BIT_AND_EXPR, niter_type, s,
- convert (niter_type, integer_one_node));
- if (integer_nonzerop (tmp))
+ build_int_cst (niter_type, 1));
+ if (nonzero_p (tmp))
break;
s = EXEC_BINARY (RSHIFT_EXPR, niter_type, s,
- convert (niter_type, integer_one_node));
+ build_int_cst (niter_type, 1));
d = EXEC_BINARY (LSHIFT_EXPR, niter_type, d,
- convert (niter_type, integer_one_node));
+ build_int_cst (niter_type, 1));
bound = EXEC_BINARY (RSHIFT_EXPR, niter_type, bound,
- convert (niter_type, integer_one_node));
+ build_int_cst (niter_type, 1));
}
assumption = fold (build2 (FLOOR_MOD_EXPR, niter_type, base1, d));
@@ -358,9 +377,9 @@ number_of_iterations_cond (tree type, tree base0, tree step0,
assumptions = fold (build2 (TRUTH_AND_EXPR, boolean_type_node,
assumptions, assumption));
- tmp = fold (build (EXACT_DIV_EXPR, niter_type, base1, d));
- tmp = fold (build (MULT_EXPR, niter_type, tmp, inverse (s, bound)));
- niter->niter = fold (build (BIT_AND_EXPR, niter_type, tmp, bound));
+ tmp = fold (build2 (EXACT_DIV_EXPR, niter_type, base1, d));
+ tmp = fold (build2 (MULT_EXPR, niter_type, tmp, inverse (s, bound)));
+ niter->niter = fold (build2 (BIT_AND_EXPR, niter_type, tmp, bound));
}
else
{
@@ -375,18 +394,18 @@ number_of_iterations_cond (tree type, tree base0, tree step0,
if (mmax)
{
bound = EXEC_BINARY (MINUS_EXPR, type, mmax, step0);
- assumption = fold (build (LE_EXPR, boolean_type_node,
- base1, bound));
- assumptions = fold (build (TRUTH_AND_EXPR, boolean_type_node,
- assumptions, assumption));
+ assumption = fold (build2 (LE_EXPR, boolean_type_node,
+ base1, bound));
+ assumptions = fold (build2 (TRUTH_AND_EXPR, boolean_type_node,
+ assumptions, assumption));
}
step = step0;
- tmp = fold (build (PLUS_EXPR, type, base1, step0));
- assumption = fold (build (GT_EXPR, boolean_type_node, base0, tmp));
- delta = fold (build (PLUS_EXPR, type, base1, step));
- delta = fold (build (MINUS_EXPR, type, delta, base0));
- delta = convert (niter_type, delta);
+ tmp = fold (build2 (PLUS_EXPR, type, base1, step0));
+ assumption = fold (build2 (GT_EXPR, boolean_type_node, base0, tmp));
+ delta = fold (build2 (PLUS_EXPR, type, base1, step));
+ delta = fold (build2 (MINUS_EXPR, type, delta, base0));
+ delta = fold_convert (niter_type, delta);
}
else
{
@@ -396,22 +415,22 @@ number_of_iterations_cond (tree type, tree base0, tree step0,
if (mmin)
{
bound = EXEC_BINARY (MINUS_EXPR, type, mmin, step1);
- assumption = fold (build (LE_EXPR, boolean_type_node,
+ assumption = fold (build2 (LE_EXPR, boolean_type_node,
bound, base0));
- assumptions = fold (build (TRUTH_AND_EXPR, boolean_type_node,
+ assumptions = fold (build2 (TRUTH_AND_EXPR, boolean_type_node,
assumptions, assumption));
}
step = fold (build1 (NEGATE_EXPR, type, step1));
- tmp = fold (build (PLUS_EXPR, type, base0, step1));
- assumption = fold (build (GT_EXPR, boolean_type_node, tmp, base1));
- delta = fold (build (MINUS_EXPR, type, base0, step));
- delta = fold (build (MINUS_EXPR, type, base1, delta));
- delta = convert (niter_type, delta);
+ tmp = fold (build2 (PLUS_EXPR, type, base0, step1));
+ assumption = fold (build2 (GT_EXPR, boolean_type_node, tmp, base1));
+ delta = fold (build2 (MINUS_EXPR, type, base0, step));
+ delta = fold (build2 (MINUS_EXPR, type, base1, delta));
+ delta = fold_convert (niter_type, delta);
}
- noloop_assumptions = fold (build (TRUTH_OR_EXPR, boolean_type_node,
+ noloop_assumptions = fold (build2 (TRUTH_OR_EXPR, boolean_type_node,
noloop_assumptions, assumption));
- delta = fold (build (FLOOR_DIV_EXPR, niter_type, delta,
- convert (niter_type, step)));
+ delta = fold (build2 (FLOOR_DIV_EXPR, niter_type, delta,
+ fold_convert (niter_type, step)));
niter->niter = delta;
}
@@ -422,7 +441,7 @@ number_of_iterations_cond (tree type, tree base0, tree step0,
zero_iter:
niter->assumptions = boolean_true_node;
niter->may_be_zero = boolean_true_node;
- niter->niter = convert (type, integer_zero_node);
+ niter->niter = build_int_cst_type (type, 0);
return;
}
@@ -466,9 +485,9 @@ simplify_using_outer_evolutions (struct loop *loop, tree expr)
if (changed)
{
if (code == COND_EXPR)
- expr = build (code, boolean_type_node, e0, e1, e2);
+ expr = build3 (code, boolean_type_node, e0, e1, e2);
else
- expr = build (code, boolean_type_node, e0, e1);
+ expr = build2 (code, boolean_type_node, e0, e1);
expr = fold (expr);
}
@@ -521,9 +540,9 @@ tree_simplify_using_condition (tree cond, tree expr)
if (changed)
{
if (code == COND_EXPR)
- expr = build (code, boolean_type_node, e0, e1, e2);
+ expr = build3 (code, boolean_type_node, e0, e1, e2);
else
- expr = build (code, boolean_type_node, e0, e1);
+ expr = build2 (code, boolean_type_node, e0, e1);
expr = fold (expr);
}
@@ -532,15 +551,15 @@ tree_simplify_using_condition (tree cond, tree expr)
/* Check whether COND ==> EXPR. */
notcond = invert_truthvalue (cond);
- e = fold (build (TRUTH_OR_EXPR, boolean_type_node,
+ e = fold (build2 (TRUTH_OR_EXPR, boolean_type_node,
notcond, expr));
- if (integer_nonzerop (e))
+ if (nonzero_p (e))
return e;
/* Check whether COND ==> not EXPR. */
- e = fold (build (TRUTH_AND_EXPR, boolean_type_node,
+ e = fold (build2 (TRUTH_AND_EXPR, boolean_type_node,
cond, expr));
- if (integer_zerop (e))
+ if (zero_p (e))
return e;
return expr;
@@ -566,8 +585,8 @@ simplify_using_initial_conditions (struct loop *loop, tree expr,
bb != ENTRY_BLOCK_PTR;
bb = get_immediate_dominator (CDI_DOMINATORS, bb))
{
- e = bb->pred;
- if (e->pred_next)
+ e = EDGE_PRED (bb, 0);
+ if (EDGE_COUNT (bb->preds) > 1)
continue;
if (!(e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
@@ -579,7 +598,7 @@ simplify_using_initial_conditions (struct loop *loop, tree expr,
exp = tree_simplify_using_condition (cond, expr);
if (exp != expr)
- *conds_used = fold (build (TRUTH_AND_EXPR,
+ *conds_used = fold (build2 (TRUTH_AND_EXPR,
boolean_type_node,
*conds_used,
cond));
@@ -861,8 +880,8 @@ loop_niter_by_eval (struct loop *loop, edge exit)
for (j = 0; j < 2; j++)
aval[j] = get_val_for (op[j], val[j]);
- acnd = fold (build (cmp, boolean_type_node, aval[0], aval[1]));
- if (integer_zerop (acnd))
+ acnd = fold (build2 (cmp, boolean_type_node, aval[0], aval[1]));
+ if (zero_p (acnd))
{
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file,
@@ -906,7 +925,7 @@ find_loop_niter_by_eval (struct loop *loop, edge *exit)
continue;
if (niter
- && !integer_nonzerop (fold (build (LT_EXPR, boolean_type_node,
+ && !nonzero_p (fold (build2 (LT_EXPR, boolean_type_node,
aniter, niter))))
continue;
@@ -980,11 +999,11 @@ estimate_numbers_of_iterations_loop (struct loop *loop)
niter = niter_desc.niter;
type = TREE_TYPE (niter);
- if (!integer_zerop (niter_desc.may_be_zero)
- && !integer_nonzerop (niter_desc.may_be_zero))
- niter = build (COND_EXPR, type, niter_desc.may_be_zero,
- convert (type, integer_zero_node),
- niter);
+ if (!zero_p (niter_desc.may_be_zero)
+ && !nonzero_p (niter_desc.may_be_zero))
+ niter = build3 (COND_EXPR, type, niter_desc.may_be_zero,
+ build_int_cst_type (type, 0),
+ niter);
record_estimate (loop, niter,
niter_desc.additional_info,
last_stmt (exits[i]->src));
@@ -1025,14 +1044,14 @@ compare_trees (tree a, tree b)
else
type = typeb;
- a = convert (type, a);
- b = convert (type, b);
+ a = fold_convert (type, a);
+ b = fold_convert (type, b);
- if (integer_nonzerop (fold (build (EQ_EXPR, boolean_type_node, a, b))))
+ if (nonzero_p (fold (build2 (EQ_EXPR, boolean_type_node, a, b))))
return 0;
- if (integer_nonzerop (fold (build (LT_EXPR, boolean_type_node, a, b))))
+ if (nonzero_p (fold (build2 (LT_EXPR, boolean_type_node, a, b))))
return 1;
- if (integer_nonzerop (fold (build (GT_EXPR, boolean_type_node, a, b))))
+ if (nonzero_p (fold (build2 (GT_EXPR, boolean_type_node, a, b))))
return -1;
return 2;
@@ -1080,9 +1099,8 @@ upper_bound_in_type (tree outer, tree inner)
}
}
- return convert (outer,
- convert (inner,
- build_int_cst_wide (NULL_TREE, lo, hi)));
+ return fold_convert (outer,
+ build_int_cst_wide (inner, lo, hi));
}
/* Returns the smallest value obtainable by casting something in INNER type to
@@ -1107,9 +1125,8 @@ lower_bound_in_type (tree outer, tree inner)
lo = 0;
}
- return convert (outer,
- convert (inner,
- build_int_cst_wide (NULL_TREE, lo, hi)));
+ return fold_convert (outer,
+ build_int_cst_wide (inner, lo, hi));
}
/* Returns true if statement S1 dominates statement S2. */
@@ -1168,10 +1185,10 @@ can_count_iv_in_wider_type_bound (tree type, tree base, tree step,
tree valid_niter, extreme, unsigned_type, delta, bound_type;
tree cond;
- b = convert (type, base);
- bplusstep = convert (type,
- fold (build (PLUS_EXPR, inner_type, base, step)));
- new_step = fold (build (MINUS_EXPR, type, bplusstep, b));
+ b = fold_convert (type, base);
+ bplusstep = fold_convert (type,
+ fold (build2 (PLUS_EXPR, inner_type, base, step)));
+ new_step = fold (build2 (MINUS_EXPR, type, bplusstep, b));
if (TREE_CODE (new_step) != INTEGER_CST)
return NULL_TREE;
@@ -1179,14 +1196,14 @@ can_count_iv_in_wider_type_bound (tree type, tree base, tree step,
{
case -1:
extreme = upper_bound_in_type (type, inner_type);
- delta = fold (build (MINUS_EXPR, type, extreme, b));
+ delta = fold (build2 (MINUS_EXPR, type, extreme, b));
new_step_abs = new_step;
break;
case 1:
extreme = lower_bound_in_type (type, inner_type);
- new_step_abs = fold (build (NEGATE_EXPR, type, new_step));
- delta = fold (build (MINUS_EXPR, type, b, extreme));
+ new_step_abs = fold (build1 (NEGATE_EXPR, type, new_step));
+ delta = fold (build2 (MINUS_EXPR, type, b, extreme));
break;
case 0:
@@ -1197,40 +1214,40 @@ can_count_iv_in_wider_type_bound (tree type, tree base, tree step,
}
unsigned_type = unsigned_type_for (type);
- delta = convert (unsigned_type, delta);
- new_step_abs = convert (unsigned_type, new_step_abs);
- valid_niter = fold (build (FLOOR_DIV_EXPR, unsigned_type,
+ delta = fold_convert (unsigned_type, delta);
+ new_step_abs = fold_convert (unsigned_type, new_step_abs);
+ valid_niter = fold (build2 (FLOOR_DIV_EXPR, unsigned_type,
delta, new_step_abs));
bound_type = TREE_TYPE (bound);
if (TYPE_PRECISION (type) > TYPE_PRECISION (bound_type))
- bound = convert (unsigned_type, bound);
+ bound = fold_convert (unsigned_type, bound);
else
- valid_niter = convert (bound_type, valid_niter);
+ valid_niter = fold_convert (bound_type, valid_niter);
if (at_stmt && stmt_dominates_stmt_p (of, at_stmt))
{
/* After the statement OF we know that anything is executed at most
BOUND times. */
- cond = build (GE_EXPR, boolean_type_node, valid_niter, bound);
+ cond = build2 (GE_EXPR, boolean_type_node, valid_niter, bound);
}
else
{
/* Before the statement OF we know that anything is executed at most
BOUND + 1 times. */
- cond = build (GT_EXPR, boolean_type_node, valid_niter, bound);
+ cond = build2 (GT_EXPR, boolean_type_node, valid_niter, bound);
}
cond = fold (cond);
- if (integer_nonzerop (cond))
+ if (nonzero_p (cond))
return new_step;
/* Try taking additional conditions into account. */
- cond = build (TRUTH_OR_EXPR, boolean_type_node,
+ cond = build2 (TRUTH_OR_EXPR, boolean_type_node,
invert_truthvalue (additional),
cond);
cond = fold (cond);
- if (integer_nonzerop (cond))
+ if (nonzero_p (cond))
return new_step;
return NULL_TREE;
diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c
index f10407538c2..d4ab19263ae 100644
--- a/gcc/tree-ssa-loop-unswitch.c
+++ b/gcc/tree-ssa-loop-unswitch.c
@@ -172,10 +172,10 @@ simplify_using_entry_checks (struct loop *loop, tree cond)
? boolean_true_node
: boolean_false_node);
- if (e->src->pred->pred_next)
+ if (EDGE_COUNT (e->src->preds) > 1)
return cond;
- e = e->src->pred;
+ e = EDGE_PRED (e->src, 0);
if (e->src == ENTRY_BLOCK_PTR)
return cond;
}
@@ -283,9 +283,7 @@ tree_unswitch_loop (struct loops *loops, struct loop *loop,
/* Some sanity checking. */
gcc_assert (flow_bb_inside_loop_p (loop, unswitch_on));
- gcc_assert (unswitch_on->succ != NULL);
- gcc_assert (unswitch_on->succ->succ_next != NULL);
- gcc_assert (unswitch_on->succ->succ_next->succ_next == NULL);
+ gcc_assert (EDGE_COUNT (unswitch_on->succs) == 2);
gcc_assert (loop->inner == NULL);
return tree_ssa_loop_version (loops, loop, unshare_expr (cond),
diff --git a/gcc/tree-ssa-loop.c b/gcc/tree-ssa-loop.c
index b1d854e9acd..1eab89fd6e2 100644
--- a/gcc/tree-ssa-loop.c
+++ b/gcc/tree-ssa-loop.c
@@ -311,7 +311,7 @@ tree_ssa_loop_bounds (void)
struct tree_opt_pass pass_record_bounds =
{
- "bounds", /* name */
+ NULL, /* name */
NULL, /* gate */
tree_ssa_loop_bounds, /* execute */
NULL, /* sub */
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index e61e736f5a3..7c38b8aae98 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -185,39 +185,35 @@ candidate_bb_for_phi_optimization (basic_block bb,
/* One of the alternatives must come from a block ending with
a COND_EXPR. */
- last0 = last_stmt (bb->pred->src);
- last1 = last_stmt (bb->pred->pred_next->src);
+ last0 = last_stmt (EDGE_PRED (bb, 0)->src);
+ last1 = last_stmt (EDGE_PRED (bb, 1)->src);
if (last0 && TREE_CODE (last0) == COND_EXPR)
{
- cond_block = bb->pred->src;
- other_block = bb->pred->pred_next->src;
+ cond_block = EDGE_PRED (bb, 0)->src;
+ other_block = EDGE_PRED (bb, 1)->src;
}
else if (last1 && TREE_CODE (last1) == COND_EXPR)
{
- other_block = bb->pred->src;
- cond_block = bb->pred->pred_next->src;
+ other_block = EDGE_PRED (bb, 0)->src;
+ cond_block = EDGE_PRED (bb, 1)->src;
}
else
return false;
/* COND_BLOCK must have precisely two successors. We indirectly
verify that those successors are BB and OTHER_BLOCK. */
- if (!cond_block->succ
- || !cond_block->succ->succ_next
- || cond_block->succ->succ_next->succ_next
- || (cond_block->succ->flags & EDGE_ABNORMAL) != 0
- || (cond_block->succ->succ_next->flags & EDGE_ABNORMAL) != 0)
+ if (EDGE_COUNT (cond_block->succs) != 2
+ || (EDGE_SUCC (cond_block, 0)->flags & EDGE_ABNORMAL) != 0
+ || (EDGE_SUCC (cond_block, 1)->flags & EDGE_ABNORMAL) != 0)
return false;
/* OTHER_BLOCK must have a single predecessor which is COND_BLOCK,
OTHER_BLOCK must have a single successor which is BB and
OTHER_BLOCK must have no PHI nodes. */
- if (!other_block->pred
- || other_block->pred->src != cond_block
- || other_block->pred->pred_next
- || !other_block->succ
- || other_block->succ->dest != bb
- || other_block->succ->succ_next
+ if (EDGE_COUNT (other_block->preds) != 1
+ || EDGE_PRED (other_block, 0)->src != cond_block
+ || EDGE_COUNT (other_block->succs) != 1
+ || EDGE_SUCC (other_block, 0)->dest != bb
|| phi_nodes (other_block))
return false;
@@ -252,20 +248,20 @@ replace_phi_with_stmt (block_stmt_iterator bsi, basic_block bb,
bb_ann (bb)->phi_nodes = NULL;
/* Remove the empty basic block. */
- if (cond_block->succ->dest == bb)
+ if (EDGE_SUCC (cond_block, 0)->dest == bb)
{
- cond_block->succ->flags |= EDGE_FALLTHRU;
- cond_block->succ->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
+ EDGE_SUCC (cond_block, 0)->flags |= EDGE_FALLTHRU;
+ EDGE_SUCC (cond_block, 0)->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
- block_to_remove = cond_block->succ->succ_next->dest;
+ block_to_remove = EDGE_SUCC (cond_block, 1)->dest;
}
else
{
- cond_block->succ->succ_next->flags |= EDGE_FALLTHRU;
- cond_block->succ->succ_next->flags
+ EDGE_SUCC (cond_block, 1)->flags |= EDGE_FALLTHRU;
+ EDGE_SUCC (cond_block, 1)->flags
&= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
- block_to_remove = cond_block->succ->dest;
+ block_to_remove = EDGE_SUCC (cond_block, 0)->dest;
}
delete_basic_block (block_to_remove);
@@ -477,7 +473,7 @@ value_replacement (basic_block bb, tree phi, tree arg0, tree arg1)
edge from OTHER_BLOCK which reaches BB and represents the desired
path from COND_BLOCK. */
if (e->dest == other_block)
- e = e->dest->succ;
+ e = EDGE_SUCC (e->dest, 0);
/* Now we know the incoming edge to BB that has the argument for the
RHS of our new assignment statement. */
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 92932b63def..3d505b5579b 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -1137,12 +1137,13 @@ compute_antic_aux (basic_block block)
setting the BB_VISITED flag. */
if (! (block->flags & BB_VISITED))
{
- for (e = block->pred; e; e = e->pred_next)
- if (e->flags & EDGE_ABNORMAL)
- {
- block->flags |= BB_VISITED;
- break;
- }
+ edge_iterator ei;
+ FOR_EACH_EDGE (e, ei, block->preds)
+ if (e->flags & EDGE_ABNORMAL)
+ {
+ block->flags |= BB_VISITED;
+ break;
+ }
}
if (block->flags & BB_VISITED)
{
@@ -1157,14 +1158,14 @@ compute_antic_aux (basic_block block)
/* If the block has no successors, ANTIC_OUT is empty, because it is
the exit block. */
- if (block->succ == NULL);
+ if (EDGE_COUNT (block->succs) == 0);
/* If we have one successor, we could have some phi nodes to
translate through. */
- else if (block->succ->succ_next == NULL)
+ else if (EDGE_COUNT (block->succs) == 1)
{
- phi_translate_set (ANTIC_OUT, ANTIC_IN(block->succ->dest),
- block, block->succ->dest);
+ phi_translate_set (ANTIC_OUT, ANTIC_IN(EDGE_SUCC (block, 0)->dest),
+ block, EDGE_SUCC (block, 0)->dest);
}
/* If we have multiple successors, we take the intersection of all of
them. */
@@ -1174,14 +1175,11 @@ compute_antic_aux (basic_block block)
edge e;
size_t i;
basic_block bprime, first;
+ edge_iterator ei;
worklist = VEC_alloc (basic_block, 2);
- e = block->succ;
- while (e)
- {
- VEC_safe_push (basic_block, worklist, e->dest);
- e = e->succ_next;
- }
+ FOR_EACH_EDGE (e, ei, block->succs)
+ VEC_safe_push (basic_block, worklist, e->dest);
first = VEC_index (basic_block, worklist, 0);
set_copy (ANTIC_OUT, ANTIC_IN (first));
@@ -1426,7 +1424,7 @@ insert_aux (basic_block block)
bitmap_insert_into_set (NEW_SETS (block), ssa_name (i));
bitmap_value_replace_in_set (AVAIL_OUT (block), ssa_name (i));
}
- if (block->pred->pred_next)
+ if (EDGE_COUNT (block->preds) > 1)
{
value_set_node_t node;
for (node = ANTIC_IN (block)->head;
@@ -1445,6 +1443,7 @@ insert_aux (basic_block block)
edge pred;
basic_block bprime;
tree eprime;
+ edge_iterator ei;
val = get_value_handle (node->expr);
if (bitmap_set_contains_value (PHI_GEN (block), val))
@@ -1455,11 +1454,9 @@ insert_aux (basic_block block)
fprintf (dump_file, "Found fully redundant value\n");
continue;
}
-
+
avail = xcalloc (last_basic_block, sizeof (tree));
- for (pred = block->pred;
- pred;
- pred = pred->pred_next)
+ FOR_EACH_EDGE (pred, ei, block->preds)
{
tree vprime;
tree edoubleprime;
@@ -1520,7 +1517,7 @@ insert_aux (basic_block block)
partially redundant. */
if (!cant_insert && !all_same && by_some)
{
- tree type = TREE_TYPE (avail[block->pred->src->index]);
+ tree type = TREE_TYPE (avail[EDGE_PRED (block, 0)->src->index]);
tree temp;
if (dump_file && (dump_flags & TDF_DETAILS))
{
@@ -1530,9 +1527,7 @@ insert_aux (basic_block block)
}
/* Make the necessary insertions. */
- for (pred = block->pred;
- pred;
- pred = pred->pred_next)
+ FOR_EACH_EDGE (pred, ei, block->preds)
{
tree stmts = alloc_stmt_list ();
tree builtexpr;
@@ -1547,7 +1542,7 @@ insert_aux (basic_block block)
bsi_insert_on_edge (pred, stmts);
avail[bprime->index] = builtexpr;
}
- }
+ }
/* Now build a phi for the new variable. */
temp = create_tmp_var (type, "prephitmp");
add_referenced_tmp_var (temp);
@@ -1562,9 +1557,7 @@ insert_aux (basic_block block)
#endif
bitmap_value_replace_in_set (AVAIL_OUT (block),
PHI_RESULT (temp));
- for (pred = block->pred;
- pred;
- pred = pred->pred_next)
+ FOR_EACH_EDGE (pred, ei, block->preds)
{
add_phi_arg (&temp, avail[pred->src->index],
pred);
@@ -1631,8 +1624,7 @@ is_undefined_value (tree expr)
return (TREE_CODE (expr) == SSA_NAME
&& IS_EMPTY_STMT (SSA_NAME_DEF_STMT (expr))
/* PARM_DECLs and hard registers are always defined. */
- && TREE_CODE (SSA_NAME_VAR (expr)) != PARM_DECL
- && !DECL_HARD_REGISTER (SSA_NAME_VAR (expr)));
+ && TREE_CODE (SSA_NAME_VAR (expr)) != PARM_DECL);
}
@@ -1926,9 +1918,9 @@ init_pre (void)
ENTRY_BLOCK_PTR (FIXME, if ENTRY_BLOCK_PTR had an index number
different than -1 we wouldn't have to hack this. tree-ssa-dce.c
needs a similar change). */
- if (ENTRY_BLOCK_PTR->succ->dest->pred->pred_next)
- if (!(ENTRY_BLOCK_PTR->succ->flags & EDGE_ABNORMAL))
- split_edge (ENTRY_BLOCK_PTR->succ);
+ if (EDGE_COUNT (EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest->preds) > 1)
+ if (!(EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->flags & EDGE_ABNORMAL))
+ split_edge (EDGE_SUCC (ENTRY_BLOCK_PTR, 0));
FOR_ALL_BB (bb)
bb->aux = xcalloc (1, sizeof (struct bb_value_sets));
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c
index f86f13b7fdc..6fab4f46242 100644
--- a/gcc/tree-ssa-propagate.c
+++ b/gcc/tree-ssa-propagate.c
@@ -40,7 +40,8 @@
#include "tree-pass.h"
#include "tree-ssa-propagate.h"
#include "langhooks.h"
-
+#include "varray.h"
+#include "vec.h"
/* This file implements a generic value propagation engine based on
the same propagation used by the SSA-CCP algorithm [1].
@@ -142,7 +143,7 @@ static sbitmap bb_in_list;
definition has changed. SSA edges are def-use edges in the SSA
web. For each D-U edge, we store the target statement or PHI node
U. */
-static GTY(()) varray_type interesting_ssa_edges;
+static GTY(()) VEC(tree) *interesting_ssa_edges;
/* Identical to INTERESTING_SSA_EDGES. For performance reasons, the
list of SSA edges is split into two. One contains all SSA edges
@@ -158,7 +159,7 @@ static GTY(()) varray_type interesting_ssa_edges;
don't use a separate worklist for VARYING edges, we end up with
situations where lattice values move from
UNDEFINED->INTERESTING->VARYING instead of UNDEFINED->VARYING. */
-static GTY(()) varray_type varying_ssa_edges;
+static GTY(()) VEC(tree) *varying_ssa_edges;
/* Return true if the block worklist empty. */
@@ -170,7 +171,8 @@ cfg_blocks_empty_p (void)
}
-/* Add a basic block to the worklist. */
+/* Add a basic block to the worklist. The block must not be already
+ in the worklist. */
static void
cfg_blocks_add (basic_block bb)
@@ -178,8 +180,7 @@ cfg_blocks_add (basic_block bb)
if (bb == ENTRY_BLOCK_PTR || bb == EXIT_BLOCK_PTR)
return;
- if (TEST_BIT (bb_in_list, bb->index))
- return;
+ gcc_assert (!TEST_BIT (bb_in_list, bb->index));
if (cfg_blocks_empty_p ())
{
@@ -247,9 +248,9 @@ add_ssa_edge (tree var, bool is_varying)
{
STMT_IN_SSA_EDGE_WORKLIST (use_stmt) = 1;
if (is_varying)
- VARRAY_PUSH_TREE (varying_ssa_edges, use_stmt);
+ VEC_safe_push (tree, varying_ssa_edges, use_stmt);
else
- VARRAY_PUSH_TREE (interesting_ssa_edges, use_stmt);
+ VEC_safe_push (tree, interesting_ssa_edges, use_stmt);
}
}
}
@@ -318,8 +319,9 @@ simulate_stmt (tree stmt)
if (stmt_ends_bb_p (stmt))
{
edge e;
+ edge_iterator ei;
basic_block bb = bb_for_stmt (stmt);
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
add_control_edge (e);
}
}
@@ -339,19 +341,20 @@ simulate_stmt (tree stmt)
/* Process an SSA edge worklist. WORKLIST is the SSA edge worklist to
drain. This pops statements off the given WORKLIST and processes
- them until there are no more statements on WORKLIST. */
+ them until there are no more statements on WORKLIST.
+ We take a pointer to WORKLIST because it may be reallocated when an
+ SSA edge is added to it in simulate_stmt. */
static void
-process_ssa_edge_worklist (varray_type *worklist)
+process_ssa_edge_worklist (VEC(tree) **worklist)
{
/* Drain the entire worklist. */
- while (VARRAY_ACTIVE_SIZE (*worklist) > 0)
+ while (VEC_length (tree, *worklist) > 0)
{
basic_block bb;
/* Pull the statement to simulate off the worklist. */
- tree stmt = VARRAY_TOP_TREE (*worklist);
- VARRAY_POP (*worklist);
+ tree stmt = VEC_pop (tree, *worklist);
/* If this statement was already visited by simulate_block, then
we don't need to visit it again here. */
@@ -406,6 +409,7 @@ simulate_block (basic_block block)
block_stmt_iterator j;
unsigned int normal_edge_count;
edge e, normal_edge;
+ edge_iterator ei;
/* Note that we have simulated this block. */
SET_BIT (executable_blocks, block->index);
@@ -434,7 +438,7 @@ simulate_block (basic_block block)
worklist. */
normal_edge_count = 0;
normal_edge = NULL;
- for (e = block->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, block->succs)
{
if (e->flags & EDGE_ABNORMAL)
add_control_edge (e);
@@ -457,11 +461,12 @@ static void
ssa_prop_init (void)
{
edge e;
+ edge_iterator ei;
basic_block bb;
/* Worklists of SSA edges. */
- VARRAY_TREE_INIT (interesting_ssa_edges, 20, "interesting_ssa_edges");
- VARRAY_TREE_INIT (varying_ssa_edges, 20, "varying_ssa_edges");
+ interesting_ssa_edges = VEC_alloc (tree, 20);
+ varying_ssa_edges = VEC_alloc (tree, 20);
executable_blocks = sbitmap_alloc (last_basic_block);
sbitmap_zero (executable_blocks);
@@ -482,13 +487,13 @@ ssa_prop_init (void)
for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
STMT_IN_SSA_EDGE_WORKLIST (bsi_stmt (si)) = 0;
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
e->flags &= ~EDGE_EXECUTABLE;
}
/* Seed the algorithm by adding the successors of the entry block to the
edge worklist. */
- for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
{
if (e->dest != EXIT_BLOCK_PTR)
{
@@ -504,8 +509,8 @@ ssa_prop_init (void)
static void
ssa_prop_fini (void)
{
- interesting_ssa_edges = NULL;
- varying_ssa_edges = NULL;
+ VEC_free (tree, interesting_ssa_edges);
+ VEC_free (tree, varying_ssa_edges);
cfg_blocks = NULL;
sbitmap_free (bb_in_list);
sbitmap_free (executable_blocks);
@@ -650,8 +655,8 @@ ssa_propagate (ssa_prop_visit_stmt_fn visit_stmt,
/* Iterate until the worklists are empty. */
while (!cfg_blocks_empty_p ()
- || VARRAY_ACTIVE_SIZE (interesting_ssa_edges) > 0
- || VARRAY_ACTIVE_SIZE (varying_ssa_edges) > 0)
+ || VEC_length (tree, interesting_ssa_edges) > 0
+ || VEC_length (tree, varying_ssa_edges) > 0)
{
if (!cfg_blocks_empty_p ())
{
diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c
index a76ce67633a..2a39c2cace7 100644
--- a/gcc/tree-ssa-threadupdate.c
+++ b/gcc/tree-ssa-threadupdate.c
@@ -129,40 +129,37 @@ copy_phis_to_block (basic_block new_bb, basic_block bb, edge e)
}
}
-/* Remove the last statement in block BB which must be a COND_EXPR or
- SWITCH_EXPR. Also remove all outgoing edges except the edge which
- reaches DEST_BB.
-
- This is only used by jump threading which knows the last statement in
- BB should be a COND_EXPR or SWITCH_EXPR. If the block ends with any other
- statement, then we abort. */
+/* Remove the last statement in block BB if it is a control statement
+ Also remove all outgoing edges except the edge which reaches DEST_BB.
+ If DEST_BB is NULL, then remove all outgoing edges. */
static void
-remove_last_stmt_and_useless_edges (basic_block bb, basic_block dest_bb)
+remove_ctrl_stmt_and_useless_edges (basic_block bb, basic_block dest_bb)
{
block_stmt_iterator bsi;
- edge e, next;
+ edge e;
+ edge_iterator ei;
bsi = bsi_last (bb);
- gcc_assert (TREE_CODE (bsi_stmt (bsi)) == COND_EXPR
- || TREE_CODE (bsi_stmt (bsi)) == SWITCH_EXPR);
+ /* If the duplicate ends with a control statement, then remove it.
- bsi_remove (&bsi);
+ Note that if we are duplicating the template block rather than the
+ original basic block, then the duplicate might not have any real
+ statements in it. */
+ if (!bsi_end_p (bsi)
+ && bsi_stmt (bsi)
+ && (TREE_CODE (bsi_stmt (bsi)) == COND_EXPR
+ || TREE_CODE (bsi_stmt (bsi)) == SWITCH_EXPR))
+ bsi_remove (&bsi);
- next = NULL;
- for (e = bb->succ; e; e = next)
+ for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
{
- next = e->succ_next;
-
if (e->dest != dest_bb)
ssa_remove_edge (e);
+ else
+ ei_next (&ei);
}
-
- /* BB now has a single outgoing edge. We need to update the flags for
- that single outgoing edge. */
- bb->succ->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
- bb->succ->flags |= EDGE_FALLTHRU;
}
/* Create a duplicate of BB which only reaches the destination of the edge
@@ -171,9 +168,6 @@ remove_last_stmt_and_useless_edges (basic_block bb, basic_block dest_bb)
static void
create_block_for_threading (basic_block bb, struct redirection_data *rd)
{
- tree phi;
- edge e;
-
/* We can use the generic block duplication code and simply remove
the stuff we do not need. */
rd->dup_block = duplicate_block (bb, NULL);
@@ -183,24 +177,12 @@ create_block_for_threading (basic_block bb, struct redirection_data *rd)
rd->dup_block->count = 0;
/* The call to duplicate_block will copy everything, including the
- useless COND_EXPR or SWITCH_EXPR at the end of the block. We just remove
+ useless COND_EXPR or SWITCH_EXPR at the end of BB. We just remove
the useless COND_EXPR or SWITCH_EXPR here rather than having a
- specialized block copier. */
- remove_last_stmt_and_useless_edges (rd->dup_block, rd->outgoing_edge->dest);
-
- for (e = rd->dup_block->succ; e; e = e->succ_next)
- e->count = 0;
-
- /* If there are any PHI nodes at the destination of the outgoing edge
- from the duplicate block, then we will need to add a new argument
- to them. The argument should have the same value as the argument
- associated with the outgoing edge stored in RD. */
- for (phi = phi_nodes (rd->dup_block->succ->dest); phi;
- phi = PHI_CHAIN (phi))
- {
- int indx = phi_arg_from_edge (phi, rd->outgoing_edge);
- add_phi_arg (&phi, PHI_ARG_DEF_TREE (phi, indx), rd->dup_block->succ);
- }
+ specialized block copier. We also remove all outgoing edges
+ from the duplicate block. The appropriate edge will be created
+ later. */
+ remove_ctrl_stmt_and_useless_edges (rd->dup_block, NULL);
}
/* BB is a block which ends with a COND_EXPR or SWITCH_EXPR and when BB
@@ -238,10 +220,8 @@ thread_block (basic_block bb)
/* E is an incoming edge into BB that we may or may not want to
redirect to a duplicate of BB. */
edge e;
-
- /* The next edge in a predecessor list. Used in loops where E->pred_next
- may change within the loop. */
- edge next;
+ edge_iterator ei;
+ basic_block template_block;
/* ALL indicates whether or not all incoming edges into BB should
be threaded to a duplicate of BB. */
@@ -254,7 +234,7 @@ thread_block (basic_block bb)
/* Look at each incoming edge into BB. Record each unique outgoing
edge that we want to thread an incoming edge to. Also note if
all incoming edges are threaded or not. */
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
if (!e->aux)
{
@@ -294,11 +274,51 @@ thread_block (basic_block bb)
/* Now create duplicates of BB. Note that if all incoming edges are
threaded, then BB is going to become unreachable. In that case
we use BB for one of the duplicates rather than wasting memory
- duplicating BB. Thus the odd starting condition for the loop. */
+ duplicating BB. Thus the odd starting condition for the loop.
+
+ Note that for a block with a high outgoing degree we can waste
+ a lot of time and memory creating and destroying useless edges.
+
+ So we first duplicate BB and remove the control structure at the
+ tail of the duplicate as well as all outgoing edges from the
+ duplicate. We then use that duplicate block as a template for
+ the rest of the duplicates. */
+ template_block = NULL;
+ for (i = (all ? 1 : 0); i < VARRAY_ACTIVE_SIZE (redirection_data); i++)
+ {
+ struct redirection_data *rd = VARRAY_GENERIC_PTR (redirection_data, i);
+
+ if (template_block == NULL)
+ {
+ create_block_for_threading (bb, rd);
+ template_block = rd->dup_block;
+ }
+ else
+ {
+ create_block_for_threading (template_block, rd);
+ }
+ }
+
+ /* Now created up edges from the duplicate blocks to their new
+ destinations. Doing this as a separate loop after block creation
+ allows us to avoid creating lots of useless edges. */
for (i = (all ? 1 : 0); i < VARRAY_ACTIVE_SIZE (redirection_data); i++)
{
struct redirection_data *rd = VARRAY_GENERIC_PTR (redirection_data, i);
- create_block_for_threading (bb, rd);
+ tree phi;
+ edge e;
+
+ e = make_edge (rd->dup_block, rd->outgoing_edge->dest, EDGE_FALLTHRU);
+
+ /* If there are any PHI nodes at the destination of the outgoing edge
+ from the duplicate block, then we will need to add a new argument
+ to them. The argument should have the same value as the argument
+ associated with the outgoing edge stored in RD. */
+ for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
+ {
+ int indx = phi_arg_from_edge (phi, rd->outgoing_edge);
+ add_phi_arg (&phi, PHI_ARG_DEF_TREE (phi, indx), e);
+ }
}
/* The loop above created the duplicate blocks (and the statements
@@ -312,16 +332,16 @@ thread_block (basic_block bb)
If this turns out to be a performance problem, then we could create
a list of incoming edges associated with each entry in
REDIRECTION_DATA and walk over that list of edges instead. */
- next = NULL;
- for (e = bb->pred; e; e = next)
+ for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
{
edge new_dest = e->aux;
- next = e->pred_next;
-
/* E was not threaded, then there is nothing to do. */
if (!new_dest)
- continue;
+ {
+ ei_next (&ei);
+ continue;
+ }
/* Go ahead and clear E->aux. It's not needed anymore and failure
to clear it will cause all kinds of unpleasant problems later. */
@@ -373,9 +393,12 @@ thread_block (basic_block bb)
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, " Threaded jump %d --> %d to %d\n",
- bb->pred->src->index, bb->index, bb->succ->dest->index);
+ EDGE_PRED (bb, 0)->src->index, bb->index,
+ EDGE_SUCC (bb, 0)->dest->index);
- remove_last_stmt_and_useless_edges (bb, rd->outgoing_edge->dest);
+ remove_ctrl_stmt_and_useless_edges (bb, rd->outgoing_edge->dest);
+ EDGE_SUCC (bb, 0)->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
+ EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
}
/* Done with this block. Clear REDIRECTION_DATA. */
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index a4b84c1e250..ece45eeced5 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -278,9 +278,10 @@ verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
edge e;
bool err = false;
int i, phi_num_args = PHI_NUM_ARGS (phi);
+ edge_iterator ei;
/* Mark all the incoming edges. */
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
e->aux = (void *) 1;
for (i = 0; i < phi_num_args; i++)
@@ -326,7 +327,7 @@ verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
e->aux = (void *) 2;
}
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
if (e->aux != (void *) 2)
{
@@ -580,10 +581,11 @@ verify_ssa (void)
{
edge e;
tree phi;
+ edge_iterator ei;
block_stmt_iterator bsi;
/* Make sure that all edges have a clear 'aux' field. */
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
if (e->aux)
{
@@ -631,7 +633,7 @@ verify_ssa (void)
/* Verify the uses in arguments of PHI nodes at the exits from the
block. */
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
{
@@ -1275,7 +1277,7 @@ warn_uninit (tree t, const char *msgid, location_t *locus)
return;
/* Hard register variables get their initial value from the ether. */
- if (DECL_HARD_REGISTER (var))
+ if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var))
return;
/* TREE_NO_WARNING either means we already warned, or the front end
diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c
index 6f3fdcaaf93..a6c44933f79 100644
--- a/gcc/tree-tailcall.c
+++ b/gcc/tree-tailcall.c
@@ -190,6 +190,7 @@ independent_of_stmt_p (tree expr, tree at, block_stmt_iterator bsi)
{
basic_block bb, call_bb, at_bb;
edge e;
+ edge_iterator ei;
if (is_gimple_min_invariant (expr))
return expr;
@@ -200,7 +201,7 @@ independent_of_stmt_p (tree expr, tree at, block_stmt_iterator bsi)
/* Mark the blocks in the chain leading to the end. */
at_bb = bb_for_stmt (at);
call_bb = bb_for_stmt (bsi_stmt (bsi));
- for (bb = call_bb; bb != at_bb; bb = bb->succ->dest)
+ for (bb = call_bb; bb != at_bb; bb = EDGE_SUCC (bb, 0)->dest)
bb->aux = &bb->aux;
bb->aux = &bb->aux;
@@ -230,7 +231,7 @@ independent_of_stmt_p (tree expr, tree at, block_stmt_iterator bsi)
break;
}
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
if (e->src->aux)
break;
gcc_assert (e);
@@ -244,7 +245,7 @@ independent_of_stmt_p (tree expr, tree at, block_stmt_iterator bsi)
}
/* Unmark the blocks. */
- for (bb = call_bb; bb != at_bb; bb = bb->succ->dest)
+ for (bb = call_bb; bb != at_bb; bb = EDGE_SUCC (bb, 0)->dest)
bb->aux = NULL;
bb->aux = NULL;
@@ -371,7 +372,7 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
basic_block abb;
stmt_ann_t ann;
- if (bb->succ->succ_next)
+ if (EDGE_COUNT (bb->succs) > 1)
return;
for (bsi = bsi_last (bb); !bsi_end_p (bsi); bsi_prev (&bsi))
@@ -412,8 +413,9 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
if (bsi_end_p (bsi))
{
+ edge_iterator ei;
/* Recurse to the predecessors. */
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
find_tail_calls (e->src, ret);
return;
@@ -458,8 +460,8 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
while (bsi_end_p (absi))
{
- ass_var = propagate_through_phis (ass_var, abb->succ);
- abb = abb->succ->dest;
+ ass_var = propagate_through_phis (ass_var, EDGE_SUCC (abb, 0));
+ abb = EDGE_SUCC (abb, 0)->dest;
absi = bsi_start (abb);
}
@@ -677,7 +679,7 @@ eliminate_tail_call (struct tailcall *t)
if (TREE_CODE (stmt) == MODIFY_EXPR)
stmt = TREE_OPERAND (stmt, 1);
- first = ENTRY_BLOCK_PTR->succ->dest;
+ first = EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest;
/* Remove the code after call_bsi that will become unreachable. The
possibly unreachable code in other blocks is removed later in
@@ -697,7 +699,7 @@ eliminate_tail_call (struct tailcall *t)
}
/* Replace the call by a jump to the start of function. */
- e = redirect_edge_and_branch (t->call_block->succ, first);
+ e = redirect_edge_and_branch (EDGE_SUCC (t->call_block, 0), first);
gcc_assert (e);
PENDING_STMT (e) = NULL_TREE;
@@ -752,12 +754,12 @@ eliminate_tail_call (struct tailcall *t)
var_ann (param)->default_def = new_name;
phi = create_phi_node (name, first);
SSA_NAME_DEF_STMT (name) = phi;
- add_phi_arg (&phi, new_name, ENTRY_BLOCK_PTR->succ);
+ add_phi_arg (&phi, new_name, EDGE_SUCC (ENTRY_BLOCK_PTR, 0));
/* For all calls the same set of variables should be clobbered. This
means that there always should be the appropriate phi node except
for the first time we eliminate the call. */
- gcc_assert (!first->pred->pred_next->pred_next);
+ gcc_assert (EDGE_COUNT (first->preds) <= 2);
}
add_phi_arg (&phi, V_MAY_DEF_OP (v_may_defs, i), e);
@@ -819,15 +821,16 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls)
bool phis_constructed = false;
struct tailcall *tailcalls = NULL, *act, *next;
bool changed = false;
- basic_block first = ENTRY_BLOCK_PTR->succ->dest;
+ basic_block first = EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest;
tree stmt, param, ret_type, tmp, phi;
+ edge_iterator ei;
if (!suitable_for_tail_opt_p ())
return;
if (opt_tailcalls)
opt_tailcalls = suitable_for_tail_call_opt_p ();
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
{
/* Only traverse the normal exits, i.e. those that end with return
statement. */
@@ -848,8 +851,8 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls)
if (!phis_constructed)
{
/* Ensure that there is only one predecessor of the block. */
- if (first->pred->pred_next)
- first = split_edge (ENTRY_BLOCK_PTR->succ);
+ if (EDGE_COUNT (first->preds) > 1)
+ first = split_edge (EDGE_SUCC (ENTRY_BLOCK_PTR, 0));
/* Copy the args if needed. */
for (param = DECL_ARGUMENTS (current_function_decl);
@@ -868,7 +871,7 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls)
var_ann (param)->default_def = new_name;
phi = create_phi_node (name, first);
SSA_NAME_DEF_STMT (name) = phi;
- add_phi_arg (&phi, new_name, first->pred);
+ add_phi_arg (&phi, new_name, EDGE_PRED (first, 0));
}
phis_constructed = true;
}
@@ -881,7 +884,7 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls)
add_referenced_tmp_var (tmp);
phi = create_phi_node (tmp, first);
- add_phi_arg (&phi, build_int_cst (ret_type, 0), first->pred);
+ add_phi_arg (&phi, build_int_cst (ret_type, 0), EDGE_PRED (first, 0));
a_acc = PHI_RESULT (phi);
}
@@ -893,7 +896,7 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls)
add_referenced_tmp_var (tmp);
phi = create_phi_node (tmp, first);
- add_phi_arg (&phi, build_int_cst (ret_type, 1), first->pred);
+ add_phi_arg (&phi, build_int_cst (ret_type, 1), EDGE_PRED (first, 0));
m_acc = PHI_RESULT (phi);
}
}
@@ -908,7 +911,7 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls)
if (a_acc || m_acc)
{
/* Modify the remaining return statements. */
- for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
{
stmt = last_stmt (e->src);
diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c
index c98d7046b8d..e4de78637d3 100644
--- a/gcc/tree-vectorizer.c
+++ b/gcc/tree-vectorizer.c
@@ -1408,6 +1408,16 @@ vectorizable_operation (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
return false;
}
vec_mode = TYPE_MODE (vectype);
+ if (!VECTOR_MODE_P (vec_mode))
+ {
+ /* TODO: tree-complex.c sometimes can parallelize operations
+ on generic vectors. We can vectorize the loop in that case,
+ but then we should re-run the lowering pass. */
+ if (vect_debug_details (NULL))
+ fprintf (dump_file, "mode not supported by target.");
+ return false;
+ }
+
if (optab->handlers[(int) vec_mode].insn_code == CODE_FOR_nothing)
{
if (vect_debug_details (NULL))
@@ -1421,7 +1431,7 @@ vectorizable_operation (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
return true;
}
- /** Trasform. **/
+ /** Transform. **/
if (vect_debug_details (NULL))
fprintf (dump_file, "transform binary/unary operation.");
@@ -1876,8 +1886,7 @@ vect_transform_loop (loop_vec_info loop_vinfo,
/* 1) Make sure the loop header has exactly two entries
2) Make sure we have a preheader basic block. */
- gcc_assert (loop->header->pred->pred_next);
- gcc_assert (!loop->header->pred->pred_next->pred_next);
+ gcc_assert (EDGE_COUNT (loop->header->preds) == 2);
loop_split_edge_with (loop_preheader_edge (loop), NULL);
diff --git a/gcc/tree.c b/gcc/tree.c
index 0237d072271..26b5f1b39ad 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -291,21 +291,40 @@ make_node_stat (enum tree_code code MEM_STAT_DECL)
break;
case tcc_exceptional: /* something random, like an identifier. */
- if (code == IDENTIFIER_NODE)
- kind = id_kind;
- else if (code == TREE_VEC)
- kind = vec_kind;
- else if (code == TREE_BINFO)
- kind = binfo_kind;
- else if (code == PHI_NODE)
- kind = phi_kind;
- else if (code == SSA_NAME)
- kind = ssa_name_kind;
- else if (code == BLOCK)
- kind = b_kind;
- else
- kind = x_kind;
+ switch (code)
+ {
+ case IDENTIFIER_NODE:
+ kind = id_kind;
+ break;
+
+ case TREE_VEC:;
+ kind = vec_kind;
+ break;
+
+ case TREE_BINFO:
+ kind = binfo_kind;
+ break;
+
+ case PHI_NODE:
+ kind = phi_kind;
+ break;
+
+ case SSA_NAME:
+ kind = ssa_name_kind;
+ break;
+
+ case BLOCK:
+ kind = b_kind;
+ break;
+
+ default:
+ kind = x_kind;
+ break;
+ }
break;
+
+ default:
+ gcc_unreachable ();
}
tree_node_counts[(int) kind]++;
@@ -4218,7 +4237,7 @@ build_index_type (tree maxval)
TREE_TYPE (itype) = sizetype;
TYPE_PRECISION (itype) = TYPE_PRECISION (sizetype);
TYPE_MIN_VALUE (itype) = size_zero_node;
- TYPE_MAX_VALUE (itype) = convert (sizetype, maxval);
+ TYPE_MAX_VALUE (itype) = fold_convert (sizetype, maxval);
TYPE_MODE (itype) = TYPE_MODE (sizetype);
TYPE_SIZE (itype) = TYPE_SIZE (sizetype);
TYPE_SIZE_UNIT (itype) = TYPE_SIZE_UNIT (sizetype);
diff --git a/gcc/tree.def b/gcc/tree.def
index 4c1f9861f9d..11469b1d1a5 100644
--- a/gcc/tree.def
+++ b/gcc/tree.def
@@ -474,7 +474,7 @@ DEFTREECODE (COND_EXPR, "cond_expr", tcc_expression, 3)
for (i=0; i<N; i++)
A[i] = X[i] < Y[i] ? B[i] : C[i];
*/
-DEFTREECODE (VEC_COND_EXPR, "vec_cond_expr", 'e', 3)
+DEFTREECODE (VEC_COND_EXPR, "vec_cond_expr", tcc_expression, 3)
/* Declare local variables, including making RTL and allocating space.
BIND_EXPR_VARS is a chain of VAR_DECL nodes for the variables.
diff --git a/gcc/tree.h b/gcc/tree.h
index 012c34cdd6e..637fab7e1f7 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -96,6 +96,12 @@ extern const enum tree_code_class tree_code_type[];
#define DECL_P(CODE)\
(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_declaration)
+/* Nonzero if CODE represents a INDIRECT_REF. */
+#define INDIRECT_REF_P(CODE)\
+ (TREE_CODE (CODE) == INDIRECT_REF \
+ || TREE_CODE (CODE) == MISALIGNED_INDIRECT_REF \
+ || TREE_CODE (CODE) == ALIGN_INDIRECT_REF)
+
/* Nonzero if CODE represents a reference. */
#define REFERENCE_CLASS_P(CODE)\
@@ -2117,7 +2123,7 @@ struct tree_binfo GTY (())
/* In a VAR_DECL, nonzero if the decl is a register variable with
an explicit asm specification. */
-#define DECL_HARD_REGISTER(NODE) (DECL_CHECK (NODE)->decl.inline_flag)
+#define DECL_HARD_REGISTER(NODE) (VAR_DECL_CHECK (NODE)->decl.inline_flag)
/* Value of the decls's visibility attribute */
#define DECL_VISIBILITY(NODE) (DECL_CHECK (NODE)->decl.visibility)
diff --git a/gcc/treelang/ChangeLog b/gcc/treelang/ChangeLog
index 773a50a5e46..6eb1dfcf553 100644
--- a/gcc/treelang/ChangeLog
+++ b/gcc/treelang/ChangeLog
@@ -1,3 +1,8 @@
+2004-10-01 Jan Hubicka <jh@suse.cz>
+
+ * treetree.c (treeland_expand_function): Update call of
+ tree_rest_of_compilation.
+
2004-09-17 Jeffrey D. Oldham <oldham@codesourcery.com>
Zack Weinberg <zack@codesourcery.com>
diff --git a/gcc/treelang/treetree.c b/gcc/treelang/treetree.c
index e0a220fe65d..a81b8b9fa36 100644
--- a/gcc/treelang/treetree.c
+++ b/gcc/treelang/treetree.c
@@ -1278,7 +1278,7 @@ static void
treelang_expand_function (tree fndecl)
{
/* We have nothing special to do while expanding functions for treelang. */
- tree_rest_of_compilation (fndecl, 0);
+ tree_rest_of_compilation (fndecl);
}
#include "debug.h" /* for debug_hooks, needed by gt-treelang-treetree.h */
diff --git a/gcc/unwind-dw2.c b/gcc/unwind-dw2.c
index 67b8d1cd066..baa4481c747 100644
--- a/gcc/unwind-dw2.c
+++ b/gcc/unwind-dw2.c
@@ -125,6 +125,11 @@ _Unwind_GetGR (struct _Unwind_Context *context, int index)
int size;
void *ptr;
+#ifdef DWARF_ZERO_REG
+ if (index == DWARF_ZERO_REG)
+ return 0;
+#endif
+
index = DWARF_REG_TO_UNWIND_COLUMN (index);
if (index >= (int) sizeof(dwarf_reg_size_table))
abort ();
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 6e95e502941..72cb81d927e 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -526,7 +526,7 @@ prologue_stack_adjust (void)
static bool
vt_stack_adjustments (void)
{
- edge *stack;
+ edge_iterator *stack;
int sp;
/* Initialize entry block. */
@@ -534,22 +534,22 @@ vt_stack_adjustments (void)
VTI (ENTRY_BLOCK_PTR)->out.stack_adjust = frame_stack_adjust;
/* Allocate stack for back-tracking up CFG. */
- stack = xmalloc ((n_basic_blocks + 1) * sizeof (edge));
+ stack = xmalloc ((n_basic_blocks + 1) * sizeof (edge_iterator));
sp = 0;
/* Push the first edge on to the stack. */
- stack[sp++] = ENTRY_BLOCK_PTR->succ;
+ stack[sp++] = ei_start (ENTRY_BLOCK_PTR->succs);
while (sp)
{
- edge e;
+ edge_iterator ei;
basic_block src;
basic_block dest;
/* Look at the edge on the top of the stack. */
- e = stack[sp - 1];
- src = e->src;
- dest = e->dest;
+ ei = stack[sp - 1];
+ src = ei_edge (ei)->src;
+ dest = ei_edge (ei)->dest;
/* Check if the edge destination has been visited yet. */
if (!VTI (dest)->visited)
@@ -558,10 +558,10 @@ vt_stack_adjustments (void)
VTI (dest)->in.stack_adjust = VTI (src)->out.stack_adjust;
bb_stack_adjust_offset (dest);
- if (dest->succ)
+ if (EDGE_COUNT (dest->succs) > 0)
/* Since the DEST node has been visited for the first
time, check its successors. */
- stack[sp++] = dest->succ;
+ stack[sp++] = ei_start (dest->succs);
}
else
{
@@ -572,9 +572,9 @@ vt_stack_adjustments (void)
return false;
}
- if (e->succ_next)
+ if (! ei_one_before_end_p (ei))
/* Go to the next edge. */
- stack[sp - 1] = e->succ_next;
+ ei_next (&stack[sp - 1]);
else
/* Return to previous level if there are no more edges. */
sp--;
@@ -1723,12 +1723,13 @@ vt_find_locations (void)
if (!TEST_BIT (visited, bb->index))
{
bool changed;
+ edge_iterator ei;
SET_BIT (visited, bb->index);
/* Calculate the IN set as union of predecessor OUT sets. */
dataflow_set_clear (&VTI (bb)->in);
- for (e = bb->pred; e; e = e->pred_next)
+ FOR_EACH_EDGE (e, ei, bb->preds)
{
dataflow_set_union (&VTI (bb)->in, &VTI (e->src)->out);
}
@@ -1736,7 +1737,7 @@ vt_find_locations (void)
changed = compute_bb_dataflow (bb);
if (changed)
{
- for (e = bb->succ; e; e = e->succ_next)
+ FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->dest == EXIT_BLOCK_PTR)
continue;
diff --git a/gcc/version.c b/gcc/version.c
index 6bdb9628b63..e1b3325e61f 100644
--- a/gcc/version.c
+++ b/gcc/version.c
@@ -5,7 +5,7 @@
please modify this string to indicate that, e.g. by putting your
organization's name in parentheses at the end of the string. */
-const char version_string[] = "4.0.0 struct-aliasing-20040927 (experimental)";
+const char version_string[] = "4.0.0 struct-aliasing 20041001 (experimental)";
/* This is the location of the online document giving instructions for
reporting bugs. If you distribute a modified version of GCC,
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 839b559fad6..86222aa942c 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,9 @@
+2004-09-29 Per Bothner <per@bothner.com>
+
+ * directives.c (cpp_handle_deferred_pragma): Save, clear and restore
+ cb.line_change. Otherwise do_pragma will call the line_change
+ call-back with a meaningless line number.
+
2004-09-24 Zack Weinberg <zack@codesourcery.com>
* configure.ac: Move AC_PROG_MAKE_SET, AC_PROG_INSTALL to
diff --git a/libcpp/directives.c b/libcpp/directives.c
index 49f95ca3389..b60b7bca800 100644
--- a/libcpp/directives.c
+++ b/libcpp/directives.c
@@ -1419,10 +1419,13 @@ cpp_handle_deferred_pragma (cpp_reader *pfile, const cpp_string *s)
cpp_token *saved_cur_token = pfile->cur_token;
tokenrun *saved_cur_run = pfile->cur_run;
bool saved_defer_pragmas = CPP_OPTION (pfile, defer_pragmas);
+ void (*saved_line_change) (cpp_reader *, const cpp_token *, int)
+ = pfile->cb.line_change;
pfile->context = XNEW (cpp_context);
pfile->context->macro = 0;
pfile->context->prev = 0;
+ pfile->cb.line_change = NULL;
CPP_OPTION (pfile, defer_pragmas) = false;
run_directive (pfile, T_PRAGMA, s->text, s->len);
@@ -1431,6 +1434,7 @@ cpp_handle_deferred_pragma (cpp_reader *pfile, const cpp_string *s)
pfile->context = saved_context;
pfile->cur_token = saved_cur_token;
pfile->cur_run = saved_cur_run;
+ pfile->cb.line_change = saved_line_change;
CPP_OPTION (pfile, defer_pragmas) = saved_defer_pragmas;
}
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 2794b78266f..983682fcf86 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,71 @@
+2004-09-30 Tom Tromey <tromey@redhat.com>
+
+ * java/text/MessageFormat.java (Field): Constructor now
+ protected.
+
+2004-09-30 Tom Tromey <tromey@redhat.com>
+
+ * javax/crypto/MacSpi.java: Fixed typo.
+
+2004-09-30 Michael Koch <konqueror@gmx.de>
+
+ * java/net/InetAddress.java: Reformatted.
+ (loopback): Initialize with Inet4Address object.
+ (static): Initialize ANY_IF with Inet4Address object.
+ (InetAddress): Removed unused package-private constructor.
+
+2004-09-30 Michael Koch <konqueror@gmx.de>
+
+ * java/beans/Beans.java,
+ java/beans/EventHandler.java,
+ java/beans/EventSetDescriptor.java,
+ java/beans/Introspector.java,
+ java/beans/PropertyEditorManager.java,
+ java/beans/beancontext/BeanContext.java,
+ java/beans/beancontext/BeanContextChild.java,
+ java/beans/beancontext/BeanContextChildSupport.java,
+ java/beans/beancontext/BeanContextMembershipEvent.java:
+ Reordered import statements and removed redundant modifiers.
+
+2004-09-29 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/17715:
+ * Makefile.in: Rebuilt.
+ * Makefile.am (libgcj-@gcc_version@.jar): Include properties
+ files.
+ (all_property_files): New macro.
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (ordinary_java_source_files): Re-sorted.
+ (libgcj.la): Moved to old location near lib-gnu-awt-xlib.la.
+
+2004-09-28 Tom Tromey <tromey@redhat.com>
+
+ * jni.cc (_Jv_JNI_RegisterNatives): Formatting fixlets.
+
+ PR libgcj/17222:
+ * Makefile.am (libgcj.la): Restored.
+ * Makefile.in: Rebuilt.
+
+2004-09-28 Michael Koch <konqueror@gmx.de>
+
+ * java/net/URLConnection.java: Reformatted.
+ * java/net/URLClassLoader.java: Reformatted.
+ (getContent): Reordered return of content.
+ (getContentHandler): Don't check for null explicitely.
+
+2004-09-27 Michael Koch <konqueror@gmx.de>
+
+ * java/io/BufferedInputStream.java
+ (BufferedInputStream): Added Jeroen Frijters to authors.
+ (count): Don't explicitely initialize with default value.
+ (pos): Likewise.
+ (marklimit): Likewise.
+ (read): Changed boolean expression to match GNU classpath' version.
+ (reset): Add proper message to exception.
+ (skip): Check for closed stream.
+ (refill): Likewise.
+
2004-09-26 Per Bothner <per@bothner.com>
* prims.cc (unblock_signal): Annotate signum with __unused__ to
diff --git a/libjava/Makefile.am b/libjava/Makefile.am
index 543b48879f5..1e0e9c07870 100644
--- a/libjava/Makefile.am
+++ b/libjava/Makefile.am
@@ -469,6 +469,9 @@ all_java_source_files = \
all_java_class_files = $(all_java_source_files:.java=.class)
+all_property_files = $(property_files) $(jgss_property_files) \
+ java/util/logging/logging.properties
+
## Build property files into the library.
property_files = \
gnu/regexp/MessagesBundle.properties \
@@ -498,9 +501,16 @@ libgcj-@gcc_version@.jar: $(all_java_source_files)
@: $(call write_entries_to_file,$?,libgcj.sourcelist)
$(JAVAC) $(JCFLAGS) -classpath '' -bootclasspath $(here):$(srcdir) -d $(here) @libgcj.sourcelist
## Note that we explicitly want to include directory information.
- find java gnu javax org -type d -o -type f -name '*.class' | \
- sed -e '/\/\./d' -e '/\/xlib/d' | \
- $(ZIP) cfM0E@ $@
+ (find java gnu javax org -type d -o -type f -name '*.class'; \
+## Ugly code to avoid "echo -C". Must separate each entry by a newline
+## Gross but easy.
+ for file in $(all_property_files); do \
+ echo "x-C" | sed -e 's/^.//'; \
+ echo $(srcdir); \
+ echo $$file; \
+ done) | \
+ sed -e '/\/xlib/d' -e '/\/\.libs/d' -e '/\/\.deps/d' | \
+ $(ZIP) -cfM0E@ $@
# This next rule seems backward, but reflects the fact
# that 1) all classfiles are compiled in one go when the
@@ -516,12 +526,19 @@ else # !ONESTEP
.java.class:
$(JAVAC) $(JCFLAGS) -classpath '' -bootclasspath $(here):$(srcdir) -d $(here) $<
-libgcj-@gcc_version@.jar: $(all_java_class_files)
+libgcj-@gcc_version@.jar: $(all_java_class_files) $(all_property_files)
-@rm -f libgcj-@gcc_version@.jar
## Note that we explicitly want to include directory information.
- find java gnu javax org -type d -o -type f -name '*.class' | \
- sed -e '/\/\./d' -e '/\/xlib/d' | \
- $(ZIP) cfM0E@ $@
+ (find java gnu javax org -type d -o -type f -name '*.class'; \
+## Ugly code to avoid "echo -C". Must separate each entry by a newline
+## Gross but easy.
+ for file in $(all_property_files); do \
+ echo "x-C" | sed -e 's/^.//'; \
+ echo $(srcdir); \
+ echo $$file; \
+ done) | \
+ sed -e '/\/xlib/d' -e '/\/\.libs/d' -e '/\/\.deps/d' | \
+ $(ZIP) -cfM0E@ $@
endif
@@ -562,6 +579,15 @@ $(gtk_awt_peer_sources:.java=.lo): %.lo: %.java
gnu/gcj/runtime/StackTrace.lo: gnu/gcj/runtime/StackTrace.java
$(LTGCJCOMPILE) -fno-optimize-sibling-calls -o $@ -c $<
+## Pass the list of object files to libtool in a temporary file to
+## avoid tripping platform command line length limits.
+libgcj.la: $(libgcj_la_OBJECTS) $(libgcj_la_DEPENDENCIES)
+ @echo Creating list of files to link...
+ @: $(call write_entries_to_file,$(libgcj_la_OBJECTS),libgcj.objectlist)
+ $(libgcj_la_LINK) -objectlist libgcj.objectlist \
+ $(libgcj_la_LIBADD) \
+ -rpath $(toolexeclibdir) $(libgcj_la_LDFLAGS) $(LIBS)
+
lib-gnu-awt-xlib.la: $(lib_gnu_awt_xlib_la_OBJECTS) $(lib_gnu_awt_xlib_la_DEPENDENCIES)
@echo Creating list of files to link...
@: $(call write_entries_to_file,$(lib_gnu_awt_xlib_la_OBJECTS) $(lib_gnu_awt_xlib_la_LIBADD),lib_gnu_awt_xlib.objectlist)
@@ -2457,7 +2483,7 @@ java/util/regex/PatternSyntaxException.java
## List of all .java files to be compiled. Please keep this list
## alphabetical. Please put files from java/lang, java/io, and java/util
-## into core_java_source_files. Please put files from gnu/gcj/convert
+## into core_java_source_files. Please put files from gnu/gcj/convert
## into convert_source_files and files from java/awt into
## awt_java_source_files. If the .java file has a hand-maintained
## header, please list it in special_java_source_files.
@@ -2635,26 +2661,26 @@ gnu/java/net/PlainDatagramSocketImpl.java \
gnu/java/net/PlainSocketImpl.java \
gnu/java/net/URLParseError.java \
gnu/java/net/protocol/core/Connection.java \
-gnu/java/net/protocol/core/Handler.java \
gnu/java/net/protocol/core/CoreInputStream.java \
+gnu/java/net/protocol/core/Handler.java \
gnu/java/net/protocol/file/Connection.java \
gnu/java/net/protocol/file/Handler.java \
+gnu/java/net/protocol/gcjlib/Connection.java \
+gnu/java/net/protocol/gcjlib/Handler.java \
gnu/java/net/protocol/http/Connection.java \
gnu/java/net/protocol/http/Handler.java \
gnu/java/net/protocol/jar/Connection.java \
gnu/java/net/protocol/jar/Handler.java \
-gnu/java/net/protocol/gcjlib/Connection.java \
-gnu/java/net/protocol/gcjlib/Handler.java \
+gnu/java/nio/ChannelInputStream.java \
+gnu/java/nio/ChannelOutputStream.java \
gnu/java/nio/DatagramChannelImpl.java \
gnu/java/nio/DatagramChannelSelectionKey.java \
gnu/java/nio/FileLockImpl.java \
+gnu/java/nio/InputStreamChannel.java \
gnu/java/nio/NIOConstants.java \
gnu/java/nio/NIODatagramSocket.java \
gnu/java/nio/NIOServerSocket.java \
gnu/java/nio/NIOSocket.java \
-gnu/java/nio/ChannelInputStream.java \
-gnu/java/nio/ChannelOutputStream.java \
-gnu/java/nio/InputStreamChannel.java \
gnu/java/nio/OutputStreamChannel.java \
gnu/java/nio/PipeImpl.java \
gnu/java/nio/SelectionKeyImpl.java \
@@ -2676,47 +2702,22 @@ gnu/java/nio/charset/UTF_16Decoder.java \
gnu/java/nio/charset/UTF_16Encoder.java \
gnu/java/nio/charset/UTF_16LE.java \
gnu/java/nio/charset/UTF_8.java \
-gnu/regexp/CharIndexed.java \
-gnu/regexp/CharIndexedCharArray.java \
-gnu/regexp/CharIndexedInputStream.java \
-gnu/regexp/CharIndexedString.java \
-gnu/regexp/CharIndexedStringBuffer.java \
-gnu/regexp/RE.java \
-gnu/regexp/REException.java \
-gnu/regexp/REFilterInputStream.java \
-gnu/regexp/REMatch.java \
-gnu/regexp/REMatchEnumeration.java \
-gnu/regexp/RESyntax.java \
-gnu/regexp/REToken.java \
-gnu/regexp/RETokenAny.java \
-gnu/regexp/RETokenBackRef.java \
-gnu/regexp/RETokenChar.java \
-gnu/regexp/RETokenEnd.java \
-gnu/regexp/RETokenEndSub.java \
-gnu/regexp/RETokenLookAhead.java \
-gnu/regexp/RETokenOneOf.java \
-gnu/regexp/RETokenPOSIX.java \
-gnu/regexp/RETokenRange.java \
-gnu/regexp/RETokenRepeated.java \
-gnu/regexp/RETokenStart.java \
-gnu/regexp/RETokenWordBoundary.java \
-gnu/regexp/UncheckedRE.java \
gnu/java/security/Engine.java \
gnu/java/security/OID.java \
+gnu/java/security/action/GetPropertyAction.java \
+gnu/java/security/action/SetAccessibleAction.java \
gnu/java/security/der/BitString.java \
gnu/java/security/der/DER.java \
gnu/java/security/der/DEREncodingException.java \
gnu/java/security/der/DERReader.java \
gnu/java/security/der/DERValue.java \
gnu/java/security/der/DERWriter.java \
-gnu/java/security/action/GetPropertyAction.java \
-gnu/java/security/action/SetAccessibleAction.java \
-gnu/java/security/provider/DefaultPolicy.java \
gnu/java/security/provider/DSAKeyFactory.java \
gnu/java/security/provider/DSAKeyPairGenerator.java \
gnu/java/security/provider/DSAParameterGenerator.java \
gnu/java/security/provider/DSAParameters.java \
gnu/java/security/provider/DSASignature.java \
+gnu/java/security/provider/DefaultPolicy.java \
gnu/java/security/provider/Gnu.java \
gnu/java/security/provider/GnuDSAPrivateKey.java \
gnu/java/security/provider/GnuDSAPublicKey.java \
@@ -2726,9 +2727,9 @@ gnu/java/security/provider/SHA1PRNG.java \
gnu/java/security/provider/X509CertificateFactory.java \
gnu/java/security/util/Prime.java \
gnu/java/security/x509/X500DistinguishedName.java \
-gnu/java/security/x509/X509Certificate.java \
-gnu/java/security/x509/X509CRLEntry.java \
gnu/java/security/x509/X509CRL.java \
+gnu/java/security/x509/X509CRLEntry.java \
+gnu/java/security/x509/X509Certificate.java \
gnu/java/text/AttributedFormatBuffer.java \
gnu/java/text/BaseBreakIterator.java \
gnu/java/text/CharacterBreakIterator.java \
@@ -2740,11 +2741,36 @@ gnu/java/text/StringFormatBuffer.java \
gnu/java/text/WordBreakIterator.java \
gnu/java/util/DoubleEnumeration.java \
gnu/java/util/EmptyEnumeration.java \
+gnu/java/util/prefs/FileBasedFactory.java \
gnu/java/util/prefs/MemoryBasedFactory.java \
-gnu/java/util/prefs/NodeReader.java \
gnu/java/util/prefs/MemoryBasedPreferences.java \
-gnu/java/util/prefs/FileBasedFactory.java \
+gnu/java/util/prefs/NodeReader.java \
gnu/java/util/prefs/NodeWriter.java \
+gnu/regexp/CharIndexed.java \
+gnu/regexp/CharIndexedCharArray.java \
+gnu/regexp/CharIndexedInputStream.java \
+gnu/regexp/CharIndexedString.java \
+gnu/regexp/CharIndexedStringBuffer.java \
+gnu/regexp/RE.java \
+gnu/regexp/REException.java \
+gnu/regexp/REFilterInputStream.java \
+gnu/regexp/REMatch.java \
+gnu/regexp/REMatchEnumeration.java \
+gnu/regexp/RESyntax.java \
+gnu/regexp/REToken.java \
+gnu/regexp/RETokenAny.java \
+gnu/regexp/RETokenBackRef.java \
+gnu/regexp/RETokenChar.java \
+gnu/regexp/RETokenEnd.java \
+gnu/regexp/RETokenEndSub.java \
+gnu/regexp/RETokenLookAhead.java \
+gnu/regexp/RETokenOneOf.java \
+gnu/regexp/RETokenPOSIX.java \
+gnu/regexp/RETokenRange.java \
+gnu/regexp/RETokenRepeated.java \
+gnu/regexp/RETokenStart.java \
+gnu/regexp/RETokenWordBoundary.java \
+gnu/regexp/UncheckedRE.java \
java/lang/ref/PhantomReference.java \
java/lang/ref/Reference.java \
java/lang/ref/ReferenceQueue.java \
@@ -2775,9 +2801,9 @@ java/net/DatagramSocketImpl.java \
java/net/DatagramSocketImplFactory.java \
java/net/FileNameMap.java \
java/net/HttpURLConnection.java \
-java/net/InetAddress.java \
java/net/Inet4Address.java \
java/net/Inet6Address.java \
+java/net/InetAddress.java \
java/net/InetSocketAddress.java \
java/net/JarURLConnection.java \
java/net/MalformedURLException.java \
@@ -2873,13 +2899,13 @@ java/nio/channels/SocketChannel.java \
java/nio/channels/UnresolvedAddressException.java \
java/nio/channels/UnsupportedAddressTypeException.java \
java/nio/channels/WritableByteChannel.java \
-java/nio/channels/spi/AbstractSelectableChannel.java \
java/nio/channels/spi/AbstractInterruptibleChannel.java \
+java/nio/channels/spi/AbstractSelectableChannel.java \
java/nio/channels/spi/AbstractSelectionKey.java \
java/nio/channels/spi/AbstractSelector.java \
java/nio/channels/spi/SelectorProvider.java \
-java/nio/charset/Charset.java \
java/nio/charset/CharacterCodingException.java \
+java/nio/charset/Charset.java \
java/nio/charset/CharsetDecoder.java \
java/nio/charset/CharsetEncoder.java \
java/nio/charset/CoderMalfunctionError.java \
@@ -2894,20 +2920,20 @@ java/security/AccessControlContext.java \
java/security/AccessControlException.java \
java/security/AccessController.java \
java/security/AlgorithmParameterGenerator.java \
-java/security/AlgorithmParameters.java \
java/security/AlgorithmParameterGeneratorSpi.java \
+java/security/AlgorithmParameters.java \
java/security/AlgorithmParametersSpi.java \
java/security/AllPermission.java \
java/security/BasicPermission.java \
java/security/Certificate.java \
java/security/CodeSource.java \
java/security/DigestException.java \
-java/security/DigestOutputStream.java \
-java/security/DummyKeyPairGenerator.java \
-java/security/DummySignature.java \
java/security/DigestInputStream.java \
+java/security/DigestOutputStream.java \
java/security/DomainCombiner.java \
+java/security/DummyKeyPairGenerator.java \
java/security/DummyMessageDigest.java \
+java/security/DummySignature.java \
java/security/GeneralSecurityException.java \
java/security/Guard.java \
java/security/GuardedObject.java \
@@ -2917,64 +2943,56 @@ java/security/InvalidAlgorithmParameterException.java \
java/security/InvalidKeyException.java \
java/security/InvalidParameterException.java \
java/security/Key.java \
-java/security/KeyFactorySpi.java \
-java/security/KeyPairGenerator.java \
-java/security/KeyStoreException.java \
java/security/KeyException.java \
-java/security/KeyManagementException.java \
-java/security/KeyPairGeneratorSpi.java \
-java/security/KeyStoreSpi.java \
java/security/KeyFactory.java \
+java/security/KeyFactorySpi.java \
+java/security/KeyManagementException.java \
java/security/KeyPair.java \
+java/security/KeyPairGenerator.java \
+java/security/KeyPairGeneratorSpi.java \
java/security/KeyStore.java \
+java/security/KeyStoreException.java \
+java/security/KeyStoreSpi.java \
java/security/MessageDigest.java \
java/security/MessageDigestSpi.java \
java/security/NoSuchAlgorithmException.java \
java/security/NoSuchProviderException.java \
java/security/Permission.java \
-java/security/Principal.java \
-java/security/PrivilegedExceptionAction.java \
-java/security/PublicKey.java \
java/security/PermissionCollection.java \
-java/security/PrivateKey.java \
-java/security/ProtectionDomain.java \
java/security/Permissions.java \
-java/security/PrivilegedAction.java \
-java/security/Provider.java \
java/security/Policy.java \
+java/security/Principal.java \
+java/security/PrivateKey.java \
+java/security/PrivilegedAction.java \
java/security/PrivilegedActionException.java \
+java/security/PrivilegedExceptionAction.java \
+java/security/ProtectionDomain.java \
+java/security/Provider.java \
java/security/ProviderException.java \
+java/security/PublicKey.java \
java/security/SecureClassLoader.java \
-java/security/SecureRandomSpi.java \
-java/security/SecurityPermission.java \
-java/security/SignatureException.java \
-java/security/SignedObject.java \
java/security/SecureRandom.java \
+java/security/SecureRandomSpi.java \
java/security/Security.java \
+java/security/SecurityPermission.java \
java/security/Signature.java \
+java/security/SignatureException.java \
java/security/SignatureSpi.java \
+java/security/SignedObject.java \
java/security/Signer.java \
java/security/UnrecoverableKeyException.java \
java/security/UnresolvedPermission.java \
java/security/acl/Acl.java \
-java/security/acl/AclNotFoundException.java \
-java/security/acl/LastOwnerException.java \
-java/security/acl/Owner.java \
java/security/acl/AclEntry.java \
+java/security/acl/AclNotFoundException.java \
java/security/acl/Group.java \
+java/security/acl/LastOwnerException.java \
java/security/acl/NotOwnerException.java \
+java/security/acl/Owner.java \
java/security/acl/Permission.java \
java/security/cert/CRL.java \
java/security/cert/CRLException.java \
java/security/cert/CRLSelector.java \
-java/security/cert/Certificate.java \
-java/security/cert/CertificateEncodingException.java \
-java/security/cert/CertificateException.java \
-java/security/cert/CertificateExpiredException.java \
-java/security/cert/CertificateFactory.java \
-java/security/cert/CertificateFactorySpi.java \
-java/security/cert/CertificateNotYetValidException.java \
-java/security/cert/CertificateParsingException.java \
java/security/cert/CertPath.java \
java/security/cert/CertPathBuilder.java \
java/security/cert/CertPathBuilderException.java \
@@ -2990,6 +3008,14 @@ java/security/cert/CertStore.java \
java/security/cert/CertStoreException.java \
java/security/cert/CertStoreParameters.java \
java/security/cert/CertStoreSpi.java \
+java/security/cert/Certificate.java \
+java/security/cert/CertificateEncodingException.java \
+java/security/cert/CertificateException.java \
+java/security/cert/CertificateExpiredException.java \
+java/security/cert/CertificateFactory.java \
+java/security/cert/CertificateFactorySpi.java \
+java/security/cert/CertificateNotYetValidException.java \
+java/security/cert/CertificateParsingException.java \
java/security/cert/CollectionCertStoreParameters.java \
java/security/cert/LDAPCertStoreParameters.java \
java/security/cert/PKIXBuilderParameters.java \
@@ -3003,8 +3029,8 @@ java/security/cert/TrustAnchor.java \
java/security/cert/X509CRL.java \
java/security/cert/X509CRLEntry.java \
java/security/cert/X509CRLSelector.java \
-java/security/cert/X509Certificate.java \
java/security/cert/X509CertSelector.java \
+java/security/cert/X509Certificate.java \
java/security/cert/X509Extension.java \
java/security/interfaces/DSAKey.java \
java/security/interfaces/DSAKeyPairGenerator.java \
@@ -3050,13 +3076,13 @@ java/sql/PreparedStatement.java \
java/sql/Ref.java \
java/sql/ResultSet.java \
java/sql/ResultSetMetaData.java \
-java/sql/Savepoint.java \
java/sql/SQLData.java \
java/sql/SQLException.java \
java/sql/SQLInput.java \
java/sql/SQLOutput.java \
java/sql/SQLPermission.java \
java/sql/SQLWarning.java \
+java/sql/Savepoint.java \
java/sql/Statement.java \
java/sql/Struct.java \
java/sql/Time.java \
diff --git a/libjava/Makefile.in b/libjava/Makefile.in
index bd831fea3e5..678acdcb493 100644
--- a/libjava/Makefile.in
+++ b/libjava/Makefile.in
@@ -755,24 +755,25 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc exception.cc resolve.cc \
gnu/java/net/PlainSocketImpl.java \
gnu/java/net/URLParseError.java \
gnu/java/net/protocol/core/Connection.java \
- gnu/java/net/protocol/core/Handler.java \
gnu/java/net/protocol/core/CoreInputStream.java \
+ gnu/java/net/protocol/core/Handler.java \
gnu/java/net/protocol/file/Connection.java \
gnu/java/net/protocol/file/Handler.java \
+ gnu/java/net/protocol/gcjlib/Connection.java \
+ gnu/java/net/protocol/gcjlib/Handler.java \
gnu/java/net/protocol/http/Connection.java \
gnu/java/net/protocol/http/Handler.java \
gnu/java/net/protocol/jar/Connection.java \
gnu/java/net/protocol/jar/Handler.java \
- gnu/java/net/protocol/gcjlib/Connection.java \
- gnu/java/net/protocol/gcjlib/Handler.java \
+ gnu/java/nio/ChannelInputStream.java \
+ gnu/java/nio/ChannelOutputStream.java \
gnu/java/nio/DatagramChannelImpl.java \
gnu/java/nio/DatagramChannelSelectionKey.java \
- gnu/java/nio/FileLockImpl.java gnu/java/nio/NIOConstants.java \
+ gnu/java/nio/FileLockImpl.java \
+ gnu/java/nio/InputStreamChannel.java \
+ gnu/java/nio/NIOConstants.java \
gnu/java/nio/NIODatagramSocket.java \
gnu/java/nio/NIOServerSocket.java gnu/java/nio/NIOSocket.java \
- gnu/java/nio/ChannelInputStream.java \
- gnu/java/nio/ChannelOutputStream.java \
- gnu/java/nio/InputStreamChannel.java \
gnu/java/nio/OutputStreamChannel.java \
gnu/java/nio/PipeImpl.java gnu/java/nio/SelectionKeyImpl.java \
gnu/java/nio/SelectorImpl.java \
@@ -791,37 +792,22 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc exception.cc resolve.cc \
gnu/java/nio/charset/UTF_16Decoder.java \
gnu/java/nio/charset/UTF_16Encoder.java \
gnu/java/nio/charset/UTF_16LE.java \
- gnu/java/nio/charset/UTF_8.java gnu/regexp/CharIndexed.java \
- gnu/regexp/CharIndexedCharArray.java \
- gnu/regexp/CharIndexedInputStream.java \
- gnu/regexp/CharIndexedString.java \
- gnu/regexp/CharIndexedStringBuffer.java gnu/regexp/RE.java \
- gnu/regexp/REException.java \
- gnu/regexp/REFilterInputStream.java gnu/regexp/REMatch.java \
- gnu/regexp/REMatchEnumeration.java gnu/regexp/RESyntax.java \
- gnu/regexp/REToken.java gnu/regexp/RETokenAny.java \
- gnu/regexp/RETokenBackRef.java gnu/regexp/RETokenChar.java \
- gnu/regexp/RETokenEnd.java gnu/regexp/RETokenEndSub.java \
- gnu/regexp/RETokenLookAhead.java gnu/regexp/RETokenOneOf.java \
- gnu/regexp/RETokenPOSIX.java gnu/regexp/RETokenRange.java \
- gnu/regexp/RETokenRepeated.java gnu/regexp/RETokenStart.java \
- gnu/regexp/RETokenWordBoundary.java \
- gnu/regexp/UncheckedRE.java gnu/java/security/Engine.java \
+ gnu/java/nio/charset/UTF_8.java gnu/java/security/Engine.java \
gnu/java/security/OID.java \
+ gnu/java/security/action/GetPropertyAction.java \
+ gnu/java/security/action/SetAccessibleAction.java \
gnu/java/security/der/BitString.java \
gnu/java/security/der/DER.java \
gnu/java/security/der/DEREncodingException.java \
gnu/java/security/der/DERReader.java \
gnu/java/security/der/DERValue.java \
gnu/java/security/der/DERWriter.java \
- gnu/java/security/action/GetPropertyAction.java \
- gnu/java/security/action/SetAccessibleAction.java \
- gnu/java/security/provider/DefaultPolicy.java \
gnu/java/security/provider/DSAKeyFactory.java \
gnu/java/security/provider/DSAKeyPairGenerator.java \
gnu/java/security/provider/DSAParameterGenerator.java \
gnu/java/security/provider/DSAParameters.java \
gnu/java/security/provider/DSASignature.java \
+ gnu/java/security/provider/DefaultPolicy.java \
gnu/java/security/provider/Gnu.java \
gnu/java/security/provider/GnuDSAPrivateKey.java \
gnu/java/security/provider/GnuDSAPublicKey.java \
@@ -831,9 +817,9 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc exception.cc resolve.cc \
gnu/java/security/provider/X509CertificateFactory.java \
gnu/java/security/util/Prime.java \
gnu/java/security/x509/X500DistinguishedName.java \
- gnu/java/security/x509/X509Certificate.java \
- gnu/java/security/x509/X509CRLEntry.java \
gnu/java/security/x509/X509CRL.java \
+ gnu/java/security/x509/X509CRLEntry.java \
+ gnu/java/security/x509/X509Certificate.java \
gnu/java/text/AttributedFormatBuffer.java \
gnu/java/text/BaseBreakIterator.java \
gnu/java/text/CharacterBreakIterator.java \
@@ -845,11 +831,27 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc exception.cc resolve.cc \
gnu/java/text/WordBreakIterator.java \
gnu/java/util/DoubleEnumeration.java \
gnu/java/util/EmptyEnumeration.java \
+ gnu/java/util/prefs/FileBasedFactory.java \
gnu/java/util/prefs/MemoryBasedFactory.java \
- gnu/java/util/prefs/NodeReader.java \
gnu/java/util/prefs/MemoryBasedPreferences.java \
- gnu/java/util/prefs/FileBasedFactory.java \
+ gnu/java/util/prefs/NodeReader.java \
gnu/java/util/prefs/NodeWriter.java \
+ gnu/regexp/CharIndexed.java \
+ gnu/regexp/CharIndexedCharArray.java \
+ gnu/regexp/CharIndexedInputStream.java \
+ gnu/regexp/CharIndexedString.java \
+ gnu/regexp/CharIndexedStringBuffer.java gnu/regexp/RE.java \
+ gnu/regexp/REException.java \
+ gnu/regexp/REFilterInputStream.java gnu/regexp/REMatch.java \
+ gnu/regexp/REMatchEnumeration.java gnu/regexp/RESyntax.java \
+ gnu/regexp/REToken.java gnu/regexp/RETokenAny.java \
+ gnu/regexp/RETokenBackRef.java gnu/regexp/RETokenChar.java \
+ gnu/regexp/RETokenEnd.java gnu/regexp/RETokenEndSub.java \
+ gnu/regexp/RETokenLookAhead.java gnu/regexp/RETokenOneOf.java \
+ gnu/regexp/RETokenPOSIX.java gnu/regexp/RETokenRange.java \
+ gnu/regexp/RETokenRepeated.java gnu/regexp/RETokenStart.java \
+ gnu/regexp/RETokenWordBoundary.java \
+ gnu/regexp/UncheckedRE.java \
java/lang/ref/PhantomReference.java \
java/lang/ref/Reference.java java/lang/ref/ReferenceQueue.java \
java/lang/ref/SoftReference.java \
@@ -872,8 +874,8 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc exception.cc resolve.cc \
java/net/DatagramSocketImpl.java \
java/net/DatagramSocketImplFactory.java \
java/net/FileNameMap.java java/net/HttpURLConnection.java \
- java/net/InetAddress.java java/net/Inet4Address.java \
- java/net/Inet6Address.java java/net/InetSocketAddress.java \
+ java/net/Inet4Address.java java/net/Inet6Address.java \
+ java/net/InetAddress.java java/net/InetSocketAddress.java \
java/net/JarURLConnection.java \
java/net/MalformedURLException.java \
java/net/MulticastSocket.java java/net/NetPermission.java \
@@ -947,13 +949,13 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc exception.cc resolve.cc \
java/nio/channels/UnresolvedAddressException.java \
java/nio/channels/UnsupportedAddressTypeException.java \
java/nio/channels/WritableByteChannel.java \
- java/nio/channels/spi/AbstractSelectableChannel.java \
java/nio/channels/spi/AbstractInterruptibleChannel.java \
+ java/nio/channels/spi/AbstractSelectableChannel.java \
java/nio/channels/spi/AbstractSelectionKey.java \
java/nio/channels/spi/AbstractSelector.java \
java/nio/channels/spi/SelectorProvider.java \
- java/nio/charset/Charset.java \
java/nio/charset/CharacterCodingException.java \
+ java/nio/charset/Charset.java \
java/nio/charset/CharsetDecoder.java \
java/nio/charset/CharsetEncoder.java \
java/nio/charset/CoderMalfunctionError.java \
@@ -968,75 +970,67 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc exception.cc resolve.cc \
java/security/AccessControlException.java \
java/security/AccessController.java \
java/security/AlgorithmParameterGenerator.java \
- java/security/AlgorithmParameters.java \
java/security/AlgorithmParameterGeneratorSpi.java \
+ java/security/AlgorithmParameters.java \
java/security/AlgorithmParametersSpi.java \
java/security/AllPermission.java \
java/security/BasicPermission.java \
java/security/Certificate.java java/security/CodeSource.java \
java/security/DigestException.java \
- java/security/DigestOutputStream.java \
- java/security/DummyKeyPairGenerator.java \
- java/security/DummySignature.java \
java/security/DigestInputStream.java \
+ java/security/DigestOutputStream.java \
java/security/DomainCombiner.java \
+ java/security/DummyKeyPairGenerator.java \
java/security/DummyMessageDigest.java \
+ java/security/DummySignature.java \
java/security/GeneralSecurityException.java \
java/security/Guard.java java/security/GuardedObject.java \
java/security/Identity.java java/security/IdentityScope.java \
java/security/InvalidAlgorithmParameterException.java \
java/security/InvalidKeyException.java \
java/security/InvalidParameterException.java \
- java/security/Key.java java/security/KeyFactorySpi.java \
- java/security/KeyPairGenerator.java \
- java/security/KeyStoreException.java \
- java/security/KeyException.java \
+ java/security/Key.java java/security/KeyException.java \
+ java/security/KeyFactory.java java/security/KeyFactorySpi.java \
java/security/KeyManagementException.java \
+ java/security/KeyPair.java java/security/KeyPairGenerator.java \
java/security/KeyPairGeneratorSpi.java \
- java/security/KeyStoreSpi.java java/security/KeyFactory.java \
- java/security/KeyPair.java java/security/KeyStore.java \
+ java/security/KeyStore.java \
+ java/security/KeyStoreException.java \
+ java/security/KeyStoreSpi.java \
java/security/MessageDigest.java \
java/security/MessageDigestSpi.java \
java/security/NoSuchAlgorithmException.java \
java/security/NoSuchProviderException.java \
- java/security/Permission.java java/security/Principal.java \
- java/security/PrivilegedExceptionAction.java \
- java/security/PublicKey.java \
+ java/security/Permission.java \
java/security/PermissionCollection.java \
- java/security/PrivateKey.java \
- java/security/ProtectionDomain.java \
- java/security/Permissions.java \
+ java/security/Permissions.java java/security/Policy.java \
+ java/security/Principal.java java/security/PrivateKey.java \
java/security/PrivilegedAction.java \
- java/security/Provider.java java/security/Policy.java \
java/security/PrivilegedActionException.java \
+ java/security/PrivilegedExceptionAction.java \
+ java/security/ProtectionDomain.java \
+ java/security/Provider.java \
java/security/ProviderException.java \
+ java/security/PublicKey.java \
java/security/SecureClassLoader.java \
- java/security/SecureRandomSpi.java \
+ java/security/SecureRandom.java \
+ java/security/SecureRandomSpi.java java/security/Security.java \
java/security/SecurityPermission.java \
+ java/security/Signature.java \
java/security/SignatureException.java \
- java/security/SignedObject.java \
- java/security/SecureRandom.java java/security/Security.java \
- java/security/Signature.java java/security/SignatureSpi.java \
- java/security/Signer.java \
+ java/security/SignatureSpi.java \
+ java/security/SignedObject.java java/security/Signer.java \
java/security/UnrecoverableKeyException.java \
java/security/UnresolvedPermission.java \
- java/security/acl/Acl.java \
+ java/security/acl/Acl.java java/security/acl/AclEntry.java \
java/security/acl/AclNotFoundException.java \
- java/security/acl/LastOwnerException.java \
- java/security/acl/Owner.java java/security/acl/AclEntry.java \
java/security/acl/Group.java \
+ java/security/acl/LastOwnerException.java \
java/security/acl/NotOwnerException.java \
- java/security/acl/Permission.java java/security/cert/CRL.java \
+ java/security/acl/Owner.java java/security/acl/Permission.java \
+ java/security/cert/CRL.java \
java/security/cert/CRLException.java \
java/security/cert/CRLSelector.java \
- java/security/cert/Certificate.java \
- java/security/cert/CertificateEncodingException.java \
- java/security/cert/CertificateException.java \
- java/security/cert/CertificateExpiredException.java \
- java/security/cert/CertificateFactory.java \
- java/security/cert/CertificateFactorySpi.java \
- java/security/cert/CertificateNotYetValidException.java \
- java/security/cert/CertificateParsingException.java \
java/security/cert/CertPath.java \
java/security/cert/CertPathBuilder.java \
java/security/cert/CertPathBuilderException.java \
@@ -1052,6 +1046,14 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc exception.cc resolve.cc \
java/security/cert/CertStoreException.java \
java/security/cert/CertStoreParameters.java \
java/security/cert/CertStoreSpi.java \
+ java/security/cert/Certificate.java \
+ java/security/cert/CertificateEncodingException.java \
+ java/security/cert/CertificateException.java \
+ java/security/cert/CertificateExpiredException.java \
+ java/security/cert/CertificateFactory.java \
+ java/security/cert/CertificateFactorySpi.java \
+ java/security/cert/CertificateNotYetValidException.java \
+ java/security/cert/CertificateParsingException.java \
java/security/cert/CollectionCertStoreParameters.java \
java/security/cert/LDAPCertStoreParameters.java \
java/security/cert/PKIXBuilderParameters.java \
@@ -1065,8 +1067,8 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc exception.cc resolve.cc \
java/security/cert/X509CRL.java \
java/security/cert/X509CRLEntry.java \
java/security/cert/X509CRLSelector.java \
- java/security/cert/X509Certificate.java \
java/security/cert/X509CertSelector.java \
+ java/security/cert/X509Certificate.java \
java/security/cert/X509Extension.java \
java/security/interfaces/DSAKey.java \
java/security/interfaces/DSAKeyPairGenerator.java \
@@ -1104,10 +1106,10 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc exception.cc resolve.cc \
java/sql/ParameterMetaData.java \
java/sql/PreparedStatement.java java/sql/Ref.java \
java/sql/ResultSet.java java/sql/ResultSetMetaData.java \
- java/sql/Savepoint.java java/sql/SQLData.java \
- java/sql/SQLException.java java/sql/SQLInput.java \
- java/sql/SQLOutput.java java/sql/SQLPermission.java \
- java/sql/SQLWarning.java java/sql/Statement.java \
+ java/sql/SQLData.java java/sql/SQLException.java \
+ java/sql/SQLInput.java java/sql/SQLOutput.java \
+ java/sql/SQLPermission.java java/sql/SQLWarning.java \
+ java/sql/Savepoint.java java/sql/Statement.java \
java/sql/Struct.java java/sql/Time.java \
java/sql/Timestamp.java java/sql/Types.java \
java/text/Annotation.java \
@@ -3655,24 +3657,24 @@ am__objects_14 = $(am__objects_9) gnu/classpath/ServiceFactory.lo \
gnu/java/net/PlainDatagramSocketImpl.lo \
gnu/java/net/PlainSocketImpl.lo gnu/java/net/URLParseError.lo \
gnu/java/net/protocol/core/Connection.lo \
- gnu/java/net/protocol/core/Handler.lo \
gnu/java/net/protocol/core/CoreInputStream.lo \
+ gnu/java/net/protocol/core/Handler.lo \
gnu/java/net/protocol/file/Connection.lo \
gnu/java/net/protocol/file/Handler.lo \
+ gnu/java/net/protocol/gcjlib/Connection.lo \
+ gnu/java/net/protocol/gcjlib/Handler.lo \
gnu/java/net/protocol/http/Connection.lo \
gnu/java/net/protocol/http/Handler.lo \
gnu/java/net/protocol/jar/Connection.lo \
gnu/java/net/protocol/jar/Handler.lo \
- gnu/java/net/protocol/gcjlib/Connection.lo \
- gnu/java/net/protocol/gcjlib/Handler.lo \
- gnu/java/nio/DatagramChannelImpl.lo \
- gnu/java/nio/DatagramChannelSelectionKey.lo \
- gnu/java/nio/FileLockImpl.lo gnu/java/nio/NIOConstants.lo \
- gnu/java/nio/NIODatagramSocket.lo \
- gnu/java/nio/NIOServerSocket.lo gnu/java/nio/NIOSocket.lo \
gnu/java/nio/ChannelInputStream.lo \
gnu/java/nio/ChannelOutputStream.lo \
+ gnu/java/nio/DatagramChannelImpl.lo \
+ gnu/java/nio/DatagramChannelSelectionKey.lo \
+ gnu/java/nio/FileLockImpl.lo \
gnu/java/nio/InputStreamChannel.lo \
+ gnu/java/nio/NIOConstants.lo gnu/java/nio/NIODatagramSocket.lo \
+ gnu/java/nio/NIOServerSocket.lo gnu/java/nio/NIOSocket.lo \
gnu/java/nio/OutputStreamChannel.lo gnu/java/nio/PipeImpl.lo \
gnu/java/nio/SelectionKeyImpl.lo gnu/java/nio/SelectorImpl.lo \
gnu/java/nio/SelectorProviderImpl.lo \
@@ -3690,34 +3692,21 @@ am__objects_14 = $(am__objects_9) gnu/classpath/ServiceFactory.lo \
gnu/java/nio/charset/UTF_16Decoder.lo \
gnu/java/nio/charset/UTF_16Encoder.lo \
gnu/java/nio/charset/UTF_16LE.lo gnu/java/nio/charset/UTF_8.lo \
- gnu/regexp/CharIndexed.lo gnu/regexp/CharIndexedCharArray.lo \
- gnu/regexp/CharIndexedInputStream.lo \
- gnu/regexp/CharIndexedString.lo \
- gnu/regexp/CharIndexedStringBuffer.lo gnu/regexp/RE.lo \
- gnu/regexp/REException.lo gnu/regexp/REFilterInputStream.lo \
- gnu/regexp/REMatch.lo gnu/regexp/REMatchEnumeration.lo \
- gnu/regexp/RESyntax.lo gnu/regexp/REToken.lo \
- gnu/regexp/RETokenAny.lo gnu/regexp/RETokenBackRef.lo \
- gnu/regexp/RETokenChar.lo gnu/regexp/RETokenEnd.lo \
- gnu/regexp/RETokenEndSub.lo gnu/regexp/RETokenLookAhead.lo \
- gnu/regexp/RETokenOneOf.lo gnu/regexp/RETokenPOSIX.lo \
- gnu/regexp/RETokenRange.lo gnu/regexp/RETokenRepeated.lo \
- gnu/regexp/RETokenStart.lo gnu/regexp/RETokenWordBoundary.lo \
- gnu/regexp/UncheckedRE.lo gnu/java/security/Engine.lo \
- gnu/java/security/OID.lo gnu/java/security/der/BitString.lo \
+ gnu/java/security/Engine.lo gnu/java/security/OID.lo \
+ gnu/java/security/action/GetPropertyAction.lo \
+ gnu/java/security/action/SetAccessibleAction.lo \
+ gnu/java/security/der/BitString.lo \
gnu/java/security/der/DER.lo \
gnu/java/security/der/DEREncodingException.lo \
gnu/java/security/der/DERReader.lo \
gnu/java/security/der/DERValue.lo \
gnu/java/security/der/DERWriter.lo \
- gnu/java/security/action/GetPropertyAction.lo \
- gnu/java/security/action/SetAccessibleAction.lo \
- gnu/java/security/provider/DefaultPolicy.lo \
gnu/java/security/provider/DSAKeyFactory.lo \
gnu/java/security/provider/DSAKeyPairGenerator.lo \
gnu/java/security/provider/DSAParameterGenerator.lo \
gnu/java/security/provider/DSAParameters.lo \
gnu/java/security/provider/DSASignature.lo \
+ gnu/java/security/provider/DefaultPolicy.lo \
gnu/java/security/provider/Gnu.lo \
gnu/java/security/provider/GnuDSAPrivateKey.lo \
gnu/java/security/provider/GnuDSAPublicKey.lo \
@@ -3727,9 +3716,9 @@ am__objects_14 = $(am__objects_9) gnu/classpath/ServiceFactory.lo \
gnu/java/security/provider/X509CertificateFactory.lo \
gnu/java/security/util/Prime.lo \
gnu/java/security/x509/X500DistinguishedName.lo \
- gnu/java/security/x509/X509Certificate.lo \
- gnu/java/security/x509/X509CRLEntry.lo \
gnu/java/security/x509/X509CRL.lo \
+ gnu/java/security/x509/X509CRLEntry.lo \
+ gnu/java/security/x509/X509Certificate.lo \
gnu/java/text/AttributedFormatBuffer.lo \
gnu/java/text/BaseBreakIterator.lo \
gnu/java/text/CharacterBreakIterator.lo \
@@ -3741,14 +3730,27 @@ am__objects_14 = $(am__objects_9) gnu/classpath/ServiceFactory.lo \
gnu/java/text/WordBreakIterator.lo \
gnu/java/util/DoubleEnumeration.lo \
gnu/java/util/EmptyEnumeration.lo \
+ gnu/java/util/prefs/FileBasedFactory.lo \
gnu/java/util/prefs/MemoryBasedFactory.lo \
- gnu/java/util/prefs/NodeReader.lo \
gnu/java/util/prefs/MemoryBasedPreferences.lo \
- gnu/java/util/prefs/FileBasedFactory.lo \
- gnu/java/util/prefs/NodeWriter.lo \
- java/lang/ref/PhantomReference.lo java/lang/ref/Reference.lo \
- java/lang/ref/ReferenceQueue.lo java/lang/ref/SoftReference.lo \
- java/lang/ref/WeakReference.lo \
+ gnu/java/util/prefs/NodeReader.lo \
+ gnu/java/util/prefs/NodeWriter.lo gnu/regexp/CharIndexed.lo \
+ gnu/regexp/CharIndexedCharArray.lo \
+ gnu/regexp/CharIndexedInputStream.lo \
+ gnu/regexp/CharIndexedString.lo \
+ gnu/regexp/CharIndexedStringBuffer.lo gnu/regexp/RE.lo \
+ gnu/regexp/REException.lo gnu/regexp/REFilterInputStream.lo \
+ gnu/regexp/REMatch.lo gnu/regexp/REMatchEnumeration.lo \
+ gnu/regexp/RESyntax.lo gnu/regexp/REToken.lo \
+ gnu/regexp/RETokenAny.lo gnu/regexp/RETokenBackRef.lo \
+ gnu/regexp/RETokenChar.lo gnu/regexp/RETokenEnd.lo \
+ gnu/regexp/RETokenEndSub.lo gnu/regexp/RETokenLookAhead.lo \
+ gnu/regexp/RETokenOneOf.lo gnu/regexp/RETokenPOSIX.lo \
+ gnu/regexp/RETokenRange.lo gnu/regexp/RETokenRepeated.lo \
+ gnu/regexp/RETokenStart.lo gnu/regexp/RETokenWordBoundary.lo \
+ gnu/regexp/UncheckedRE.lo java/lang/ref/PhantomReference.lo \
+ java/lang/ref/Reference.lo java/lang/ref/ReferenceQueue.lo \
+ java/lang/ref/SoftReference.lo java/lang/ref/WeakReference.lo \
java/lang/reflect/AccessibleObject.lo \
java/lang/reflect/Array.lo java/lang/reflect/Constructor.lo \
java/lang/reflect/Field.lo \
@@ -3764,8 +3766,8 @@ am__objects_14 = $(am__objects_9) gnu/classpath/ServiceFactory.lo \
java/net/ContentHandlerFactory.lo java/net/DatagramPacket.lo \
java/net/DatagramSocket.lo java/net/DatagramSocketImpl.lo \
java/net/DatagramSocketImplFactory.lo java/net/FileNameMap.lo \
- java/net/HttpURLConnection.lo java/net/InetAddress.lo \
- java/net/Inet4Address.lo java/net/Inet6Address.lo \
+ java/net/HttpURLConnection.lo java/net/Inet4Address.lo \
+ java/net/Inet6Address.lo java/net/InetAddress.lo \
java/net/InetSocketAddress.lo java/net/JarURLConnection.lo \
java/net/MalformedURLException.lo java/net/MulticastSocket.lo \
java/net/NetPermission.lo java/net/NetworkInterface.lo \
@@ -3833,14 +3835,13 @@ am__objects_14 = $(am__objects_9) gnu/classpath/ServiceFactory.lo \
java/nio/channels/UnresolvedAddressException.lo \
java/nio/channels/UnsupportedAddressTypeException.lo \
java/nio/channels/WritableByteChannel.lo \
- java/nio/channels/spi/AbstractSelectableChannel.lo \
java/nio/channels/spi/AbstractInterruptibleChannel.lo \
+ java/nio/channels/spi/AbstractSelectableChannel.lo \
java/nio/channels/spi/AbstractSelectionKey.lo \
java/nio/channels/spi/AbstractSelector.lo \
java/nio/channels/spi/SelectorProvider.lo \
- java/nio/charset/Charset.lo \
java/nio/charset/CharacterCodingException.lo \
- java/nio/charset/CharsetDecoder.lo \
+ java/nio/charset/Charset.lo java/nio/charset/CharsetDecoder.lo \
java/nio/charset/CharsetEncoder.lo \
java/nio/charset/CoderMalfunctionError.lo \
java/nio/charset/CoderResult.lo \
@@ -3854,70 +3855,59 @@ am__objects_14 = $(am__objects_9) gnu/classpath/ServiceFactory.lo \
java/security/AccessControlException.lo \
java/security/AccessController.lo \
java/security/AlgorithmParameterGenerator.lo \
- java/security/AlgorithmParameters.lo \
java/security/AlgorithmParameterGeneratorSpi.lo \
+ java/security/AlgorithmParameters.lo \
java/security/AlgorithmParametersSpi.lo \
java/security/AllPermission.lo \
java/security/BasicPermission.lo java/security/Certificate.lo \
java/security/CodeSource.lo java/security/DigestException.lo \
- java/security/DigestOutputStream.lo \
- java/security/DummyKeyPairGenerator.lo \
- java/security/DummySignature.lo \
java/security/DigestInputStream.lo \
+ java/security/DigestOutputStream.lo \
java/security/DomainCombiner.lo \
+ java/security/DummyKeyPairGenerator.lo \
java/security/DummyMessageDigest.lo \
+ java/security/DummySignature.lo \
java/security/GeneralSecurityException.lo \
java/security/Guard.lo java/security/GuardedObject.lo \
java/security/Identity.lo java/security/IdentityScope.lo \
java/security/InvalidAlgorithmParameterException.lo \
java/security/InvalidKeyException.lo \
java/security/InvalidParameterException.lo \
- java/security/Key.lo java/security/KeyFactorySpi.lo \
- java/security/KeyPairGenerator.lo \
- java/security/KeyStoreException.lo \
- java/security/KeyException.lo \
+ java/security/Key.lo java/security/KeyException.lo \
+ java/security/KeyFactory.lo java/security/KeyFactorySpi.lo \
java/security/KeyManagementException.lo \
- java/security/KeyPairGeneratorSpi.lo \
- java/security/KeyStoreSpi.lo java/security/KeyFactory.lo \
- java/security/KeyPair.lo java/security/KeyStore.lo \
- java/security/MessageDigest.lo \
+ java/security/KeyPair.lo java/security/KeyPairGenerator.lo \
+ java/security/KeyPairGeneratorSpi.lo java/security/KeyStore.lo \
+ java/security/KeyStoreException.lo \
+ java/security/KeyStoreSpi.lo java/security/MessageDigest.lo \
java/security/MessageDigestSpi.lo \
java/security/NoSuchAlgorithmException.lo \
java/security/NoSuchProviderException.lo \
- java/security/Permission.lo java/security/Principal.lo \
- java/security/PrivilegedExceptionAction.lo \
- java/security/PublicKey.lo \
+ java/security/Permission.lo \
java/security/PermissionCollection.lo \
- java/security/PrivateKey.lo java/security/ProtectionDomain.lo \
- java/security/Permissions.lo java/security/PrivilegedAction.lo \
- java/security/Provider.lo java/security/Policy.lo \
+ java/security/Permissions.lo java/security/Policy.lo \
+ java/security/Principal.lo java/security/PrivateKey.lo \
+ java/security/PrivilegedAction.lo \
java/security/PrivilegedActionException.lo \
- java/security/ProviderException.lo \
+ java/security/PrivilegedExceptionAction.lo \
+ java/security/ProtectionDomain.lo java/security/Provider.lo \
+ java/security/ProviderException.lo java/security/PublicKey.lo \
java/security/SecureClassLoader.lo \
- java/security/SecureRandomSpi.lo \
- java/security/SecurityPermission.lo \
- java/security/SignatureException.lo \
- java/security/SignedObject.lo java/security/SecureRandom.lo \
- java/security/Security.lo java/security/Signature.lo \
- java/security/SignatureSpi.lo java/security/Signer.lo \
+ java/security/SecureRandom.lo java/security/SecureRandomSpi.lo \
+ java/security/Security.lo java/security/SecurityPermission.lo \
+ java/security/Signature.lo java/security/SignatureException.lo \
+ java/security/SignatureSpi.lo java/security/SignedObject.lo \
+ java/security/Signer.lo \
java/security/UnrecoverableKeyException.lo \
java/security/UnresolvedPermission.lo java/security/acl/Acl.lo \
+ java/security/acl/AclEntry.lo \
java/security/acl/AclNotFoundException.lo \
- java/security/acl/LastOwnerException.lo \
- java/security/acl/Owner.lo java/security/acl/AclEntry.lo \
java/security/acl/Group.lo \
+ java/security/acl/LastOwnerException.lo \
java/security/acl/NotOwnerException.lo \
- java/security/acl/Permission.lo java/security/cert/CRL.lo \
- java/security/cert/CRLException.lo \
+ java/security/acl/Owner.lo java/security/acl/Permission.lo \
+ java/security/cert/CRL.lo java/security/cert/CRLException.lo \
java/security/cert/CRLSelector.lo \
- java/security/cert/Certificate.lo \
- java/security/cert/CertificateEncodingException.lo \
- java/security/cert/CertificateException.lo \
- java/security/cert/CertificateExpiredException.lo \
- java/security/cert/CertificateFactory.lo \
- java/security/cert/CertificateFactorySpi.lo \
- java/security/cert/CertificateNotYetValidException.lo \
- java/security/cert/CertificateParsingException.lo \
java/security/cert/CertPath.lo \
java/security/cert/CertPathBuilder.lo \
java/security/cert/CertPathBuilderException.lo \
@@ -3933,6 +3923,14 @@ am__objects_14 = $(am__objects_9) gnu/classpath/ServiceFactory.lo \
java/security/cert/CertStoreException.lo \
java/security/cert/CertStoreParameters.lo \
java/security/cert/CertStoreSpi.lo \
+ java/security/cert/Certificate.lo \
+ java/security/cert/CertificateEncodingException.lo \
+ java/security/cert/CertificateException.lo \
+ java/security/cert/CertificateExpiredException.lo \
+ java/security/cert/CertificateFactory.lo \
+ java/security/cert/CertificateFactorySpi.lo \
+ java/security/cert/CertificateNotYetValidException.lo \
+ java/security/cert/CertificateParsingException.lo \
java/security/cert/CollectionCertStoreParameters.lo \
java/security/cert/LDAPCertStoreParameters.lo \
java/security/cert/PKIXBuilderParameters.lo \
@@ -3946,8 +3944,8 @@ am__objects_14 = $(am__objects_9) gnu/classpath/ServiceFactory.lo \
java/security/cert/X509CRL.lo \
java/security/cert/X509CRLEntry.lo \
java/security/cert/X509CRLSelector.lo \
- java/security/cert/X509Certificate.lo \
java/security/cert/X509CertSelector.lo \
+ java/security/cert/X509Certificate.lo \
java/security/cert/X509Extension.lo \
java/security/interfaces/DSAKey.lo \
java/security/interfaces/DSAKeyPairGenerator.lo \
@@ -3984,12 +3982,12 @@ am__objects_14 = $(am__objects_9) gnu/classpath/ServiceFactory.lo \
java/sql/DriverPropertyInfo.lo java/sql/ParameterMetaData.lo \
java/sql/PreparedStatement.lo java/sql/Ref.lo \
java/sql/ResultSet.lo java/sql/ResultSetMetaData.lo \
- java/sql/Savepoint.lo java/sql/SQLData.lo \
- java/sql/SQLException.lo java/sql/SQLInput.lo \
- java/sql/SQLOutput.lo java/sql/SQLPermission.lo \
- java/sql/SQLWarning.lo java/sql/Statement.lo \
- java/sql/Struct.lo java/sql/Time.lo java/sql/Timestamp.lo \
- java/sql/Types.lo java/text/Annotation.lo \
+ java/sql/SQLData.lo java/sql/SQLException.lo \
+ java/sql/SQLInput.lo java/sql/SQLOutput.lo \
+ java/sql/SQLPermission.lo java/sql/SQLWarning.lo \
+ java/sql/Savepoint.lo java/sql/Statement.lo java/sql/Struct.lo \
+ java/sql/Time.lo java/sql/Timestamp.lo java/sql/Types.lo \
+ java/text/Annotation.lo \
java/text/AttributedCharacterIterator.lo \
java/text/AttributedString.lo \
java/text/AttributedStringIterator.lo \
@@ -4673,6 +4671,9 @@ all_java_source_files = \
$(xlib_java_source_files)
all_java_class_files = $(all_java_source_files:.java=.class)
+all_property_files = $(property_files) $(jgss_property_files) \
+ java/util/logging/logging.properties
+
property_files = \
gnu/regexp/MessagesBundle.properties \
gnu/regexp/MessagesBundle_fr.properties
@@ -6440,26 +6441,26 @@ gnu/java/net/PlainDatagramSocketImpl.java \
gnu/java/net/PlainSocketImpl.java \
gnu/java/net/URLParseError.java \
gnu/java/net/protocol/core/Connection.java \
-gnu/java/net/protocol/core/Handler.java \
gnu/java/net/protocol/core/CoreInputStream.java \
+gnu/java/net/protocol/core/Handler.java \
gnu/java/net/protocol/file/Connection.java \
gnu/java/net/protocol/file/Handler.java \
+gnu/java/net/protocol/gcjlib/Connection.java \
+gnu/java/net/protocol/gcjlib/Handler.java \
gnu/java/net/protocol/http/Connection.java \
gnu/java/net/protocol/http/Handler.java \
gnu/java/net/protocol/jar/Connection.java \
gnu/java/net/protocol/jar/Handler.java \
-gnu/java/net/protocol/gcjlib/Connection.java \
-gnu/java/net/protocol/gcjlib/Handler.java \
+gnu/java/nio/ChannelInputStream.java \
+gnu/java/nio/ChannelOutputStream.java \
gnu/java/nio/DatagramChannelImpl.java \
gnu/java/nio/DatagramChannelSelectionKey.java \
gnu/java/nio/FileLockImpl.java \
+gnu/java/nio/InputStreamChannel.java \
gnu/java/nio/NIOConstants.java \
gnu/java/nio/NIODatagramSocket.java \
gnu/java/nio/NIOServerSocket.java \
gnu/java/nio/NIOSocket.java \
-gnu/java/nio/ChannelInputStream.java \
-gnu/java/nio/ChannelOutputStream.java \
-gnu/java/nio/InputStreamChannel.java \
gnu/java/nio/OutputStreamChannel.java \
gnu/java/nio/PipeImpl.java \
gnu/java/nio/SelectionKeyImpl.java \
@@ -6481,47 +6482,22 @@ gnu/java/nio/charset/UTF_16Decoder.java \
gnu/java/nio/charset/UTF_16Encoder.java \
gnu/java/nio/charset/UTF_16LE.java \
gnu/java/nio/charset/UTF_8.java \
-gnu/regexp/CharIndexed.java \
-gnu/regexp/CharIndexedCharArray.java \
-gnu/regexp/CharIndexedInputStream.java \
-gnu/regexp/CharIndexedString.java \
-gnu/regexp/CharIndexedStringBuffer.java \
-gnu/regexp/RE.java \
-gnu/regexp/REException.java \
-gnu/regexp/REFilterInputStream.java \
-gnu/regexp/REMatch.java \
-gnu/regexp/REMatchEnumeration.java \
-gnu/regexp/RESyntax.java \
-gnu/regexp/REToken.java \
-gnu/regexp/RETokenAny.java \
-gnu/regexp/RETokenBackRef.java \
-gnu/regexp/RETokenChar.java \
-gnu/regexp/RETokenEnd.java \
-gnu/regexp/RETokenEndSub.java \
-gnu/regexp/RETokenLookAhead.java \
-gnu/regexp/RETokenOneOf.java \
-gnu/regexp/RETokenPOSIX.java \
-gnu/regexp/RETokenRange.java \
-gnu/regexp/RETokenRepeated.java \
-gnu/regexp/RETokenStart.java \
-gnu/regexp/RETokenWordBoundary.java \
-gnu/regexp/UncheckedRE.java \
gnu/java/security/Engine.java \
gnu/java/security/OID.java \
+gnu/java/security/action/GetPropertyAction.java \
+gnu/java/security/action/SetAccessibleAction.java \
gnu/java/security/der/BitString.java \
gnu/java/security/der/DER.java \
gnu/java/security/der/DEREncodingException.java \
gnu/java/security/der/DERReader.java \
gnu/java/security/der/DERValue.java \
gnu/java/security/der/DERWriter.java \
-gnu/java/security/action/GetPropertyAction.java \
-gnu/java/security/action/SetAccessibleAction.java \
-gnu/java/security/provider/DefaultPolicy.java \
gnu/java/security/provider/DSAKeyFactory.java \
gnu/java/security/provider/DSAKeyPairGenerator.java \
gnu/java/security/provider/DSAParameterGenerator.java \
gnu/java/security/provider/DSAParameters.java \
gnu/java/security/provider/DSASignature.java \
+gnu/java/security/provider/DefaultPolicy.java \
gnu/java/security/provider/Gnu.java \
gnu/java/security/provider/GnuDSAPrivateKey.java \
gnu/java/security/provider/GnuDSAPublicKey.java \
@@ -6531,9 +6507,9 @@ gnu/java/security/provider/SHA1PRNG.java \
gnu/java/security/provider/X509CertificateFactory.java \
gnu/java/security/util/Prime.java \
gnu/java/security/x509/X500DistinguishedName.java \
-gnu/java/security/x509/X509Certificate.java \
-gnu/java/security/x509/X509CRLEntry.java \
gnu/java/security/x509/X509CRL.java \
+gnu/java/security/x509/X509CRLEntry.java \
+gnu/java/security/x509/X509Certificate.java \
gnu/java/text/AttributedFormatBuffer.java \
gnu/java/text/BaseBreakIterator.java \
gnu/java/text/CharacterBreakIterator.java \
@@ -6545,11 +6521,36 @@ gnu/java/text/StringFormatBuffer.java \
gnu/java/text/WordBreakIterator.java \
gnu/java/util/DoubleEnumeration.java \
gnu/java/util/EmptyEnumeration.java \
+gnu/java/util/prefs/FileBasedFactory.java \
gnu/java/util/prefs/MemoryBasedFactory.java \
-gnu/java/util/prefs/NodeReader.java \
gnu/java/util/prefs/MemoryBasedPreferences.java \
-gnu/java/util/prefs/FileBasedFactory.java \
+gnu/java/util/prefs/NodeReader.java \
gnu/java/util/prefs/NodeWriter.java \
+gnu/regexp/CharIndexed.java \
+gnu/regexp/CharIndexedCharArray.java \
+gnu/regexp/CharIndexedInputStream.java \
+gnu/regexp/CharIndexedString.java \
+gnu/regexp/CharIndexedStringBuffer.java \
+gnu/regexp/RE.java \
+gnu/regexp/REException.java \
+gnu/regexp/REFilterInputStream.java \
+gnu/regexp/REMatch.java \
+gnu/regexp/REMatchEnumeration.java \
+gnu/regexp/RESyntax.java \
+gnu/regexp/REToken.java \
+gnu/regexp/RETokenAny.java \
+gnu/regexp/RETokenBackRef.java \
+gnu/regexp/RETokenChar.java \
+gnu/regexp/RETokenEnd.java \
+gnu/regexp/RETokenEndSub.java \
+gnu/regexp/RETokenLookAhead.java \
+gnu/regexp/RETokenOneOf.java \
+gnu/regexp/RETokenPOSIX.java \
+gnu/regexp/RETokenRange.java \
+gnu/regexp/RETokenRepeated.java \
+gnu/regexp/RETokenStart.java \
+gnu/regexp/RETokenWordBoundary.java \
+gnu/regexp/UncheckedRE.java \
java/lang/ref/PhantomReference.java \
java/lang/ref/Reference.java \
java/lang/ref/ReferenceQueue.java \
@@ -6580,9 +6581,9 @@ java/net/DatagramSocketImpl.java \
java/net/DatagramSocketImplFactory.java \
java/net/FileNameMap.java \
java/net/HttpURLConnection.java \
-java/net/InetAddress.java \
java/net/Inet4Address.java \
java/net/Inet6Address.java \
+java/net/InetAddress.java \
java/net/InetSocketAddress.java \
java/net/JarURLConnection.java \
java/net/MalformedURLException.java \
@@ -6678,13 +6679,13 @@ java/nio/channels/SocketChannel.java \
java/nio/channels/UnresolvedAddressException.java \
java/nio/channels/UnsupportedAddressTypeException.java \
java/nio/channels/WritableByteChannel.java \
-java/nio/channels/spi/AbstractSelectableChannel.java \
java/nio/channels/spi/AbstractInterruptibleChannel.java \
+java/nio/channels/spi/AbstractSelectableChannel.java \
java/nio/channels/spi/AbstractSelectionKey.java \
java/nio/channels/spi/AbstractSelector.java \
java/nio/channels/spi/SelectorProvider.java \
-java/nio/charset/Charset.java \
java/nio/charset/CharacterCodingException.java \
+java/nio/charset/Charset.java \
java/nio/charset/CharsetDecoder.java \
java/nio/charset/CharsetEncoder.java \
java/nio/charset/CoderMalfunctionError.java \
@@ -6699,20 +6700,20 @@ java/security/AccessControlContext.java \
java/security/AccessControlException.java \
java/security/AccessController.java \
java/security/AlgorithmParameterGenerator.java \
-java/security/AlgorithmParameters.java \
java/security/AlgorithmParameterGeneratorSpi.java \
+java/security/AlgorithmParameters.java \
java/security/AlgorithmParametersSpi.java \
java/security/AllPermission.java \
java/security/BasicPermission.java \
java/security/Certificate.java \
java/security/CodeSource.java \
java/security/DigestException.java \
-java/security/DigestOutputStream.java \
-java/security/DummyKeyPairGenerator.java \
-java/security/DummySignature.java \
java/security/DigestInputStream.java \
+java/security/DigestOutputStream.java \
java/security/DomainCombiner.java \
+java/security/DummyKeyPairGenerator.java \
java/security/DummyMessageDigest.java \
+java/security/DummySignature.java \
java/security/GeneralSecurityException.java \
java/security/Guard.java \
java/security/GuardedObject.java \
@@ -6722,64 +6723,56 @@ java/security/InvalidAlgorithmParameterException.java \
java/security/InvalidKeyException.java \
java/security/InvalidParameterException.java \
java/security/Key.java \
-java/security/KeyFactorySpi.java \
-java/security/KeyPairGenerator.java \
-java/security/KeyStoreException.java \
java/security/KeyException.java \
-java/security/KeyManagementException.java \
-java/security/KeyPairGeneratorSpi.java \
-java/security/KeyStoreSpi.java \
java/security/KeyFactory.java \
+java/security/KeyFactorySpi.java \
+java/security/KeyManagementException.java \
java/security/KeyPair.java \
+java/security/KeyPairGenerator.java \
+java/security/KeyPairGeneratorSpi.java \
java/security/KeyStore.java \
+java/security/KeyStoreException.java \
+java/security/KeyStoreSpi.java \
java/security/MessageDigest.java \
java/security/MessageDigestSpi.java \
java/security/NoSuchAlgorithmException.java \
java/security/NoSuchProviderException.java \
java/security/Permission.java \
-java/security/Principal.java \
-java/security/PrivilegedExceptionAction.java \
-java/security/PublicKey.java \
java/security/PermissionCollection.java \
-java/security/PrivateKey.java \
-java/security/ProtectionDomain.java \
java/security/Permissions.java \
-java/security/PrivilegedAction.java \
-java/security/Provider.java \
java/security/Policy.java \
+java/security/Principal.java \
+java/security/PrivateKey.java \
+java/security/PrivilegedAction.java \
java/security/PrivilegedActionException.java \
+java/security/PrivilegedExceptionAction.java \
+java/security/ProtectionDomain.java \
+java/security/Provider.java \
java/security/ProviderException.java \
+java/security/PublicKey.java \
java/security/SecureClassLoader.java \
-java/security/SecureRandomSpi.java \
-java/security/SecurityPermission.java \
-java/security/SignatureException.java \
-java/security/SignedObject.java \
java/security/SecureRandom.java \
+java/security/SecureRandomSpi.java \
java/security/Security.java \
+java/security/SecurityPermission.java \
java/security/Signature.java \
+java/security/SignatureException.java \
java/security/SignatureSpi.java \
+java/security/SignedObject.java \
java/security/Signer.java \
java/security/UnrecoverableKeyException.java \
java/security/UnresolvedPermission.java \
java/security/acl/Acl.java \
-java/security/acl/AclNotFoundException.java \
-java/security/acl/LastOwnerException.java \
-java/security/acl/Owner.java \
java/security/acl/AclEntry.java \
+java/security/acl/AclNotFoundException.java \
java/security/acl/Group.java \
+java/security/acl/LastOwnerException.java \
java/security/acl/NotOwnerException.java \
+java/security/acl/Owner.java \
java/security/acl/Permission.java \
java/security/cert/CRL.java \
java/security/cert/CRLException.java \
java/security/cert/CRLSelector.java \
-java/security/cert/Certificate.java \
-java/security/cert/CertificateEncodingException.java \
-java/security/cert/CertificateException.java \
-java/security/cert/CertificateExpiredException.java \
-java/security/cert/CertificateFactory.java \
-java/security/cert/CertificateFactorySpi.java \
-java/security/cert/CertificateNotYetValidException.java \
-java/security/cert/CertificateParsingException.java \
java/security/cert/CertPath.java \
java/security/cert/CertPathBuilder.java \
java/security/cert/CertPathBuilderException.java \
@@ -6795,6 +6788,14 @@ java/security/cert/CertStore.java \
java/security/cert/CertStoreException.java \
java/security/cert/CertStoreParameters.java \
java/security/cert/CertStoreSpi.java \
+java/security/cert/Certificate.java \
+java/security/cert/CertificateEncodingException.java \
+java/security/cert/CertificateException.java \
+java/security/cert/CertificateExpiredException.java \
+java/security/cert/CertificateFactory.java \
+java/security/cert/CertificateFactorySpi.java \
+java/security/cert/CertificateNotYetValidException.java \
+java/security/cert/CertificateParsingException.java \
java/security/cert/CollectionCertStoreParameters.java \
java/security/cert/LDAPCertStoreParameters.java \
java/security/cert/PKIXBuilderParameters.java \
@@ -6808,8 +6809,8 @@ java/security/cert/TrustAnchor.java \
java/security/cert/X509CRL.java \
java/security/cert/X509CRLEntry.java \
java/security/cert/X509CRLSelector.java \
-java/security/cert/X509Certificate.java \
java/security/cert/X509CertSelector.java \
+java/security/cert/X509Certificate.java \
java/security/cert/X509Extension.java \
java/security/interfaces/DSAKey.java \
java/security/interfaces/DSAKeyPairGenerator.java \
@@ -6855,13 +6856,13 @@ java/sql/PreparedStatement.java \
java/sql/Ref.java \
java/sql/ResultSet.java \
java/sql/ResultSetMetaData.java \
-java/sql/Savepoint.java \
java/sql/SQLData.java \
java/sql/SQLException.java \
java/sql/SQLInput.java \
java/sql/SQLOutput.java \
java/sql/SQLPermission.java \
java/sql/SQLWarning.java \
+java/sql/Savepoint.java \
java/sql/Statement.java \
java/sql/Struct.java \
java/sql/Time.java \
@@ -9141,10 +9142,10 @@ gnu/java/net/URLParseError.lo: gnu/java/net/$(am__dirstamp) \
gnu/java/net/protocol/core/Connection.lo: \
gnu/java/net/protocol/core/$(am__dirstamp) \
gnu/java/net/protocol/core/$(DEPDIR)/$(am__dirstamp)
-gnu/java/net/protocol/core/Handler.lo: \
+gnu/java/net/protocol/core/CoreInputStream.lo: \
gnu/java/net/protocol/core/$(am__dirstamp) \
gnu/java/net/protocol/core/$(DEPDIR)/$(am__dirstamp)
-gnu/java/net/protocol/core/CoreInputStream.lo: \
+gnu/java/net/protocol/core/Handler.lo: \
gnu/java/net/protocol/core/$(am__dirstamp) \
gnu/java/net/protocol/core/$(DEPDIR)/$(am__dirstamp)
gnu/java/net/protocol/file/$(am__dirstamp):
@@ -9159,6 +9160,18 @@ gnu/java/net/protocol/file/Connection.lo: \
gnu/java/net/protocol/file/Handler.lo: \
gnu/java/net/protocol/file/$(am__dirstamp) \
gnu/java/net/protocol/file/$(DEPDIR)/$(am__dirstamp)
+gnu/java/net/protocol/gcjlib/$(am__dirstamp):
+ @$(mkdir_p) gnu/java/net/protocol/gcjlib
+ @: > gnu/java/net/protocol/gcjlib/$(am__dirstamp)
+gnu/java/net/protocol/gcjlib/$(DEPDIR)/$(am__dirstamp):
+ @$(mkdir_p) gnu/java/net/protocol/gcjlib/$(DEPDIR)
+ @: > gnu/java/net/protocol/gcjlib/$(DEPDIR)/$(am__dirstamp)
+gnu/java/net/protocol/gcjlib/Connection.lo: \
+ gnu/java/net/protocol/gcjlib/$(am__dirstamp) \
+ gnu/java/net/protocol/gcjlib/$(DEPDIR)/$(am__dirstamp)
+gnu/java/net/protocol/gcjlib/Handler.lo: \
+ gnu/java/net/protocol/gcjlib/$(am__dirstamp) \
+ gnu/java/net/protocol/gcjlib/$(DEPDIR)/$(am__dirstamp)
gnu/java/net/protocol/http/$(am__dirstamp):
@$(mkdir_p) gnu/java/net/protocol/http
@: > gnu/java/net/protocol/http/$(am__dirstamp)
@@ -9183,18 +9196,10 @@ gnu/java/net/protocol/jar/Connection.lo: \
gnu/java/net/protocol/jar/Handler.lo: \
gnu/java/net/protocol/jar/$(am__dirstamp) \
gnu/java/net/protocol/jar/$(DEPDIR)/$(am__dirstamp)
-gnu/java/net/protocol/gcjlib/$(am__dirstamp):
- @$(mkdir_p) gnu/java/net/protocol/gcjlib
- @: > gnu/java/net/protocol/gcjlib/$(am__dirstamp)
-gnu/java/net/protocol/gcjlib/$(DEPDIR)/$(am__dirstamp):
- @$(mkdir_p) gnu/java/net/protocol/gcjlib/$(DEPDIR)
- @: > gnu/java/net/protocol/gcjlib/$(DEPDIR)/$(am__dirstamp)
-gnu/java/net/protocol/gcjlib/Connection.lo: \
- gnu/java/net/protocol/gcjlib/$(am__dirstamp) \
- gnu/java/net/protocol/gcjlib/$(DEPDIR)/$(am__dirstamp)
-gnu/java/net/protocol/gcjlib/Handler.lo: \
- gnu/java/net/protocol/gcjlib/$(am__dirstamp) \
- gnu/java/net/protocol/gcjlib/$(DEPDIR)/$(am__dirstamp)
+gnu/java/nio/ChannelInputStream.lo: gnu/java/nio/$(am__dirstamp) \
+ gnu/java/nio/$(DEPDIR)/$(am__dirstamp)
+gnu/java/nio/ChannelOutputStream.lo: gnu/java/nio/$(am__dirstamp) \
+ gnu/java/nio/$(DEPDIR)/$(am__dirstamp)
gnu/java/nio/DatagramChannelImpl.lo: gnu/java/nio/$(am__dirstamp) \
gnu/java/nio/$(DEPDIR)/$(am__dirstamp)
gnu/java/nio/DatagramChannelSelectionKey.lo: \
@@ -9202,6 +9207,8 @@ gnu/java/nio/DatagramChannelSelectionKey.lo: \
gnu/java/nio/$(DEPDIR)/$(am__dirstamp)
gnu/java/nio/FileLockImpl.lo: gnu/java/nio/$(am__dirstamp) \
gnu/java/nio/$(DEPDIR)/$(am__dirstamp)
+gnu/java/nio/InputStreamChannel.lo: gnu/java/nio/$(am__dirstamp) \
+ gnu/java/nio/$(DEPDIR)/$(am__dirstamp)
gnu/java/nio/NIOConstants.lo: gnu/java/nio/$(am__dirstamp) \
gnu/java/nio/$(DEPDIR)/$(am__dirstamp)
gnu/java/nio/NIODatagramSocket.lo: gnu/java/nio/$(am__dirstamp) \
@@ -9210,12 +9217,6 @@ gnu/java/nio/NIOServerSocket.lo: gnu/java/nio/$(am__dirstamp) \
gnu/java/nio/$(DEPDIR)/$(am__dirstamp)
gnu/java/nio/NIOSocket.lo: gnu/java/nio/$(am__dirstamp) \
gnu/java/nio/$(DEPDIR)/$(am__dirstamp)
-gnu/java/nio/ChannelInputStream.lo: gnu/java/nio/$(am__dirstamp) \
- gnu/java/nio/$(DEPDIR)/$(am__dirstamp)
-gnu/java/nio/ChannelOutputStream.lo: gnu/java/nio/$(am__dirstamp) \
- gnu/java/nio/$(DEPDIR)/$(am__dirstamp)
-gnu/java/nio/InputStreamChannel.lo: gnu/java/nio/$(am__dirstamp) \
- gnu/java/nio/$(DEPDIR)/$(am__dirstamp)
gnu/java/nio/OutputStreamChannel.lo: gnu/java/nio/$(am__dirstamp) \
gnu/java/nio/$(DEPDIR)/$(am__dirstamp)
gnu/java/nio/PipeImpl.lo: gnu/java/nio/$(am__dirstamp) \
@@ -9274,62 +9275,6 @@ gnu/java/nio/charset/UTF_16LE.lo: \
gnu/java/nio/charset/$(DEPDIR)/$(am__dirstamp)
gnu/java/nio/charset/UTF_8.lo: gnu/java/nio/charset/$(am__dirstamp) \
gnu/java/nio/charset/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/$(am__dirstamp):
- @$(mkdir_p) gnu/regexp
- @: > gnu/regexp/$(am__dirstamp)
-gnu/regexp/$(DEPDIR)/$(am__dirstamp):
- @$(mkdir_p) gnu/regexp/$(DEPDIR)
- @: > gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/CharIndexed.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/CharIndexedCharArray.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/CharIndexedInputStream.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/CharIndexedString.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/CharIndexedStringBuffer.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RE.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/REException.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/REFilterInputStream.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/REMatch.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/REMatchEnumeration.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RESyntax.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/REToken.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RETokenAny.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RETokenBackRef.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RETokenChar.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RETokenEnd.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RETokenEndSub.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RETokenLookAhead.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RETokenOneOf.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RETokenPOSIX.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RETokenRange.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RETokenRepeated.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RETokenStart.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/RETokenWordBoundary.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
-gnu/regexp/UncheckedRE.lo: gnu/regexp/$(am__dirstamp) \
- gnu/regexp/$(DEPDIR)/$(am__dirstamp)
gnu/java/security/$(am__dirstamp):
@$(mkdir_p) gnu/java/security
@: > gnu/java/security/$(am__dirstamp)
@@ -9340,6 +9285,18 @@ gnu/java/security/Engine.lo: gnu/java/security/$(am__dirstamp) \
gnu/java/security/$(DEPDIR)/$(am__dirstamp)
gnu/java/security/OID.lo: gnu/java/security/$(am__dirstamp) \
gnu/java/security/$(DEPDIR)/$(am__dirstamp)
+gnu/java/security/action/$(am__dirstamp):
+ @$(mkdir_p) gnu/java/security/action
+ @: > gnu/java/security/action/$(am__dirstamp)
+gnu/java/security/action/$(DEPDIR)/$(am__dirstamp):
+ @$(mkdir_p) gnu/java/security/action/$(DEPDIR)
+ @: > gnu/java/security/action/$(DEPDIR)/$(am__dirstamp)
+gnu/java/security/action/GetPropertyAction.lo: \
+ gnu/java/security/action/$(am__dirstamp) \
+ gnu/java/security/action/$(DEPDIR)/$(am__dirstamp)
+gnu/java/security/action/SetAccessibleAction.lo: \
+ gnu/java/security/action/$(am__dirstamp) \
+ gnu/java/security/action/$(DEPDIR)/$(am__dirstamp)
gnu/java/security/der/$(am__dirstamp):
@$(mkdir_p) gnu/java/security/der
@: > gnu/java/security/der/$(am__dirstamp)
@@ -9363,27 +9320,12 @@ gnu/java/security/der/DERValue.lo: \
gnu/java/security/der/DERWriter.lo: \
gnu/java/security/der/$(am__dirstamp) \
gnu/java/security/der/$(DEPDIR)/$(am__dirstamp)
-gnu/java/security/action/$(am__dirstamp):
- @$(mkdir_p) gnu/java/security/action
- @: > gnu/java/security/action/$(am__dirstamp)
-gnu/java/security/action/$(DEPDIR)/$(am__dirstamp):
- @$(mkdir_p) gnu/java/security/action/$(DEPDIR)
- @: > gnu/java/security/action/$(DEPDIR)/$(am__dirstamp)
-gnu/java/security/action/GetPropertyAction.lo: \
- gnu/java/security/action/$(am__dirstamp) \
- gnu/java/security/action/$(DEPDIR)/$(am__dirstamp)
-gnu/java/security/action/SetAccessibleAction.lo: \
- gnu/java/security/action/$(am__dirstamp) \
- gnu/java/security/action/$(DEPDIR)/$(am__dirstamp)
gnu/java/security/provider/$(am__dirstamp):
@$(mkdir_p) gnu/java/security/provider
@: > gnu/java/security/provider/$(am__dirstamp)
gnu/java/security/provider/$(DEPDIR)/$(am__dirstamp):
@$(mkdir_p) gnu/java/security/provider/$(DEPDIR)
@: > gnu/java/security/provider/$(DEPDIR)/$(am__dirstamp)
-gnu/java/security/provider/DefaultPolicy.lo: \
- gnu/java/security/provider/$(am__dirstamp) \
- gnu/java/security/provider/$(DEPDIR)/$(am__dirstamp)
gnu/java/security/provider/DSAKeyFactory.lo: \
gnu/java/security/provider/$(am__dirstamp) \
gnu/java/security/provider/$(DEPDIR)/$(am__dirstamp)
@@ -9399,6 +9341,9 @@ gnu/java/security/provider/DSAParameters.lo: \
gnu/java/security/provider/DSASignature.lo: \
gnu/java/security/provider/$(am__dirstamp) \
gnu/java/security/provider/$(DEPDIR)/$(am__dirstamp)
+gnu/java/security/provider/DefaultPolicy.lo: \
+ gnu/java/security/provider/$(am__dirstamp) \
+ gnu/java/security/provider/$(DEPDIR)/$(am__dirstamp)
gnu/java/security/provider/Gnu.lo: \
gnu/java/security/provider/$(am__dirstamp) \
gnu/java/security/provider/$(DEPDIR)/$(am__dirstamp)
@@ -9438,13 +9383,13 @@ gnu/java/security/x509/$(DEPDIR)/$(am__dirstamp):
gnu/java/security/x509/X500DistinguishedName.lo: \
gnu/java/security/x509/$(am__dirstamp) \
gnu/java/security/x509/$(DEPDIR)/$(am__dirstamp)
-gnu/java/security/x509/X509Certificate.lo: \
+gnu/java/security/x509/X509CRL.lo: \
gnu/java/security/x509/$(am__dirstamp) \
gnu/java/security/x509/$(DEPDIR)/$(am__dirstamp)
gnu/java/security/x509/X509CRLEntry.lo: \
gnu/java/security/x509/$(am__dirstamp) \
gnu/java/security/x509/$(DEPDIR)/$(am__dirstamp)
-gnu/java/security/x509/X509CRL.lo: \
+gnu/java/security/x509/X509Certificate.lo: \
gnu/java/security/x509/$(am__dirstamp) \
gnu/java/security/x509/$(DEPDIR)/$(am__dirstamp)
gnu/java/text/$(am__dirstamp):
@@ -9490,21 +9435,77 @@ gnu/java/util/prefs/$(am__dirstamp):
gnu/java/util/prefs/$(DEPDIR)/$(am__dirstamp):
@$(mkdir_p) gnu/java/util/prefs/$(DEPDIR)
@: > gnu/java/util/prefs/$(DEPDIR)/$(am__dirstamp)
-gnu/java/util/prefs/MemoryBasedFactory.lo: \
+gnu/java/util/prefs/FileBasedFactory.lo: \
gnu/java/util/prefs/$(am__dirstamp) \
gnu/java/util/prefs/$(DEPDIR)/$(am__dirstamp)
-gnu/java/util/prefs/NodeReader.lo: \
+gnu/java/util/prefs/MemoryBasedFactory.lo: \
gnu/java/util/prefs/$(am__dirstamp) \
gnu/java/util/prefs/$(DEPDIR)/$(am__dirstamp)
gnu/java/util/prefs/MemoryBasedPreferences.lo: \
gnu/java/util/prefs/$(am__dirstamp) \
gnu/java/util/prefs/$(DEPDIR)/$(am__dirstamp)
-gnu/java/util/prefs/FileBasedFactory.lo: \
+gnu/java/util/prefs/NodeReader.lo: \
gnu/java/util/prefs/$(am__dirstamp) \
gnu/java/util/prefs/$(DEPDIR)/$(am__dirstamp)
gnu/java/util/prefs/NodeWriter.lo: \
gnu/java/util/prefs/$(am__dirstamp) \
gnu/java/util/prefs/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/$(am__dirstamp):
+ @$(mkdir_p) gnu/regexp
+ @: > gnu/regexp/$(am__dirstamp)
+gnu/regexp/$(DEPDIR)/$(am__dirstamp):
+ @$(mkdir_p) gnu/regexp/$(DEPDIR)
+ @: > gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/CharIndexed.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/CharIndexedCharArray.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/CharIndexedInputStream.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/CharIndexedString.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/CharIndexedStringBuffer.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RE.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/REException.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/REFilterInputStream.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/REMatch.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/REMatchEnumeration.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RESyntax.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/REToken.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RETokenAny.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RETokenBackRef.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RETokenChar.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RETokenEnd.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RETokenEndSub.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RETokenLookAhead.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RETokenOneOf.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RETokenPOSIX.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RETokenRange.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RETokenRepeated.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RETokenStart.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/RETokenWordBoundary.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
+gnu/regexp/UncheckedRE.lo: gnu/regexp/$(am__dirstamp) \
+ gnu/regexp/$(DEPDIR)/$(am__dirstamp)
java/lang/ref/PhantomReference.lo: java/lang/ref/$(am__dirstamp) \
java/lang/ref/$(DEPDIR)/$(am__dirstamp)
java/lang/ref/Reference.lo: java/lang/ref/$(am__dirstamp) \
@@ -9576,12 +9577,12 @@ java/net/FileNameMap.lo: java/net/$(am__dirstamp) \
java/net/$(DEPDIR)/$(am__dirstamp)
java/net/HttpURLConnection.lo: java/net/$(am__dirstamp) \
java/net/$(DEPDIR)/$(am__dirstamp)
-java/net/InetAddress.lo: java/net/$(am__dirstamp) \
- java/net/$(DEPDIR)/$(am__dirstamp)
java/net/Inet4Address.lo: java/net/$(am__dirstamp) \
java/net/$(DEPDIR)/$(am__dirstamp)
java/net/Inet6Address.lo: java/net/$(am__dirstamp) \
java/net/$(DEPDIR)/$(am__dirstamp)
+java/net/InetAddress.lo: java/net/$(am__dirstamp) \
+ java/net/$(DEPDIR)/$(am__dirstamp)
java/net/InetSocketAddress.lo: java/net/$(am__dirstamp) \
java/net/$(DEPDIR)/$(am__dirstamp)
java/net/JarURLConnection.lo: java/net/$(am__dirstamp) \
@@ -9804,10 +9805,10 @@ java/nio/channels/spi/$(am__dirstamp):
java/nio/channels/spi/$(DEPDIR)/$(am__dirstamp):
@$(mkdir_p) java/nio/channels/spi/$(DEPDIR)
@: > java/nio/channels/spi/$(DEPDIR)/$(am__dirstamp)
-java/nio/channels/spi/AbstractSelectableChannel.lo: \
+java/nio/channels/spi/AbstractInterruptibleChannel.lo: \
java/nio/channels/spi/$(am__dirstamp) \
java/nio/channels/spi/$(DEPDIR)/$(am__dirstamp)
-java/nio/channels/spi/AbstractInterruptibleChannel.lo: \
+java/nio/channels/spi/AbstractSelectableChannel.lo: \
java/nio/channels/spi/$(am__dirstamp) \
java/nio/channels/spi/$(DEPDIR)/$(am__dirstamp)
java/nio/channels/spi/AbstractSelectionKey.lo: \
@@ -9825,11 +9826,11 @@ java/nio/charset/$(am__dirstamp):
java/nio/charset/$(DEPDIR)/$(am__dirstamp):
@$(mkdir_p) java/nio/charset/$(DEPDIR)
@: > java/nio/charset/$(DEPDIR)/$(am__dirstamp)
-java/nio/charset/Charset.lo: java/nio/charset/$(am__dirstamp) \
- java/nio/charset/$(DEPDIR)/$(am__dirstamp)
java/nio/charset/CharacterCodingException.lo: \
java/nio/charset/$(am__dirstamp) \
java/nio/charset/$(DEPDIR)/$(am__dirstamp)
+java/nio/charset/Charset.lo: java/nio/charset/$(am__dirstamp) \
+ java/nio/charset/$(DEPDIR)/$(am__dirstamp)
java/nio/charset/CharsetDecoder.lo: java/nio/charset/$(am__dirstamp) \
java/nio/charset/$(DEPDIR)/$(am__dirstamp)
java/nio/charset/CharsetEncoder.lo: java/nio/charset/$(am__dirstamp) \
@@ -9879,11 +9880,11 @@ java/security/AccessController.lo: java/security/$(am__dirstamp) \
java/security/AlgorithmParameterGenerator.lo: \
java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/AlgorithmParameters.lo: java/security/$(am__dirstamp) \
- java/security/$(DEPDIR)/$(am__dirstamp)
java/security/AlgorithmParameterGeneratorSpi.lo: \
java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
+java/security/AlgorithmParameters.lo: java/security/$(am__dirstamp) \
+ java/security/$(DEPDIR)/$(am__dirstamp)
java/security/AlgorithmParametersSpi.lo: \
java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
@@ -9897,18 +9898,18 @@ java/security/CodeSource.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
java/security/DigestException.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/DigestOutputStream.lo: java/security/$(am__dirstamp) \
- java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/DummyKeyPairGenerator.lo: java/security/$(am__dirstamp) \
- java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/DummySignature.lo: java/security/$(am__dirstamp) \
- java/security/$(DEPDIR)/$(am__dirstamp)
java/security/DigestInputStream.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
+java/security/DigestOutputStream.lo: java/security/$(am__dirstamp) \
+ java/security/$(DEPDIR)/$(am__dirstamp)
java/security/DomainCombiner.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
+java/security/DummyKeyPairGenerator.lo: java/security/$(am__dirstamp) \
+ java/security/$(DEPDIR)/$(am__dirstamp)
java/security/DummyMessageDigest.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
+java/security/DummySignature.lo: java/security/$(am__dirstamp) \
+ java/security/$(DEPDIR)/$(am__dirstamp)
java/security/GeneralSecurityException.lo: \
java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
@@ -9930,27 +9931,27 @@ java/security/InvalidParameterException.lo: \
java/security/$(DEPDIR)/$(am__dirstamp)
java/security/Key.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/KeyFactorySpi.lo: java/security/$(am__dirstamp) \
- java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/KeyPairGenerator.lo: java/security/$(am__dirstamp) \
+java/security/KeyException.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/KeyStoreException.lo: java/security/$(am__dirstamp) \
+java/security/KeyFactory.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/KeyException.lo: java/security/$(am__dirstamp) \
+java/security/KeyFactorySpi.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
java/security/KeyManagementException.lo: \
java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/KeyPairGeneratorSpi.lo: java/security/$(am__dirstamp) \
- java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/KeyStoreSpi.lo: java/security/$(am__dirstamp) \
+java/security/KeyPair.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/KeyFactory.lo: java/security/$(am__dirstamp) \
+java/security/KeyPairGenerator.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/KeyPair.lo: java/security/$(am__dirstamp) \
+java/security/KeyPairGeneratorSpi.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
java/security/KeyStore.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
+java/security/KeyStoreException.lo: java/security/$(am__dirstamp) \
+ java/security/$(DEPDIR)/$(am__dirstamp)
+java/security/KeyStoreSpi.lo: java/security/$(am__dirstamp) \
+ java/security/$(DEPDIR)/$(am__dirstamp)
java/security/MessageDigest.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
java/security/MessageDigestSpi.lo: java/security/$(am__dirstamp) \
@@ -9963,50 +9964,50 @@ java/security/NoSuchProviderException.lo: \
java/security/$(DEPDIR)/$(am__dirstamp)
java/security/Permission.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/Principal.lo: java/security/$(am__dirstamp) \
+java/security/PermissionCollection.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/PrivilegedExceptionAction.lo: \
- java/security/$(am__dirstamp) \
+java/security/Permissions.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/PublicKey.lo: java/security/$(am__dirstamp) \
+java/security/Policy.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/PermissionCollection.lo: java/security/$(am__dirstamp) \
+java/security/Principal.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
java/security/PrivateKey.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/ProtectionDomain.lo: java/security/$(am__dirstamp) \
- java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/Permissions.lo: java/security/$(am__dirstamp) \
- java/security/$(DEPDIR)/$(am__dirstamp)
java/security/PrivilegedAction.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/Provider.lo: java/security/$(am__dirstamp) \
- java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/Policy.lo: java/security/$(am__dirstamp) \
- java/security/$(DEPDIR)/$(am__dirstamp)
java/security/PrivilegedActionException.lo: \
java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/ProviderException.lo: java/security/$(am__dirstamp) \
+java/security/PrivilegedExceptionAction.lo: \
+ java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/SecureClassLoader.lo: java/security/$(am__dirstamp) \
+java/security/ProtectionDomain.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/SecureRandomSpi.lo: java/security/$(am__dirstamp) \
+java/security/Provider.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/SecurityPermission.lo: java/security/$(am__dirstamp) \
+java/security/ProviderException.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/SignatureException.lo: java/security/$(am__dirstamp) \
+java/security/PublicKey.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
-java/security/SignedObject.lo: java/security/$(am__dirstamp) \
+java/security/SecureClassLoader.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
java/security/SecureRandom.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
+java/security/SecureRandomSpi.lo: java/security/$(am__dirstamp) \
+ java/security/$(DEPDIR)/$(am__dirstamp)
java/security/Security.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
+java/security/SecurityPermission.lo: java/security/$(am__dirstamp) \
+ java/security/$(DEPDIR)/$(am__dirstamp)
java/security/Signature.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
+java/security/SignatureException.lo: java/security/$(am__dirstamp) \
+ java/security/$(DEPDIR)/$(am__dirstamp)
java/security/SignatureSpi.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
+java/security/SignedObject.lo: java/security/$(am__dirstamp) \
+ java/security/$(DEPDIR)/$(am__dirstamp)
java/security/Signer.lo: java/security/$(am__dirstamp) \
java/security/$(DEPDIR)/$(am__dirstamp)
java/security/UnrecoverableKeyException.lo: \
@@ -10022,21 +10023,21 @@ java/security/acl/$(DEPDIR)/$(am__dirstamp):
@: > java/security/acl/$(DEPDIR)/$(am__dirstamp)
java/security/acl/Acl.lo: java/security/acl/$(am__dirstamp) \
java/security/acl/$(DEPDIR)/$(am__dirstamp)
+java/security/acl/AclEntry.lo: java/security/acl/$(am__dirstamp) \
+ java/security/acl/$(DEPDIR)/$(am__dirstamp)
java/security/acl/AclNotFoundException.lo: \
java/security/acl/$(am__dirstamp) \
java/security/acl/$(DEPDIR)/$(am__dirstamp)
+java/security/acl/Group.lo: java/security/acl/$(am__dirstamp) \
+ java/security/acl/$(DEPDIR)/$(am__dirstamp)
java/security/acl/LastOwnerException.lo: \
java/security/acl/$(am__dirstamp) \
java/security/acl/$(DEPDIR)/$(am__dirstamp)
-java/security/acl/Owner.lo: java/security/acl/$(am__dirstamp) \
- java/security/acl/$(DEPDIR)/$(am__dirstamp)
-java/security/acl/AclEntry.lo: java/security/acl/$(am__dirstamp) \
- java/security/acl/$(DEPDIR)/$(am__dirstamp)
-java/security/acl/Group.lo: java/security/acl/$(am__dirstamp) \
- java/security/acl/$(DEPDIR)/$(am__dirstamp)
java/security/acl/NotOwnerException.lo: \
java/security/acl/$(am__dirstamp) \
java/security/acl/$(DEPDIR)/$(am__dirstamp)
+java/security/acl/Owner.lo: java/security/acl/$(am__dirstamp) \
+ java/security/acl/$(DEPDIR)/$(am__dirstamp)
java/security/acl/Permission.lo: java/security/acl/$(am__dirstamp) \
java/security/acl/$(DEPDIR)/$(am__dirstamp)
java/security/cert/$(am__dirstamp):
@@ -10052,29 +10053,6 @@ java/security/cert/CRLException.lo: \
java/security/cert/$(DEPDIR)/$(am__dirstamp)
java/security/cert/CRLSelector.lo: java/security/cert/$(am__dirstamp) \
java/security/cert/$(DEPDIR)/$(am__dirstamp)
-java/security/cert/Certificate.lo: java/security/cert/$(am__dirstamp) \
- java/security/cert/$(DEPDIR)/$(am__dirstamp)
-java/security/cert/CertificateEncodingException.lo: \
- java/security/cert/$(am__dirstamp) \
- java/security/cert/$(DEPDIR)/$(am__dirstamp)
-java/security/cert/CertificateException.lo: \
- java/security/cert/$(am__dirstamp) \
- java/security/cert/$(DEPDIR)/$(am__dirstamp)
-java/security/cert/CertificateExpiredException.lo: \
- java/security/cert/$(am__dirstamp) \
- java/security/cert/$(DEPDIR)/$(am__dirstamp)
-java/security/cert/CertificateFactory.lo: \
- java/security/cert/$(am__dirstamp) \
- java/security/cert/$(DEPDIR)/$(am__dirstamp)
-java/security/cert/CertificateFactorySpi.lo: \
- java/security/cert/$(am__dirstamp) \
- java/security/cert/$(DEPDIR)/$(am__dirstamp)
-java/security/cert/CertificateNotYetValidException.lo: \
- java/security/cert/$(am__dirstamp) \
- java/security/cert/$(DEPDIR)/$(am__dirstamp)
-java/security/cert/CertificateParsingException.lo: \
- java/security/cert/$(am__dirstamp) \
- java/security/cert/$(DEPDIR)/$(am__dirstamp)
java/security/cert/CertPath.lo: java/security/cert/$(am__dirstamp) \
java/security/cert/$(DEPDIR)/$(am__dirstamp)
java/security/cert/CertPathBuilder.lo: \
@@ -10118,6 +10096,29 @@ java/security/cert/CertStoreParameters.lo: \
java/security/cert/CertStoreSpi.lo: \
java/security/cert/$(am__dirstamp) \
java/security/cert/$(DEPDIR)/$(am__dirstamp)
+java/security/cert/Certificate.lo: java/security/cert/$(am__dirstamp) \
+ java/security/cert/$(DEPDIR)/$(am__dirstamp)
+java/security/cert/CertificateEncodingException.lo: \
+ java/security/cert/$(am__dirstamp) \
+ java/security/cert/$(DEPDIR)/$(am__dirstamp)
+java/security/cert/CertificateException.lo: \
+ java/security/cert/$(am__dirstamp) \
+ java/security/cert/$(DEPDIR)/$(am__dirstamp)
+java/security/cert/CertificateExpiredException.lo: \
+ java/security/cert/$(am__dirstamp) \
+ java/security/cert/$(DEPDIR)/$(am__dirstamp)
+java/security/cert/CertificateFactory.lo: \
+ java/security/cert/$(am__dirstamp) \
+ java/security/cert/$(DEPDIR)/$(am__dirstamp)
+java/security/cert/CertificateFactorySpi.lo: \
+ java/security/cert/$(am__dirstamp) \
+ java/security/cert/$(DEPDIR)/$(am__dirstamp)
+java/security/cert/CertificateNotYetValidException.lo: \
+ java/security/cert/$(am__dirstamp) \
+ java/security/cert/$(DEPDIR)/$(am__dirstamp)
+java/security/cert/CertificateParsingException.lo: \
+ java/security/cert/$(am__dirstamp) \
+ java/security/cert/$(DEPDIR)/$(am__dirstamp)
java/security/cert/CollectionCertStoreParameters.lo: \
java/security/cert/$(am__dirstamp) \
java/security/cert/$(DEPDIR)/$(am__dirstamp)
@@ -10154,10 +10155,10 @@ java/security/cert/X509CRLEntry.lo: \
java/security/cert/X509CRLSelector.lo: \
java/security/cert/$(am__dirstamp) \
java/security/cert/$(DEPDIR)/$(am__dirstamp)
-java/security/cert/X509Certificate.lo: \
+java/security/cert/X509CertSelector.lo: \
java/security/cert/$(am__dirstamp) \
java/security/cert/$(DEPDIR)/$(am__dirstamp)
-java/security/cert/X509CertSelector.lo: \
+java/security/cert/X509Certificate.lo: \
java/security/cert/$(am__dirstamp) \
java/security/cert/$(DEPDIR)/$(am__dirstamp)
java/security/cert/X509Extension.lo: \
@@ -10295,8 +10296,6 @@ java/sql/ResultSet.lo: java/sql/$(am__dirstamp) \
java/sql/$(DEPDIR)/$(am__dirstamp)
java/sql/ResultSetMetaData.lo: java/sql/$(am__dirstamp) \
java/sql/$(DEPDIR)/$(am__dirstamp)
-java/sql/Savepoint.lo: java/sql/$(am__dirstamp) \
- java/sql/$(DEPDIR)/$(am__dirstamp)
java/sql/SQLData.lo: java/sql/$(am__dirstamp) \
java/sql/$(DEPDIR)/$(am__dirstamp)
java/sql/SQLException.lo: java/sql/$(am__dirstamp) \
@@ -10309,6 +10308,8 @@ java/sql/SQLPermission.lo: java/sql/$(am__dirstamp) \
java/sql/$(DEPDIR)/$(am__dirstamp)
java/sql/SQLWarning.lo: java/sql/$(am__dirstamp) \
java/sql/$(DEPDIR)/$(am__dirstamp)
+java/sql/Savepoint.lo: java/sql/$(am__dirstamp) \
+ java/sql/$(DEPDIR)/$(am__dirstamp)
java/sql/Statement.lo: java/sql/$(am__dirstamp) \
java/sql/$(DEPDIR)/$(am__dirstamp)
java/sql/Struct.lo: java/sql/$(am__dirstamp) \
@@ -13955,8 +13956,6 @@ sysdep/$(DEPDIR)/$(am__dirstamp):
@: > sysdep/$(DEPDIR)/$(am__dirstamp)
sysdep/dwarf2-backtrace.lo: sysdep/$(am__dirstamp) \
sysdep/$(DEPDIR)/$(am__dirstamp)
-libgcj.la: $(libgcj_la_OBJECTS) $(libgcj_la_DEPENDENCIES)
- $(libgcj_la_LINK) -rpath $(toolexeclibdir) $(libgcj_la_LDFLAGS) $(libgcj_la_OBJECTS) $(libgcj_la_LIBADD) $(LIBS)
libgij.la: $(libgij_la_OBJECTS) $(libgij_la_DEPENDENCIES)
$(CXXLINK) -rpath $(toolexeclibdir) $(libgij_la_LDFLAGS) $(libgij_la_OBJECTS) $(libgij_la_LIBADD) $(LIBS)
install-binPROGRAMS: $(bin_PROGRAMS)
@@ -23163,9 +23162,14 @@ $(lib_gnu_java_awt_peer_gtk_la_OBJECTS): $(lib_gnu_java_awt_peer_gtk_la_DEPENDEN
@ONESTEP_TRUE@ @echo Compiling Java sourcefiles...
@ONESTEP_TRUE@ @: $(call write_entries_to_file,$?,libgcj.sourcelist)
@ONESTEP_TRUE@ $(JAVAC) $(JCFLAGS) -classpath '' -bootclasspath $(here):$(srcdir) -d $(here) @libgcj.sourcelist
-@ONESTEP_TRUE@ find java gnu javax org -type d -o -type f -name '*.class' | \
-@ONESTEP_TRUE@ sed -e '/\/\./d' -e '/\/xlib/d' | \
-@ONESTEP_TRUE@ $(ZIP) cfM0E@ $@
+@ONESTEP_TRUE@ (find java gnu javax org -type d -o -type f -name '*.class'; \
+@ONESTEP_TRUE@ for file in $(all_property_files); do \
+@ONESTEP_TRUE@ echo "x-C" | sed -e 's/^.//'; \
+@ONESTEP_TRUE@ echo $(srcdir); \
+@ONESTEP_TRUE@ echo $$file; \
+@ONESTEP_TRUE@ done) | \
+@ONESTEP_TRUE@ sed -e '/\/xlib/d' -e '/\/\.libs/d' -e '/\/\.deps/d' | \
+@ONESTEP_TRUE@ $(ZIP) -cfM0E@ $@
# This next rule seems backward, but reflects the fact
# that 1) all classfiles are compiled in one go when the
@@ -23179,11 +23183,16 @@ $(lib_gnu_java_awt_peer_gtk_la_OBJECTS): $(lib_gnu_java_awt_peer_gtk_la_DEPENDEN
@ONESTEP_FALSE@.java.class:
@ONESTEP_FALSE@ $(JAVAC) $(JCFLAGS) -classpath '' -bootclasspath $(here):$(srcdir) -d $(here) $<
-@ONESTEP_FALSE@libgcj-@gcc_version@.jar: $(all_java_class_files)
+@ONESTEP_FALSE@libgcj-@gcc_version@.jar: $(all_java_class_files) $(all_property_files)
@ONESTEP_FALSE@ -@rm -f libgcj-@gcc_version@.jar
-@ONESTEP_FALSE@ find java gnu javax org -type d -o -type f -name '*.class' | \
-@ONESTEP_FALSE@ sed -e '/\/\./d' -e '/\/xlib/d' | \
-@ONESTEP_FALSE@ $(ZIP) cfM0E@ $@
+@ONESTEP_FALSE@ (find java gnu javax org -type d -o -type f -name '*.class'; \
+@ONESTEP_FALSE@ for file in $(all_property_files); do \
+@ONESTEP_FALSE@ echo "x-C" | sed -e 's/^.//'; \
+@ONESTEP_FALSE@ echo $(srcdir); \
+@ONESTEP_FALSE@ echo $$file; \
+@ONESTEP_FALSE@ done) | \
+@ONESTEP_FALSE@ sed -e '/\/xlib/d' -e '/\/\.libs/d' -e '/\/\.deps/d' | \
+@ONESTEP_FALSE@ $(ZIP) -cfM0E@ $@
mostlyclean-local:
find . -name '*.lo' -print | xargs $(LIBTOOL) rm -f
@@ -23208,6 +23217,13 @@ $(gtk_awt_peer_sources:.java=.lo): %.lo: %.java
gnu/gcj/runtime/StackTrace.lo: gnu/gcj/runtime/StackTrace.java
$(LTGCJCOMPILE) -fno-optimize-sibling-calls -o $@ -c $<
+libgcj.la: $(libgcj_la_OBJECTS) $(libgcj_la_DEPENDENCIES)
+ @echo Creating list of files to link...
+ @: $(call write_entries_to_file,$(libgcj_la_OBJECTS),libgcj.objectlist)
+ $(libgcj_la_LINK) -objectlist libgcj.objectlist \
+ $(libgcj_la_LIBADD) \
+ -rpath $(toolexeclibdir) $(libgcj_la_LDFLAGS) $(LIBS)
+
lib-gnu-awt-xlib.la: $(lib_gnu_awt_xlib_la_OBJECTS) $(lib_gnu_awt_xlib_la_DEPENDENCIES)
@echo Creating list of files to link...
@: $(call write_entries_to_file,$(lib_gnu_awt_xlib_la_OBJECTS) $(lib_gnu_awt_xlib_la_LIBADD),lib_gnu_awt_xlib.objectlist)
diff --git a/libjava/java/beans/Beans.java b/libjava/java/beans/Beans.java
index 7ee0522f823..96813d30b0d 100644
--- a/libjava/java/beans/Beans.java
+++ b/libjava/java/beans/Beans.java
@@ -39,10 +39,11 @@ exception statement from your version. */
package java.beans;
import gnu.java.io.ClassLoaderObjectInputStream;
-import java.io.InputStream;
+
+import java.applet.Applet;
import java.io.IOException;
+import java.io.InputStream;
import java.io.ObjectInputStream;
-import java.applet.Applet;
/**
* <code>Beans</code> provides some helper methods that allow the basic
diff --git a/libjava/java/beans/EventHandler.java b/libjava/java/beans/EventHandler.java
index e1cf6b97551..112fbe28021 100644
--- a/libjava/java/beans/EventHandler.java
+++ b/libjava/java/beans/EventHandler.java
@@ -38,7 +38,6 @@ exception statement from your version. */
package java.beans;
-import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -82,7 +81,7 @@ public class EventHandler implements InvocationHandler
private String property;
// String class doesn't already have a capitalize routine.
- final private String capitalize(String s)
+ private String capitalize(String s)
{
return s.substring(0, 1).toUpperCase() + s.substring(1);
}
diff --git a/libjava/java/beans/EventSetDescriptor.java b/libjava/java/beans/EventSetDescriptor.java
index 66bf8e559e3..b68916eb213 100644
--- a/libjava/java/beans/EventSetDescriptor.java
+++ b/libjava/java/beans/EventSetDescriptor.java
@@ -38,10 +38,11 @@ exception statement from your version. */
package java.beans;
+import gnu.java.lang.ClassHelper;
+
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Vector;
-import gnu.java.lang.ClassHelper;
/**
** EventSetDescriptor describes the hookup between an event source
diff --git a/libjava/java/beans/Introspector.java b/libjava/java/beans/Introspector.java
index b3f67c521ba..f9b95696ce3 100644
--- a/libjava/java/beans/Introspector.java
+++ b/libjava/java/beans/Introspector.java
@@ -41,9 +41,10 @@ package java.beans;
import gnu.java.beans.BeanInfoEmbryo;
import gnu.java.beans.ExplicitBeanInfo;
import gnu.java.beans.IntrospectionIncubator;
+import gnu.java.lang.ClassHelper;
+
import java.util.Hashtable;
import java.util.Vector;
-import gnu.java.lang.ClassHelper;
/**
* Introspector is the class that does the bulk of the
diff --git a/libjava/java/beans/PropertyEditorManager.java b/libjava/java/beans/PropertyEditorManager.java
index 85c9ba5d8dc..89c474f0b84 100644
--- a/libjava/java/beans/PropertyEditorManager.java
+++ b/libjava/java/beans/PropertyEditorManager.java
@@ -38,7 +38,6 @@ exception statement from your version. */
package java.beans;
-import gnu.java.lang.ClassHelper;
import gnu.java.beans.editors.ColorEditor;
import gnu.java.beans.editors.FontEditor;
import gnu.java.beans.editors.NativeBooleanEditor;
@@ -49,6 +48,8 @@ import gnu.java.beans.editors.NativeIntEditor;
import gnu.java.beans.editors.NativeLongEditor;
import gnu.java.beans.editors.NativeShortEditor;
import gnu.java.beans.editors.StringEditor;
+import gnu.java.lang.ClassHelper;
+
import java.awt.Color;
import java.awt.Font;
diff --git a/libjava/java/beans/beancontext/BeanContext.java b/libjava/java/beans/beancontext/BeanContext.java
index c996013e760..d23ee456266 100644
--- a/libjava/java/beans/beancontext/BeanContext.java
+++ b/libjava/java/beans/beancontext/BeanContext.java
@@ -38,12 +38,12 @@ exception statement from your version. */
package java.beans.beancontext;
-import java.util.Collection;
-import java.beans.Visibility;
import java.beans.DesignMode;
-import java.net.URL;
-import java.io.InputStream;
+import java.beans.Visibility;
import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Collection;
/**
* Acts as a container for sub-beans and as a sub-bean,
diff --git a/libjava/java/beans/beancontext/BeanContextChild.java b/libjava/java/beans/beancontext/BeanContextChild.java
index 4421273e8fd..acded069c14 100644
--- a/libjava/java/beans/beancontext/BeanContextChild.java
+++ b/libjava/java/beans/beancontext/BeanContextChild.java
@@ -39,8 +39,8 @@ exception statement from your version. */
package java.beans.beancontext;
import java.beans.PropertyChangeListener;
-import java.beans.VetoableChangeListener;
import java.beans.PropertyVetoException;
+import java.beans.VetoableChangeListener;
/**
* Beans implement this to get information about the execution environment and
diff --git a/libjava/java/beans/beancontext/BeanContextChildSupport.java b/libjava/java/beans/beancontext/BeanContextChildSupport.java
index 8cc17508e9e..c5d1387a25c 100644
--- a/libjava/java/beans/beancontext/BeanContextChildSupport.java
+++ b/libjava/java/beans/beancontext/BeanContextChildSupport.java
@@ -38,11 +38,11 @@ exception statement from your version. */
package java.beans.beancontext;
-import java.beans.PropertyChangeListener;
-import java.beans.VetoableChangeListener;
-import java.beans.PropertyVetoException;
import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
+import java.beans.PropertyVetoException;
+import java.beans.VetoableChangeListener;
import java.beans.VetoableChangeSupport;
import java.io.Serializable;
@@ -59,7 +59,6 @@ import java.io.Serializable;
* @since 1.2
* @see java.beans.beancontext.BeanContextChild
*/
-
public class BeanContextChildSupport
implements BeanContextChild, BeanContextServicesListener, Serializable
{
diff --git a/libjava/java/beans/beancontext/BeanContextMembershipEvent.java b/libjava/java/beans/beancontext/BeanContextMembershipEvent.java
index 0824b8dcb4c..129d0309e9a 100644
--- a/libjava/java/beans/beancontext/BeanContextMembershipEvent.java
+++ b/libjava/java/beans/beancontext/BeanContextMembershipEvent.java
@@ -1,5 +1,5 @@
/* java.beans.beancontext.BeanContextMembershipEvent
- Copyright (C) 1999 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,8 +38,8 @@ exception statement from your version. */
package java.beans.beancontext;
-import java.util.Collection;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Iterator;
/**
@@ -48,10 +48,9 @@ import java.util.Iterator;
* of the listener interface was called.
*
* @author John Keiser
- * @since JDK1.2
+ * @since 1.2
* @see java.beans.beancontext.BeanContextMembershipListener
*/
-
public class BeanContextMembershipEvent extends BeanContextEvent {
/**
* The children that were added or removed.
diff --git a/libjava/java/io/BufferedInputStream.java b/libjava/java/io/BufferedInputStream.java
index cd8e681ed1f..3faaa6591d4 100644
--- a/libjava/java/io/BufferedInputStream.java
+++ b/libjava/java/io/BufferedInputStream.java
@@ -61,6 +61,7 @@ package java.io;
*
* @author Aaron M. Renn (arenn@urbanophile.com)
* @author Warren Levy <warrenl@cygnus.com>
+ * @author Jeroen Frijters <jeroen@frijters.net>
*/
public class BufferedInputStream extends FilterInputStream
{
@@ -79,13 +80,13 @@ public class BufferedInputStream extends FilterInputStream
* The number of valid bytes currently in the buffer. It is also the index
* of the buffer position one byte past the end of the valid data.
*/
- protected int count = 0;
+ protected int count;
/**
* The index of the next character that will by read from the buffer.
* When <code>pos == count</code>, the buffer is empty.
*/
- protected int pos = 0;
+ protected int pos;
/**
* The value of <code>pos</code> when the <code>mark()</code> method was
@@ -100,7 +101,7 @@ public class BufferedInputStream extends FilterInputStream
* After this may bytes are read, the <code>reset()</code> method
* may not be called successfully.
*/
- protected int marklimit = 0;
+ protected int marklimit;
/**
* This is the maximum size we have to allocate for the mark buffer.
@@ -260,7 +261,7 @@ public class BufferedInputStream extends FilterInputStream
*/
public synchronized int read(byte[] b, int off, int len) throws IOException
{
- if (off < 0 || len < 0 || off + len > b.length)
+ if (off < 0 || len < 0 || b.length - off < len)
throw new IndexOutOfBoundsException();
if (pos >= count && !refill())
@@ -286,13 +287,13 @@ public class BufferedInputStream extends FilterInputStream
* passed when establishing the mark.
*
* @exception IOException If <code>mark()</code> was never called or more
- * then <code>markLimit</code> bytes were read since the last
+ * then <code>marklimit</code> bytes were read since the last
* call to <code>mark()</code>
*/
public synchronized void reset() throws IOException
{
- if (markpos < 0)
- throw new IOException();
+ if (markpos == -1)
+ throw new IOException(buf == null ? "Stream closed." : "Invalid mark.");
pos = markpos;
}
@@ -310,6 +311,9 @@ public class BufferedInputStream extends FilterInputStream
*/
public synchronized long skip(long n) throws IOException
{
+ if (buf == null)
+ throw new IOException("Stream closed.");
+
final long origN = n;
while (n > 0L)
@@ -332,14 +336,16 @@ public class BufferedInputStream extends FilterInputStream
}
/**
- * Called to refill the buffer (when count is equal or greater the pos).
- * Package local so BufferedReader can call it when needed.
+ * Called to refill the buffer (when count is equal to pos).
*
- * @return <code>true</code> when <code>buf</code> can be (partly) refilled,
- * <code>false</code> otherwise.
+ * @return <code>true</code> when at least one additional byte was read
+ * into <code>buf</code>, <code>false</code> otherwise (at EOF).
*/
boolean refill() throws IOException
{
+ if (buf == null)
+ throw new IOException("Stream closed.");
+
if (markpos < 0)
count = pos = 0;
else if (markpos > 0)
diff --git a/libjava/java/net/InetAddress.java b/libjava/java/net/InetAddress.java
index cf1f3a581fb..51bcf3ae6ec 100644
--- a/libjava/java/net/InetAddress.java
+++ b/libjava/java/net/InetAddress.java
@@ -35,9 +35,11 @@ this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
+
package java.net;
import gnu.classpath.Configuration;
+
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
@@ -49,12 +51,12 @@ import java.io.Serializable;
* constructor. Instead, new instances of this objects are created
* using the static methods getLocalHost(), getByName(), and
* getAllByName().
- * <p>
- * This class fulfills the function of the C style functions gethostname(),
+ *
+ * <p>This class fulfills the function of the C style functions gethostname(),
* gethostbyname(), and gethostbyaddr(). It resolves Internet DNS names
- * into their corresponding numeric addresses and vice versa.
+ * into their corresponding numeric addresses and vice versa.</p>
*
- * @author Aaron M. Renn <arenn@urbanophile.com>
+ * @author Aaron M. Renn (arenn@urbanophile.com)
* @author Per Bothner
*
* @specnote This class is not final since JK 1.4
@@ -71,7 +73,7 @@ public class InetAddress implements Serializable
private static final byte[] loopbackAddress = { 127, 0, 0, 1 };
private static final InetAddress loopback
- = new InetAddress (loopbackAddress, "localhost");
+ = new Inet4Address(loopbackAddress, "localhost");
private static InetAddress localhost = null;
@@ -79,12 +81,10 @@ public class InetAddress implements Serializable
{
// load the shared library needed for name resolution
if (Configuration.INIT_LOAD_LIBRARY)
- {
- System.loadLibrary ("javanet");
- }
+ System.loadLibrary("javanet");
byte[] zeros = { 0, 0, 0, 0 };
- ANY_IF = new InetAddress (zeros, "0.0.0.0");
+ ANY_IF = new Inet4Address(zeros, "0.0.0.0");
}
/**
@@ -119,27 +119,15 @@ public class InetAddress implements Serializable
* only by static methods in this class.
*
* @param ipaddr The IP number of this address as an array of bytes
- */
- InetAddress(byte[] address)
- {
- this (address, null);
- }
-
- /**
- * Initializes this object's addr instance variable from the passed in
- * int array. Note that this constructor is protected and is called
- * only by static methods in this class.
- *
- * @param ipaddr The IP number of this address as an array of bytes
* @param hostname The hostname of this IP address.
*/
- InetAddress(byte[] address, String hostname)
+ InetAddress(byte[] ipaddr, String hostname)
{
- addr = address;
+ addr = ipaddr;
hostName = hostname;
- if (address != null)
- family = getFamily (address);
+ if (ipaddr != null)
+ family = getFamily(ipaddr);
}
/**
@@ -304,9 +292,12 @@ public class InetAddress implements Serializable
*/
public String getHostName()
{
- if (hostName == null)
- lookup (null, this, false);
+ if (hostName != null)
+ return hostName;
+ // Lookup hostname and set field.
+ lookup (null, this, false);
+
return hostName;
}
@@ -422,13 +413,13 @@ public class InetAddress implements Serializable
for ( ; ; )
{
- sb.append (addr [i] & 0xff);
- i++;
+ sb.append(addr[i] & 0xff);
+ i++;
- if (i == len)
- break;
+ if (i == len)
+ break;
- sb.append ('.');
+ sb.append('.');
}
return sb.toString();
diff --git a/libjava/java/net/URLClassLoader.java b/libjava/java/net/URLClassLoader.java
index 064114989fd..b991be8addf 100644
--- a/libjava/java/net/URLClassLoader.java
+++ b/libjava/java/net/URLClassLoader.java
@@ -858,7 +858,7 @@ public class URLClassLoader extends SecureClassLoader
// Just try to read it in all at once
data = new byte[length];
int pos = 0;
- while(length - pos > 0)
+ while (length - pos > 0)
{
int len = in.read(data, pos, length - pos);
if (len == -1)
@@ -872,7 +872,7 @@ public class URLClassLoader extends SecureClassLoader
// We don't know the data length.
// Have to read it in chunks.
ByteArrayOutputStream out = new ByteArrayOutputStream(4096);
- byte b[] = new byte[4096];
+ byte[] b = new byte[4096];
int l = 0;
while (l != -1)
{
diff --git a/libjava/java/net/URLConnection.java b/libjava/java/net/URLConnection.java
index 4bf52b860cd..3b3355cc11e 100644
--- a/libjava/java/net/URLConnection.java
+++ b/libjava/java/net/URLConnection.java
@@ -35,6 +35,7 @@ this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
+
package java.net;
import java.io.IOException;
@@ -87,8 +88,8 @@ import gnu.gcj.io.MimeTypes;
* by the actual content handlers as described in the description of that
* method.
*
- * @author Aaron M. Renn <arenn@urbanophile.com>
- * @author Warren Levy <warrenl@cygnus.com>
+ * @author Aaron M. Renn (arenn@urbanophile.com)
+ * @author Warren Levy (warrenl@cygnus.com)
*/
public abstract class URLConnection
{
@@ -370,7 +371,7 @@ public abstract class URLConnection
{
if (! dateformats_initialized)
initializeDateFormats();
-
+
if (position == null)
position = new ParsePosition(0);
@@ -411,23 +412,29 @@ public abstract class URLConnection
}
/**
- * This method returns the content of the document pointed to by the URL
- * as an Object. The type of object depends on the MIME type of the
- * object and particular content hander loaded. Most text type content
- * handlers will return a subclass of InputStream. Images usually return
- * a class that implements ImageProducer. There is not guarantee what
- * type of object will be returned, however.
- * <p>
- * This class first determines the MIME type of the content, then creates
- * a ContentHandler object to process the input. If the ContentHandlerFactory
- * is set, then that object is called to load a content handler, otherwise
- * a class called gnu.java.net.content.&lt;content_type&gt; is tried.
- * The default class will also be used if the content handler factory returns
- * a null content handler.
- *
- * @exception IOException If an error occurs
+ * This method returns the content of the document pointed to by the
+ * URL as an Object. The type of object depends on the MIME type of
+ * the object and particular content hander loaded. Most text type
+ * content handlers will return a subclass of
+ * <code>InputStream</code>. Images usually return a class that
+ * implements <code>ImageProducer</code>. There is not guarantee
+ * what type of object will be returned, however.
+ *
+ * <p>This class first determines the MIME type of the content, then
+ * creates a ContentHandler object to process the input. If the
+ * <code>ContentHandlerFactory</code> is set, then that object is
+ * called to load a content handler, otherwise a class called
+ * gnu.java.net.content.&lt;content_type&gt; is tried. If this
+ * handler does not exist, the method will simple return the
+ * <code>InputStream</code> returned by
+ * <code>getInputStream()</code>. Note that the default
+ * implementation of <code>getInputStream()</code> throws a
+ * <code>UnknownServiceException</code> so subclasses are encouraged
+ * to override this method.</p>
+ *
+ * @exception IOException If an error with the connection occurs.
* @exception UnknownServiceException If the protocol does not support the
- * content type
+ * content type at all.
*/
public Object getContent() throws IOException
{
@@ -441,10 +448,10 @@ public abstract class URLConnection
String type = getContentType();
ContentHandler ch = getContentHandler(type);
- if (ch == null)
- return getInputStream();
+ if (ch != null)
+ return ch.getContent(this);
- return ch.getContent(this);
+ return getInputStream();
}
/**
@@ -888,20 +895,20 @@ public abstract class URLConnection
*/
public static String guessContentTypeFromName(String filename)
{
- int dot = filename.lastIndexOf (".");
+ int dot = filename.lastIndexOf(".");
if (dot != -1)
{
if (dot == filename.length())
- return ("application/octet-stream");
+ return "application/octet-stream";
else
- filename = filename.substring (dot + 1);
+ filename = filename.substring(dot + 1);
}
- String type = MimeTypes.getMimeTypeFromExtension (filename);
+ String type = MimeTypes.getMimeTypeFromExtension(filename);
if (type == null)
- return("application/octet-stream");
+ return"application/octet-stream";
return type;
}
@@ -957,7 +964,7 @@ public abstract class URLConnection
*/
public static void setFileNameMap(FileNameMap map)
{
- // Throw an exception if an extant security mgr precludes
+ // Throw an exception if an extant security manager precludes
// setting the factory.
SecurityManager s = System.getSecurityManager();
if (s != null)
@@ -968,12 +975,12 @@ public abstract class URLConnection
private ContentHandler getContentHandler(String contentType)
{
- ContentHandler handler;
-
// No content type so just handle it as the default.
if (contentType == null || contentType.equals(""))
return null;
+ ContentHandler handler;
+
// See if a handler has been cached for this content type.
// For efficiency, if a content type has been searched for but not
// found, it will be in the hash table but as the contentType String
@@ -1039,7 +1046,7 @@ public abstract class URLConnection
}
// Update the hashtable with the new content handler.
- if (handler != null && handler instanceof ContentHandler)
+ if (handler instanceof ContentHandler)
{
handlers.put(contentType, handler);
return handler;
diff --git a/libjava/java/text/MessageFormat.java b/libjava/java/text/MessageFormat.java
index b123412554d..1c681795fa1 100644
--- a/libjava/java/text/MessageFormat.java
+++ b/libjava/java/text/MessageFormat.java
@@ -165,7 +165,7 @@ public class MessageFormat extends Format
super("");
}
- private Field(String s)
+ protected Field(String s)
{
super(s);
}
diff --git a/libjava/javax/crypto/MacSpi.java b/libjava/javax/crypto/MacSpi.java
index 4d63b6a8efc..d96182a917d 100644
--- a/libjava/javax/crypto/MacSpi.java
+++ b/libjava/javax/crypto/MacSpi.java
@@ -52,7 +52,7 @@ import java.security.spec.AlgorithmParameterSpec;
* then provide an entry pointing to this implementation in the master
* {@link java.security.Provider} class.
*
- * <p>Implemetations may optionally implement the {@link
+ * <p>Implementations may optionally implement the {@link
* java.lang.Cloneable} interface.
*
* @author Casey Marshall (csm@gnu.org)
diff --git a/libjava/jni.cc b/libjava/jni.cc
index 7943fe0ef04..e9e557a3645 100644
--- a/libjava/jni.cc
+++ b/libjava/jni.cc
@@ -1883,8 +1883,7 @@ _Jv_JNI_RegisterNatives (JNIEnv *env, jclass klass,
if (! strcmp (self->name->chars (), methods[j].name)
&& ! strcmp (self->signature->chars (), methods[j].signature))
{
- if (! (self->accflags
- & java::lang::reflect::Modifier::NATIVE))
+ if (! (self->accflags & java::lang::reflect::Modifier::NATIVE))
break;
// Found a match that is native.
@@ -1900,7 +1899,7 @@ _Jv_JNI_RegisterNatives (JNIEnv *env, jclass klass,
jstring m = JvNewStringUTF (methods[j].name);
try
{
- env->ex =new java::lang::NoSuchMethodError (m);
+ env->ex = new java::lang::NoSuchMethodError (m);
}
catch (jthrowable t)
{
diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog
index 232da9cadb4..3c8017a4767 100644
--- a/libobjc/ChangeLog
+++ b/libobjc/ChangeLog
@@ -1,3 +1,13 @@
+2004-09-16 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR libobjc/16448
+ * exception.c: Include config.h
+ (objc_exception_throw): Change _GLIBCXX_SJLJ_EXCEPTIONS to
+ SJLJ_EXCEPTIONS.
+ * configure.ac: Find out what exception handling code we use.
+ * configure: Regenerate.
+ * config.h.in: New file, regenerate.
+
2004-09-16 Andrew Pinski <apinski@apple.com>
* encoding.c (ALTIVEC_VECTOR_MODE): Define a bogus macro.
diff --git a/libobjc/configure b/libobjc/configure
index d67cd6a2014..6a440186d84 100755
--- a/libobjc/configure
+++ b/libobjc/configure
@@ -843,6 +843,8 @@ Optional Features:
--enable-static=PKGS build static libraries default=yes
--enable-fast-install=PKGS optimize for fast installation default=yes
--disable-libtool-lock avoid locking (might break parallel builds)
+ --enable-sjlj-exceptions
+ force use of builtin_setjmp for exceptions
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -953,7 +955,7 @@ esac
else
echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi
- cd "$ac_popdir"
+ cd $ac_popdir
done
fi
@@ -1536,6 +1538,7 @@ esac
+
# Export source directory.
# These need to be absolute paths, yet at the same time need to
# canonicalize only relative paths, because then amd will not unmount
@@ -1596,6 +1599,9 @@ esac
+ ac_config_headers="$ac_config_headers config.h"
+
+
# --------
# Programs
# --------
@@ -2209,7 +2215,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2267,7 +2274,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2383,7 +2391,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2437,7 +2446,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2482,7 +2492,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2526,7 +2537,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3632,7 +3644,7 @@ test x"$pic_mode" = xno && libtool_flags="$libtool_flags --prefer-non-pic"
case $host in
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 3635 "configure"' > conftest.$ac_ext
+ echo '#line 3647 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
@@ -3779,7 +3791,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4241,7 +4254,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4411,7 +4425,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4474,7 +4489,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4631,7 +4647,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4798,7 +4815,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4940,6 +4958,75 @@ echo "${ECHO_T}$objc_cv_gthread_flags" >&6
GTHREAD_FLAGS=$objc_cv_gthread_flags
+echo "$as_me:$LINENO: checking for exception model to use" >&5
+echo $ECHO_N "checking for exception model to use... $ECHO_C" >&6
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+# Check whether --enable-sjlj-exceptions or --disable-sjlj-exceptions was given.
+if test "${enable_sjlj_exceptions+set}" = set; then
+ enableval="$enable_sjlj_exceptions"
+ :
+else
+ cat > conftest.$ac_ext << EOF
+#line 4975 "configure"
+@interface Frob
+@end
+@implementation Frob
+@end
+int proc();
+int foo()
+{
+ @try {
+ return proc();
+ }
+ @catch (Frob* ex) {
+ return 0;
+ }
+}
+EOF
+old_CFLAGS="$CFLAGS"
+CFLAGS="-x objective-c -fgnu-runtime -fobjc-exceptions -S"
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
+ enable_sjlj_exceptions=yes
+ elif grep _Unwind_Resume conftest.s >/dev/null 2>&1 ; then
+ enable_sjlj_exceptions=no
+ fi
+fi
+CFLAGS="$old_CFLAGS"
+rm -f conftest*
+fi;
+if test x$enable_sjlj_exceptions = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define SJLJ_EXCEPTIONS 1
+_ACEOF
+
+ ac_exception_model_name=sjlj
+elif test x$enable_sjlj_exceptions = xno; then
+ ac_exception_model_name="call frame"
+else
+ { { echo "$as_me:$LINENO: error: unable to detect exception model" >&5
+echo "$as_me: error: unable to detect exception model" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+echo "$as_me:$LINENO: result: $ac_exception_model_name" >&5
+echo "${ECHO_T}$ac_exception_model_name" >&6
+
# ------
# Output
# ------
@@ -5024,38 +5111,7 @@ s/^[^=]*=[ ]*$//;
}'
fi
-# Transform confdefs.h into DEFS.
-# Protect against shell expansion while executing Makefile rules.
-# Protect against Makefile macro expansion.
-#
-# 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
-
+DEFS=-DHAVE_CONFIG_H
ac_libobjs=
ac_ltlibobjs=
@@ -5389,10 +5445,15 @@ Usage: $0 [OPTIONS] [FILE]...
--recheck update $as_me by reconfiguring in the same conditions
--file=FILE[:TEMPLATE]
instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
Configuration files:
$config_files
+Configuration headers:
+$config_headers
+
Configuration commands:
$config_commands
@@ -5522,6 +5583,7 @@ do
# Handling of arguments.
"Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
"default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
*) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
{ (exit 1); exit 1; }; };;
@@ -5534,6 +5596,7 @@ done
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
fi
@@ -5819,6 +5882,11 @@ esac
*) ac_INSTALL=$ac_top_builddir$INSTALL ;;
esac
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
# Let's still pretend it is `configure' which instantiates (i.e., don't
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
@@ -5857,12 +5925,6 @@ echo "$as_me: error: cannot find input file: $f" >&2;}
fi;;
esac
done` || { (exit 1); exit 1; }
-
- if test x"$ac_file" != x-; then
- { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
- rm -f "$ac_file"
- fi
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF
sed "$ac_vpsub
@@ -5895,6 +5957,229 @@ _ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF
#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
# CONFIG_COMMANDS section.
#
for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
diff --git a/libobjc/configure.ac b/libobjc/configure.ac
index b3c12cea40c..6c6b4309b63 100644
--- a/libobjc/configure.ac
+++ b/libobjc/configure.ac
@@ -167,6 +167,8 @@ esac
AC_SUBST(includedirname)
AC_SUBST(libext)
+AC_CONFIG_HEADERS(config.h)
+
# --------
# Programs
# --------
@@ -228,6 +230,60 @@ fi])
GTHREAD_FLAGS=$objc_cv_gthread_flags
AC_SUBST(GTHREAD_FLAGS)
+AC_MSG_CHECKING([for exception model to use])
+AC_LANG_PUSH(C)
+AC_ARG_ENABLE(sjlj-exceptions,
+ AS_HELP_STRING([--enable-sjlj-exceptions],
+ [force use of builtin_setjmp for exceptions]),
+[:],
+[dnl Botheration. Now we've got to detect the exception model.
+dnl Link tests against libgcc.a are problematic since -- at least
+dnl as of this writing -- we've not been given proper -L bits for
+dnl single-tree newlib and libgloss.
+dnl
+dnl This is what AC_TRY_COMPILE would do if it didn't delete the
+dnl conftest files before we got a change to grep them first.
+cat > conftest.$ac_ext << EOF
+[#]line __oline__ "configure"
+@interface Frob
+@end
+@implementation Frob
+@end
+int proc();
+int foo()
+{
+ @try {
+ return proc();
+ }
+ @catch (Frob* ex) {
+ return 0;
+ }
+}
+EOF
+old_CFLAGS="$CFLAGS"
+dnl work around that we don't have Objective-C support in autoconf
+CFLAGS="-x objective-c -fgnu-runtime -fobjc-exceptions -S"
+if AC_TRY_EVAL(ac_compile); then
+ if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
+ enable_sjlj_exceptions=yes
+ elif grep _Unwind_Resume conftest.s >/dev/null 2>&1 ; then
+ enable_sjlj_exceptions=no
+ fi
+fi
+CFLAGS="$old_CFLAGS"
+rm -f conftest*])
+if test x$enable_sjlj_exceptions = xyes; then
+ AC_DEFINE(SJLJ_EXCEPTIONS, 1,
+ [Define if the compiler is configured for setjmp/longjmp exceptions.])
+ ac_exception_model_name=sjlj
+elif test x$enable_sjlj_exceptions = xno; then
+ ac_exception_model_name="call frame"
+else
+ AC_MSG_ERROR([unable to detect exception model])
+fi
+AC_LANG_POP(C)
+AC_MSG_RESULT($ac_exception_model_name)
+
# ------
# Output
# ------
diff --git a/libobjc/exception.c b/libobjc/exception.c
index d788c412ace..cfce70c51e3 100644
--- a/libobjc/exception.c
+++ b/libobjc/exception.c
@@ -25,6 +25,7 @@ Boston, MA 02111-1307, USA. */
executable file might be covered by the GNU General Public License. */
#include <stdlib.h>
+#include "config.h"
#include "objc/objc-api.h"
#include "unwind.h"
#include "unwind-pe.h"
@@ -356,7 +357,7 @@ objc_exception_throw (id value)
header->base.exception_cleanup = __objc_exception_cleanup;
header->value = value;
-#ifdef _GLIBCXX_SJLJ_EXCEPTIONS
+#ifdef SJLJ_EXCEPTIONS
_Unwind_SjLj_RaiseException (&header->base);
#else
_Unwind_RaiseException (&header->base);
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index a262ee388ca..88bd3a75768 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,79 @@
+2004-10-01 Paolo Carlini <pcarlini@suse.de>
+
+ * include/bits/sstream.tcc (seekpos): Minor rearrangement of two
+ conditionals consistently with seekoff.
+ * include/std/std_sstream.h (setbuf): Avoid a string temporary.
+ (_M_sync): Simplify a bit, clean-up comment.
+
+2004-09-30 Paolo Carlini <pcarlini@suse.de>
+
+ PR libstdc++/10975 (DR 453)
+ * include/bits/sstream.tcc (seekoff): Don't fail if __beg == 0
+ and __off == 0.
+ * docs/html/ext/howto.html: Add an entry for DR 453.
+ * testsuite/27_io/basic_stringbuf/seekoff/char/10975.cc: New.
+ * testsuite/27_io/basic_stringbuf/seekoff/wchar_t/10975.cc: Likewise.
+ * testsuite/27_io/basic_istream/tellg/char/1.cc: Tweak consistently.
+ * testsuite/27_io/basic_ostream/tellp/char/1.cc: Likewise.
+ * testsuite/27_io/basic_ostream/tellp/char/2.cc: Likewise.
+ * testsuite/27_io/basic_istream/seekg/char/2346-fstream.cc: Fix and
+ move to...
+ * testsuite/27_io/basic_istream/seekp/char/2346-fstream.cc: ... here.
+ * testsuite/27_io/basic_istream/seekg/char/2346-sstream.cc: Fix and
+ move to...
+ * testsuite/27_io/basic_istream/seekp/char/2346-sstream.cc: ... here.
+
+2004-09-29 Paolo Carlini <pcarlini@suse.de>
+
+ * include/std/std_sstream.h (basic_stringbuf(ios_base::openmode)):
+ Don't use _M_stringbuf_init, keep the pointers null, per 27.7.1.1.
+ (str()): Slightly tweak, protect from pptr() == 0.
+ (_M_update_egptr()): Likewise.
+ * include/bits/sstream.tcc (ssekoff, seekpos): In order to check
+ for an empty buffer use __beg instead of _M_string.capacity().
+ * testsuite/27_io/basic_stringbuf/cons/char/1.cc: New.
+ * testsuite/27_io/basic_stringbuf/cons/wchar_t/1.cc: Likewise.
+
+ * testsuite/27_io/basic_filebuf/cons/char/1.cc: New.
+ * testsuite/27_io/basic_filebuf/cons/wchar_t/1.cc: Likewise.
+ * testsuite/27_io/basic_streambuf/cons/char/1.cc: Update.
+ * testsuite/27_io/basic_streambuf/cons/wchar_t/1.cc: Likewise.
+
+2004-09-29 Paolo Carlini <pcarlini@suse.de>
+ Benjamin Kosnik <bkoz@redhat.com>
+
+ * testsuite/testsuite_io.h (class constraint_buf): New, extended
+ and templatized version of constraint_filebuf; add typedefs for
+ streambuf/stringbuf/filebuf and wchar_t counterparts.
+
+2004-09-28 Paolo Carlini <pcarlini@suse.de>
+
+ PR libstdc++/16612
+ * include/bits/basic_string.h (_M_dispose, _M_refcopy,
+ basic_string()): When _GLIBCXX_FULLY_DYNAMIC_STRING is defined,
+ don't deal with _S_empty_rep.
+ * include/bits/basic_string.tcc (_S_construct, _M_destroy,
+ _M_leak_hard, _M_mutate): Likewise.
+ * acinclude.m4 (GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING): New.
+ * acconfig.h: Add corresponding undef.
+ * configure.ac: Use GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING.
+ * docs/html/configopts.html: Document --enable-fully-dynamic-string.
+ * configure: Regenerate.
+ * config.h.in: Likewise.
+
+2004-09-28 Benjamin Kosnik <bkoz@redhat.com>
+ Paolo Carlini <pcarlini@suse.de>
+
+ * testsuite/21_strings/basic_string/operations/char/1.cc: New.
+ * testsuite/21_strings/basic_string/operations/wchar_t/1.cc: New.
+ * testsuite/21_strings/basic_string/element_access/char/empty.cc: New.
+ * testsuite/21_strings/basic_string/element_access/wchar_t/empty.cc:
+ New.
+
+2004-09-28 Paolo Carlini <pcarlini@suse.de>
+
+ * README: Remove obsolete entry about include/c_shadow.
+
2004-09-24 H.J. Lu <hongjiu.lu@intel.com>
PR libstdc++/17469
diff --git a/libstdc++-v3/README b/libstdc++-v3/README
index 6844909a1cf..1064095fba7 100644
--- a/libstdc++-v3/README
+++ b/libstdc++-v3/README
@@ -35,13 +35,6 @@ It has subdirectories:
names into the std:: namespace.
[NB: this is the default, and is the same as --enable-cheaders=c_std]
- include/c_shadow
- Headers intended to shadow standard C headers provided by an
- underlying OS or C library, and other headers depended on directly
- by C++ headers (e.g. unistd.h). These are meant to wrap the names
- defined there into the _C_legacy namespace.
- [NB: this can be enabled via --enable-cheaders=c_shadow]
-
include/bits
Files included by standard headers and by other files in
the bits directory.
diff --git a/libstdc++-v3/acconfig.h b/libstdc++-v3/acconfig.h
index c2a96c2248b..cffecbd172f 100644
--- a/libstdc++-v3/acconfig.h
+++ b/libstdc++-v3/acconfig.h
@@ -45,6 +45,9 @@
// Define if LFS support is available.
#undef _GLIBCXX_USE_LFS
+// Define if a fully dynamic basic_string is wanted.
+#undef _GLIBCXX_FULLY_DYNAMIC_STRING
+
// Define if NLS translations are to be used.
#undef _GLIBCXX_USE_NLS
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 6e531007cac..6c9f13aa185 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -594,6 +594,25 @@ AC_DEFUN([GLIBCXX_CHECK_LFS], [
dnl
+dnl Check for whether a fully dynamic basic_string implementation should
+dnl be turned on, that does not put empty objects in per-process static
+dnl memory (mostly useful together with shared memory allocators, see PR
+dnl libstdc++/16612 for details).
+dnl
+dnl --enable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING
+dnl --disable-fully-dynamic-string leaves _GLIBCXX_FULLY_DYNAMIC_STRING undefined
+dnl + Usage: GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING[(DEFAULT)]
+dnl Where DEFAULT is either `yes' or `no'.
+dnl
+AC_DEFUN([GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING], [
+ GLIBCXX_ENABLE(fully-dynamic-string,$1,,[do not put empty strings in per-process static memory])
+ if test $enable_fully_dynamic_string = yes; then
+ AC_DEFINE(_GLIBCXX_FULLY_DYNAMIC_STRING)
+ fi
+])
+
+
+dnl
dnl Does any necessary configuration of the testsuite directory. Generates
dnl the testsuite_hooks.h header.
dnl
diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in
index ecb29eb35db..acb7d732abc 100644
--- a/libstdc++-v3/config.h.in
+++ b/libstdc++-v3/config.h.in
@@ -46,6 +46,9 @@
// Define if LFS support is available.
#undef _GLIBCXX_USE_LFS
+// Define if a fully dynamic basic_string is wanted.
+#undef _GLIBCXX_FULLY_DYNAMIC_STRING
+
// Define if NLS translations are to be used.
#undef _GLIBCXX_USE_NLS
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index 92492dbe5e5..f19e56b5dd2 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -884,6 +884,9 @@ Optional Features:
--enable-cxx-flags=FLAGS
pass compiler FLAGS when building library
[default=]
+ --enable-fully-dynamic-string
+ do not put empty strings in per-process static
+ memory [default=no]
--enable-symvers=STYLE enables symbol versioning of the shared library
[default=yes]
--enable-version-specific-runtime-libs
@@ -4394,7 +4397,7 @@ test x"$pic_mode" = xno && libtool_flags="$libtool_flags --prefer-non-pic"
case $host in
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 4397 "configure"' > conftest.$ac_ext
+ echo '#line 4400 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
@@ -5015,7 +5018,7 @@ fi;
#
# Fake what AC_TRY_COMPILE does. XXX Look at redoing this new-style.
cat > conftest.$ac_ext << EOF
-#line 5018 "configure"
+#line 5021 "configure"
struct S { ~S(); };
void bar();
void foo()
@@ -7841,6 +7844,29 @@ echo "${ECHO_T}$EXTRA_CXX_FLAGS" >&6
+ # Check whether --enable-fully-dynamic-string or --disable-fully-dynamic-string was given.
+if test "${enable_fully_dynamic_string+set}" = set; then
+ enableval="$enable_fully_dynamic_string"
+
+ case "$enableval" in
+ yes|no) ;;
+ *) { { echo "$as_me:$LINENO: error: Argument to enable/disable fully-dynamic-string must be yes or no" >&5
+echo "$as_me: error: Argument to enable/disable fully-dynamic-string must be yes or no" >&2;}
+ { (exit 1); exit 1; }; } ;;
+ esac
+
+else
+ enable_fully_dynamic_string=no
+fi;
+
+ if test $enable_fully_dynamic_string = yes; then
+ cat >>confdefs.h <<\_ACEOF
+#define _GLIBCXX_FULLY_DYNAMIC_STRING 1
+_ACEOF
+
+ fi
+
+
# No surprises, no surprises...
if test $atomicity_dir = cpu/generic ; then
{ echo "$as_me:$LINENO: WARNING: No native atomic operations are provided for this platform." >&5
diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac
index 279a5f0f02d..7c1d1936104 100644
--- a/libstdc++-v3/configure.ac
+++ b/libstdc++-v3/configure.ac
@@ -94,6 +94,7 @@ GLIBCXX_ENABLE_CONCEPT_CHECKS([no])
GLIBCXX_ENABLE_DEBUG_FLAGS(["-g3 -O0"])
GLIBCXX_ENABLE_DEBUG([no])
GLIBCXX_ENABLE_CXX_FLAGS
+GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING([no])
# No surprises, no surprises...
if test $atomicity_dir = cpu/generic ; then
diff --git a/libstdc++-v3/docs/html/configopts.html b/libstdc++-v3/docs/html/configopts.html
index 8ef9c42eb5d..2c84e969a05 100644
--- a/libstdc++-v3/docs/html/configopts.html
+++ b/libstdc++-v3/docs/html/configopts.html
@@ -144,9 +144,8 @@ options</a></h1>
<dt><code>--enable-cheaders=OPTION </code></dt>
<dd><p>This allows the user to define what kind of C headers are
- used. Options are: c, c_std, and c_shadow. These correspond
- to the source directory's include/c, include/c_std, and
- include/c_shadow directories. The default is c_std.
+ used. Options are c and c_std. These correspond to the source
+ directory's include/c and include/c_std. The default is c_std.
</p>
</dd>
@@ -261,6 +260,14 @@ options</a></h1>
</p>
</dd>
+ <dt><code>--enable-fully-dynamic-string </code></dt>
+ <dd><p>This option enables a special version of basic_string avoiding
+ the optimization that allocates empty objects in static memory.
+ Mostly useful together with shared memory allocators, see PR
+ libstdc++/16612 for details.
+ </p>
+ </dd>
+
<dt><code>--enable-concept-checks </code></dt>
<dd><p>This turns on additional compile-time checks for instantiated
library templates, in the form of specialized templates,
diff --git a/libstdc++-v3/docs/html/ext/howto.html b/libstdc++-v3/docs/html/ext/howto.html
index 5670c469768..5b4a69fb1f7 100644
--- a/libstdc++-v3/docs/html/ext/howto.html
+++ b/libstdc++-v3/docs/html/ext/howto.html
@@ -496,6 +496,12 @@
</dt>
<dd>Replace &quot;new&quot; with &quot;::new&quot;.
</dd>
+
+ <dt><a href="lwg-active.html#453">453</a>:
+ <em>basic_stringbuf::seekoff need not always fail for an empty stream</em>
+ </dt>
+ <dd>Don't fail if the next pointer is null and newoff is zero.
+ </dd>
<!--
<dt><a href="lwg-defects.html#"></a>:
<em></em>
diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h
index 7e6c669bd0b..1e79da4b4bd 100644
--- a/libstdc++-v3/include/bits/basic_string.h
+++ b/libstdc++-v3/include/bits/basic_string.h
@@ -211,7 +211,9 @@ namespace std
void
_M_dispose(const _Alloc& __a)
{
+#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
if (__builtin_expect(this != &_S_empty_rep(), false))
+#endif
if (__gnu_cxx::__exchange_and_add(&this->_M_refcount, -1) <= 0)
_M_destroy(__a);
} // XXX MT
@@ -222,7 +224,9 @@ namespace std
_CharT*
_M_refcopy() throw()
{
+#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
if (__builtin_expect(this != &_S_empty_rep(), false))
+#endif
__gnu_cxx::__atomic_add(&this->_M_refcount, 1);
return _M_refdata();
} // XXX MT
@@ -1957,11 +1961,14 @@ namespace std
size_type __n2) const;
};
-
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>::
basic_string()
+#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
: _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { }
+#else
+ : _M_dataplus(_S_construct(size_type(), _CharT(), _Alloc()), _Alloc()) { }
+#endif
// operator+
/**
diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc
index 7d27aab970c..49b6362e790 100644
--- a/libstdc++-v3/include/bits/basic_string.tcc
+++ b/libstdc++-v3/include/bits/basic_string.tcc
@@ -88,8 +88,10 @@ namespace std
_S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
input_iterator_tag)
{
+#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
if (__beg == __end && __a == _Alloc())
return _S_empty_rep()._M_refdata();
+#endif
// Avoid reallocation for common case.
_CharT __buf[128];
size_type __len = 0;
@@ -134,11 +136,12 @@ namespace std
_S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
forward_iterator_tag)
{
+#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
if (__beg == __end && __a == _Alloc())
return _S_empty_rep()._M_refdata();
-
+#endif
// NB: Not required, but considered best practice.
- if (__builtin_expect(__is_null_pointer(__beg), 0))
+ if (__builtin_expect(__is_null_pointer(__beg) && __beg != __end, 0))
__throw_logic_error(__N("basic_string::_S_construct NULL not valid"));
const size_type __dnew = static_cast<size_type>(std::distance(__beg,
@@ -162,9 +165,10 @@ namespace std
basic_string<_CharT, _Traits, _Alloc>::
_S_construct(size_type __n, _CharT __c, const _Alloc& __a)
{
+#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
if (__n == 0 && __a == _Alloc())
return _S_empty_rep()._M_refdata();
-
+#endif
// Check for out_of_range and length_error exceptions.
_Rep* __r = _Rep::_S_create(__n, size_type(0), __a);
if (__n)
@@ -358,8 +362,10 @@ namespace std
basic_string<_CharT, _Traits, _Alloc>::_Rep::
_M_destroy(const _Alloc& __a) throw ()
{
+#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
if (this == &_S_empty_rep())
- return;
+ return;
+#endif
const size_type __size = sizeof(_Rep_base) +
(this->_M_capacity + 1) * sizeof(_CharT);
_Raw_bytes_alloc(__a).deallocate(reinterpret_cast<char*>(this), __size);
@@ -369,8 +375,10 @@ namespace std
void
basic_string<_CharT, _Traits, _Alloc>::_M_leak_hard()
{
+#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
if (_M_rep() == &_S_empty_rep())
- return;
+ return;
+#endif
if (_M_rep()->_M_is_shared())
_M_mutate(0, 0, 0);
_M_rep()->_M_set_leaked();
@@ -385,8 +393,12 @@ namespace std
const size_type __new_size = __old_size + __len2 - __len1;
const size_type __how_much = __old_size - __pos - __len1;
+#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
if (_M_rep() == &_S_empty_rep()
|| _M_rep()->_M_is_shared() || __new_size > capacity())
+#else
+ if (_M_rep()->_M_is_shared() || __new_size > capacity())
+#endif
{
// Must reallocate.
const allocator_type __a = get_allocator();
diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config
index 09f6d2cf511..939aed87596 100644
--- a/libstdc++-v3/include/bits/c++config
+++ b/libstdc++-v3/include/bits/c++config
@@ -35,7 +35,7 @@
#include <bits/os_defines.h>
// The current version of the C++ library in compressed ISO date format.
-#define __GLIBCXX__ 20040927
+#define __GLIBCXX__ 20041001
// Allow use of "export template." This is currently not a feature
// that g++ supports.
diff --git a/libstdc++-v3/include/bits/sstream.tcc b/libstdc++-v3/include/bits/sstream.tcc
index 137d6b3fff7..19a24bf0f18 100644
--- a/libstdc++-v3/include/bits/sstream.tcc
+++ b/libstdc++-v3/include/bits/sstream.tcc
@@ -123,6 +123,7 @@ namespace std
{
// Update egptr() to match the actual string end.
_M_update_egptr();
+
if (this->gptr() < this->egptr())
__ret = traits_type::to_int_type(*this->gptr());
}
@@ -141,10 +142,11 @@ namespace std
__testin &= !(__mode & ios_base::out);
__testout &= !(__mode & ios_base::in);
- if (_M_string.capacity() && (__testin || __testout || __testboth))
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 453. basic_stringbuf::seekoff need not always fail for an empty stream.
+ const char_type* __beg = __testin ? this->eback() : this->pbase();
+ if ((__beg || !__off) && (__testin || __testout || __testboth))
{
- char_type* __beg = __testin ? this->eback() : this->pbase();
-
_M_update_egptr();
off_type __newoffi = __off;
@@ -181,18 +183,18 @@ namespace std
seekpos(pos_type __sp, ios_base::openmode __mode)
{
pos_type __ret = pos_type(off_type(-1));
- if (_M_string.capacity())
- {
- off_type __pos (__sp);
- const bool __testin = (ios_base::in & this->_M_mode & __mode) != 0;
- const bool __testout = (ios_base::out & this->_M_mode & __mode) != 0;
- char_type* __beg = __testin ? this->eback() : this->pbase();
+ const bool __testin = (ios_base::in & this->_M_mode & __mode) != 0;
+ const bool __testout = (ios_base::out & this->_M_mode & __mode) != 0;
+ const char_type* __beg = __testin ? this->eback() : this->pbase();
+ if (__beg && (__testin || __testout))
+ {
_M_update_egptr();
+ const off_type __pos(__sp);
const bool __testpos = 0 <= __pos
&& __pos <= this->egptr() - __beg;
- if ((__testin || __testout) && __testpos)
+ if (__testpos)
{
if (__testin)
this->gbump((__beg + __pos) - this->gptr());
diff --git a/libstdc++-v3/include/std/std_sstream.h b/libstdc++-v3/include/std/std_sstream.h
index 6b5728b94ce..3420999164c 100644
--- a/libstdc++-v3/include/std/std_sstream.h
+++ b/libstdc++-v3/include/std/std_sstream.h
@@ -111,8 +111,8 @@ namespace std
*/
explicit
basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out)
- : __streambuf_type(), _M_mode(), _M_string()
- { _M_stringbuf_init(__mode); }
+ : __streambuf_type(), _M_mode(__mode), _M_string()
+ { }
/**
* @brief Starts with an existing string buffer.
@@ -140,8 +140,7 @@ namespace std
__string_type
str() const
{
- const bool __testout = this->_M_mode & ios_base::out;
- if (__testout)
+ if (this->pptr())
{
// The current egptr() may not be the actual string end.
if (this->pptr() > this->egptr())
@@ -169,7 +168,7 @@ namespace std
}
protected:
- // Common initialization code for both ctors goes here.
+ // Common initialization code goes here.
/**
* @if maint
* @doctodo
@@ -220,7 +219,7 @@ namespace std
// things will quickly blow up.
// Step 1: Destroy the current internal array.
- _M_string = __string_type(__s, __n);
+ _M_string.assign(__s, __n);
// Step 2: Use the external array.
_M_sync(__s, 0, 0);
@@ -254,20 +253,19 @@ namespace std
{
const bool __testin = this->_M_mode & ios_base::in;
const bool __testout = this->_M_mode & ios_base::out;
- const __size_type __len = _M_string.size();
+ char_type* __end = __base + _M_string.size();
if (__testin)
- this->setg(__base, __base + __i, __base + __len);
+ this->setg(__base, __base + __i, __end);
if (__testout)
{
this->setp(__base, __base + _M_string.capacity());
this->pbump(__o);
- // We need a pointer to the string end anyway, even when
- // !__testin: in that case, however, for the correct
- // functioning of the streambuf inlines all the get area
- // pointers must be identical.
+ // egptr() always tracks the string end. When !__testin,
+ // for the correct functioning of the streambuf inlines
+ // the other get area pointers are identical.
if (!__testin)
- this->setg(__base + __len, __base + __len, __base + __len);
+ this->setg(__end, __end, __end);
}
}
@@ -277,9 +275,8 @@ namespace std
_M_update_egptr()
{
const bool __testin = this->_M_mode & ios_base::in;
- const bool __testout = this->_M_mode & ios_base::out;
- if (__testout && this->pptr() > this->egptr())
+ if (this->pptr() && this->pptr() > this->egptr())
if (__testin)
this->setg(this->eback(), this->gptr(), this->pptr());
else
diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/seekg/char/2346-fstream.cc b/libstdc++-v3/testsuite/27_io/basic_istream/seekg/char/2346-fstream.cc
deleted file mode 100644
index 72686f1b699..00000000000
--- a/libstdc++-v3/testsuite/27_io/basic_istream/seekg/char/2346-fstream.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-// 2000-06-29 bkoz
-
-// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation
-//
-// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// 27.6.1.3 unformatted input functions
-// NB: ostream has a particular "seeks" category. Adopt this for istreams too.
-// @require@ %-*.tst %-*.txt
-// @diff@ %-*.tst %-*.txt
-
-#include <istream>
-#include <fstream>
-#include <testsuite_hooks.h>
-
-const char* s = " lootpack, peanut butter wolf, rob swift, madlib, quasimoto";
-const int times = 10;
-
-void write_rewind(std::iostream& stream)
-{
- for (int j = 0; j < times; j++)
- {
- bool test __attribute__((unused)) = true;
- std::streampos begin = stream.tellg();
-
- for (int i = 0; i < times; ++i)
- stream << j << '-' << i << s << '\n';
-
- stream.seekg(begin);
- std::streampos end = stream.tellg();
- std::streampos badpos = std::streampos(std::streambuf::off_type(-1));
- }
-}
-
-void check_contents(std::iostream& stream)
-{
- bool test __attribute__((unused)) = true;
-
- stream.clear();
- stream.seekg(0, std::ios::beg);
- int i = 0;
- int loop = times * times + 2;
- while (i < loop)
- {
- stream.ignore(80, '\n');
- if (stream.good())
- ++i;
- else
- break;
- }
- VERIFY( i == times );
-}
-
-// fstream
-// libstdc++/2346
-void test02()
-{
- std::fstream ofstrm;
- ofstrm.open("istream_seeks-3.txt", std::ios::out);
- if (!ofstrm)
- std::abort();
- write_rewind(ofstrm);
- ofstrm.close();
-
- std::fstream ifstrm;
- ifstrm.open("istream_seeks-3.txt", std::ios::in);
- check_contents(ifstrm);
- ifstrm.close();
-}
-
-int main()
-{
- test02();
- return 0;
-}
diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/seekg/char/2346-sstream.cc b/libstdc++-v3/testsuite/27_io/basic_istream/seekg/char/2346-sstream.cc
deleted file mode 100644
index 60e43c9a78b..00000000000
--- a/libstdc++-v3/testsuite/27_io/basic_istream/seekg/char/2346-sstream.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// 2000-06-29 bkoz
-
-// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation
-//
-// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// 27.6.1.3 unformatted input functions
-// NB: ostream has a particular "seeks" category. Adopt this for istreams too.
-
-#include <istream>
-#include <sstream>
-#include <testsuite_hooks.h>
-
-const char* s = " lootpack, peanut butter wolf, rob swift, madlib, quasimoto";
-const int times = 10;
-
-void write_rewind(std::iostream& stream)
-{
- for (int j = 0; j < times; j++)
- {
- bool test __attribute__((unused)) = true;
- std::streampos begin = stream.tellg();
-
- for (int i = 0; i < times; ++i)
- stream << j << '-' << i << s << '\n';
-
- stream.seekg(begin);
- std::streampos end = stream.tellg();
- std::streampos badpos = std::streampos(std::streambuf::off_type(-1));
- }
-}
-
-void check_contents(std::iostream& stream)
-{
- bool test __attribute__((unused)) = true;
-
- stream.clear();
- stream.seekg(0, std::ios::beg);
- int i = 0;
- int loop = times * times + 2;
- while (i < loop)
- {
- stream.ignore(80, '\n');
- if (stream.good())
- ++i;
- else
- break;
- }
- VERIFY( i == times );
-}
-
-// stringstream
-// libstdc++/2346
-void test03()
-{
- std::stringstream sstrm;
-
- write_rewind(sstrm);
- check_contents(sstrm);
-}
-
-int main()
-{
- test03();
- return 0;
-}
diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/tellg/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_istream/tellg/char/1.cc
index d213d040a11..4bbe40be919 100644
--- a/libstdc++-v3/testsuite/27_io/basic_istream/tellg/char/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_istream/tellg/char/1.cc
@@ -31,20 +31,23 @@
void test01()
{
using namespace std;
+ typedef ios::off_type off_type;
typedef ios::pos_type pos_type;
bool test __attribute__((unused)) = true;
const char str_lit01[] = "istream_seeks-1.tst";
// in
- // test default ctors leave things in the same positions...
istringstream ist1;
pos_type p3 = ist1.tellg();
ifstream ifs1;
pos_type p4 = ifs1.tellg();
- VERIFY( p3 == p4 );
+ // N.B. We implement the resolution of DR 453 and
+ // istringstream::tellg() doesn't fail.
+ VERIFY( p3 == pos_type(off_type(0)) );
+ VERIFY( p4 == pos_type(off_type(-1)) );
// in
// test ctors leave things in the same positions...
diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/tellp/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/tellp/char/1.cc
index 5c8caced6f3..27506636b03 100644
--- a/libstdc++-v3/testsuite/27_io/basic_ostream/tellp/char/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_ostream/tellp/char/1.cc
@@ -1,6 +1,6 @@
// 2000-06-29 bkoz
-// Copyright (C) 2000, 2003 Free Software Foundation
+// Copyright (C) 2000, 2003, 2004 Free Software Foundation
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -25,24 +25,26 @@
#include <fstream>
#include <testsuite_hooks.h>
-
void test01()
{
using namespace std;
+ typedef ios::off_type off_type;
typedef ios::pos_type pos_type;
bool test __attribute__((unused)) = true;
const char str_lit01[] = "ostream_seeks-1.txt";
// out
- // test default ctors leave things in the same positions...
ostringstream ost1;
pos_type p1 = ost1.tellp();
ofstream ofs1;
pos_type p2 = ofs1.tellp();
- VERIFY( p1 == p2 );
+ // N.B. We implement the resolution of DR 453 and
+ // ostringstream::tellp() doesn't fail.
+ VERIFY( p1 == pos_type(off_type(0)) );
+ VERIFY( p2 == pos_type(off_type(-1)) );
// out
// test ctors leave things in the same positions...
diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/tellp/char/2.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/tellp/char/2.cc
index f82df5d4bb0..acdc3b4cc75 100644
--- a/libstdc++-v3/testsuite/27_io/basic_ostream/tellp/char/2.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_ostream/tellp/char/2.cc
@@ -1,6 +1,6 @@
// 2000-03-23 bkoz
-// Copyright (C) 2000, 2003 Free Software Foundation
+// Copyright (C) 2000, 2003, 2004 Free Software Foundation
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -33,13 +33,13 @@ void test01()
ostringstream ost;
pos_type pos1;
pos1 = ost.tellp();
- VERIFY( pos1 == pos_type(-1) );
+ VERIFY( pos1 == pos_type(off_type(0)) );
ost << "RZA ";
pos1 = ost.tellp();
- VERIFY( pos1 == pos_type(4) );
+ VERIFY( pos1 == pos_type(off_type(4)) );
ost << "ghost dog: way of the samurai";
pos1 = ost.tellp();
- VERIFY( pos1 == pos_type(33) );
+ VERIFY( pos1 == pos_type(off_type(33)) );
}
int main()
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/cons/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/cons/char/1.cc
index 9400a599bfc..76a344cfe23 100644
--- a/libstdc++-v3/testsuite/27_io/basic_streambuf/cons/char/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_streambuf/cons/char/1.cc
@@ -31,69 +31,12 @@
#include <streambuf>
#include <testsuite_hooks.h>
-
-class testbuf : public std::streambuf
-{
-public:
-
- // Typedefs:
- typedef std::streambuf::traits_type traits_type;
- typedef std::streambuf::char_type char_type;
-
- testbuf(): std::streambuf()
- { }
-
- bool
- check_pointers()
- {
- bool test __attribute__((unused)) = true;
- VERIFY( this->eback() == NULL );
- VERIFY( this->gptr() == NULL );
- VERIFY( this->egptr() == NULL );
- VERIFY( this->pbase() == NULL );
- VERIFY( this->pptr() == NULL );
- VERIFY( this->epptr() == NULL );
- return test;
- }
-
- int_type
- pub_uflow()
- { return (this->uflow()); }
-
- int_type
- pub_overflow(int_type __c = traits_type::eof())
- { return (this->overflow(__c)); }
-
- int_type
- pub_pbackfail(int_type __c)
- { return (this->pbackfail(__c)); }
-
- void
- pub_setg(char* beg, char* cur, char *end)
- { this->setg(beg, cur, end); }
-
- void
- pub_setp(char* beg, char* end)
- { this->setp(beg, end); }
-
-protected:
- int_type
- underflow()
- {
- int_type __retval = traits_type::eof();
- if (this->gptr() < this->egptr())
- __retval = traits_type::not_eof(0);
- return __retval;
- }
-};
+#include <testsuite_io.h>
void test01()
{
- typedef testbuf::traits_type traits_type;
- typedef testbuf::int_type int_type;
-
bool test __attribute__((unused)) = true;
- testbuf buf01;
+ __gnu_test::constraint_streambuf buf01;
// 27.5.2.1 basic_streambuf ctors
// default ctor initializes
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/cons/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/cons/wchar_t/1.cc
index a97b35f4d11..1721e4a820a 100644
--- a/libstdc++-v3/testsuite/27_io/basic_streambuf/cons/wchar_t/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_streambuf/cons/wchar_t/1.cc
@@ -32,69 +32,12 @@
#include <streambuf>
#include <testsuite_hooks.h>
-
-class testbuf : public std::wstreambuf
-{
-public:
-
- // Typedefs:
- typedef std::wstreambuf::traits_type traits_type;
- typedef std::wstreambuf::char_type char_type;
-
- testbuf(): std::wstreambuf()
- { }
-
- bool
- check_pointers()
- {
- bool test __attribute__((unused)) = true;
- VERIFY( this->eback() == NULL );
- VERIFY( this->gptr() == NULL );
- VERIFY( this->egptr() == NULL );
- VERIFY( this->pbase() == NULL );
- VERIFY( this->pptr() == NULL );
- VERIFY( this->epptr() == NULL );
- return test;
- }
-
- int_type
- pub_uflow()
- { return (this->uflow()); }
-
- int_type
- pub_overflow(int_type __c = traits_type::eof())
- { return (this->overflow(__c)); }
-
- int_type
- pub_pbackfail(int_type __c)
- { return (this->pbackfail(__c)); }
-
- void
- pub_setg(wchar_t* beg, wchar_t* cur, wchar_t* end)
- { this->setg(beg, cur, end); }
-
- void
- pub_setp(wchar_t* beg, wchar_t* end)
- { this->setp(beg, end); }
-
-protected:
- int_type
- underflow()
- {
- int_type __retval = traits_type::eof();
- if (this->gptr() < this->egptr())
- __retval = traits_type::not_eof(0);
- return __retval;
- }
-};
+#include <testsuite_io.h>
void test01()
{
- typedef testbuf::traits_type traits_type;
- typedef testbuf::int_type int_type;
-
bool test __attribute__((unused)) = true;
- testbuf buf01;
+ __gnu_test::constraint_wstreambuf buf01;
// 27.5.2.1 basic_streambuf ctors
// default ctor initializes
diff --git a/libstdc++-v3/testsuite/testsuite_io.h b/libstdc++-v3/testsuite/testsuite_io.h
index e5e342eed14..809d0801c6d 100644
--- a/libstdc++-v3/testsuite/testsuite_io.h
+++ b/libstdc++-v3/testsuite/testsuite_io.h
@@ -1,7 +1,7 @@
// -*- C++ -*-
-// Testing filebuf for the C++ library testsuite.
+// Testing streambuf/filebuf/stringbuf for the C++ library testsuite.
//
-// Copyright (C) 2003 Free Software Foundation, Inc.
+// Copyright (C) 2003, 2004 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -32,6 +32,7 @@
#define _GLIBCXX_TESTSUITE_IO_H
#include <fstream>
+#include <sstream>
namespace __gnu_test
{
@@ -44,34 +45,60 @@ namespace __gnu_test
// Joint file position
// 27.8.1.4 - Overridden virtual functions p9
// If unbuffered, pbase == pptr == NULL
- class constraint_filebuf: public std::filebuf
- {
- public:
- bool
- write_position()
- {
- bool two = this->pptr() != NULL;
- bool one = this->pptr() < this->epptr();
- return one && two;
- }
-
- bool
- read_position()
- {
- bool one = this->gptr() != NULL;
- bool two = this->gptr() < this->egptr();
-
- return one && two;
- }
-
- bool
- unbuffered()
- {
- bool one = this->pbase() == NULL;
- bool two = this->pptr() == NULL;
- return one && two;
- }
- };
+ // 27.7.1.1 - Basic_stringbuf constructors p 1
+ // 27.8.1.2 - Basic_filebuf constructors p 1
+ // ... , initializing the base class with basic_streambuf() 27.5.2.1
+ template<typename T>
+ class constraint_buf
+ : public T
+ {
+ public:
+ bool
+ write_position()
+ {
+ bool one = this->pptr() != NULL;
+ bool two = this->pptr() < this->epptr();
+ return one && two;
+ }
+
+ bool
+ read_position()
+ {
+ bool one = this->gptr() != NULL;
+ bool two = this->gptr() < this->egptr();
+ return one && two;
+ }
+
+ bool
+ unbuffered()
+ {
+ bool one = this->pbase() == NULL;
+ bool two = this->pptr() == NULL;
+ return one && two;
+ }
+
+ bool
+ check_pointers()
+ {
+ bool one = this->eback() == NULL;
+ bool two = this->gptr() == NULL;
+ bool three = this->egptr() == NULL;
+
+ bool four = this->pbase() == NULL;
+ bool five = this->pptr() == NULL;
+ bool six = this->epptr() == NULL;
+ return one && two && three && four && five && six;
+ }
+ };
+
+ typedef constraint_buf<std::streambuf> constraint_streambuf;
+ typedef constraint_buf<std::filebuf> constraint_filebuf;
+ typedef constraint_buf<std::stringbuf> constraint_stringbuf;
+#ifdef _GLIBCXX_USE_WCHAR_T
+ typedef constraint_buf<std::wstreambuf> constraint_wstreambuf;
+ typedef constraint_buf<std::wfilebuf> constraint_wfilebuf;
+ typedef constraint_buf<std::wstringbuf> constraint_wstringbuf;
+#endif
// Used to check if basic_streambuf::pubsync() has been called.
// This is useful for checking if a function creates [io]stream::sentry