summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorobrien <obrien@FreeBSD.org>2002-05-09 20:02:13 +0000
committerobrien <obrien@FreeBSD.org>2002-05-09 20:02:13 +0000
commit98051db4df2d731c020b9560e9937beb0e4656b1 (patch)
tree36f481a01150941dad35fedfafeac692064186ca /contrib
parente28e4d7e4707573d64baa270f9578937fe574a87 (diff)
parentc8f5fc7032940ad6633f932ac40cade82ec4d0cc (diff)
downloadFreeBSD-src-98051db4df2d731c020b9560e9937beb0e4656b1.zip
FreeBSD-src-98051db4df2d731c020b9560e9937beb0e4656b1.tar.gz
This commit was generated by cvs2svn to compensate for changes in r96263,
which included commits to RCS files with non-trunk default branches.
Diffstat (limited to 'contrib')
-rw-r--r--contrib/gcc/ChangeLog6461
-rw-r--r--contrib/gcc/ChangeLog.lib3781
-rw-r--r--contrib/gcc/FSFChangeLog.1010110
-rw-r--r--contrib/gcc/FSFChangeLog.1114493
-rw-r--r--contrib/gcc/alias.c59
-rw-r--r--contrib/gcc/ansidecl.h344
-rw-r--r--contrib/gcc/attribs.c34
-rw-r--r--contrib/gcc/basic-block.h5
-rw-r--r--contrib/gcc/bb-reorder.c6
-rw-r--r--contrib/gcc/builtins.c90
-rw-r--r--contrib/gcc/c-common.def9
-rw-r--r--contrib/gcc/c-common.h19
-rw-r--r--contrib/gcc/c-decl.c351
-rw-r--r--contrib/gcc/c-format.c9
-rw-r--r--contrib/gcc/c-lang.c3
-rw-r--r--contrib/gcc/c-lex.c48
-rw-r--r--contrib/gcc/c-objc-common.c9
-rw-r--r--contrib/gcc/c-parse.in16
-rw-r--r--contrib/gcc/c-pragma.c206
-rw-r--r--contrib/gcc/c-pragma.h8
-rw-r--r--contrib/gcc/c-semantics.c14
-rw-r--r--contrib/gcc/c-typeck.c230
-rw-r--r--contrib/gcc/calls.c56
-rw-r--r--contrib/gcc/cfg.c22
-rw-r--r--contrib/gcc/cfganal.c77
-rw-r--r--contrib/gcc/cfgcleanup.c305
-rw-r--r--contrib/gcc/cfgrtl.c116
-rw-r--r--contrib/gcc/collect2.c2
-rw-r--r--contrib/gcc/combine.c399
-rw-r--r--contrib/gcc/concat.c236
-rw-r--r--contrib/gcc/config.gcc325
-rw-r--r--contrib/gcc/config.in6
-rw-r--r--contrib/gcc/config/alpha/alpha-protos.h6
-rw-r--r--contrib/gcc/config/alpha/alpha.h14
-rw-r--r--contrib/gcc/config/alpha/alpha.md179
-rw-r--r--contrib/gcc/config/alpha/linux.h4
-rw-r--r--contrib/gcc/config/alpha/netbsd.h14
-rw-r--r--contrib/gcc/config/alpha/osf.h25
-rw-r--r--contrib/gcc/config/alpha/t-vms4
-rw-r--r--contrib/gcc/config/alpha/vms.h51
-rw-r--r--contrib/gcc/config/alpha/x-vms2
-rw-r--r--contrib/gcc/config/alpha/xm-vms.h3
-rw-r--r--contrib/gcc/config/arm/aof.h13
-rw-r--r--contrib/gcc/config/arm/aout.h12
-rw-r--r--contrib/gcc/config/arm/arm.c323
-rw-r--r--contrib/gcc/config/arm/arm.h23
-rw-r--r--contrib/gcc/config/arm/arm.md71
-rw-r--r--contrib/gcc/config/arm/coff.h4
-rw-r--r--contrib/gcc/config/arm/elf.h4
-rw-r--r--contrib/gcc/config/arm/linux-elf.h8
-rw-r--r--contrib/gcc/config/arm/netbsd.h11
-rw-r--r--contrib/gcc/config/arm/rtems-elf.h13
-rw-r--r--contrib/gcc/config/float-sparc.h2
-rw-r--r--contrib/gcc/config/i386/cygwin.h5
-rw-r--r--contrib/gcc/config/i386/djgpp-rtems.h9
-rw-r--r--contrib/gcc/config/i386/gnu.h2
-rw-r--r--contrib/gcc/config/i386/i386-interix.h12
-rw-r--r--contrib/gcc/config/i386/i386-protos.h1
-rw-r--r--contrib/gcc/config/i386/libgcc-x86_64-glibc.ver25
-rw-r--r--contrib/gcc/config/i386/linux-aout.h4
-rw-r--r--contrib/gcc/config/i386/linux-oldld.h4
-rw-r--r--contrib/gcc/config/i386/linux.h2
-rw-r--r--contrib/gcc/config/i386/linux64.h96
-rw-r--r--contrib/gcc/config/i386/netbsd-elf.h12
-rw-r--r--contrib/gcc/config/i386/netbsd.h9
-rw-r--r--contrib/gcc/config/i386/rtems.h16
-rw-r--r--contrib/gcc/config/i386/rtemself.h72
-rw-r--r--contrib/gcc/config/i386/sco5.h3
-rw-r--r--contrib/gcc/config/i386/sol2.h10
-rw-r--r--contrib/gcc/config/i386/t-interix2
-rw-r--r--contrib/gcc/config/i386/t-linux6415
-rw-r--r--contrib/gcc/config/i386/t-rtems-i38640
-rw-r--r--contrib/gcc/config/i386/x86-64.h2
-rw-r--r--contrib/gcc/config/ia64/aix.h16
-rw-r--r--contrib/gcc/config/ia64/elf.h6
-rw-r--r--contrib/gcc/config/ia64/freebsd.h10
-rw-r--r--contrib/gcc/config/ia64/hpux.h14
-rw-r--r--contrib/gcc/config/ia64/ia64-protos.h4
-rw-r--r--contrib/gcc/config/ia64/ia64.c322
-rw-r--r--contrib/gcc/config/ia64/ia64.h59
-rw-r--r--contrib/gcc/config/ia64/ia64.md33
-rw-r--r--contrib/gcc/config/ia64/linux.h22
-rw-r--r--contrib/gcc/config/ia64/sysv4.h5
-rw-r--r--contrib/gcc/config/ia64/unwind-ia64.c298
-rw-r--r--contrib/gcc/config/libgcc-glibc.ver23
-rw-r--r--contrib/gcc/config/netbsd.h13
-rw-r--r--contrib/gcc/config/rs6000/aix.h5
-rw-r--r--contrib/gcc/config/rs6000/aix43.h4
-rw-r--r--contrib/gcc/config/rs6000/aix51.h11
-rw-r--r--contrib/gcc/config/rs6000/altivec.h8733
-rw-r--r--contrib/gcc/config/rs6000/crtsavres.asm407
-rw-r--r--contrib/gcc/config/rs6000/darwin.h14
-rw-r--r--contrib/gcc/config/rs6000/eabi.asm362
-rw-r--r--contrib/gcc/config/rs6000/gnu.h38
-rw-r--r--contrib/gcc/config/rs6000/linux64.h78
-rw-r--r--contrib/gcc/config/rs6000/netbsd.h5
-rw-r--r--contrib/gcc/config/rs6000/ppc-asm.h1
-rw-r--r--contrib/gcc/config/rs6000/rs6000-protos.h2
-rw-r--r--contrib/gcc/config/rs6000/rs6000.c710
-rw-r--r--contrib/gcc/config/rs6000/rs6000.h219
-rw-r--r--contrib/gcc/config/rs6000/rs6000.md591
-rw-r--r--contrib/gcc/config/rs6000/rtems.h12
-rw-r--r--contrib/gcc/config/rs6000/sysv4.h104
-rw-r--r--contrib/gcc/config/rs6000/t-aix432
-rw-r--r--contrib/gcc/config/rs6000/t-linux6416
-rw-r--r--contrib/gcc/config/rs6000/t-ppccomm11
-rw-r--r--contrib/gcc/config/rs6000/xcoff.h28
-rw-r--r--contrib/gcc/config/rtems.h17
-rw-r--r--contrib/gcc/config/sparc/aout.h2
-rw-r--r--contrib/gcc/config/sparc/crtfastmath.c54
-rw-r--r--contrib/gcc/config/sparc/elf.h4
-rw-r--r--contrib/gcc/config/sparc/freebsd.h28
-rw-r--r--contrib/gcc/config/sparc/gmon-sol2.c4
-rw-r--r--contrib/gcc/config/sparc/libgcc-sparc-glibc.ver28
-rw-r--r--contrib/gcc/config/sparc/linux-aout.h6
-rw-r--r--contrib/gcc/config/sparc/linux.h84
-rw-r--r--contrib/gcc/config/sparc/linux64.h153
-rw-r--r--contrib/gcc/config/sparc/lite.h2
-rw-r--r--contrib/gcc/config/sparc/litecoff.h2
-rw-r--r--contrib/gcc/config/sparc/liteelf.h2
-rw-r--r--contrib/gcc/config/sparc/netbsd-elf.h344
-rw-r--r--contrib/gcc/config/sparc/netbsd.h9
-rw-r--r--contrib/gcc/config/sparc/pbd.h3
-rw-r--r--contrib/gcc/config/sparc/rtems.h9
-rw-r--r--contrib/gcc/config/sparc/rtemself.h11
-rw-r--r--contrib/gcc/config/sparc/sol2-64.h25
-rw-r--r--contrib/gcc/config/sparc/sol2-bi.h279
-rw-r--r--contrib/gcc/config/sparc/sol2-gas-bi.h5
-rw-r--r--contrib/gcc/config/sparc/sol2-gld-bi.h9
-rw-r--r--contrib/gcc/config/sparc/sol2-gld.h6
-rw-r--r--contrib/gcc/config/sparc/sol2.h36
-rw-r--r--contrib/gcc/config/sparc/sol27-sld.h8
-rw-r--r--contrib/gcc/config/sparc/sp64-aout.h2
-rw-r--r--contrib/gcc/config/sparc/sp64-elf.h6
-rw-r--r--contrib/gcc/config/sparc/sp86x-aout.h2
-rw-r--r--contrib/gcc/config/sparc/sp86x-elf.h2
-rw-r--r--contrib/gcc/config/sparc/sparc-protos.h20
-rw-r--r--contrib/gcc/config/sparc/sparc.c1436
-rw-r--r--contrib/gcc/config/sparc/sparc.h380
-rw-r--r--contrib/gcc/config/sparc/sparc.md912
-rw-r--r--contrib/gcc/config/sparc/splet.h2
-rw-r--r--contrib/gcc/config/sparc/t-crtfm4
-rw-r--r--contrib/gcc/config/sparc/t-elf12
-rw-r--r--contrib/gcc/config/sparc/t-linux648
-rw-r--r--contrib/gcc/config/sparc/t-netbsd646
-rw-r--r--contrib/gcc/config/sparc/t-sol2-642
-rw-r--r--contrib/gcc/config/sparc/vxsim.h3
-rw-r--r--contrib/gcc/config/sparc/vxsparc64.h2
-rw-r--r--contrib/gcc/config/t-slibgcc-elf-ver23
-rw-r--r--contrib/gcc/config/t-slibgcc-nolc-override1
-rw-r--r--contrib/gcc/config/t-slibgcc-sld20
-rw-r--r--contrib/gcc/configure.in278
-rw-r--r--contrib/gcc/cp-demangle.c4138
-rw-r--r--contrib/gcc/cp/ChangeLog708
-rw-r--r--contrib/gcc/cp/Make-lang.in9
-rw-r--r--contrib/gcc/cp/NEWS21
-rw-r--r--contrib/gcc/cp/call.c69
-rw-r--r--contrib/gcc/cp/class.c107
-rw-r--r--contrib/gcc/cp/cp-tree.def4
-rw-r--r--contrib/gcc/cp/cp-tree.h98
-rw-r--r--contrib/gcc/cp/cvt.c7
-rw-r--r--contrib/gcc/cp/decl2.c66
-rw-r--r--contrib/gcc/cp/dump.c9
-rw-r--r--contrib/gcc/cp/error.c14
-rw-r--r--contrib/gcc/cp/friend.c2
-rw-r--r--contrib/gcc/cp/g++spec.c15
-rw-r--r--contrib/gcc/cp/init.c196
-rw-r--r--contrib/gcc/cp/lang-specs.h10
-rw-r--r--contrib/gcc/cp/lex.c10
-rw-r--r--contrib/gcc/cp/mangle.c92
-rw-r--r--contrib/gcc/cp/method.c185
-rw-r--r--contrib/gcc/cp/parse.y67
-rw-r--r--contrib/gcc/cp/pt.c484
-rw-r--r--contrib/gcc/cp/search.c96
-rw-r--r--contrib/gcc/cp/semantics.c84
-rw-r--r--contrib/gcc/cp/spew.c5
-rw-r--r--contrib/gcc/cp/tree.c95
-rw-r--r--contrib/gcc/cp/typeck.c492
-rw-r--r--contrib/gcc/cp/typeck2.c26
-rw-r--r--contrib/gcc/cplus-dem.c1125
-rw-r--r--contrib/gcc/cppexp.c6
-rw-r--r--contrib/gcc/cpphash.c1
-rw-r--r--contrib/gcc/cpphash.h4
-rw-r--r--contrib/gcc/cppinit.c80
-rw-r--r--contrib/gcc/cpplex.c19
-rw-r--r--contrib/gcc/cpplib.c270
-rw-r--r--contrib/gcc/cpplib.h6
-rw-r--r--contrib/gcc/cppmacro.c47
-rw-r--r--contrib/gcc/cppmain.c20
-rw-r--r--contrib/gcc/crtstuff.c6
-rw-r--r--contrib/gcc/cse.c23
-rw-r--r--contrib/gcc/cselib.c18
-rw-r--r--contrib/gcc/defaults.h9
-rw-r--r--contrib/gcc/demangle.h110
-rw-r--r--contrib/gcc/df.c5
-rw-r--r--contrib/gcc/doc/c-tree.texi16
-rw-r--r--contrib/gcc/doc/contrib.texi78
-rw-r--r--contrib/gcc/doc/contribute.texi2
-rw-r--r--contrib/gcc/doc/cpp.texi530
-rw-r--r--contrib/gcc/doc/cppenv.texi76
-rw-r--r--contrib/gcc/doc/cppopts.texi586
-rw-r--r--contrib/gcc/doc/extend.texi713
-rw-r--r--contrib/gcc/doc/frontends.texi7
-rw-r--r--contrib/gcc/doc/gcc.texi2
-rw-r--r--contrib/gcc/doc/include/texinfo.tex6325
-rw-r--r--contrib/gcc/doc/install.texi331
-rw-r--r--contrib/gcc/doc/invoke.texi544
-rw-r--r--contrib/gcc/doc/md.texi40
-rw-r--r--contrib/gcc/doc/passes.texi2
-rw-r--r--contrib/gcc/doc/rtl.texi37
-rw-r--r--contrib/gcc/doc/sourcebuild.texi5
-rw-r--r--contrib/gcc/doc/standards.texi27
-rw-r--r--contrib/gcc/doc/tm.texi138
-rw-r--r--contrib/gcc/dwarf2.h1
-rw-r--r--contrib/gcc/dwarf2out.c159
-rw-r--r--contrib/gcc/dyn-string.c419
-rw-r--r--contrib/gcc/dyn-string.h92
-rw-r--r--contrib/gcc/emit-rtl.c194
-rw-r--r--contrib/gcc/except.c301
-rw-r--r--contrib/gcc/except.h9
-rw-r--r--contrib/gcc/explow.c74
-rw-r--r--contrib/gcc/expmed.c204
-rw-r--r--contrib/gcc/expr.c369
-rw-r--r--contrib/gcc/expr.h50
-rw-r--r--contrib/gcc/f/ChangeLog100
-rw-r--r--contrib/gcc/f/Make-lang.in4
-rw-r--r--contrib/gcc/f/bad.def390
-rw-r--r--contrib/gcc/f/bugs.texi9
-rw-r--r--contrib/gcc/f/com.c22
-rw-r--r--contrib/gcc/f/data.c50
-rw-r--r--contrib/gcc/f/expr.c11
-rw-r--r--contrib/gcc/f/ffe.texi9
-rw-r--r--contrib/gcc/f/g77.texi61
-rw-r--r--contrib/gcc/f/implic.c3
-rw-r--r--contrib/gcc/f/intdoc.c12
-rw-r--r--contrib/gcc/f/intdoc.texi12
-rw-r--r--contrib/gcc/f/intrin.c18
-rw-r--r--contrib/gcc/f/intrin.def13
-rw-r--r--contrib/gcc/f/invoke.texi133
-rw-r--r--contrib/gcc/f/lex.c13
-rw-r--r--contrib/gcc/f/news.texi38
-rw-r--r--contrib/gcc/f/proj.h4
-rw-r--r--contrib/gcc/f/root.texi3
-rw-r--r--contrib/gcc/f/stb.c3
-rw-r--r--contrib/gcc/f/ste.c3
-rw-r--r--contrib/gcc/f/stu.c3
-rw-r--r--contrib/gcc/f/target.c44
-rw-r--r--contrib/gcc/f/target.h2
-rw-r--r--contrib/gcc/f/version.c2
-rw-r--r--contrib/gcc/fibheap.c523
-rw-r--r--contrib/gcc/fibheap.h81
-rw-r--r--contrib/gcc/flow.c85
-rw-r--r--contrib/gcc/fold-const.c142
-rw-r--r--contrib/gcc/function.h4
-rwxr-xr-xcontrib/gcc/gccbug.in551
-rw-r--r--contrib/gcc/gcse.c121
-rw-r--r--contrib/gcc/genattrtab.c4
-rw-r--r--contrib/gcc/genemit.c49
-rw-r--r--contrib/gcc/genextract.c4
-rw-r--r--contrib/gcc/genflags.c2
-rw-r--r--contrib/gcc/genoutput.c15
-rw-r--r--contrib/gcc/genrecog.c36
-rw-r--r--contrib/gcc/getopt.c6
-rw-r--r--contrib/gcc/getopt.h12
-rw-r--r--contrib/gcc/getopt1.c4
-rw-r--r--contrib/gcc/getpwd.c49
-rw-r--r--contrib/gcc/ggc-common.c38
-rw-r--r--contrib/gcc/gthr-dce.h3
-rw-r--r--contrib/gcc/gthr-posix.h3
-rw-r--r--contrib/gcc/gthr-rtems.h13
-rw-r--r--contrib/gcc/gthr-solaris.h3
-rw-r--r--contrib/gcc/gthr-win32.h509
-rw-r--r--contrib/gcc/haifa-sched.c32
-rw-r--r--contrib/gcc/hashtab.c616
-rw-r--r--contrib/gcc/hashtab.h155
-rw-r--r--contrib/gcc/hex.c111
-rw-r--r--contrib/gcc/hooks.c34
-rw-r--r--contrib/gcc/hooks.h22
-rw-r--r--contrib/gcc/hwint.h2
-rw-r--r--contrib/gcc/ifcvt.c181
-rw-r--r--contrib/gcc/integrate.c18
-rw-r--r--contrib/gcc/jump.c36
-rw-r--r--contrib/gcc/langhooks-def.h6
-rw-r--r--contrib/gcc/langhooks.c24
-rw-r--r--contrib/gcc/langhooks.h3
-rw-r--r--contrib/gcc/lbasename.c88
-rw-r--r--contrib/gcc/libfuncs.h2
-rw-r--r--contrib/gcc/libiberty.h185
-rw-r--r--contrib/gcc/local-alloc.c4
-rw-r--r--contrib/gcc/longlong.h15
-rw-r--r--contrib/gcc/loop.c118
-rw-r--r--contrib/gcc/loop.h1
-rw-r--r--contrib/gcc/machmode.def124
-rw-r--r--contrib/gcc/machmode.h8
-rw-r--r--contrib/gcc/make-temp-file.c179
-rw-r--r--contrib/gcc/md5.c421
-rw-r--r--contrib/gcc/md5.h142
-rw-r--r--contrib/gcc/mkconfig.sh74
-rw-r--r--contrib/gcc/mklibgcc.in117
-rw-r--r--contrib/gcc/mkmap-symver.awk6
-rw-r--r--contrib/gcc/objc/lang-specs.h10
-rw-r--r--contrib/gcc/objc/objc-act.c13
-rw-r--r--contrib/gcc/objc/objc-lang.c3
-rw-r--r--contrib/gcc/obstack.c6
-rw-r--r--contrib/gcc/obstack.h22
-rw-r--r--contrib/gcc/optabs.c32
-rw-r--r--contrib/gcc/output.h12
-rw-r--r--contrib/gcc/partition.c191
-rw-r--r--contrib/gcc/partition.h81
-rw-r--r--contrib/gcc/predict.c9
-rw-r--r--contrib/gcc/protoize.c51
-rw-r--r--contrib/gcc/recog.c111
-rw-r--r--contrib/gcc/reg-stack.c1
-rw-r--r--contrib/gcc/regclass.c1
-rw-r--r--contrib/gcc/regmove.c74
-rw-r--r--contrib/gcc/regrename.c32
-rw-r--r--contrib/gcc/reload1.c58
-rw-r--r--contrib/gcc/reorg.c52
-rw-r--r--contrib/gcc/resource.c2
-rw-r--r--contrib/gcc/rtl.c134
-rw-r--r--contrib/gcc/rtl.def7
-rw-r--r--contrib/gcc/rtl.h11
-rw-r--r--contrib/gcc/rtlanal.c84
-rw-r--r--contrib/gcc/sched-deps.c1
-rw-r--r--contrib/gcc/sched-int.h1
-rw-r--r--contrib/gcc/sched-rgn.c52
-rw-r--r--contrib/gcc/sibcall.c31
-rw-r--r--contrib/gcc/simplify-rtx.c78
-rw-r--r--contrib/gcc/splay-tree.c213
-rw-r--r--contrib/gcc/splay-tree.h56
-rw-r--r--contrib/gcc/ssa-ccp.c4
-rw-r--r--contrib/gcc/stmt.c108
-rw-r--r--contrib/gcc/stor-layout.c77
-rw-r--r--contrib/gcc/symcat.h49
-rw-r--r--contrib/gcc/system.h4
-rw-r--r--contrib/gcc/target-def.h12
-rw-r--r--contrib/gcc/target.h10
-rw-r--r--contrib/gcc/tradcif.y3
-rw-r--r--contrib/gcc/tradcpp.c53
-rw-r--r--contrib/gcc/tradcpp.h1
-rw-r--r--contrib/gcc/tree-dump.c7
-rw-r--r--contrib/gcc/tree-inline.c25
-rw-r--r--contrib/gcc/tree.c107
-rw-r--r--contrib/gcc/tree.def3
-rw-r--r--contrib/gcc/tree.h69
-rw-r--r--contrib/gcc/unroll.c17
-rw-r--r--contrib/gcc/unwind-dw2-fde-glibc.c4
-rw-r--r--contrib/gcc/varasm.c403
-rw-r--r--contrib/gcc/version.c2
-rw-r--r--contrib/gcc/vmsdbgout.c19
350 files changed, 74311 insertions, 9632 deletions
diff --git a/contrib/gcc/ChangeLog b/contrib/gcc/ChangeLog
index b8b7ac3..93d1400 100644
--- a/contrib/gcc/ChangeLog
+++ b/contrib/gcc/ChangeLog
@@ -1,17 +1,6446 @@
+Thu May 9 12:21:48 2002 Jeffrey A Law (law@redhat.com)
+
+ * pa.c (hppa_profile_hook): Use force_reg to get the address
+ of the profile hook into an appropriate pseudo register.
+
+2002-05-09 Jakub Jelinek <jakub@redhat.com>
+
+ * mklibgcc.in: Set shlib_slibdir_qual to empty string if
+ SHLIB_SLIBDIR_SUFFIXES is empty.
+
+2002-05-09 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ * config/mips/t-iris6 (SHLIB_SLIBDIR_SUFFIXES): Define.
+ (SHLIB_LINK, SHLIB_INSTALL): Adjust.
+
+2002-05-09 Jakub Jelinek <jakub@redhat.com>
+
+ * config/sparc/t-linux64 (SHLIB_MAPFILES): Set.
+ * config/sparc/libgcc-sparc-glibc.ver: New file.
+ * config/i386/t-linux64 (SHLIB_MAPFILES): Add libgcc-x86_64-glibc.ver.
+ * config/i386/libgcc-x86_64-glibc.ver: New file.
+ * config/cris/t-linux (SHLIB_MAPFILES): Remove.
+ * mklibgcc.in: Preprocess SHLIB_MAPFILES with ml flags.
+
+2002-05-09 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/6429
+ * Makefile.in (libgcc.mk): Pass SHLIB_SLIBDIR_SUFFIXES to mklibgcc.
+ * mklibgcc.in: If SHLIB_SLIBDIR_SUFFIXES is defined, put libgcc_s
+ shared libraries into multilib dirs, with SONAME libgcc_s.so.1 for
+ base multilibs.
+ * config/t-slibgcc-elf-ver (SHLIB_LINK): Adjust for the above.
+ * config/t-slibgcc-sld (SHLIB_LINK): Likewise.
+ * config/i386/t-linux64 (SHLIB_SLIBDIR_SUFFIXES): Define.
+ * config/sparc/t-linux64 (SHLIB_SLIBDIR_SUFFIXES): Define.
+ * config/sparc/t-sol2-64 (SHLIB_SLIBDIR_SUFFIXES): Define.
+
+2002-05-08 Mark Mitchell <mark@codesourcery.com>
+
+ PR c/6569.
+ * varasm.c (mark_weak): New function.
+ (merge_weak): Use it. Do not call declare_weak.
+ (declare_weak): Use merge_weak.
+
+2002-05-07 Geoffrey Keating <geoffk@redhat.com>
+
+ * configure.in: Don't pass -Wno-long-long to a ADA compiler
+ that doesn't support it.
+ * configure: Regenerate.
+
+2002-05-07 Jason Merrill <jason@redhat.com>
+
+ * dwarf2out.c (rtl_for_decl_location): Don't try to extract a
+ constant value from DECL_INITIAL.
+
+2002-05-07 Richard Henderson <rth@redhat.com>
+
+ PR c++/6212
+ * expr.c (highest_pow2_factor_for_type): New.
+ (expand_assignment): Use it.
+
+2002-05-07 Jakub Jelinek <jakub@redhat.com>
+
+ * configure.in: If as or ld segfaults, don't clutter with it stdout.
+ * configure: Rebuilt.
+
+2002-05-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/6561
+ * config/sparc/sparc.md (muldi3_v8plus): Handle %1 equal to %2.
+
+2002-05-05 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ * doc/install.texi (powerpc-*-linux-gnu*): Update build requirements.
+
+2002-05-04 David Edelsohn <edelsohn@gnu.org>
+
+ PR c/6543
+ * config/rs6000/rs6000.md (sCC pattern and splitter): Remove
+ clobber and use result as temporary value.
+
+2002-05-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/6542
+ * config/sparc/sparc.h (leaf_reg_remap): Remove const.
+ (CONDITIONAL_REGISTER_USAGE): For TARGET_FLAT make
+ fill leaf_reg_remap with identity.
+ * config/sparc/sparc.c (leaf_reg_remap): Remove const.
+
+2002-05-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/6522
+ * dwarf2out.c (simple_decl_align_in_bits): Renamed to...
+ (simple_field_decl_align_in_bits): this. Apply
+ BIGGEST_FIELD_ALIGNMENT and ADJUST_FIELD_ALIGN if defined.
+
+2002-05-03 Richard Henderson <rth@redhat.com>
+
+ PR opt/6534
+ * ifcvt.c (noce_try_store_flag, noce_try_store_flag_constants,
+ noce_try_store_flag_inc, noce_try_store_flag_mask, noce_try_cmove,
+ noce_try_cmove_arith, noce_try_minmax, noce_try_abs): Insert new
+ code before JUMP, not EARLIEST.
+
+2002-05-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR preprocessor/6489
+ * tradcpp.c (fixup_newlines): New.
+ (main, finclude): Use it.
+
+2002-05-03 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ * doc/install.texi (Installing): Mention GCC 3.1 buildstats.
+ (Specific): Removed buildstats references.
+ (Specific, hppa*-hp-hpux11): Adjust for GCC versions > 3.0.
+ (Specific, sparc-sun-solaris2*): Update 64-bit hints for GCC 3.1.
+ Accomodate Solaris versions beyond 8.
+ (Specific, sparc-sun-solaris2.7): Update as path for GCC 3.1.
+ (Specific, *-*-solaris2.8): Removed, obsolete.
+
+2002-05-02 Jason Merrill <jason@redhat.com>
+
+ * defaults.h (BOOL_TYPE_SIZE): Move default here from cp/decl.c.
+ * c-decl.c (c_init_decl_processing): Use it.
+ * config/rs6000/darwin.h (BOOL_TYPE_SIZE): Define to INT_TYPE_SIZE.
+ * config/i960/i960.h (BOOL_TYPE_SIZE): Don't define.
+ * config/mcore/mcore.h (BOOL_TYPE_SIZE): Don't define.
+
+2002-05-02 Loren J. Rittle <ljrittle@acm.org>
+
+ * doc/install.texi (*-*-freebsd*): Update to latest status.
+
+2002-05-02 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/6540
+ * config.gcc (sparc*-*-solaris2*): Set float_format to i128.
+ * config/float-sparc.h: Assume 128-bit long double if
+ __LONG_DOUBLE_128__ is defined.
+
+ PR target/6512, PR target/5628
+ * config/sparc/sparc.md (movdf_insn_v9only_novis): Don't allow >= %f32
+ when memory is not aligned.
+ (movdf_insn_v9only_vis): Likewise.
+ * config/sparc/sparc.h (SECONDARY_INPUT_RELOAD_CLASS): Request a FP_REGS
+ temporary for EXTRA_FP_REGS DFmode load from unaligned memory.
+ (SECONDARY_OUTPUT_RELOAD_CLASS): Similarly.
+
+2002-05-02 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * doc/install.texi: State GNAT version requirements.
+
+2002-05-01 Jeff Law <law@redhat.com>
+
+ * pa.h (EXTRA_CONSTRAINT): Don't accept PIC addresses for the
+ 'T' constraint.
+
+2002-05-01 Joel Brobecker <brobecker@gnat.com>
+
+ * dbxout.c (dbxout_type): Emit size information for range types,
+ as well, but only when using GDB extensions.
+
+2002-05-01 Richard Henderson <rth@redhat.com>
+
+ * configure.in (HAVE_GAS_HIDDEN): Replace SPARC feature test with
+ target-independent gnu binutils date test.
+
+2002-05-01 Jakub Jelinek <jakub@redhat.com>
+
+ * cppinit.c (cpp_handle_option) [-dM]: Don't set no_output here...
+ (cpp_post_options): ...but here. Disable -dD, -dN and -dI when
+ -M -or -MM is in effect.
+
+2002-05-01 Zack Weinberg <zack@codesourcery.com>
+
+ * config.gcc: Correct test of --enable-obsolete. Obsolete all
+ A29k configurations.
+ * doc/install.texi: Update to match.
+
+2002-05-01 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ PR bootstrap/6514
+ * varasm.c (globalize_decl): Compare DECL_ASSEMBLER_NAME to check
+ for duplicates. Always loop over whole list.
+
+Wed May 1 10:32:37 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * reload.c (find_reloads, case 'p'): Set BADOP to 0.
+
+2002-05-01 Joel Sherrill <joel@OARcorp.com>
+
+ * config/sparc/t-elf (sparc-rtems, sparc-elf): Build assembly
+ support routines.
+
+2002-05-01 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * doc/install.texi: Update Texinfo version requirement
+ documentation.
+
+2002-04-30 Richard Henderson <rth@redhat.com>
+
+ * config/sparc/sol27-sld.h: Rename from sol26-sld.h.
+ (PREFERRED_DEBUGGING_TYPE, ASM_DEBUG_SPEC): Undef.
+ * config.gcc (sparc-solaris): Adjust test for native ld bug.
+ Add it after the biarch headers.
+
+2002-04-30 Richard Henderson <rth@redhat.com>
+
+ PR opt/6516
+ * toplev.c (rest_of_compilation): Don't run cross-jump before
+ bb-reorder.
+
+2002-04-30 Joel Sherrill <joel@OARcorp.com>
+
+ * config/arm/rtems-elf.h: Add #undef TARGET_VERSION to prevent warning.
+
+2002-04-30 Richard Henderson <rth@redhat.com>
+
+ * config/sparc/sparc.c (emit_soft_tfmode_libcall,
+ emit_soft_tfmode_binop, emit_soft_tfmode_unop, emit_soft_tfmode_cvt,
+ emit_hard_tfmode_operation, emit_tfmode_binop, emit_tfmode_unop,
+ emit_tfmode_cvt): New.
+ * config/sparc/sparc.md (extendsftf2, extenddftf2, trunctfsf2,
+ trunctfdf2, floatsitf2, floatunssitf2, floatditf2, floatunsditf2,
+ fix_trunctfsi2, fixuns_trunctfsi2, fix_trunctfdi2, fixuns_trunctfdi2,
+ addtf3, subtf3, multf3, divtf3, sqrttf2): Use them.
+ * config/sparc/sparc-protos.h: Update.
+
+2002-04-30 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * config.gcc (hppa1.1-*-pro*, hppa1.1-*-osf*, hppa1.1-*-rtems*,
+ hppa1.0-*-osf*, hppa1.1-*-bsd*, hppa1.1-*-hpux10*, hppa2*-*-hpux10*,
+ hppa1.0-*-hpux10*, hppa*64*-*-hpux11*, hppa1.1-*-hpux11*,
+ hppa2*-*-hpux11*, hppa1.0-*-hpux11*, hppa*-*-lites*): Define xmake_file.
+ * ada/Make-lang.in (ADA_FLAGS_TO_PASS): Don't pass ADA_CFLAGS.
+ * pa/t-linux, pa/t-pa, pa/t-pa64, t-pro (T_ADAFLAGS): Delete.
+ * pa/x-ada: New file. Define ADA_CFLAGS.
+
+2002-04-30 Janis Johnson <janis187@us.ibm.com>
+
+ * doc/install.texi (Final install): Add to the list of info to include
+ in a report of a successful bootstrap, and add link to 3.1 list.
+
+2002-04-30 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/6396
+ * toplev.c (rest_of_compilation): Only run regrename and copy
+ propagation if optimizing.
+
+2002-04-30 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
+
+ * doc/contrib.texi (Contributors): Use MIPS instead of Mips and
+ mips. Add two missing commas.
+
+2002-04-30 Paolo Carlini <pcarlini@unitus.it>
+
+ * doc/contrib.texi (Contributors): Update Paolo Carlini's
+ and Benjamin Kosnik's entries.
+
+2002-04-29 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ * combine.c (find_split_point): Use trunc_int_for_mode.
+
+Mon Apr 29 17:19:10 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * reload1.c (eliminate_regs, case SUBREG): Fix typo in
+ adjust_address_nv call.
+
+2002-04-29 Janis Johnson <janis187@us.ibm.com>
+
+ * doc/install.texi (Testing): Provide additional information, and
+ a stronger encouragement, for running the testsuites.
+
+2002-04-29 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ * fixinc/inclhack.def (solaris_widec): Include <wchar.h> in
+ Solaris 2 <widec.h> if missing.
+ * fixinc/fixincl.x: Regenerate.
+ * fixinc/tests/base/widec.h: New file.
+
+2002-04-29 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/6476
+ * configure.in: Check whether linker eh_frame optimizations work
+ properly.
+ * configure: Rebuilt.
+
+Mon Apr 29 17:08:09 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (dbx64_register_map): Fix typo.
+
+Mon Apr 29 14:48:33 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.md (sse_mov?fcc*): Revert patch of Apr 18th.
+
+2002-04-29 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
+
+ * doc/contrib.texi (Contributors): Add Paolo Carlini and
+ Janis Johnson.
+ Update Richard Henderson, Jakub Jelinek, and Mark Mitchell.
+ Refer to Objective-C instead of ObjC, SPARC instead of sparc,
+ and CPU instead of cpu.
+
+2002-04-29 Alexandre Oliva <aoliva@redhat.com>
+
+ * config.gcc: Revert i386 changes inadvertently brought in
+ from mainline along with 2002-04-04's change.
+
+2002-04-28 David S. Miller <davem@redhat.com>
+
+ PR target/6496
+ * config/sparc/sparc.md (call followed by jump peephole): Do not
+ match for TARGET_V9, kill TARGET_ARCH64 variants.
+
+ PR target/6500
+ * config/sparc/sparc.md (prefetch): Emit properly for 32-bit vs.
+ 64-bit TARGET_V9. Do not use prefetch page, use prefetch for
+ several {reads,writes} instead.
+ * config/sparc/sparc.h (PREFETCH_BLOCK, SIMULTANEOUS_PREFETCHES):
+ Define.
+
+2002-04-27 David S. Miller <davem@redhat.com>
+
+ PR target/6494
+ * config/sparc/linux64.h (MD_FALLBACK_FRAME_STATE_FOR): Be mindful
+ of the stack bias.
+
+ * config/sparc/linux.h, config/sparc/linux64.h: Don't bother
+ including signal.h and sys/ucontext.h, not needed.
+
+2002-04-28 Richard Henderson <rth@redhat.com>
+
+ PR c/5154
+ * ggc-common.c (ggc_mark_rtx_children_1): Rename from...
+ (ggc_mark_rtx_children): New.
+
+2002-04-28 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ PR c/6497
+ * config/rs6000/rs6000.md (sCC patterns): Remove clobber and use
+ result as temporary value.
+
+2002-04-28 Jakub Jelinek <jakub@redhat.com>
+
+ PR optimization/6475
+ * reload1.c (alter_reg): Only call set_mem_expr if I is home pseudo
+ register of REGNO_DECL (i).
+ * Makefile.in (reload1.o): Add $(TREE_H).
+
+2002-04-28 Bruce Korb <bkorb@gnu.org>
+
+ * fixinc/check.tpl (set-writable): verify that it exists before
+ invoking.
+
+2002-04-28 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ PR c/6343
+ * c-decl.c (duplicate_decls): Call merge_weak.
+ * c-pragma.c (apply_pragma_weak): Warn about misuse.
+ * output.h (merge_weak): Prototype merge_weak.
+ * varasm.c (merge_weak): New function.
+ (declare_weak): Make sure we don't give an error on VAR_DECLs.
+ Mark RTL with SYMBOL_REF_WEAK.
+
+2002-04-25 David S. Miller <davem@redhat.com>
+
+ PR target/6422
+ * reorg.c (optimize_skip): Do not allow exception causing
+ instructions to be considered for delay slots.
+ (fill_simply_delay_slots, fill_slots_from_thread): Likewise.
+ (relax_delay_slots): Do not try to consider exception causing
+ instructions as redundant.
+
+2002-04-26 Alexandre Oliva <aoliva@redhat.com>
+
+ * tree.c (tree_int_cst_lt): Compare constants whose types differ
+ in unsigned-ness correctly.
+
+2002-04-26 Chris Demetriou <cgd@broadcom.com>
+
+ * config/mips/mips.h (SUBTARGET_CPP_SIZE_SPEC): Get closer to
+ correct for MEABI (used by mipsisa32-elf).
+
+2002-04-26 Mark Mitchell <mark@codesourcery.com>
+
+ PR bootstrap/6445
+ * config/i386/i386.md (untyped_call): Return the value in a float
+ register if TARGET_FLOAT_RETURNS_IN_80387, not just if
+ TARGET_80387.
+
+2002-04-26 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/linux.h: Revert 2002-04-22 change.
+
+2002-04-26 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa.h (FUNCTION_OK_FOR_SIBCALL): Don't do sibcalls when using the
+ portable runtime model.
+
+2002-04-26 David Edelsohn <edelsohn@gnu.org>
+ Richard Henderson <rth@redhat.com>
+
+ * config/rs6000/rs6000.md (sCC pattern): Remove clobber and use
+ result as temporary value.
+
+2002-04-26 Richard Henderson <rth@redhat.com>
+
+ PR c/3581
+ * c-common.c (combine_strings): Use xmalloc, not alloca.
+
+ * c-common.c (combine_strings): Tweak __FUNCTION__ warning text.
+
+2002-04-26 Bo Thorsen <bo@suse.co.uk>
+
+ * config/i386/linux64.h (MD_FALLBACK_FRAME_STATE_FOR): Define for
+ x86-64.
+
+2002-04-25 David S. Miller <davem@redhat.com>
+
+ * config/sparc/sparc.h (FUNCTION_OK_FOR_SIBCALL): Add back check
+ for DECL being NULL.
+
+2002-04-25 Eric Botcazou <ebotcazou@multimania.com>
+
+ * c-decl.c (grokdeclarator): Remove outdated ??? note
+ on invalid declaration of flexible array members.
+
+2002-04-25 Richard Henderson <rth@redhat.com>
+
+ * doc/invoke.texi: Document -gdwarf{,-2} vs debug level.
+
+2002-04-25 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (s390_emit_epilogue): Always restore registers
+ needed by the compiler, even if they are used as global regs.
+
+2002-04-25 Steven Bosscher <S.Bosscher@student.tudelft.nl>
+
+ * doc/c-tree.texi: Fix typo in introduction.
+
+2002-04-24 Richard Henderson <rth@redhat.com>
+
+ * configure.in (HAVE_GAS_HIDDEN): Detect sparc binutils 2.12
+ linker bug.
+
+2002-04-24 Jason Merrill <jason@redhat.com>
+
+ * dwarf2.h (enum dwarf_attribute): Add DW_AT_GNU_vector.
+ * dwarf2out.c (dwarf_attr_name): Support it.
+ (gen_array_type_die): Emit it.
+ (lookup_type_die): No special handling for VECTOR_TYPE.
+ (gen_type_die): Hand VECTOR_TYPE off to gen_array_type_die.
+
+2002-04-24 Richard Henderson <rth@redhat.com>
+
+ * config/mips/mips.md (movdi_usd): Renumber.
+
+2002-04-24 Robert Lipe <robertlipe@usa.net>
+
+ * config/i386/sco5.h(i386.h, att.h): Eliminate double inclusion.
+
+2002-04-24 David S. Miller <davem@redhat.com>
+
+ * config/sparc/sparc.h (FUNCTION_OK_FOR_SIBCALL): Return false if
+ 32-bit Sparc and current_function_returns_struct is true.
+
+2002-04-24 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/altivec.h: Cleanup file. Add non individual
+ variants.
+ (vec_vaddubm): New.
+ (vec_vadduhm): New.
+ (vec_vadduwm): New.
+ (vec_vaddfp): New.
+ (vec_vaddcuw): New.
+ (vec_vaddubs): New.
+ (vec_vaddsbs): New.
+ (vec_vadduhs): New.
+ (vec_vadduws): New.
+ (vec_vaddsws): New.
+ (vec_vand): New.
+ (vec_vandc): New.
+ (vec_vavgub): New.
+ (vec_vavgsb): New.
+ (vec_vavguh): New.
+ (vec_vavgsh): New.
+ (vec_vavguw): New.
+ (vec_vavgsw): New.
+ (vec_vrfip): New.
+ (vec_vcmpbfp): New.
+ (vec_vcmpequb): New.
+ (vec_vcmpequh): New.
+ (vec_vcmpequw): New.
+ (vec_vcmpeqfp): New.
+ (vec_vcmpgefp): New.
+ (vec_vcmpgtub): New.
+ (vec_vcmpgtsb): New.
+ (vec_vcmpgtuh): New.
+ (vec_vcmpgtsh): New.
+ (vec_vcmpgtuw): New.
+ (vec_vcmpgtsw): New.
+ (vec_vcmpgtfp): New.
+ (vec_vcmpgefp): New.
+ (vec_vcfux): New.
+ (vec_vcfsx): New.
+ (vec_vctsxs): New.
+ (vec_vctuxs): New.
+ (vec_vexptefp): New.
+ (vec_vrfim): New.
+ (vec_lvx): New.
+ (vec_lvebx): New.
+ (vec_lvehx): New.
+ (vec_lde): Add vector float variant.
+ (vec_lvewx): New.
+ (vec_lvxl): New.
+ (vec_vlogefp): New.
+ (vec_vmaddfp): New.
+ (vec_vmhaddshs): New.
+ (vec_vmaxub): New.
+ (vec_vmaxsb): New.
+ (vec_vmaxuh): New.
+ (vec_vmaxsh): New.
+ (vec_vmaxuw): New.
+ (vec_vmaxsw): New.
+ (vec_vmaxsw): New.
+ (vec_vmaxfp): New.
+ (vec_vmrghb): New.
+ (vec_vmrghh): New.
+ (vec_vmrghw): New.
+ (vec_vmrglb): New.
+ (vec_vmrglh): New.
+ (vec_vmrglw): New.
+ (vec_vminub): New.
+ (vec_vminsb): New.
+ (vec_vminuh): New.
+ (vec_vminsh): New.
+ (vec_vminuw): New.
+ (vec_vminsw): New.
+ (vec_vminfp): New.
+ (vec_vmladduhm): New.
+ (vec_vmhraddshs): New.
+ (vec_msumubm): New.
+ (vec_vmsummbm): New.
+ (vec_vmsumuhm): New.
+ (vec_vmsumshm): New.
+ (vec_vmsumuhs): New.
+ (vec_vmsumshs): New.
+ (vec_vmuleub): New.
+ (vec_vmulesb): New.
+ (vec_vmuleuh): New.
+ (vec_vmulesh): New.
+ (vec_vmuloub): New.
+ (vec_mulosb): New.
+ (vec_vmulouh): New.
+ (vec_vmulosh): New.
+ (vec_vnmsubfp): New.
+ (vec_vnor): New.
+ (vec_vor): New.
+ (vec_vpkuhum): New.
+ (vec_vpkuwum): New.
+ (vec_vpkpx): New.
+ (vec_vpkuhus): New.
+ (vec_vpkshss): New.
+ (vec_vpkuwus): New.
+ (vec_vpkswss): New.
+ (vec_vpkshus): New.
+ (vec_vpkswus): New.
+ (vec_vperm): New.
+ (vec_vrefp): New.
+ (vec_vrlb): New.
+ (vec_vrlh): New.
+ (vec_vrlw): New.
+ (vec_vrfin): New.
+ (vec_vrsqrtefp): New.
+ (vec_vsel): New.
+ (vec_vslb): New.
+ (vec_vslh): New.
+ (vec_vslw): New.
+ (vec_vsldoi): New.
+ (vec_vsl): New.
+ (vec_vslo): New.
+ (vec_vspltb): New.
+ (vec_vsplth): New.
+ (vec_vspltw): New.
+ (vec_vspltisb): New.
+ (vec_vspltish): New.
+ (vec_vspltisw): New.
+ (vec_vsrb): New.
+ (vec_vsrh): New.
+ (vec_vsrw): New.
+ (vec_vsrab): New.
+ (vec_vsrah): New.
+ (vec_vsraw): New.
+ (vec_vsr): New.
+ (vec_vsro): New.
+ (vec_stvx): New.
+ (vec_stvebx): New.
+ (vec_stvehx): New.
+ (vec_stvewx): New.
+ (vec_stvxl): New.
+ (vec_vsububm): New.
+ (vec_vsubuhm): New.
+ (vec_vsubuwm): New.
+ (vec_vsubfp): New.
+ (vec_vsubcuw): New.
+ (vec_vsububs): New.
+ (vec_vsubsbs): New.
+ (vec_vsubuhs): New.
+ (vec_vsubshs): New.
+ (vec_vsubuws): New.
+ (vec_vsubsws): New.
+ (vec_vsum4ubs): New.
+ (vec_vsum4sbs): New.
+ (vec_vsum4shs): New.
+ (vec_vsum2sws): New.
+ (vec_vsumsws): New.
+ (vec_vrfiz): New.
+ (vec_vupkhsb): New.
+ (vec_vupkhpx): New.
+ (vec_vupkhsh): New.
+ (vec_vupklsb): New.
+ (vec_vupklpx): New.
+ (vec_vupklsh): New.
+ (vec_vxor): New.
+
+2002-04-23 Zack Weinberg <zack@codesourcery.com>
+
+ * doc/install.texi: Clarify which versions of alpha*-dec-osf*
+ are obsoleted.
+
+2002-04-23 Eric Botcazou <ebotcazou@multimania.com>
+
+ PR c/5430
+ * fold-const.c (split_tree): Add MINUS_LITP parameter; separate
+ added literals from substracted literals.
+ (associate_trees): Don't convert MINUS_EXPR into PLUS_EXPR.
+ (fold) [associate]: Preserve MINUS_EXPR if needed.
+
+2002-04-23 Tom Tromey <tromey@redhat.com>
+
+ * gcc.c: Added --resource. For PR java/6314.
+
+2002-04-23 David O'Brien <obrien@FreeBSD.org>
+
+ * config/freebsd.h(OBJECT_FORMAT_ELF): Define.
+
+2002-04-23 David O'Brien <obrien@FreeBSD.org>
+
+ * cp/g++spec.c: Use profiled libstdc++ and libm with -p/-pg.
+ * config/freebsd.h (MATH_LIBRARY_PROFILE): Use the _p verions of
+ these libraries.
+
+2002-04-23 Alan Modra <amodra@bigpond.net.au>
+
+ PR target/6413
+ * function.h: (struct function): Add profile_label_no field.
+ (current_function_profile_label_no): Define.
+ * function.c: (profile_label_no): New static var.
+ (expand_function_start): Increment it, and copy to
+ current_function_profile_label_no.
+ * output.h (profile_label_no): Delete.
+ * final.c (profile_label_no): Delete.
+ (profile_function): Use current_function_profile_label_no.
+ (final_end_function): Don't increment profile_label_no here.
+ * config/i386/i386.c (ix86_osf_output_function_prologue): Replace
+ profile_label_no with current_function_profile_label_no.
+ * config/pa/pa.c (current_function_number): Delete.
+ (pa_output_function_prologue): Don't output profile label here.
+ (hppa_profile_hook): Use label_no param rather than
+ current_function_number.
+ (FUNC_BEGIN_PROLOG_LABEL): Move to ..
+ * config/pa/pa.h: .. here.
+ (FUNCTION_PROFILER): Output profile label here.
+
+2002-04-23 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/altivec.h (vec_step): Remove extraneous
+ parentheses.
+ (vec_ctu): Cast return.
+
+2002-04-22 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/rs6000.md ("*movv4si_internal"): Change 'm'
+ constraint to 'o' for m=r and r=m alternatives.
+ ("*movv8hi_internal1"): Same.
+ ("*movv16qi_internal1"): Same.
+ ("*movv4sf_internal1"): Same.
+
+2002-04-22 Zack Weinberg <zack@codesourcery.com>
+
+ * c-lex.c (lex_charconst): Call convert to get constant in
+ proper type; don't just smash the type field.
+ Fixes PR c/6300.
+
+ * config.gcc: Add list of obsolete configurations. Disallow
+ building these without --enable-obsolete.
+ * doc/install.texi: Document --enable-obsolete and obsoletion
+ policy. Mention obsoletion of individual targets in
+ appropriate places.
+
+2002-04-22 Richard Henderson <rth@redhat.com>
+
+ * config/sparc/sol2-bi.h (ASM_DEBUG_SPEC): New.
+
+2002-04-22 Mark Mitchell <mark@codesourcery.com>
+
+ PR f/6138.
+ * function.c (fixup_memory_subreg): Add promoted_mode parameter.
+ (walk_fixup_memory_subreg): Likewise.
+ (fixup_var_refs_insn): Adjust accordingly.
+ (fixup_var_refs_1): Likewise.
+
+2002-04-22 Joel Sherrill <joel@OARcorp.com>
+
+ * gthr-rtems.h: Correct prototypes to remove warnings.
+
+2002-04-22 Richard Henderson <rth@redhat.com>
+
+ PR c/6344
+ * alias.c (canon_true_dependence): Special case (mem:blk (scratch)).
+
+ * gcse.c (free_insn_expr_list_list): New.
+ (clear_modify_mem_tables): Use it. Fix bit set usage.
+ (canon_list_insert): Use EXPR_LISTs for expressions.
+ (record_last_mem_set_info): Factor BLOCK_NUM (insn).
+
+2002-04-22 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/linux.h: (LIBPATH_SPEC, LIBPATH_ARCH31_SPEC,
+ LIBPATH_ARCH64_SPEC): Define.
+ (EXTRA_SPECS): Add libpath, libpath_arch31, libpath_arch64.
+ (STARTFILE_SPEC, ENDFILE_SPEC): Define; use libpath.
+ (LINK_ARCH31_SPEC): Add libpath_arch31 to search path.
+ (LINK_ARCH64_SPEC): Add libpath_arch64 to search path.
+
+2002-04-22 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/altivec.h (vec_xor): Add variant for both args
+ being vector signed int.
+ (vec_andc): Same.
+ (vec_xor): Add variant for both args being vector signed char.
+ Remove redundant variant.
+ (vec_andc): Same.
+
+2002-04-21 David S. Miller <davem@redhat.com>
+
+ * config/sparc/sparc.md (set then compare DI mode peephole2): Fix
+ compare mode in output RTL.
+
+2002-04-22 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.c (rs6000_override_options): Correct
+ style and formatting of previous patch.
+
+2002-04-22 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.c (rs6000_override_options): Always clear
+ flag_pic for ABI_AIX.
+
+2002-04-21 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * cppmacro.c (funlike_invocation_p): Don't step back
+ over CPP_EOF.
+
+2002-04-21 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.c (output_profile_hook): Do not increment
+ labelno.
+
+2002-04-20 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * doc/invoke.texi: Remove Chill references.
+ * doc/gcc.texi: Update last modified date.
+
+2002-04-19 David S. Miller <davem@redhat.com>
+
+ * config/sparc/linux.h (MD_FALLBACK_FRAME_STATE_FOR): Define.
+ * config/sparc/linux64.h (MD_FALLBACK_FRAME_STATE_FOR): Likewise.
+
+Sat Apr 20 02:17:38 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.md (movsi_1, movhi_1): Force reload to use more flexible
+ alternative.
+
+2002-04-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/6358
+ * function.c: Reapply patch for c/6358.
+ (expand_function_end): Copy decl_rtl's mode, not
+ current_function_return_rtx mode.
+
+2002-04-19 Joel Sherrill <joel@OARcorp.com>
+
+ * config/rtems.h (STARTFILE_SPEC, ENDFILE_SPEC): Fix for non-ELF
+ targets.
+
+2002-04-19 Tom Tromey <tromey@redhat.com>
+
+ * doc/install.texi (Specific): Update status of Solaris 2.8.
+ For PR libgcj/6158.
+
+2002-04-19 Dan Nicolaescu <dann@godzilla.ics.uci.edu>
+ Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
+
+ * doc/install.texi (Specific, sparc-sun-solaris2*): Mention that
+ binutils 2.11.2 and higher generate smaller binaries than Sun's
+ native tools.
+
+2002-04-19 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/6352
+ * toplev.c (rest_of_compilation): Do not defer functions for which
+ TREE_SYMBOL_REFERENCED has already been set.
+
+2002-04-18 Richard Henderson <rth@redhat.com>
+
+ * function.c: Revert patch for c/6358.
+
+2002-04-18 Richard Henderson <rth@redhat.com>
+
+ * ifcvt.c (find_cond_trap): Handle cases with no proper THEN or JOIN
+ blocks. Handle multiple references to the TRAP block. Handle
+ non-adjacent THEN and OTHER blocks.
+
+2002-04-18 Richard Henderson <rth@redhat.com>
+
+ * config/ia64/ia64.c (ia64_function_arg_pass_by_reference): Don't
+ crash with no type for by-mode libcalls.
+
+ * config/ia64/ia64.md (conditional_trap): Fix predicate polarity.
+
+2002-04-18 David S. Miller <davem@redhat.com>
+
+ * config/sparc/sparc.h (BRANCH_COST): Define.
+
+ * fold-const.c (BRANCH_COST): Don't provide default here, expr.h
+ does it.
+
+2002-04-18 Richard Henderson <rth@redhat.com>
+
+ * config/ia64/ia64.c (ia64_function_arg_pass_by_reference): New.
+ (ia64_va_arg): Expect variable sized types by reference.
+ * config/ia64/ia64-protos.h: Update.
+ * config/ia64/ia64.h (FUNCTION_ARG_PASS_BY_REFERENCE): Use
+ ia64_function_arg_pass_by_reference.
+
+2002-04-18 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * flow.c (update_life_info): Ignore return value of cleanup_cfg.
+ Mask out PROP_SCAN_DEAD_CODE | PROP_KILL_DEAD_CODE in
+ propagate_block calls after relaxation loop using new variable
+ stabilized_prop_flags.
+
+2002-04-18 Richard Henderson <rth@redhat.com>
+
+ * ifcvt.c: Include except.h.
+ (block_has_only_trap): Break out from find_cond_trap.
+ (find_cond_trap): Use it. Always delete the trap block.
+ (merge_if_block): Allow then block null. Be less simplistic about
+ what insns can end a block.
+ * Makefile.in (ifcvt.o): Depend on except.h.
+
+ * config/ia64/ia64.md (trap, conditional_trap): New.
+
+2002-04-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/6358
+ * function.c (assign_parms): Assign hard current_function_return_rtx
+ register here...
+ (expand_function_end): ...not here.
+
+2002-04-18 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
+
+ * doc/install.texi (Downloading the source): Do not mention Chill
+ any longer, but mention Ada.
+ (Configuration): Do not mention Chill any longer.
+
+2002-04-18 Hans-Peter Nilsson <hp@axis.com>
+
+ * config/cris/cris.h (TARGET_VERSION): Remove local version number.
+
+Thu Apr 18 15:49:12 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.h (SSE_FLOAT_MODE_P): Kill bogus TARGET_SSE_MATH check.
+ * i386.md (sse_mov?fcc*): Swap operands for cases they will be swapped
+ later.
+
+2002-04-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/6205
+ * config/i386/i386.md (movsf_1): Use pxor only if TARGET_SSE2,
+ otherwise xorps.
+
+2002-04-18 Loren J. Rittle <ljrittle@acm.org>
+
+ Revert this change:
+
+ * doc/install.texi (Installing GCC: Configuration): Clarify
+ the only supported ways to configure gcc.
+
+2002-04-17 Dale Johannesen <dalej@apple.com>
+
+ * config/rs6000/rs6000.c (rs6000_emit_cmove): Fail if modes of
+ comparison operands do not match each other or if modes of
+ conditions do not match result.
+ (rs6000_output_function_prologue): Compute instruction addresses.
+ (rs6000_output_function_epilogue): Likewise.
+
+2002-04-17 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (legitimize_pic_address): Do not generate
+ illegal address constant without CONST.
+
+2002-04-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * sparc/linux64.h (CC1_SPEC): Error for -m32 and -m64.
+ * sparc/netbsd-elf.h (CC1_SPEC32, CC1_SPEC64): Likewise.
+
+2002-04-17 Ulrich Weigand <uweigand@de.ibm.com>
+
+ PR optimization/6305
+ * config/s390/s390.c (s390_expand_plus_operand): Use find_replacement
+ to make sure previous reloads are taken into account. Generate
+ better code if one operand is an in-range immediate constant.
+
+2002-04-16 Andrew Haley <aph@cambridge.redhat.com>
+
+ * doc/install.texi (Building): libgcj requires GNU make.
+
+2002-04-17 Jakub Jelinek <jakub@redhat.com>
+
+ PR bootstrap/6315
+ * config/sparc/sparc.md (movtf reg<-reg split): Allow spliting
+ even if hard quad and register is not floating.
+ (movtf reg<-mem split): Disallow splitting if hard quad and
+ register is floating.
+ (movtf mem<-reg split): Likewise.
+ * config/sparc/sparc.c (fp_register_operand): New predicate.
+ * config/sparc/sparc.h (PREDICATE_CODES): Add fp_register_operand.
+
+2002-04-17 Zack Weinberg <zack@codesourcery.com>
+
+ * Makefile.in (PROTO_OBJS): Add cppdefault.o.
+ (protoize.o): Take $(PREPROCESSOR_DEFINES) off command line.
+ (unprotoize.o): Ditto. Build from protoize.c. Define
+ UNPROTOIZE on command line.
+ * protoize.c: Include cppdefault.h. Delete include_defaults.
+ (in_system_include_dir): Use cpp_include_defaults (defined in
+ cppdefault.o).
+ * unprotoize.c: Delete file.
+
+2002-04-17 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/altivec.h (vec_ld): Add array variants.
+ (vec_lde): Same.
+ (vec_ldl): Same.
+
+2002-04-17 Alan Matsuoka <alanm@redhat.com>
+ Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/altivec.h: Define __ALTIVEC__.
+ (bool): New.
+ (__pixel): New.
+ (pixel): New.
+ (vec_cfux): New.
+ (vec_vmaddfp): New.
+ (vec_vsldoi): New.
+ Add parentheses to all macro arguments.
+
+2002-04-16 Richard Henderson <rth@redhat.com>
+
+ PR c++/6320
+ * except.c (remove_eh_handler): Insert inner regions at beginning
+ of sibling chain. Refactor expressions.
+
+2002-04-16 Mark Mitchell <mark@codesourcery.com>
+
+ * c-common.h (STMT_EXPR_NO_SCOPE): New macro.
+ * c-common.c (c_expand_expr): Respect STMT_EXPR_NO_SCOPE.
+ * tree.h (expand_start_stmt_expr): Update prototype.
+ * stmt.c (expand_start_stmt_expr): Add has_scope parameter.
+ * tree-inline.c (expand_call_inline): Set STMT_EXPR_NO_SCOPE
+ on the STMT_EXPR created for the inline function.
+
+2002-04-16 Richard Henderson <rth@redhat.com>
+
+ * config/sparc/sol2-bi.h (AS_SPARC64_FLAG): New.
+ * config/sparc/sol2-gas-bi.h: New file.
+ * config.gcc (sparc*-solaris): Add it as needed.
+ * configure.in (AS_SPARC64_FLAG): Remove check.
+ * config.in, configure: Regenerate.
+
+ * config/sparc/sol2-bi.h (CC1_SPEC): Error for -m32 and -m64.
+
+2002-04-16 Richard Henderson <rth@redhat.com>
+
+ * config/mips/mips.c (override_options): Don't override N32 for
+ a 64-bit ISA.
+
+ PR c/6202
+ * config/mips/mips.md (can_delay): Split out of existing define_delays.
+ (HILO_delay): Set can_delay false.
+
+2002-04-16 Paolo Carlini <pcarlini@unitus.it>
+
+ * c-parse.in (poplevel, compstmt_start, compstmt_primary_start):
+ Add ending ';', in accordance with POSIX.
+
+2002-04-16 Richard Henderson <rth@redhat.com>
+
+ * config.gcc (sparcv9-solaris): Configure for 64-bit default.
+ Adjust tm_file order to get TARGET_DEFAULT set properly.
+ (sparc-solaris): Configure 2.[78] for 64-bit multilibs.
+ * doc/install.texi (sparc-solaris): Update.
+
+2002-04-16 Hartmut Penner <hpenner@de.ibm.com>
+
+ PR target/6305
+ * config/s390/s390.md (mulsidi3): Set both subregs of the
+ multiword register.
+
+2002-04-16 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/altivec.h (vec_addc): Type check.
+
+2002-04-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/6279
+ * expr.c (store_expr): Don't copy if DECL_RTL (exp) == target.
+
+ * expr.c (safe_from_p): Cleanup: use DECL_RTL_IF_SET.
+
+2002-04-15 Richard Henderson <rth@redhat.com>
+
+ * config/mips/abi64.h (SUBTARGET_CONDITIONAL_REGISTER_USAGE): Set
+ call_really_used_regs too.
+
+2002-04-15 David S. Miller <davem@redhat.com>
+
+ * rtlanal.c (note_stores): Don't present PARALLEL SET_DESTs
+ as being CLOBBERed.
+
+2002-04-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/6290
+ * config/rs6000/rs6000.c (easy_vector_constant): Return 1 if the
+ CONST_VECTOR is { 0, ... 0 }.
+
+2002-04-15 Loren J. Rittle <ljrittle@acm.org>
+
+ * doc/install.texi (Installing GCC: Configuration): Clarify
+ the only supported ways to configure gcc.
+
+2002-04-15 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/linux.h, config/arm/linux-elf.h, config/i370/linux.h,
+ config/i386/linux-aout.h, config/i386/linux-oldld.h,
+ config/i386/linux.h, config/i386/linux64.h, config/ia64/linux.h,
+ config/m68k/linux-aout.h, config/m68k/linux.h, config/mips/linux.h,
+ config/pa/pa-linux.h, config/pj/linux.h, config/s390/linux.h,
+ config/sh/linux.h, config/sparc/linux-aout.h, config/sparc/linux.h,
+ config/sparc/linux64.h, config/xtensa/linux.h (CPP_PREDEFINES):
+ Define __gnu_linux__, not gnu_linux.
+ * config/rs6000/sysv4.h (CPP_OS_GNU_SPEC): Likewise for gnu_hurd.
+
+2002-04-15 Mark Mitchell <mark@codesourcery.com>
+
+ Remove Chill front end.
+ * gcc.c (default_compilers): Remove Chill entries.
+ * ch: Remove directory.
+ * doc/frontends.texi: Remove information about Chill.
+ * doc/sourcebuild.texi: Likewise.
+ * doc/standards.texi: Likewise.
+
+2002-04-15 Douglas B Rupp <rupp@gnat.com>
+
+ * config/alpha/vms.h (INCLUDE_DEFAULTS): Add /gnu/lib/gcc-lib/include.
+ (LONGLONG_STANDALONE): Define.
+
+2002-04-15 David S. Miller <davem@redhat.com>
+
+ * config/sparc/sparc.c (sparc_emit_float_lib_cmp):
+ Call emit_library_call with LCT_NORMAL.
+ (sparc_initialize_trampoline): Use LCT_foo instead of
+ magic constant in emit_library_call invocations.
+ (sparc64_initialize_trampoline): Likewise.
+ (sparc_profile_hook): Likewise.
+ * config/sparc/sparc.md: Likewise.
+
+ * config/sparc/sparc.c (sparc_extra_constraint_check):
+ Fix type of argument 'c'.
+ * config/sparc/sparc-protos.h (sparc_extra_constraint_check):
+ Likewise.
+
+2002-04-14 Andreas Schwab <schwab@suse.de>
+
+ * config/ia64/linux.h (CPP_PREDEFINES): Fix missing backslash.
+
+2002-04-14 Jeroen Dobbelaere <jeroen.dobbelaere@acunia.com>
+
+ * config/arm/linux-elf.h (CPLUSPLUS_CPP_SPEC): Define.
+
+2002-04-13 Mark Mitchell <mark@codesourcery.com>
+
+ * config/alpha/linux.h (CPP_PREDEFINES): Fix typo.
+ * config/i386/gnu.h (CPP_PREDEFINES): Define __gnu_hurd__,
+ not gnu_hurd.
+
+2002-04-13 Hans-Peter Nilsson <hp@axis.com>
+
+ * config/cris/linux.h (CRIS_CPP_SUBTARGET_SPEC): Fix typo.
+
+2002-04-13 Joel Sherrill <joel@OARcorp.com>
+
+ * config/sparc/t-elf: Enable v8 multilibs. Impacts
+ sparc-elf and sparc-rtems targets.
+
+2002-04-13 Mark Mitchell <mark@codesourcery.com>
+
+ * alpha/linux.h: Define __gnu_linux__ wherever __linux__ is
+ defined, and __gnu_hurd__ wherever __GNU__ is defined.
+ * arm/linux-elf.h: Likewise.
+ * cris/aout.h: Likewise.
+ * cris/linux.h: Likewise.
+ * i370/linux.h: Likewise.
+ * i386/gnu.h: Likewise.
+ * i386/linux-aout.h: Likewise.
+ * i386/linux-oldld.h: Likewise.
+ * i386/linux.h: Likewise.
+ * i386/linux64.h: Likewise.
+ * ia64/linux.h: Likewise.
+ * m68k/linux-aout.h: Likewise.
+ * m68k/linux.h: Likewise.
+ * mips/linux.h: Likewise.
+ * pa/pa-linux.h: Likewise.
+ * pj/linux.h: Likewise.
+ * rs6000/sysv4.h: Likewise.
+ * s390/linux.h: Likewise.
+ * sh/linux.h: Likewise.
+ * sparc/linux-aout.h: Likewise.
+ * sparc/linux.h: Likewise.
+ * sparc/linux64.h: Likewise.
+ * xtensa/linux.h: Likewise.
+
+2002-04-13 Andreas Schwab <schwab@suse.de>
+
+ * config/ia64/ia64.h (CPP_SPEC): Include %(cpp_cpu).
+
+2002-04-12 Mark Mitchell <mark@codesourcery.com>
+
+ Revert these changes:
+
+ 2002-04-06 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/5571
+ * stor-layout.c (layout_decl): Reset the RTL for the decl.
+
+ 2002-03-15 Mark Mitchell <mark@codesourcery.com>
+
+ * expr.c (expand_expr): Tidy.
+
+2002-04-12 Richard Henderson <rth@redhat.com>
+
+ * config.gcc (sparcv9-*-solaris2): Default to 32-bit code.
+ (sparc*-*-solaris): Clean up header files.
+ * configure.in (AS_SPARC64_FLAG): Error out if can't find it
+ and plan on generating 64-bit code.
+ * toplev.c (decode_g_option): Remove LINKER_DOES_NOT_WORK_WITH_DWARF2.
+ * config/sparc/sol2-64.h: Delete and reuse for default 64-bit code.
+ * config/sparc/sol2-sld-64.h: Rename ...
+ * config/sparc/sol2-bi.h: ... here. Remove the bits that checked
+ for AS_SPARC64_FLAG not defined.
+ * config/sparc/sol2-gld-bi.h: New.
+ * config/sparc/sol2-sld.h: Remove.
+ * config/sparc/sol26-sld.h: New.
+ * config/sparc/sol2.h: Tidy comments.
+ * doc/install.texi: Document sparc-solaris configury changes.
+
+2002-04-12 Richard Henderson <rth@redhat.com>
+
+ * recog.c (offsettable_address_p): Match the logic in adjust_address.
+
+ * config/sparc/sparc.h (LEGITIMIZE_RELOAD_ADDRESS): Handle TFmode
+ in 64-bit mode only. Use only for 32-bit or MEDLOW.
+
+2002-04-12 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ * config/alpha/osf.h (LINK_SPEC): Pass -S to silence ld warnings.
+
+Fri Apr 12 15:42:59 2002 Jeffrey A Law (law@redhat.com)
+
+ * pa.c (pa_can_combine_p): Call extract_insn before calling
+ constrain_operands.
+
+2002-04-12 Douglas B Rupp <rupp@gnat.com>
+
+ * hwint.h (HAVE___INT64): Correct spelling.
+
+ * config/i386/i386-interix.h (EH_FRAME_IN_DATA_SECTION): Define.
+ (TARGET_ASM_NAMED_SECTION, RETURN_IN_MEMORY) Define.
+ (DEFAULT_PCC_STRUCT_RETURN): Define as 0.
+ (CPP_PREDEFINES): Handle __declspec.
+ * config/i386/t-interix (USER_H): Remove.
+
+2002-04-12 DJ Delorie <dj@redhat.com>
+
+ * integrate.c (compare_blocks): Make comparisons safe for when
+ sizeof(int) < sizeof(char *).
+ (find_block): Likewise.
+
+2002-04-12 Andreas Schwab <schwab@suse.de>
+
+ * config/ia64/ia64.h (ASM_SPEC): Moved from here ...
+ * config/ia64/sysv4.h (ASM_SPEC): ... to here, so that it
+ overrides the definition in config/svr4.h.
+
+2002-04-12 Eric Norum <eric.norum@usask.ca>
+
+ * config/rtems.h, config/a29k/rtems.h, config/arm/rtems-elf.h,
+ config/c4x/rtems.h, config/h8300/rtems.h, config/i386/rtems.h,
+ config/i386/rtemself.h, config/i960/rtems.h, config/m68k/rtems.h,
+ config/m68k/rtemself.h, config/mips/rtems.h, config/mips/rtems64.h,
+ config/pa/rtems.h, config/rs6000/rtems.h, config/sh/rtems.h,
+ config/sh/rtemself.h, config/sparc/rtems.h, config/sparc/rtemself.h,
+ config/v850/rtems.h (*-rtems*): Cleanup pass to move common
+ definitions to config/rtems.h and make the targets more similar.
+
+Fri Apr 12 08:06:54 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expr.c (expand_assigment): Remove duplicate conversions #ifdef
+ POINTERS_EXTEND_UNSIGNED.
+ (store_constructor, expand_expr, case COMPONENT_REF): Likewise.
+ (store_expr): Use TYPE_MODE (sizetype), not ptr_mode.
+
+ * emit-rtl.c (widen_memory_access): Don't do anything if MEMOFFSET
+ not specified.
+
+2002-04-12 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * function.c (fixup_var_refs_1) <SET, handling VAR in SET_SRC>:
+ For paradoxical (subreg VAR), replace VAR, don't try the subreg.
+
+2002-04-12 Andreas Schwab <schwab@suse.de>
+
+ * config/ia64/ia64.h (EXTRA_SPECS): Fix missing backslash.
+
+2002-04-12 Richard Henderson <rth@redhat.com>
+
+ PR bootstrap/4191
+ * config/d30v/d30v.h (INIT_SECTION_ASM_OP): Don't undef.
+
+ * flow.c (mark_used_reg): Manage reg_cond_dead properly for
+ modes spanning multiple hard regs.
+
+ * recog.c (peephole2_optimize): Rebuild jump labels as needed.
+
+2002-04-11 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa.c (output_millicode_call): Check attribute type as well as length
+ when length is 28.
+
+2002-04-11 David O'Brien <obrien@FreeBSD.org>
+
+ * config/freebsd.h (NO_IMPLICIT_EXTERN_C, SCCS_DIRECTIVE): Give value.
+ (DEFAULT_PCC_STRUCT_RETURN) Do not redefine.
+ (USER_LABEL_PREFIX, HANDLE_SYSV_PRAGMA, IDENT_ASM_OP,
+ DWARF2_DEBUGGING_INFO, DBX_DEBUGGING_INFO, PREFERRED_DEBUGGING_TYPE):
+ elfos.h and dbxelf.h values are fine now.
+ * config/i386/freebsd.h, config/alpha/freebsd.h
+ (DEFAULT_PCC_STRUCT_RETURN): Define to 0.
+
+2002-04-11 David O'Brien <obrien@FreeBSD.org>
+
+ * config/ia64/aix.h (CPP_PREDEFINES): Do not define _LP64/__LP64__
+ or set Acpu or Amachine. Reformat.
+ (ASM_SPEC, DONT_USE_BUILTIN_SETJMP, PROFILE_BEFORE_PROLOGUE): Do not
+ define.
+ (LINK_SPEC): Do not need to undef.
+ * config/ia64/elf.h (ASM_EXTRA_SPEC): Define.
+ * config/ia64/freebsd.h (LINK_SPEC): Do not need to undef.
+ (ASM_SPEC, DONT_USE_BUILTIN_SETJMP, PROFILE_BEFORE_PROLOGUE): Do not
+ define.
+ * config/ia64/hpux.h (ASM_EXTRA_SPEC): Define.
+ (ASM_SPEC): Do not define, use ASM_EXTRA_SPEC instead.
+ (LINK_SPEC): Do not need to undef.
+ (DONT_USE_BUILTIN_SETJMP): Do not define.
+ * config/ia64/ia64.h (ASM_SPEC, ASM_EXTRA_SPEC): Add.
+ (CPP_CPU_SPEC): Define _LP64, set Acpu and Amachine. Remove -Dia64.
+ (DONT_USE_BUILTIN_SETJMP, PROFILE_BEFORE_PROLOGUE): Define.
+ Remove trailing spaces.
+ * config/ia64/linux.h (CPP_PREDEFINES): Do not define _LP64/__LP64__,
+ __ELF__, or set Acpu or Amachine. Reformat.
+ (ASM_SPEC, DONT_USE_BUILTIN_SETJMP, PROFILE_BEFORE_PROLOGUE): Do not
+ define.
+
+2002-04-11 David O'Brien <obrien@FreeBSD.org>
+
+ * config.gcc (ia64-*-freebsd*): Fix ordering of tm_files to match
+ all other *-*-freebsd* targets.
+
+2002-04-11 Richard Sandiford <rsandifo@redhat.com>
+
+ * doc/extend.texi: Remove old claim that typedefs cannot have
+ an alignment attribute.
+
+2002-04-11 Jakub Jelinek <jakub@redhat.com>
+
+ PR optimization/6177
+ * expr.c (expand_expr) [COMPONENT_REF]: Handle op0 CONCAT if
+ bitpos is 0 and bitsize CONCAT size.
+
+2002-04-11 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/6223
+ * combine.c (if_then_else_cond): Use trunc_int_for_mode on nz.
+
+2002-04-11 David O'Brien <obrien@FreeBSD.org>
+
+ * config/alpha/freebsd.h: Minor reformatting.
+ (CPP_SPEC): Define ELF and add cpp_subtarget.
+ (ASM_SPEC): No longer needed.
+
+2002-04-11 Richard Henderson <rth@redhat.com>
+
+ * config/sparc/sparc.md (movdi_insn_sp32): Add o/J alternative.
+ (movdi_insn_sp32_v9): Likewise. Only allow stx with aligned memory.
+ (dimode mem/zero splitter): New.
+
+2002-04-11 Hans-Peter Nilsson <hp@axis.com>
+
+ * config/cris/cris.c (cris_override_options): Tweak error message
+ for PIC not implemented.
+
+ * config/cris/cris.h: Tweak comments related to parameter-passing.
+
+ * config/cris/t-cris (TARGET_LIBGCC2_CFLAGS): Don't -Dinhibit_libc here.
+
+ * config/cris/cris.c (cris_target_asm_function_prologue): Cast
+ uses of PIC_OFFSET_TABLE_REGNUM to int to silence warnings.
+ (cris_target_asm_function_epilogue): Ditto.
+ (cris_initial_frame_pointer_offset): Ditto.
+ (cris_simple_epilogue): Ditto.
+ (cris_expand_builtin_va_arg): Variable-size types come in
+ by-reference.
+
+2002-04-10 Richard Henderson <rth@redhat.com>
+
+ * except.c (add_ehl_entry): Allow duplicates after landing pad
+ creation.
+
+2002-04-10 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/t-aix43 (SHLIB_NM_FLAGS): Add -X32_64.
+
+2002-04-10 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * reload1.c (choose_reload_regs): HARD_FRAME_POINTER_REGNUM
+ is only used as frame pointer when frame_pointer_needed is true.
+
+2002-04-10 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/817
+ * arm.md (arm_movdi): Adjust neg_pool_range attribute to allow
+ for the fact that the pool entry uses two words.
+ (movdf_hard_insn): Similarly. Also, ADR instruction can span
+ 1k bytes.
+ (movdf_soft_insn): Similarly.
+ (movxf_hard_insn): Adjust neg_pool_range attribute to allow
+ for the fact that the pool entry uses three words.
+
+2002-04-10 Richard Henderson <rth@redhat.com>
+
+ * expr.c (expand_expr) [INTEGER_CST]: Don't force into registers
+ if EXPAND_INITIALIZER.
+
+2002-04-10 Alan Modra <amodra@bigpond.net.au>
+
+ PR optimization/6233
+ * rtlanal.c (pure_call_p): New function.
+ * rtl.h (pure_call_p): Declare.
+ * loop.c (prescan_loop): Use it to set has_nonconst_call.
+ * gcse.c (store_killed_in_insn): Use pure_call_p here too.
+
+2002-04-09 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/alpha.md (movdi_er_maybe_g): New.
+ * config/alpha/alpha.c (alpha_expand_mov): Use it.
+
+2002-04-09 Richard Henderson <rth@redhat.com>
+
+ PR c/5078
+ * expr.c (expand_expr) [INTEGER_CST]: Force overflows into registers.
+
+2002-04-09 Andrew MacLeod <amacleod@redhat.com>
+
+ * expr.c (expand_expr): A RESULT_DECL is part of a call.
+
+2002-04-09 Richard Henderson <rth@redhat.com>
+
+ * cfg.c (expunge_block): Decrement num_elements here ...
+ (expunge_block_nocompact): ... not here.
+ * cfgcleanup.c (delete_unreachable_blocks): Set num_elements.
+
+2002-04-09 Richard Henderson <rth@redhat.com>
+
+ * basic-block.h (flow_delete_block_noexpunge): Declare.
+ (expunge_block_nocompact): Declare.
+ * cfg.c (expunge_block_nocompact): Split out from ...
+ (expunge_block): ... here.
+ * cfgrtl.c (can_delete_label_p): Don't use exception_handler_labels.
+ (flow_delete_block_noexpunge): Split out from ...
+ (flow_delete_block): ... here.
+ * cfgcleanup.c (delete_unreachable_blocks): Compact while
+ removing dead blocks.
+ * except.c (exception_handler_labels): Remove.
+ (exception_handler_label_map): New.
+ (struct eh_region): Add aka member.
+ (mark_ehl_map_entry, mark_ehl_map, free_region): New.
+ (ehl_hash, ehl_eq, ehl_free, add_ehl_entry): New.
+ (for_each_eh_label, for_each_eh_label_1): New.
+ (init_eh): Register exception_handler_label_map.
+ (free_eh_status): Use free_region.
+ (find_exception_handler_labels): Use the map, not the list.
+ (remove_exception_handler_label): Likewise.
+ (maybe_remove_eh_handler): Likewise.
+ (remove_eh_handler): Use the region aka bitmap.
+ * except.h (exception_handler_labels): Remove.
+ (for_each_eh_label): Declare.
+ * jump.c (rebuild_jump_labels): Don't check exception_handler_labels.
+ * loop.c (invalidate_loops_containing_label): New.
+ (find_and_verify_loops): Use it. Use for_each_eh_label.
+ * sched-rgn.c (is_cfg_nonregular): Use
+ current_function_has_exception_handlers.
+
+2002-04-08 Richard Henderson <rth@redhat.com>
+
+ * reorg.c (get_branch_condition): Use reversed_comparison_code.
+
+2002-04-08 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/larith.asm (__map_data_section): Fix condition
+ and optimize for size.
+ (__do_global_ctors): Fix pointer comparison.
+ (__do_global_dtors): Likewise.
+
+2002-04-09 David S. Miller <davem@redhat.com>
+
+ * config/sparc/sparc.c (sparc_extra_constraint_check): New
+ function, implementing EXTRA_CONSTRAINTS. For memory constraints,
+ allow reloading pseudos.
+ * config/sparc/sparc.h (EXTRA_CONSTRAINTS): Use it.
+ * config/sparc/sparc-protos.h: Declare it.
+
+ * config/sparc/sparc.c (const64_is_2insns): Kill signed vs.
+ unsigned comparison warning.
+ (output_restore_regs): Mark leaf_function as unused.
+
+Tue Apr 9 09:35:45 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expr.c (is_aligning_offset): New function.
+ (expand_expr, case COMPONENT_EXPR): Call it.
+
+2002-04-09 Alan Modra <amodra@bigpond.net.au>
+
+ * configure.in (auto-build.h): Use target_alias and build_alias
+ when running configure.
+ (gcc_cv_as): Use $target_alias in directory searchs rather than
+ $target. Heed program_prefix and program_transform_name. Search
+ for gas in cross-compiler case too. "test -x" rather than "test -f".
+ (gcc_cv_ld): Likewise.
+ (gcc_cv_nm): Set for cross compilers too. Heed program_prefix and
+ program_transform_name.
+ (gcc_cv_objdump): Likewise.
+ * configure: Regenerate.
+
+2002-04-08 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * config/mmix/t-mmix (TARGET_LIBGCC2_CFLAGS): Don't -Dinhibit_libc
+ here.
+
+ * config/mmix/mmix.h (INITIAL_ELIMINATION_OFFSET): Remove spurious
+ semicolon.
+
+ * config/mmix/mmix.c (mmix_expand_builtin_va_arg): Variable-size
+ types come in by-reference. Fix typo in comment.
+
+2002-04-08 Richard Henderson <rth@redhat.com>
+
+ PR opt/6007
+ * toplev.c (rest_of_compilation): Disable cross-jumping for
+ highly connected graphs.
+
+2002-04-08 David S. Miller <davem@redhat.com>
+
+ PR target/6082
+ * config/sparc/freebsd.h (SPARC_DEFAULT_CMODEL): Set to CM_MEDLOW
+
+ Make init_priority work on Sparc when using GNU ld.
+ * config/sparc/linux.h, config/sparc/linux64.h,
+ config/sparc/netbsd-elf.h, config/sparc/freebsd.h
+ (CTORS_SECTION_ASM_OP, DTORS_SECTION_ASM_OP): Undefine.
+ * config/sparc/sol2-gld.h: New file to do the same.
+ * config.gcc (sparc*-*-solaris2*): If gnu_ld=yes add
+ sparc/sol2-gld.h to tm_file.
+
+ PR optimization/4328
+ * config/sparc/sparc.h (EXTRA_CONSTRAINT): Add new constraint 'W'.
+ * doc/md.texi: Document it.
+ * config/sparc/sparc.md (movdi_insn_sp64_novis,
+ movdi_insn_sp64_vis, movdf_insn_sp32, movdf_insn_v9only_novis,
+ movdf_insn_v9only_vis, movdf_insn_sp64_novis,
+ movdf_insn_sp64_vis): Use it as MEM constraing with 'e' registers.
+ * config/sparc/sparc.c (mem_min_alignment): Fix comment.
+
+2002-04-08 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
+
+ * doc/contrib.texi (Contributors): Add John David Anglin and Loren
+ J. Rittle (the latter also to Testers). Update David O'Brien's entry.
+
+2002-04-07 David S. Miller <davem@redhat.com>
+
+ * config.gcc (sparc64-*-linux*): Add t-crtfm to tmake_file.
+
+2002-04-07 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ PR 5933
+ * pa.h (ASM_OUTPUT_MI_THUNK): Use indirect jump to target function when
+ generating 32-bit pic code.
+
+2002-04-07 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ * config/rs6000/rs6000.h (RS6000_PIC_OFFSET_TABLE_REGNUM): New.
+ (PIC_OFFSET_TABLE_REGNUM): Use it and return INVALID_REGNUM if
+ !flag_pic.
+ (CONDITIONAL_REGISTER_USAGE): Adjust accordingly.
+ * config/rs6000/rs6000.h: Use RS6000_PIC_OFFSET_TABLE_REGNUM instead
+ of PIC_OFFSET_TABLE_REGNUM thruout.
+ * config/rs6000/rs6000.md: Likewise.
+ * config/rs6000/darwin.h: Likewise.
+
+2002-04-06 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * reorg.c (dbr_schedule): Don't reposition prologue and epilogue notes.
+
+2002-04-06 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/5571
+ * stor-layout.c (layout_decl): Reset the RTL for the decl.
+
+ PR opt/5120
+ * sibcall.c (optimize_sibling_and_tail_recursive_call): Clear
+ RTX_UNCHANGING_P for the functions arguments when a tail call
+ is made.
+
+2002-04-06 Jason Merrill <jason@redhat.com>
+
+ * toplev.c (flag_no_inline, flag_really_no_inline): Default to 2.
+ (parse_options_and_default_flags): Set them appropriately.
+ * c-common.c (c_common_post_options): Don't set flag_really_no_inline.
+
+Sat Apr 6 18:26:32 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * ifcvt.c (if_convert): Clear aux fields of blocks.
+
+2002-04-05 David S. Miller <davem@redhat.com>
+
+ * config/sparc/freebsd.h (ENDFILE_SPEC): Add crtfastmath bits.
+ * config.gcc (sparc64-wrs-vxworks, sparc-*-chorusos,
+ sparc-*-rtems*, sparclite-*-elf* sparc86x-*-elf*, sparc64-*-elf*,
+ {sparc64,ultrasparc}-*-freebsd*): Add sparc/t-crtfm to tmake_file.
+
+2002-04-05 Jan Hubicka <jh@suse.cz>
+
+ * optabs.c (emit_no_conflict_block, emit_libcall_block): Avoid nesting
+ of libcall regions.
+
+2002-04-05 David S. Miller <davem@redhat.com>
+
+ * config/sparc/sparc.c (sparc_nonflat_function_epilogue): If we
+ are not going to emit return instructions, emit at least a nop
+ for the sake of sane backtraces.
+
+2002-04-05 Jakub Jelinek <jakub@redhat.com>
+
+ * mklibgcc.in: Use separate libgcc.map for each multilib.
+ * Makefile.in (distclean): Don't remove libgcc.map here.
+
+2002-04-05 Jakub Jelinek <jakub@redhat.com>
+
+ * Makefile.in (s-mlib): Handle --disable-multilib by separate
+ genmultilib invocation.
+
+2002-04-04 David S. Miller <davem@redhat.com>
+
+ * config/sparc/crtfastmath.c: New file.
+ * config/sparc/t-crtfm: New file.
+ * config/sparc/linux.h (ENDFILE_SPEC): Use crtfastmath.o
+ * config/sparc/linux64.h (ENDFILE_SPEC): Likewise.
+ * config/sparc/sol2.h (ENDFILE_SPEC): Likewise.
+ * config/sparc/sp64-elf.h (ENDFILE_SPEC): Likewise.
+ * config/sparc/elf.h (ENDFILE_SPEC): Likewise.
+ * config.gcc (sparc*-*-{elf*,linux*,solaris2*}): Add
+ sparc/t-crtfm to tmake_file.
+
+2002-04-05 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/t-linux64 (EXTRA_MULTILIB_PARTS): Add crtsavres.o
+ Add rules to make null object file.
+
+2002-04-04 David S. Miller <davem@redhat.com>
+
+ * calls.c (store_one_arg): If ECF_SIBCALL, use tail_call_reg.
+
+2002-04-04 Richard Henderson <rth@redhat.com>
+
+ PR opt/6165
+ * alias.c (true_dependence): Force (mem:blk (scratch)) to conflict.
+ (write_dependence_p): Likewise.
+
+2002-04-04 Richard Henderson <rth@redhat.com>
+
+ * predict.c (estimate_bb_frequencies): Do frequency calculation
+ with a volatile temporary.
+
+2002-04-04 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/linux.h (LOCAL_LABEL_PREFIX): Define.
+
+2002-04-04 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/6119
+ * final.c (final_start_function): Don't bump profile_label_no here...
+ (final_end_function): ...but here.
+
+2002-04-04 Jakub Jelinek <jakub@redhat.com>
+
+ * config/sparc/sparc.md (pic): New attribute.
+ (do_builtin_setjmp_setup): Save %fp, %i7 and %l7 for TARGET_V9
+ into stack slots.
+ (split after do_builtin_setjmp_setup): New.
+
+2002-04-04 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/6106
+ * config/sparc/sparc.h (MIN_UNITS_PER_WORD): Backout 2001-01-01
+ change.
+
+2002-04-04 Jakub Jelinek <jakub@redhat.com>
+
+ * config/sparc/sparc.c (sparc_va_arg): Adjust va_list by
+ UNITS_PER_WORD for zero sized aggregates.
+
+2002-04-04 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
+
+ * doc/contrib.texi (Contributors): Add David O'Brien.
+
+2002-04-03 David S. Miller <davem@redhat.com>
+
+ * gcc.c (LINK_GCC_C_SEQUENCE_SPEC): No need for a new
+ one-character spec for this, just use %(link_gcc_c_sequence).
+
+2002-04-04 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/t-linux64 (EXTRA_MULTILIB_PARTS): Define.
+
+2002-04-03 David S. Miller <davem@redhat.com>
+
+ * gcc.c (LINK_GCC_C_SEQUENCE_SPEC): New spec to override the gcc/c
+ library sequence passed to the linker.
+ (LINK_COMMAND_SPEC): Use it.
+ * doc/tm.texi: Document it, and mention from LINK_COMMAND_SPEC as
+ a macro a target can use to avoid overriding LINK_COMMAND_SPEC.
+ * config/sparc/sparc.h (LINK_GCC_C_SEQUENCE_SPEC): Define.
+
+2002-04-03 Jason Merrill <jason@redhat.com>
+
+ PR c++/5636
+ * tree.h (CLEANUP_EH_ONLY): New macro.
+ * stmt.c (expand_decl_cleanup_eh): New fn.
+ (expand_cleanups): Check CLEANUP_EH_ONLY.
+ * c-semantics.c (genrtl_decl_cleanup): Just take the CLEANUP_STMT.
+ Use expand_decl_cleanup_eh.
+ (expand_stmt): Adjust.
+ * c-common.h: Adjust prototype.
+
+2002-04-03 Jakub Jelinek <jakub@redhat.com>
+
+ * configure.in (HAVE_SPARC_UA_PCREL_HIDDEN): Test whether %r_disp32()
+ works properly with .hidden symbols.
+ * configure: Rebuilt.
+ * config.in: Rebuilt.
+ * config/sparc/sparc.h (ASM_PREFERRED_EH_DATA_FORMAT): Use
+ DW_EH_PE_absptr for flag_pic && GLOBAL if %r_disp32() doesn't work
+ properly with .hidden symbols.
+
+2002-04-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/6102
+ * df.c (df_insn_refs_record): Use XEXP not SET_DEST to access
+ USE argument.
+
+2002-04-03 Richard Henderson <rth@redhat.com>
+
+ PR opt/4120
+ * sched-rgn.c (sets_likely_spilled): New.
+ (sets_likely_spilled_1): New.
+ (add_branch_dependences): Use it.
+
+2002-04-02 Richard Henderson <rth@redhat.com>
+
+ PR opt/4311
+ * loop.h (LOOP_FIRST_PASS): New.
+ * loop.c (strength_reduce): Mind it when deciding to unroll.
+ * toplev.c (rest_of_compilation): Set it.
+
+2002-04-02 David S. Miller <davem@redhat.com>
+
+ * config/sparc/sparc.md (ldd peephole2s): Fix final arg to
+ mems_ok_for_ldd_peep when the order of the loads being examined
+ is reversed.
+ * config/sparc/sparc.c (mems_ok_for_ldd_peep): Expand upon
+ existing comment to increase comprehension of this situation.
+
+2002-04-02 Richard Henderson <rth@redhat.com>
+
+ * libgcc2.c (__bb_exit_func): Revert 03-31 change.
+
+2002-04-02 Eric Botcazou <ebotcazou@multimania.com>
+ Richard Henderson <rth@redhat.com>
+
+ PR c/5484
+ * function.c (assign_temp): Accept either type or decl argument.
+ Detect variables whose size is too large to fit into an integer.
+ * stmt.c (expand_decl): Pass the decl, not the type.
+
+2002-04-02 David O'Brien <obrien@FreeBSD.org>
+
+ * protoize.c: Match include directory usage with cppdefault.c.
+
+2002-04-03 Jeffrey A Law (law@redhat.com)
+ Hans-Peter Nilsson <hp@bitrange.com>
+
+ * combine.c (simplify_comparison): Avoid narrowing a comparison
+ with a paradoxical subreg when doing so would drop signficant bits.
+
+2002-04-02 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.h (WIDEST_HARDWARE_FP_SIZE): Define.
+
+2002-04-02 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.md (ctrdi*): Add FPR constraint and
+ associated splitter. Remove MQ constraint.
+ (ctrdi_internal4): Correct CCmode clobber.
+
+2002-04-03 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * config/mmix/mmix.md (define_constants): Remove misleading
+ FIXME. Add MMIX_fp_rO_OFFSET.
+ ("nonlocal_goto_receiver"): Don't have stack-frame address of
+ saved rO as part of the pattern. Remove FIXME.
+ ("*nonlocal_goto_receiver_expanded"): Similar. Generate address
+ here, at output-time.
+ * config/mmix/crti.asm (_init): Register _fini with atexit.
+ * config/mmix/crtn.asm (_fini): Add omitted "POP 0,0".
+ * config/mmix/mmix.c (mmix_target_asm_function_prologue): Correct
+ unwind information when frame_pointer_needed.
+ (mmix_assemble_integer): Tweak wording in comment.
+
+2002-04-02 Richard Henderson <rth@redhat.com>
+
+ PR opt/3967
+ * local-alloc.c (contains_replace_regs): LO_SUM may contain
+ replace regs.
+
+2002-04-02 Richard Henderson <rth@redhat.com>
+
+ * doc/standards.texi: Document required freestanding libc entry points.
+
+2002-04-02 Alexandre Oliva <aoliva@redhat.com>
+
+ * config/mips/mips.c (mips_va_arg): Apply big-endianness address
+ offset before loading address of argument passed by transparent
+ reference.
+
+2002-04-02 Richard Henderson <rth@redhat.com>
+
+ * fixinc/inclhack.def (AAB_solaris_sys_varargs_h): Move and
+ rename solaris_sys_varargs_h.
+
+Tue Apr 2 06:47:40 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * stor-layout.c (layout_type, case ARRAY_TYPE): Give one-element array
+ the same mode as its component.
+
+2002-04-02 Richard Henderson <rth@redhat.com>
+
+ PR opt/420
+ * config/m68k/m68k.md (dbcc peepholes): Match four forms of dbra.
+
+2002-04-01 Richard Henderson <rth@redhat.com>
+
+ PR target/1538
+ * fixinc/inclhack.def (solaris_sys_varargs_h): New.
+ * fixinc/fixincl.x: Rebuild.
+
+2002-04-01 Richard Henderson <rth@redhat.com>
+
+ * config/ia64/unwind-ia64.c: Include ia64intrin.h.
+ (atomic_alloc, atomic_free): New.
+ (SIZE, MASK_FOR, PTR_IN): New.
+ (emergency_reg_state, emergency_reg_state_free): New.
+ (emergency_labeled_state, emergency_labeled_state_free): New.
+ (reg_state_alloced, labeled_state_alloced): New.
+ (alloc_reg_state, free_reg_state): New.
+ (alloc_label_state, free_label_state, free_label_states): New.
+ (push, pop, dup_state_stack, free_state_stack): Use them.
+ (desc_label_state): Likewise.
+ (uw_frame_state_for): Free label states and state stack.
+ (uw_update_reg_address): Eliminate warnings.
+
+2002-04-01 Loren J. Rittle <ljrittle@acm.org>
+
+ * doc/install.texi (*-*-freebsd*): Update.
+
+2002-04-01 Phil Edwards <pme@gcc.gnu.org>
+
+ * version.c: Fix misplaced leading blanks on first line.
+
+2002-04-01 Vladimir Makarov <vmakarov@redhat.com>
+
+ * config/pa/pa-pro-end.h (ASM_OUTPUT_ALIGNED_COMMON,
+ ASM_OUTPUT_ALIGNED_LOCAL): Redefine them.
+
+2002-04-01 Jim Blandy <jimb@redhat.com>
+
+ * cppmacro.c (cpp_macro_definition): Do not emit spaces after
+ macro formal parameter names.
+
+2002-04-01 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa.c (xtensa_va_arg): Fix compiler warning
+ in previous change.
+
+2002-04-01 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa.c (xtensa_va_arg): Fix to handle arguments
+ for which MUST_PASS_IN_STACK is true (e.g., variable-sized types).
+
+2002-03-31 Richard Henderson <rth@redhat.com>
+
+ * config/ia64/unwind-ia64.c (alloc_spill_area): Fix offset.
+ (desc_frgr_mem): Fix reference to f16-f31.
+
+Sun Mar 31 14:43:24 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * emit-rtl.c (adjust_address_1, offset_address): Cast value to
+ unsigned HOST_WIDE_INT, not unsigned int.
+
+2002-03-31 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/6096, middle-end/6098, middle-end/6099
+ * reorg.c (emit_delay_sequence): Only increment LABEL_NUSES for
+ CODE_LABELs.
+ (fill_slots_from_thread): Likewise.
+
+2002-03-31 Jakub Jelinek <jakub@redhat.com>
+
+ * config/sparc/sparc.c (function_arg_record_value_1): Pass complex
+ floating fields in float regs.
+ (function_arg_record_value_2): Likewise.
+
+2002-03-31 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/6100
+ * config/sparc/sparc.c (output_cbranch): Use REG_BR_PROB, not
+ REG_BR_PRED.
+ (output_v9branch): Likewise.
+
+2002-03-31 Alexandre Oliva <aoliva@redhat.com>
+
+ * gcc.c: Revert previous patch for now.
+ * config/i386/djgpp.h: Likewise.
+
+2002-03-31 Richard Henderson <rth@redhat.com>
+
+ PR target/3997
+ * config/alpha/elf.h (ASM_OUTPUT_DEF): Tidy.
+ (ASM_OUTPUT_DEF_FROM_DECLS): New.
+
+2002-03-31 Richard Henderson <rth@redhat.com>
+
+ * libgcc2.c (__bb_exit_func): Make static.
+
+ * config/alpha/alpha.md (trap): New.
+
+2002-03-31 Alexandre Oliva <aoliva@redhat.com>
+
+ * gcc.c (LIBGCC_SPEC): Folded %L and duplicate %G here...
+ (LINK_COMMAND_SPEC): ... from here.
+ (init_gcc_specs): Duplicate it here too, omitting
+ shared_name in the second copy.
+ (init_spec): Test for duplicate
+ * config/i386/djgpp.h (LINK_COMMAND_SPEC): Remove `%L %G'.
+
+2002-03-31 Richard Henderson <rth@redhat.com>
+
+ * builtins.c (expand_builtin_va_arg): Give warnings not errors for
+ promoted argument types; build trap.
+ (expand_builtin_trap): New.
+ (expand_builtin): Use it.
+ * stmt.c (expand_nl_goto_receivers): Likewise.
+ * expr.h (expand_builtin_trap): Declare.
+ * libfuncs.h (LTI_abort, abort_libfunc): New.
+ * optabs.c (init_optabs): Init abort_libfunc.
+
+2002-03-30 David S. Miller <davem@redhat.com>
+
+ * config/sparc/linux.h (HANDLE_PRAGMA_PACK_PUSH_POP): Define.
+ * config/sparc/linux64.h (HANDLE_PRAGMA_PACK_PUSH_POP): Likewise.
+
+2002-03-30 Roger Sayle <roger@eyesopen.com>
+ Richard Henderson <rth@redhat.com>
+
+ * regmove.c (combine_stack_adjustments_for_block): Avoid
+ emitting a stack adjustment of zero bytes. Let delete_insn
+ update bb->head.
+
+2002-03-30 Richard Henderson <rth@redhat.com>
+
+ * config/sparc/sparc.c: Remove all references to TARGET_EPILOGUE.
+ (sparc_emitting_epilogue): New.
+ (leaf_label, output_return, sparc_return_peephole_ok): Remove.
+ * config/sparc/sparc-protos.h: Update.
+ * config/sparc/sparc.h (MASK_EPILOGUE, TARGET_EPILOGUE): Remove.
+ (TARGET_SWITCHES): Update.
+ * config/sparc/sparc.md (return): Remove.
+ (return_*): Use sparc_emitting_epilogue, not !TARGET_EPILOGUE.
+ * config/sparc/freebsd.h, config/sparc/linux64.h, config/sparc/lite.h,
+ config/sparc/liteelf.h, config/sparc/netbsd-elf.h,
+ config/sparc/sol2-sld-64.h, config/sparc/sol2.h,
+ config/sparc/sp64-aout.h, config/sparc/sp64-elf.h,
+ config/sparc/sp86x-aout.h, config/sparc/sp86x-elf.h,
+ config/sparc/splet.h, config/sparc/vxsparc64.h (TARGET_DEFAULT):
+ Remove MASK_EPILOGUE.
+ * doc/invoke.texi: Update.
+
+2002-03-30 Daniel Berlin <dan@dberlin.org>
+
+ * dwarf2out.c (dwarf2out_define): Remove start_source_file call,
+ CPP will start the file for us.
+
+2002-03-30 Richard Henderson <rth@redhat.com>
+
+ PR target/5446
+ * config/ia64/ia64.c (group_barrier_needed_p): Special case
+ prologue_allocate_stack.
+ (ia64_single_set): Use insn codes for recognition of special
+ cases, not rtl matching.
+ * config/ia64/ia64.md (prologue_allocate_stack): Op 3 is in-out.
+
+2002-03-30 Richard Henderson <rth@redhat.com>
+
+ PR target/6032
+ * config/sparc/sparc.h (OVERRIDE_OPTIONS): Don't override -fpic
+ or -fomit-frame-pointer with profiling.
+ (SUBTARGET_OVERRIDE_OPTIONS): Remove.
+ (FUNCTION_PROFILER): Do nothing.
+ (PROFILE_HOOK): New.
+ * config/sparc/sparc.c (sparc_override_options): Don't check
+ code models for profiling.
+ (sparc_function_profiler): Remove.
+ (sparc_profile_hook): New.
+ * config/sparc/sparc-protos.h: Update.
+
+2002-03-30 Jakub Jelinek <jakub@redhat.com>
+
+ PR optimization/6086
+ * combine.c (combine_simplify_rtx): If simplify_rtx failed because
+ of SUBREG of volatile MEM or because the MEM was mode dependent,
+ return CLOBBER instead of unmodified SUBREG.
+
+2002-03-30 David O'Brien <obrien@FreeBSD.org>
+
+ * config/i370/linux.h: Update copyright.
+
+2002-03-30 Alexandre Oliva <aoliva@redhat.com>
+
+ * config/mips/mips.c (function_arg_pass_by_reference): Force to 0
+ in o32 and o64 ABIs.
+ * config/mips/abi64.h (MUST_PASS_IN_STACK): Define as in expr.h,
+ but getting fixed-size structs passed in registers regardless of
+ padding in o32 and o64 ABIs.
+
+2002-03-29 Richard Henderson <rth@redhat.com>
+
+ PR target/5672
+ * expr.c (expand_expr): Pass along EXPAND_INITIALIZER one more place.
+
+2002-03-29 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ * config/rs6000/rs6000.c (rs6000_va_arg): Correctly set register count
+ for aggregate and TFmode types.
+
+2002-03-29 Richard Henderson <rth@redhat.com>
+
+ PR target/5886
+ * config/ia64/aix.h (CPP_PREDEFINES): Add -D_LP64.
+ * config/ia64/hpux.h, config/ia64/linux.h: Likewise.
+
+2002-03-29 Loren J. Rittle <ljrittle@acm.org>
+
+ * doc/install.texi (*-*-freebsd*): Fix last commit.
+
+2002-03-29 Richard Henderson <rth@redhat.com>
+
+ PR target/6041
+ * config/i386/i386.c (x86_arch_always_fancy_math_387): New.
+ (override_options): Disable NO_FANCY_MATH_387 if the arch allows.
+ * config/i386/i386.h (x86_arch_always_fancy_math_387): New.
+ * config/i386/i386.md (sqrtxf2, sqrtextendsfxf2, sinxf2): Fix
+ conditional.
+ * docs/invoke.texi: Update -mno-fancy-math-387 docs.
+
+2002-03-29 Loren J. Rittle <ljrittle@acm.org>
+
+ * config.gcc (*-*-freebsd*): Enable creation of libgcc_s.so.
+ * config/t-slibgcc-elf-ver (SHLIB_LC): Add macro and use it.
+ No functional change except ...
+ * config/t-slibgcc-nolc-override (SHLIB_LC): Override it. New file.
+ * doc/install.texi (*-*-freebsd*): Document port configuration.
+
+2002-03-29 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/5964
+ * config/sparc/sparc.md (empty_delay_slot, branch_type): New
+ attributes.
+ (length): Compute variable length for branches/calls/jumps here.
+ (branch, inverted_branch, normal_fp_branch, inverted_fp_branch,
+ normal_fpe_branch, inverted_fpe_branch): Remove length attribute,
+ define branch_type attribute.
+ (divsi3_sp32): Maximum length is 6 not 7.
+ (call_address_struct_value_sp32, call_symbolic_struct_value_sp32,
+ call_address_untyped_struct_value_sp32,
+ call_symbolic_untyped_struct_value_sp32): Set length to 3 not 2.
+ * config/sparc/sparc.c (empty_delay_slot): New function.
+ * config/sparc/sparc.h (ADJUST_INSN_LENGTH): Remove.
+ * config/sparc/sparc-protos.h (empty_delay_slot): Add prototype.
+
+2002-03-29 Jakub Jelinek <jakub@redhat.com>
+
+ * combine.c (set_nonzero_bits_and_sign_copies): Don't call
+ nonzero_bits if not needed.
+ (nonzero_bits) [XOR]: Likewise.
+ (nonzero_bits) [REG]: Use reg_last_set_nonzero_bits even if
+ reg_last_set_mode and mode are both MODE_INT, but not equal.
+ (record_value_for_reg): Compute reg_last_set_nonzero_bits
+ in nonzero_bits_mode for MODE_INT modes.
+
+2002-03-28 Richard Henderson <rth@redhat.com>
+
+ PR target/5715
+ * config/alpha/osf.h (ASM_SPEC): Don't pass any special options
+ to GAS. Correct drift between alternatives.
+
+2002-03-28 Richard Henderson <rth@redhat.com>
+
+ PR target/6087
+ * reload1.c (fixup_abnormal_edges): Move insn to edge via sequence.
+
+2002-03-28 Alexandre Oliva <aoliva@redhat.com>
+
+ * config/i386/freebsd.h (LINK_SPEC): Don't pass default
+ emulation to the linker.
+
+2002-03-28 Loren J. Rittle <ljrittle@acm.org>
+
+ * config/alpha/freebsd.h (LINK_SPEC): Likewise.
+ * config/sparc/freebsd.h (LINK_SPEC): Likewise.
+
+2002-03-28 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa-linux.h (LOCAL_LABEL_PREFIX): Define.
+
+Thu Mar 28 16:33:13 2002 Jeffrey A Law (law@redhat.com)
+
+ * combine.c (simplify_and_const_int): Make sure to apply mask
+ when force_to_mode returns a constant integer. PR3311.
+
+2002-03-28 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
+
+ * doc/invoke.texi (Warning Options): Refer to C++ Dialect Options
+ and Objective-C Dialect Options.
+
+2002-03-28 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/alpha.c (alpha_emit_conditional_branch): TFmode NE
+ comparison should be done vs !=0 not >0 return code. Tidy cases.
+
+2002-03-28 Richard Henderson <rth@redhat.com>
+
+ * c-decl.c (finish_function): New arg can_defer_p. Pass it
+ on to c_expand_body.
+ * c-tree.h (finish_function): Update decl.
+ * c-objc-common.c, c-parse.in, objc/objc-act.c: Update calls.
+
+2002-03-27 Andreas Schwab <schwab@suse.de>
+
+ * config/i386/i386.c (classify_argument): Also check for
+ QUAL_UNION_TYPE.
+
+2002-03-27 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ * doc/install.texi (alpha*-dec-osf*): Don't need --enable-libgcj
+ any more.
+
+Wed Mar 27 22:52:02 CET 2002 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
+
+ * cfgrtl.c (merge_blocks_nomove): Use set_block_for_insn instead of
+ assigning to BLOCK_FOR_INSN directly.
+
+Wed Mar 27 22:46:04 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (ix86_output_addr_diff_elt): Remove binutils bug workaround.
+
+2002-03-27 Richard Henderson <rth@redhat.com>
+
+ * toplev.c (rest_of_compilation): Don't compile if we've had errors.
+
+2002-03-27 Richard Henderson <rth@redhat.com>
+
+ * config/sparc/freebsd.h, config/sparc/linux.h, config/sparc/linux64.h,
+ config/sparc/netbsd-elf.h, config/sparc/pbd.h, config/sparc/sol2.h,
+ config/sparc/vxsim.h (LOCAL_LABEL_PREFIX): Define.
+
+2002-03-27 Richard Henderson <rth@redhat.com>
+
+ PR target/6054
+ * config/ia64/ia64.c (ia64_expand_call): Use pic patterns for
+ TARGET_CONST_GP. Simplify conditions.
+
+2002-03-26 Vladimir Makarov <vmakarov@redhat.com>
+
+ * pa/pa-pro-end.h (CPP_PREDEFINES): Add -D__pro__.
+
+ * pa/lib2funcs.asm: Don't use .SPACE and .SUBSPACE if __pro__
+ or __rtems_ is defined.
+
+2002-03-26 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/alpha.c (alpha_emit_set_const): Add a REG_EQUAL note
+ if a non-trivial load was emitted.
+ (alpha_emit_set_const_1): Remove obsolete extension. Fix thinko
+ in high+extra+low case.
+
+2002-03-26 Richard Henderson <rth@redhat.com>
+
+ * config.gcc (sparc*-solaris): Use float_format=sparc.
+
+2002-03-26 Richard Henderson <rth@redhat.com>
+
+ * config/sparc/sparc.h (MAX_WCHAR_TYPE_SIZE): Don't define.
+ * config/sparc/linux-aout.h (MAX_WCHAR_TYPE_SIZE): Don't undef.
+ * config/sparc/linux.h, config/sparc/linux64.h: Likewise.
+ * config/sparc/sol2.h (WCHAR_TYPE, WCHAR_TYPE_SIZE): Redefine.
+ (WINT_TYPE_SIZE): Fix at 32.
+
+2002-03-26 Richard Henderson <rth@redhat.com>
+
+ * toplev.c (rest_of_compilation): Delay emit_initial_value_sets
+ until after eh landing pad generation.
+ * config/alpha/alpha.c (alpha_gp_save_rtx): Use gen_mem_addressof.
+ * config/alpha/alpha.md (exception_receiver_2): Only accept MEMs.
+
+2002-03-26 Richard Henderson <rth@redhat.com>
+
+ * expr.h (ADD_PARM_SIZE): One more convert for INC.
+
+2002-03-26 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/aix51.h (WCHAR_TYPE): Define.
+
+2002-03-26 Hans Boehm <Hans_Boehm@hp.com>
+
+ * config/ia64/linux.h (MD_FALLBACK_FRAME_STATE_FOR):
+ Restore more of the signal context. Set no_reg_stack_frame.
+ * config/ia64/unwind-ia64.c (unw_state_record):
+ Add no_reg_stack_frame, comments.
+ (uw_frame_state_for): Initialize when field to UNW_WHEN_NEVER.
+ (uw_update_context): Adjust bsp when unwinding from leaf,
+ but not signal frame.
+
+2002-03-26 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa.c (xtensa_va_arg): Handle variable-sized types.
+
+2002-03-26 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/5621
+ * arm.md (define_asm_attributes): Reapply patch of Thu Sep 9, 1999:
+ "Add a pool_range attribute", which was lost during the ARM/Thumb
+ merge.
+
+2002-03-26 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa.c (xtensa_valid_move): Allow move from
+ a register into the MAC16 accumulator.
+
+2002-03-26 Hartmut Penner <hpenner@de.ibm.com>
+
+ * config/s390/s390.c (s390_emit_epilogue): Change epilogue
+ code to not restoring global registers.
+
+2002-03-26 Richard Henderson <rth@redhat.com>
+
+ * expr.h (ADD_PARM_SIZE): Cast INC to ssizetype.
+ (SUB_PARM_SIZE): Cast DEC to ssizetype.
+
+ * config/alpha/alpha.c (alpha_va_arg): Read MUST_PASS_IN_STACK
+ types from the normal argument frame.
+
+ * config/sparc/sparc.c (function_arg_pass_by_reference): Pass
+ variable sized objects by reference.
+ (sparc_va_arg): Receive them by reference too.
+
+2002-03-25 Bruce Korb <bkorb@gnu.org>
+
+ * Makefile.in(check-fixinc): run "$(MAKE) check" in the fixinc
+ directory when autogen is detected.
+
+2002-03-25 Richard Henderson <rth@redhat.com>
+
+ * recog.c (peephole2_optimize): Distribute EH_REGION -1 notes
+ anywhere in the block. Don't refer to insns that have been
+ removed from the chain. Iterate backward through the new insns.
+ Don't refer to edges that have been removed.
+
+2002-03-26 Alan Modra <amodra@bigpond.net.au>
+
+ * combine.c (simplify_comparison <ASHIFTRT, LSHIFTRT>): Correct
+ test for overflow of constant.
+
+2002-03-25 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/2623
+ * arm.md (loadhi_preinc, loadhi_predec, loadhi_shiftpreinc)
+ (loadhi_shiftpredec, loadhi-with-writeback peephole): Don't use
+ these patterns on arm_archv4.
+
+2002-03-22 Nick Clifton <nickc@cambridge.redhat.com>
+
+ * config/mcore/mcore.h (CC1_SPEC): Define only if not already
+ defined. Do not disable exceptions or rtti.
+ * config/mcore/mcore-pe.h (CC1_SPEC): Define before including
+ mcore.h. Disable exceptions and rtti, since they are not
+ supported by EPOC.
+
+2002-03-25 Jakub Jelinek <jakub@redhat.com>
+
+ * regrename.c (build_def_use): Move recog_memoized
+ before extract_insn.
+
+2002-03-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/6043
+ * expr.c (emit_group_store): Handle storing into CONCAT.
+
+2002-03-25 Jakub Jelinek <jakub@redhat.com>
+
+ * regrename.c (build_def_use): Share RTL between MATCH_OPERATOR and
+ corresponding MATCH_DUP.
+
+2002-03-24 Richard Henderson <rth@redhat.com>
+
+ * unroll.c (unroll_loop): Zero label_map.
+
+ * gcse.c: Include except.h.
+ * Makefile.in (gcse.o): Update.
+
+2002-03-24 Richard Henderson <rth@redhat.com>
+
+ * varasm.c (asm_emit_uninitialised): Revert 2002-03-14 change.
+ Do resolve_unique_section before shared data clause.
+
+2002-03-24 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/elf.h (STARTFILE_SPEC): Use crtbeginT with -static.
+
+2002-03-24 Richard Henderson <rth@redhat.com>
+
+ * recog.c (peephole2_optimize): Split blocks when EH insns are
+ generated in the middle of a block. Do global life update if
+ zapped EH edges.
+
+2002-03-24 Richard Henderson <rth@redhat.com>
+
+ * mips.c (mips_function_value): Only promote_mode for non-libcalls.
+
+2002-03-24 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ preprocessor/3951
+ * gcc.c (cpp_options): Pass -MD through as -MD not -M -MF.
+ * cppinit.c (cpp_handle_option): Set no_ouput if -MD or -MMD.
+ (init_dependency_output): Don't make no_output decision here.
+
+2002-03-24 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/m68hc11.c (m68hc11_autoinc_compatible_p): New function.
+ (m68hc11_split_move): Call it to see if the source and destination
+ operands use the same direction auto inc/dec mode, otherwise make the
+ source an offsetable memory operand and generate an add.
+
+2002-03-24 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/m68hc11.md ("*subsi3_zero_extendhi"): Allow address
+ register for operand 2.
+ ("*subsi3_zero_extendqi"): Likewise.
+ ("*iorhi3_gen"): Do the operation on the upper bits and then lower
+ bits so that it is compatible with a pop.
+ ("*andhi3_gen"): Likewise.
+ ("xorhi3"): Likewise.
+
+2002-03-24 Richard Henderson <rth@redhat.com>
+
+ PR optimization/5742
+ * machmode.def: Add inner mode field to complex modes.
+ * config/mips/mips.c (mips_function_value): Always define. Add
+ new argument to handle libcalls.
+ * config/mips/mips.h (LIBCALL_VALUE): Use mips_function_value.
+ (FUNCTION_VALUE): Likewise.
+ * config/mips/abi64.h (FUNCTION_VALUE): Remove.
+ * config/mips/mips-protos.h: Update.
+
+2002-03-23 Richard Henderson <rth@redhat.com>
+
+ * config/sparc/sparc.c (sparc_emit_floatunsdi): New.
+ * config/sparc/sparc-protos.h: Update.
+ * config/sparc/sparc.md (floatunsdisf2, floatunsdidf2): New.
+
+2002-03-23 Richard Henderson <rth@redhat.com>
+
+ * config/sparc/gmon-sol2.c (internal_mcount): Assume either
+ _start or _init begins the text segment.
+
+2002-03-23 Alan Modra <amodra@bigpond.net.au>
+
+ * combine.c (simplify_comparison): When widening modes, ignore
+ sign extension on CONST_INTs.
+
+2002-03-22 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa.c (print_operand): Fix incorrect mode
+ passed to adjust_address. Fix comment formatting.
+
+2002-03-22 Alexandre Oliva <aoliva@redhat.com>
+
+ * config/mips/mips.h (MASK_RETURN_ADDR): Define.
+ (TARGET_PTRMEMFUNC_VBIT_LOCATION): Define.
+
+2002-03-22 Richard Henderson <rth@redhat.com>
+
+ * c-pragma.c (maybe_apply_renaming_pragma): New.
+ (handle_pragma_redefine_extname, pending_redefine_extname): New.
+ (handle_pragma_extern_prefix, pragma_extern_prefix): New.
+ (init_pragma): Register them.
+ * c-pragma.h (maybe_apply_renaming_pragma): Declare.
+ * c-decl.c (finish_decl): Call it.
+ * cp/decl.c (cp_finish_decl): Likewise.
+ * doc/extend.texi: Document the new pragmas.
+
+ * config/alpha/osf.h (CPP_SUBTARGET_SPEC): Add __EXTERN_PREFIX.
+ (HANDLE_PRAGMA_EXTERN_PREFIX): New.
+
+ * config/i386/sol2.h (CPP_PREDEFINES): Add __PRAGMA_REDEFINE_EXTNAME.
+ (HANDLE_PRAGMA_REDEFINE_EXTNAME): New.
+ * config/sparc/sol2.h: Likewise.
+
+2002-03-22 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa-protos.h (non_acc_reg_operand): Remove.
+ (xtensa_valid_move, xtensa_preferred_reload_class): Define.
+ * config/xtensa/xtensa.c (non_acc_reg_operand): Remove.
+ (xtensa_valid_move, xtensa_preferred_reload_class): Define to
+ prevent use of sp as a reload register.
+ (xtensa_emit_move_sequence): Use xtensa_valid_move instead of
+ non_acc_reg_operand.
+ * config/xtensa/xtensa.h (PREDICATE_CODES): Remove non_acc_reg_operand.
+ (PREFERRED_RELOAD_CLASS): Move code to xtensa_preferred_reload_class.
+ * config/xtensa/xtensa.md (movsi_internal, movhi_internal,
+ movqi_internal): Use xtensa_valid_move instead of non_acc_reg_operand.
+
+2002-03-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR optimization/5854
+ * config/m68hc11/m68hc11.h (CONST_OK_FOR_LETTER_VALUE_P): Use K for 0.
+ Shut up warnings.
+ (CONST_DOUBLE_OK_FOR_LETTER_P): Use G for 0.0.
+ (EXTRA_CONSTRAINT): Use S for non-push memory operand.
+ * config/m68hc11/m68hc11.c (m68hc11_split_move): Handle setting from
+ const0 if scratch register was not allocated.
+ (m68hc11_reload_operands, m68hc11_gen_lowpart, m68hc11_gen_highpart,
+ m68hc11_z_replacement): Replace gen_rtx (CONST_INT, VOIDmode, ...)
+ with GEN_INT (...).
+ (m68hc11_reorg): Compute BLOCK_FOR_INSN before reload_cse_regs.
+ * config/m68hc11/m68hc11.md: Replace gen_rtx (CONST_INT, VOIDmode, ...)
+ with GEN_INT (...) everywhere. Remove constraints in define_split
+ patterns.
+ (movdi_internal, movdf_internal, movsi_internal, movsf_internal): Don't
+ require scratch register for setting 0 into regs/non-pushable memory.
+
+2002-03-22 Alexandre Oliva <aoliva@redhat.com>
+
+ * flow.c (calculate_global_regs_live): Clear aux fields of
+ ENTRY and EXIT.
+
+2002-03-22 Jakub Jelinek <jakub@redhat.com>
+
+ * config/v850/v850.c (v850_reorg): Only call alter_subreg on
+ REG or MEM subregs, pass rtx * instead of rtx to it.
+ * config/i860/i860.c (output_delayed_branch, output_delay_insn): Pass
+ rtx * instead of rtx to alter_subreg.
+ * config/m32r/m32r.c (gen_split_move_double): Likewise.
+ * config/pj/pj.c (pj_output_rval): Likewise.
+
+2002-03-22 Richard Henderson <rth@redhat.com>
+
+ PR target/3177
+ * config/ia64/ia64.h (CUMULATIVE_ARGS): Add int_regs.
+ (INIT_CUMULATIVE_ARGS, INIT_CUMULATIVE_INCOMING_ARGS): Update.
+ * config/ia64/ia64.c (ia64_function_arg_advance): Set int_regs.
+ (ia64_expand_prologue): Look at int_regs, not words, for number
+ of incomming int regs.
+
+Fri Mar 22 16:00:06 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * cfgcleanup.c (outgoing_edges_math): Fix condition; relax
+ frequencies match; avoid match on different loop depths.
+ (try_crossjump_to_bb): Kill tests that no longer brings time
+ savings.
+ * cfgrtl.c (force_nonfallthru_and_redirect): Fix loop_depth
+ updating code.
+ (split_edge): Likewise.
+
+2002-03-21 Richard Henderson <rth@redhat.com>
+
+ PR target/5996
+ * fixinc/inclhack.def (solaris_stdio_tag): New.
+ * fixinc/fixincl.x: Regenerate.
+
+2002-03-21 Eric Botcazou <ebotcazou@multimania.com>
+
+ PR c/5597
+ * c-typeck.c (process_init_element): Flag non-static
+ initialization of a flexible array member as illegal.
+
+2002-03-22 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/t-linux64: New.
+ * config.gcc (powerpc64-*-linux* <tmake_file>): Drop t-ppcos and
+ t-ppccomm. Use t-rs6000 and t-linux64.
+ (powerpc64-*-gnu* <tmake_file>): Likewise.
+ * mklibgcc.in (SHLIB_MKMAP_OPTS): New variable.
+ * mkmap-symver.awk (dotsyms): If set, output .foo as well as foo.
+ * Makefile.in (SHLIB_MKMAP_OPTS): Pass to mklibgcc.
+
+2002-03-21 Aldy Hernandez <aldyh@redhat.com>
+
+ * langhooks.c (lhd_tree_inlining_cannot_inline_tree_fn): Check
+ flag_really_no_inline instead of optimize == 0.
+
+ * c-objc-common.c (c_cannot_inline_tree_fn): Same.
+
+ * cp/tree.c (cp_cannot_inline_tree_fn): Same.
+
+ * flags.h (flag_really_no_inline): New.
+
+ * c-common.c (c_common_post_options): Initialzie
+ flag_really_no_inline.
+
+ * toplev.c (flag_really_no_inline): New.
+
+2002-03-21 Jakub Jelinek <jakub@redhat.com>
+
+ * config/avr/avr.md (length): Fix length computation for
+ conditional branches.
+
+2002-03-21 Richard Henderson <rth@redhat.com>
+
+ * config/rs6000/rs6000.c (rs6000_select_rtx_section): Put symbolic
+ constants in .data when -fpic.
+
+2002-03-21 Tom Tromey <tromey@redhat.com>
+
+ * config/i386/sol2.h (ASM_QUAD): Undef. Fixes PR bootstrap/5948.
+
+2002-03-21 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
+
+ * doc/contrib.texi (Contributors): Use GNU/Linux instead of Linux
+ where appropriate.
+
+Thu Mar 21 09:50:48 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * config/ia64/ia64.c (hfa_element_mode, case ARRAY_TYPE): Recurse.
+
+ * expr.c (emit_group_store): Don't copy const0_rtx to a CONCAT.
+
+2002-03-21 Eric Botcazou <ebotcazou@multimania.com>
+ Richard Henderson <rth@redhat.com>
+
+ PR c/5354:
+ * c-common.c (c_expand_expr): Preserve result of a statement
+ expression if needed.
+
+2002-03-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR bootstrap/4195
+ * genrecog.c (maybe_both_true_mode): Remove.
+ (maybe_both_true_2, write_switch): Revert 2001-07-17 changes.
+ * machmode.def (Pmode): Likewise.
+
+2002-03-21 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ * fixinc/inclhack.def (alpha_assert): Fix assert macro in Tru64
+ UNIX assert.h.
+ * fixinc/fixincl.x: Regenerate.
+
+2002-03-20 Jason Merrill <jason@redhat.com>
+
+ * config/i386/cygwin.h (DWARF2_UNWIND_INFO): Define to 0.
+
+2002-03-20 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa.h (ASM_OUTPUT_POOL_PROLOGUE): Emit a
+ ".literal_position" directive before the constant pool.
+
+2002-03-20 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
+
+ * doc/contrib.texi (Contributors): Update Geoffrey Keating.
+ Add Craig Rodrigues.
+ Add Brad Lucier to testers.
+
+2002-03-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/4792
+ * config/arc/arc.md (movsicc, movdicc, movsfcc, movdfcc): Add mode
+ to if_then_else.
+ (movsicc_insn, movdicc_insn, movsfcc_insn, movdfcc_insn): Likewise.
+ * config/arc/arc.c (arc_final_prescan_insn): Use extract_insn_cached
+ instead of insn_extract.
+
+2002-03-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR bootstrap/4192
+ * config/fr30/fr30.md (jump): Remove clobber of fixed register.
+
+ * genemit.c (output_added_clobbers_hard_reg_p): Only output return
+ stmt if some case has been output.
+
+2002-03-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/5972
+ * config/i386/i386.md (movdicc_c_rex64, movsicc_noc, movhicc_noc,
+ movsfcc_1, movdfcc_1): Add %O2.
+ * config/i386/i386.c (print_operand): Handle %ON.
+ Print . before float condition codes in Sun as cmov syntax.
+ * config/i386/sol2.h (CMOV_SUN_AS_SYNTAX): Define for Sun as.
+ * config.gcc (i[34567]86-*-solaris2*): Remove comment which is
+ no longer true.
+
+2002-03-20 Philip Blundell <pb@nexus.co.uk>
+
+ * config/arm/arm.c (arm_output_epilogue): Don't generate separate
+ return instruction if PC was popped.
+
+2002-03-20 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * config/mmix/mmix.md ("fixuns_truncdfdi2"): Use (unsigned_fix:DI
+ (unsigned_fix:DF op1)), not (unsigned_fix:DI (fix:DF op1)).
+ ("truncdfsf2"): Correct operator is float_truncate, not fix.
+ ("*truncdfsf2_real"): Ditto.
+ ("*nonlocal_goto_receiver_expanded"): Fix output template formatting.
+
+ * config/mmix/mmix.h (WCHAR_TYPE, WCHAR_TYPE_SIZE): Don't define.
+
+2002-03-19 Jim Blandy <jimb@redhat.com>
+
+ * c-lex.c (cb_file_change): Pass the #inclusion's line number to
+ the start_source_file debug hook, not the current line number.
+
+ * cppmacro.c (cpp_macro_definition): Emit a space after the macro
+ name, even if the replacement list contains no tokens, as required
+ by Dwarf.
+
+2002-03-19 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.c (rs6000_override_options): Only warn
+ about -fpic/-fPIC if extra_warnings set.
+
+2002-03-19 Richard Henderson <rth@redhat.com>
+
+ * flow.c (EH_USES): Provide default.
+ (calculate_global_regs_live): Use it for EH edges and noreturn calls.
+ * doc/tm.texi (EH_USES): New.
+
+ * config/ia64/ia64.c (ia64_eh_uses): New.
+ * config/ia64/ia64-protos.h: Update.
+ * config/ia64/ia64.h (EH_USES): New.
+
+2002-03-20 Alan Modra <amodra@bigpond.net.au>
+
+ * defaults.h (SUPPORTS_WEAK): Set if ASM_WEAKEN_DECL.
+ * varasm.c (assemble_alias): Use ASM_WEAKEN_DECL.
+ * doc/tm.texi (ASM_WEAKEN_DECL): Document.
+ (ASM_WEAKEN_LABEL): Mention ASM_WEAKEN_DECL.
+ (SUPPORTS_WEAK): Likewise.
+
+2002-03-19 Richard Henderson <rth@redhat.com>
+
+ PR 5879
+ * except.c (current_function_has_exception_handlers): New.
+ * except.h: Declare it.
+ * sibcall.c (optimize_sibling_and_tail_recursive_call): Use it.
+ Combine tests that disable all sibcalls for the function.
+
+2002-03-19 Richard Henderson <rth@redhat.com>
+
+ PR 5977, 5991
+ * config/ia64/ia64.c: Revert 2002-03-01 patch.
+ * config/ia64/ia64.h (INIT_EXPANDERS): New.
+
+2002-03-19 Olivier Hainque <hainque@act-europe.fr>
+
+ * varasm.c (output_constant_def): Don't call ENCODE_SECTION_INFO
+ for INTEGER_CST.
+
+2002-03-19 Jason Merrill <jason@redhat.com>
+
+ * varasm.c (globalize_decl): Get the name from the RTL, not
+ DECL_ASSEMBLER_NAME.
+
+ * Makefile.in (LIBGCC2_DEBUG_CFLAGS): Set to -g.
+
+2002-03-19 Dale Johannesen <dalej@apple.com>
+
+ PR optimization/5999, middle-end/5731
+ * expr.c (expand_expr) [RDIV_EXPR]: Only convert real divisions into
+ multiplications by reciprocals.
+
+2002-03-19 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa.md (adddi3, adddi_carry, subdi3,
+ subdi_carry): Define.
+
+Tue Mar 19 14:12:32 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * config/sparc/sparc.h (CAN_ELMINIATE): Can only eliminate FP
+ in favor of SP if FRAME_POINTER_REQUIRED is false.
+
+2002-03-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/5656
+ * langhooks.h (struct lang_hooks_for_tree_inlining): Add
+ convert_parm_for_inlining.
+ * c-lang.c (LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING):
+ Define.
+ * langhooks-def.h: Likewise.
+ * objc/objc-lang.c: Likewise.
+ * langhooks.c (lhd_tree_inlining_convert_parm_for_inlining): New
+ function.
+ * tree-inline.c (initialize_inlined_parameters):
+ Call convert_parm_for_inlining lang hook if needed.
+ * c-typeck.c (c_convert_parm_for_inlining): New function.
+ * c-tree.h (c_convert_parm_for_inlining): Add prototype.
+
+2002-03-18 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * gcse.c (insert_insn_end_bb): Fix typo in last change.
+
+2002-03-18 Mark Mitchell <mark@codesourcery.com>
+
+ * calls.c (precompute_arguments): Do not assume that temporaries
+ can be destroyed after expanding the argument.
+ (expand_call): Likewise.
+
+2002-03-18 Ashif Harji <asharji@uwaterloo.ca>
+
+ * gcc.c (struct compiler default_compilers): Add
+ -no-integrated-cpp flag to invoke an external cpp.
+ (struct option_map option_map[]): Likewise.
+ * objc/lang-specs.h (struct compiler default_compilers): Add
+ -no-integrated-cpp flag to invoke an external cpp.
+ * doc/invoke.texi: Document -no-integrated-cpp flag.
+
+2002-03-18 Alan Modra <amodra@bigpond.net.au>
+ David Edelsohn <edelsohn@gnu.org>
+
+ * c-pragma.h (HANDLE_PRAGMA_WEAK): Define if ASM_WEAKEN_DECL too.
+ * config/rs6000/linux64.h (ASM_DECLARE_FUNCTION_NAME): Don't emit
+ .weak for code sym. Do emit .size for descriptor sym.
+ (ASM_DECLARE_FUNCTION_SIZE): Define.
+ * config/rs6000/rs6000.h (ASM_WEAKEN_DECL): Define.
+ (ASM_OUTPUT_DEF_FROM_DECLS): Don't emit .weak here. Don't output
+ .lglobl unless TARGET_XCOFF. Formatting fixes.
+ (PREDICATE_CODES): Add any_operand and zero_constant.
+ (HANDLE_PRAGMA_PACK): Delete.
+ * config/rs6000/xcoff.h (ASM_DECLARE_FUNCTION_NAME): Don't emit
+ .weak for code sym.
+ (HANDLE_PRAGMA_WEAK): Remove.
+ (ASM_WEAKEN_LABEL): Remove.
+ (COLLECT_EXPORT_LIST): Delete.
+ * config/rs6000/aix.h (HANDLE_SYSV_PRAGMA): Define.
+ * config/rs6000/darwin.h (HANDLE_SYSV_PRAGMA): Define.
+
+2002-03-18 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa.h (GO_IF_MODE_DEPENDENT_ADDRESS): Treat
+ constant-pool addresses as "mode-dependent".
+
+Mon Mar 18 18:12:48 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (override_options): Disallow preferred_stack_boundary to be
+ less than 16 bytes
+ (construct_container): Fix end of array check.
+ (ix86_va_start): Force alignemnt to be 16 bytes.
+
+ * linux64.h (MULTILIB_DEFAULTS): Set to "m64".
+ (t-linux64): Add multilibing
+
+ * i386.h (PROMOTE_PROTOTYPES): Set to 0 for x86_64.
+
+ * gcse.c (hash_scan_set): Refuse instructions with EH edges.
+
+ * basic-block.h (fixup_abnormal_edges): Declare.
+ * reload1.c (fixup_abnormal_edges): Make global.
+ * reg-stack.c (convert_regs): Use it.
+
+ * gcse.c (insert_insn_end_bb): Handle trapping insns.
+
+ * reload1.c (reload_cse_delete_noop_set): Purge dead edges.
+
+ * recog.c (peephole2_optimize): Re-distribute EH edges.
+
+2002-03-18 Jason Merrill <jason@redhat.com>
+
+ * configure.in: Disable checking by default on release branch.
+
+2002-03-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/5740
+ * expr.c (emit_group_load): Use extract_bit_field if
+ needed for CONCAT arguments.
+
+2002-03-18 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/4863
+ * arm.md (tablejump): Make this a define_expand. For PIC add the
+ offset to the base of the table.
+ (thumb_tablejump): Matcher for Thumb tablejump insn.
+ * config/arm/aout.h (ASM_OUTPUT_ADDR_DIFF_ELT): Output thumb entries
+ as the difference of two labels.
+ * config/arm/aof.h (ASM_OUTPUT_ADDR_DIFF_ELT): Likewise.
+ * config/arm/elf.h (JUMP_TABLES_IN_TEXT_SECTION): Only put ARM jump
+ tables in the code.
+ * config/arm/coff.h (JUMP_TABLES_IN_TEXT_SECTION): Likewise.
+ * arm.c (get_jump_table_size): If the table is not in the text
+ section, return zero.
+
+2002-03-17 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/alpha.c (alpha_emit_set_const_1): Build add insns
+ explicitly.
+
+2002-03-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * ifcvt.c (dead_or_predicable): Fix uninitialized variable.
+
+2002-03-17 David Edelsohn <edelsohn@gnu.org>
+
+ * expr.c (expand_expr): Sign-extend CONST_INT generated from
+ TREE_STRING_POINTER.
+
+2002-03-16 Richard Henderson <rth@redhat.com>
+
+ * config/ia64/ia64.c (ia64_attribute_table): Move before
+ targetm definition. Make static.
+
+2002-03-16 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * cppinit.c (print_help): Display -MD and -MMD.
+ Don't display usage string. Update assertion syntax and
+ typo.
+
+2002-03-16 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/m68hc11.c (m68hc11_override_options): Don't use
+ soft registers by default for 68HC12.
+ (m68hc11_conditional_register_usage): Don't use Z register for 68HC12
+ when compiling with -fomit-frame-pointer.
+ (expand_prologue): Use push/pop to allocate 4-bytes of locals on 68HC12.
+ (expand_epilogue): Likewise.
+ (m68hc11_gen_rotate): Use exg when rotating by 8.
+
+2002-03-16 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/m68hc11-protos.h (ix_reg): Declare.
+ * config/m68hc11/m68hc11.md ("addsi3"): Use general_operand for sources.
+ (splits): Remove unused add splits.
+ ("*addhi3_68hc12"): Tune constraints.
+ ("addhi_sp"): Try to use X instead of Y in all cases and if the
+ constant fits in 8-bits and D is dead use abx/aby instructions.
+ ("*addhi3"): Remove extern declaration of ix_reg.
+ ("*subsi3"): Optimize and provide new split.
+ ("subhi3"): Cleanup.
+ ("*subhi3_sp"): Avoid saving X if we know it is dead.
+ (arith splits): For 68hc12 save the address register on the stack
+ and do the arithmetic operation with a pop.
+
+2002-03-16 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/m68hc11.md ("*movqi_68hc12"): Fix constraints, avoid
+ allocating QImode in address registers.
+ ("*movqi_m68hc11"): Likewise.
+
+2002-03-15 Mark Mitchell <mark@codesourcery.com>
+
+ * expr.c (expand_expr): Revert previous change.
+
+ * c-common.c (statement_code_p): Handle CLEANUP_STMT.
+ * c-common.def (CLEANUP_STMT): New tree node.
+ * c-common.h (CLEANUP_DECL): New macro.
+ (CLEANUP_EXPR): Likewise.
+ * c-semantics.c (expand_stmt): Handle CLEANUP_STMT.
+ * expr.c (expand_expr): Tidy.
+ * tree-dump.c (dequeue_and_dump): Handle CLEANUP_STMT.
+ * tree-inline.c (initialize_inlined_parameters): Clean up
+ new local variables.
+
+2002-03-15 Richard Henderson <rth@redhat.com>
+
+ * c-decl.c: Include c-pragma.h.
+ (start_decl, start_function): Invoke maybe_apply_pragma_weak.
+ (finish_function): Tidy.
+ * c-pragma.c: Include c-common.h.
+ (pending_weaks, apply_pragma_weak, maybe_apply_pragma_weak): New.
+ (handle_pragma_weak): Use them.
+ (init_pragma): Register pending_weaks.
+ * c-pragma.h (maybe_apply_pragma_weak): Declare.
+ * print-tree.c (print_node): Print DECL_WEAK.
+ * varasm.c (mark_weak_decls): Remove.
+ (remove_from_pending_weak_list): Remove.
+ (add_weak): Remove.
+ (asm_emit_uninitialised): Call globalize_decl for weak commons.
+ (weak_decls): Make a tree_list.
+ (declare_weak): Cons weak_decls directly.
+ (globalize_decl): Remove weak_decls elements directly.
+ (weak_finish): Simplify weak_decls walk. Don't weaken unused
+ symbols. Don't pretend to handle aliases.
+ (init_varasm_once): Update weak_decls registry.
+ * Makefile.in: Update dependencies.
+
+2002-03-15 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/alpha.c (alpha_va_arg): Manipulate the type
+ size as a tree.
+
+2002-03-15 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/m68hc11.md ("tstqi_1"): Try to use ldab instead of tst.
+ ("tstqi" split): Avoid using memory for tstqi on address register.
+ (splits): Remove constraints.
+ ("cmphi_1_hc12"): New from "cmphi_1" and tuned for 68HC12.
+ ("cmpdf", "cmpsf"): Remove since not used.
+ ("*tbeq", "*tbne", "*tbeq8", "*tbne8"): Also look in cc_status.value2.
+ (peephole2): New peepholes to optimize tstqi and pre inc/dec addressing.
+
+2002-03-15 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/m68hc11.md ("negsi2"): Optimize inline case.
+ ("neghi2"): Tighten constraints.
+ ("one_cmplsi2"): Optimize and simplify split.
+ * config/m68hc11/larith.asm (__negsi2): Likewise for library.
+
+2002-03-15 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/m68hc11.md ("logicalsi3_zexthi"): Fix constraints
+ and split of AND operation to clear the upper bits.
+ ("*logicalsi3_zextqi"): Likewise.
+ ("*logicallhi3_zexthi_ashift8"): Likewise.
+ ("*logicalsi3_silshr16"): Likewise.
+ ("logicalsi3_silshl16"): Likewise.
+ ("anddi3", "iordi3", "xordi3" splits): Remove constraints.
+
+2002-03-15 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/m68hc11.c (m68hc11_symbolic_p): New function.
+ (m68hc11_indirect_p): New function.
+ (m68hc11_override_options): Must set MASK_NO_DIRECT_MODE for 68HC12.
+ (m68hc11_gen_highpart): Use TARGET_NO_DIRECT_MODE instead of
+ TARGET_M6812.
+ (asm_print_register): Likewise.
+ * config/m68hc11/m68hc11-protos.h (m68hc11_symbolic_p): Declare.
+ (m68hc11_indirect_p): Declare.
+ * config/m68hc11/m68hc11.h (EXTRA_CONSTRAINT): New constraint 'R', 'Q'.
+ (TARGET_NO_DIRECT_MODE, TARGET_RELAX): New.
+ (TARGET_SWITCHES): New option -mrelax.
+ * config/m68hc11/m68hc11.md ("andsi3"): Allow soft register for
+ destination.
+ ("iorsi3", "xorsi3"): Likewise.
+ ("andhi3", "andqi3", "iorhi3", "iorqi3"): Use a define_expand.
+ ("*andhi3_mem"): New to handle destination in memory with bclr
+ and a scratch register.
+ ("*andqi3_mem", "*iorhi3_mem", "*iorqi3_mem"): Likewise.
+ ("*andhi3_const"): New when operand2 is constant.
+ ("*andqi3_const", "*iorhi3_const", "*iorqi3_const"): Likewise.
+ ("*andhi3_gen"): Cleanup of the old "andhi3".
+ ("*andqi3_gen", "*iorhi3_gen", "*iorqi3_gen"): Likewise.
+ ("xorqi3"): Update constraints.
+
+2002-03-15 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/m68hc11.c (m68hc11_small_indexed_indirect_p): Look
+ for reg_equiv_memory_loc when the operand is a register that does
+ not get a hard register (stack location).
+ (tst_operand): After reload, accept all memory operand.
+ (symbolic_memory_operand): Fix detection of symbolic references.
+ * config/m68hc11/m68hc11.h (VALID_CONSTANT_OFFSET_P): For 68HC12
+ accept symbols and any constant.
+
+2002-03-15 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/m68hc11.c (emit_move_after_reload): Add a REG_INC
+ note on the insn that sets the soft frame register.
+ (must_parenthesize): ix and iy are also reserved names.
+ (print_operand_address): One more place where parenthesis are required
+ to avoid confusion with register names.
+ (m68hc11_gen_movhi): Allow push of stack pointer.
+ (m68hc11_check_z_replacement): Fix handling of parallel with a
+ clobber.
+ (m68hc11_z_replacement): Must update the REG_INC notes to tell what
+ the replacement register is.
+ * config/m68hc11/m68hc11.h (REG_CLASS_CONTENTS): Switch Z_REGS
+ and D8_REGS classes.
+ (MODES_TIEABLE_P): All modes are tieable except QImode.
+
+2002-03-15 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/larith.asm (___adddi3): Optimize saving of result.
+ (___subdi3): Likewise.
+ (__mulsi3, __mulhi32): Avoid using _.tmp scratch location.
+ (__map_data_section): Optimize 68hc11 case.
+
+2002-03-15 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/m68hc11/m68hc11.c (m6812_cost): Make cost of add higher
+ than a shift to avoid adding a register with itself.
+ (m68hc11_memory_move_cost): Take into account NO_REGS.
+ (m68hc11_register_move_cost): Update and use memory move cost
+ for soft registers.
+ (m68hc11_address_cost): Make cost of valid offset not 0 so that
+ it gives more opportunities to cse to optimize.
+ * config/m68hc11/m68hc11.h (REGISTER_MOVE_COST): Pass the mode.
+ * config/m68hc11/m68hc11-protos.h (m68hc11_register_move_cost): Update.
+
+2002-03-15 Jason Merrill <jason@redhat.com>
+
+ * varasm.c (globalize_decl): New fn.
+ (assemble_start_function): Use it.
+ (asm_emit_uninitialized): Use it.
+ (assemble_alias): Use it.
+ (assemble_variable): Use it.
+
+2002-03-15 Jason Merrill <jason@redhat.com>
+
+ * varasm.c (assemble_variable): Use zeros for a decl with DECL_INITIAL
+ of error_mark_node.
+
+2002-03-15 Jakub Jelinek <jakub@redhat.com>
+
+ PR bootstrap/4128
+ * config/sparc/sparc.c (gen_v9_scc): Move early clobber test
+ before movrXX only, use reg_overlap_mentioned_p.
+ Only special case NE if just one insn can be generated.
+
+2002-03-15 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/5712
+ * arm.md (movaddr, movaddr_insn): Delete.
+
+2002-03-15 Jason Merrill <jason@redhat.com>
+
+ * toplev.c (wrapup_global_declarations): Clarify variable handling.
+ -fkeep-static-consts doesn't apply to comdats.
+
+2002-03-14 Richard Henderson <rth@redhat.com>
+
+ PR target/5312
+ * config/ia64/ia64.c: Include tm_p.h last.
+ (gen_nop_type): Remove duplicate definition.
+ (cycle_end_fill_slots): Set sched_data for second L slot.
+ (maybe_rotate): Call cycle_end_fill_slots to fill in nop slots.
+ (nop_cycles_until): Fix typos.
+
+2002-03-15 Jakub Jelinek <jakub@redhat.com>
+
+ PR optimization/5891
+ * unroll.c (copy_loop_body) [CALL_INSN]: Copy SIBLING_CALL_P flag.
+
+2002-03-14 David Mosberger <davidm@hpl.hp.com>, Hans Boehm <Hans_Boehm@hp.com>
+
+ * config/ia64/unwind-ia64.c: Handle copy_state and label_state
+ descriptors correctly.
+
+2002-03-14 Zack Weinberg <zack@codesourcery.com>
+
+ * cpphash.h (struct lexer_state): Remove line_extension member.
+ * cpplib.c (dequote_string, do_linemarker): New functions.
+ (linemarker_dir): New data object.
+ (DIRECTIVE_TABLE): No longer need to interpret #line in
+ preprocessed source. Delete obsolete comment about return
+ values of handlers.
+ (end_directive, directive_diagnostics, _cpp_handle_directive):
+ Don't muck with line_extension.
+ (directive_diagnostics): No need to issue warnings for
+ linemarkers here.
+ (_cpp_handle_directive): Issue warnings for linemarkers here,
+ when appropriate. Dispatch linemarkers to do_linemarker, not
+ do_line.
+ (do_line): Code to handle linemarkers split out to do_linemarker.
+ Convert escape sequences in filename argument, both places.
+
+ * cppmacro.c (quote_string): Rename cpp_quote_string and
+ export. All callers changed.
+ * cpplib.h (cpp_quote_string): Prototype.
+ * cppmain.c (print_line): Call cpp_quote_string on to_file
+ before printing it.
+
+ * doc/cpp.texi: Document that escapes are now interpreted in
+ #line and in linemarkers, and that non-printing characters are
+ converted to octal escapes when linemarkers are generated.
+
+2002-03-14 Richard Earnshaw <rearnsha@arm.com>
+ Jeroen Dobbelaere <jeroen.dobbelaere@acunia.com>
+
+ PR target/5828
+ * arm.c (arm_output_epilogue): Fix floating-point register save
+ adjustment when using a frame pointer.
+
+2002-03-13 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * config/mmix/mmix.c: Improve comments.
+ (mmix_target_asm_function_prologue): Drop variable
+ empty_stack_frame. Don't allocate unused slot above fp.
+ (mmix_target_asm_function_epilogue): Mirror prologue changes.
+ (mmix_expand_builtin_va_arg): Do all computations on trees.
+ * config/mmix/mmix.h (MMIX_GNU_ABI_REG_ALLOC_ORDER): Don't have
+ brace in first column.
+ (enum reg_class): Ditto.
+ (FIRST_PARM_OFFSET): Now 0.
+ (USER_LABEL_PREFIX): Remove #if 0:d definition.
+ (LINK_SPEC): Don't defsym __.MMIX.start..text if linking
+ relocatably. Always produce ELF, not mmo if linking relocatably.
+
+2002-03-13 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.h (PAD_VARARGS_DOWN): Define.
+ * config/rs6000/rs6000.c (rs6000_va_arg): Use
+ std_expand_builtin_va_arg if not ABI_V4.
+
+2002-03-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/5626
+ * config/sparc/sparc.md (normal_branch, inverted_branch,
+ normal_fp_branch, inverted_fp_branch, normal_fpe_branch,
+ inverted_fp_branch): Adjust calls to output_cbranch.
+ Set length attribute.
+ (normal_int_branch_sp64, inverted_int_branch_sp64): Adjust calls to
+ output_v9branch. Set length attribute.
+ * config/sparc/sparc.c (fcc0_reg_operand, noov_compare64_op): New
+ predicates.
+ (noov_compare_op): Handle CCX_NOOVmode the same way as CC_NOOVmode.
+ (output_cbranch): Likewise. Handle far branches.
+ (output_v9branch): Handle far branches.
+ * config/sparc/sparc-protos.h (output_cbranch, output_v9branch):
+ Adjust prototypes.
+ * config/sparc/sparc.h (PREDICATE_CODES): Add fcc0_reg_operand and
+ noov_compare64_op predicates.
+
+2002-03-13 Jason Merrill <jason@redhat.com>
+
+ * gthr-posix.h (__gthread_active_p): Move __gthread_active_ptr
+ into the function and constify it.
+ * gthr-dce.h, gthr-solaris.h: Likewise.
+
+2002-03-12 Hans-Peter Nilsson <hp@axis.com>
+
+ * config/cris/cris.c (cris_print_operand): Avoid
+ traditional-warning for 0xffffffff.
+ (cris_expand_builtin_va_arg): Do all computations on trees.
+
+2002-03-13 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * expr.c (expand_expr, case NE_EXPR): Do not call copy_to_reg with
+ VOIDmode operand. Add compile-time optimization for constant results.
+
+2002-03-13 Hartmut Penner <hpenner@de.ibm.com>
+
+ * config/s390/s390.h (PROFILE_BEFORE_PROLOGUE): Emit profile code
+ before prologue, to avoid scheduling problems.
+
+2002-03-13 Jakub Jelinek <jakub@redhat.com>
+
+ * config/sparc/sparc.h (INITIAL_FRAME_POINTER_OFFSET): Remove.
+ (ELIMINABLE_REGS): Add sfp->sp.
+ (INITIAL_ELIMINATION_OFFSET): Compute sfp->sp offset too.
+
+2002-03-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR optimization/5892
+ * config/ia64/ia64.c (rotate_one_bundle): Update current packet.
+
+2002-03-13 Jakub Jelinek <jakub@redhat.com>
+
+ * loop.c (basic_induction_var): Don't call convert_modes if mode
+ classes are different.
+
+2002-03-12 Richard Henderson <rth@redhat.com>
+
+ PR optimization/5901
+ * function.c (reposition_prologue_and_epilogue_notes): Position
+ the markers after/before the last/first insn not deleted.
+
+2002-03-12 Richard Henderson <rth@redhat.com>
+
+ PR optimization/5878
+ * config/arc/arc.h, config/cris/cris.h, config/i386/i386.h,
+ config/m68k/m68k.h, config/s390/s390.h, config/sparc/sparc.h
+ (PIC_OFFSET_TABLE_REGNUM): Conditionalize on flag_pic.
+
+ * config/arm/arm.h config/i386/i386.h, config/m68k/m68k.h,
+ config/sparc/sparc.h (CONDITIONAL_REGISTER_USAGE): Set
+ PIC_OFFSET_TABLE_REGNUM based on INVALID_REGNUM not flag_pic.
+
+ * config/arc/arc.h (CONDITIONAL_REGISTER_USAGE): New.
+ * config/arm/arm.c (arm_pic_register): Init to INVALID_REGNUM.
+ (arm_override_options): Set arm_pic_register if TARGET_APCS_STACK
+ also. Don't set it if not flag_pic.
+ * config/i386/i386.c (ix86_save_reg): Trust PIC_OFFSET_TABLE_REGNUM
+ to be INVALID_REGNUM when not used.
+
+2002-03-13 Aldy Hernandez <aldyh@redhat.com>
+
+ * expmed.c (store_bit_field): Reset alias set for memory.
+ (extract_bit_field): Same.
+
+2002-03-12 Chris Meyer <cmeyer@gatan.com>
+
+ * genflags.c (gen_insn): Use IS_VSPACE.
+ * genoutput.c (output_insn_data): Likewise.
+ (process_template): Likewise.
+
+2002-03-12 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa.c (xtensa_expand_block_move): Use
+ validize_mem() instead of change_address to avoid clobbering
+ memory attributes.
+
+2002-03-12 Jakub Jelinek <jakub@redhat.com>
+
+ * c-lex.c (cb_ident, c_lex): Remove unnecessary cast.
+ (lex_string): Use unsigned char pointers.
+
+2002-03-12 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * reload1.c (reload): Ignore MEM REG_EQUIV notes if the equivalent
+ is not a valid memory_operand.
+
+2002-03-12 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa-config.h: Define XCHAL_HAVE_LOOPS.
+ * config/xtensa/lib1funcs.asm: Fix copyright to include
+ special case for libgcc files.
+ (__udivsi3): Avoid loop instructions when XCHAL_HAVE_LOOPS is 0.
+ (__divsi3): Likewise.
+ (__umodsi3): Likewise.
+ (__modsi3): Likewise.
+ * config/xtensa/lib2funcs.S: Fix copyright to include
+ special case for libgcc files.
+
+2002-03-12 Michael Matz <matz@suse.de>
+
+ * config/rs6000/rs6000.md (ne0+4): Add extra CLOBBER.
+ (ne0+5): Use new clobber to generate proper shift pattern.
+
+2002-03-12 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/t-xtensa (CRTSTUFF_T_CFLAGS_S): Define.
+
+2002-03-12 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa.h (ASM_OUTPUT_POOL_PROLOGUE): Switch
+ to function_section before writing out the constant pool.
+
+2002-03-12 Zack Weinberg <zack@codesourcery.com>
+
+ * Makefile.in: Give texi2pod its input file as a command
+ line argument, not on stdin.
+
+2002-03-12 Andrew MacLeod <amacleod@redhat.com>
+
+ * config/sparc/sparc.h (RETURN_ADDR_RTX): Include v9 stack bias in
+ address calculation.
+
+2002-03-12 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.md (reload_insi, reload_indi): Change mode of
+ scratch register to DImode / TImode.
+ config/s390/s390.c (s390_expand_plus_operand): Make sure scratch
+ register used does not overlap the target.
+
+2002-03-11 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * Makefile.in: Update.
+doc:
+ * cppenv.texi, cppopts.texi: Split out of cpp.texi and gcc.texi.
+ Update documentation.
+ * gcc.texi: Include cppopts.texi and cppenv.texi.
+ * cpp.texi: Include cppopts.texi and cppenv.texi.
+
+2002-03-11 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.h (REG_ALLOC_ORDER): Add missing register.
+
+2002-03-11 Douglas B Rupp <rupp@gnat.com>
+
+ * toplev.c (vms_fopen): Remove, not needed.
+
+ * vmsdbgout.c (lookup_filename): Adjust creation date for GMT.
+
+ * config/alpha/xm-vms.h (__UNIX_FWRITE): Define.
+
+ * config/alpha/alpha.c (alpha_sa_size, VMS): Don't reserve space
+ for FP, already done later.
+
+ * toplev.c (debug_args): Add entry for VMS_DEBUG.
+ * vmsdbgout.c (vmsdbgout_init): Fix typo in call to xmalloc.
+
+2002-03-10 Richard Henderson <rth@redhat.com>
+
+ PR 5693
+ * reload.c (copy_replacements_1): New.
+ (copy_replacements): Use it to recurse through the rtx.
+
+2002-03-10 Richard Henderson <rth@redhat.com>
+
+ * sched-rgn.c (add_branch_dependences): Don't allow insns that throw
+ to move away from the end of the block.
+
+2002-03-10 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ PR preprocessor/5899
+ * cppinit.c (init_dependency_output): Don't ignore -dM etc.
+
+2002-03-10 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * combine.c (make_extraction): Fix error in last change.
+
+2002-03-09 Jakub Jelinek <jakub@redhat.com>
+
+ PR optimization/5172, optimization/5200
+ * gcse.c (gcse_main): Disable store_motion.
+
+2002-03-09 Andreas Schwab <schwab@suse.de>
+
+ * gcc.c (validate_all_switches): Also handle `%W{...}'.
+
+2002-03-09 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/5877
+ * expr.c (highest_pow2_factor): Check TREE_INT_CST_LOW
+ even for non-representable constants.
+
+Sat Mar 9 07:20:01 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * emit-rtl.c (copy_most_rtx): Accept EXPR_LIST for may_share.
+ * function.c (fixup_var_refs): Add MAY_SHARE parameter.
+ (fixup_var_refs_insns, fixup_var_refs_insns_with_has): Likewise.
+ (fixup_var_refs_insn, fixup_var_refs_1): Likewise.
+ (pop_function_context): Compute MAY_SHARE parameter for
+ fixup_var_refs.
+ (fixup_var_refs_1, case MEM): Pass MAY_SHARE to copy_most_rtx, not VAR.
+ (gen_mem_addressof): Call fixup_var_refs with new parm.
+
+ * combine.c (make_extraction): Don't make extension of CONST_INT.
+
+2002-03-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * sparc.c (arith_4096_operand): Fix error in last change.
+
+2002-03-08 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/rs6000.c (rs6000_va_arg): Fix alignment for
+ vectors.
+
+2002-03-08 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/sysv4.h (BIGGEST_ALIGNMENT): Change for altivec.
+
+2002-03-08 Craig Rodrigues <rodrigc@gcc.gnu.org>
+
+ * doc/install.texi (--with-libiconv-prefix): Document.
+
+2002-03-08 Michael Y. Brukman <myb2@cornell.edu>
+
+ * doc/sourcebuild.texi: Fix typo.
+
+2002-03-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/3711
+ * builtins.c (std_expand_builtin_va_arg): Do all computations on
+ trees.
+
+Fri Mar 8 06:48:45 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * rtl.c (copy_most_rtx): Move from here ...
+ * emit-rtl.c (copy_most_rtx): ... to here.
+
+2002-03-08 Richard Earnshaw <rearnsha@arm.com>
+
+ * combine.c (simplify_comparison): If simplifying a logical shift
+ right and compare with constant, force the comparison to unsigned.
+
+2002-03-07 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * genextract.c (walk_rtx): Recurse into MATCH_PAR_DUP.
+ genoutput.c (scan_operands): Recurse into MATCH_PAR_DUP
+ and MATCH_OP_DUP.
+
+2002-03-07 Aldy Hernandez <aldyh@redhat.com>
+
+ * doc/invoke.texi: Add documentation for -mabi=no-altivec.
+
+ * config/rs6000/rs6000.c (rs6000_parse_abi_options): Add
+ -mabi=no-altivec
+ (alt_reg_names): Remove % for vrsave.
+
+2002-03-06 Jeffrey A Law (law@redhat.com)
+
+ * ssa-ccp.c (ssa_fast_dce): Update the DF def-use chains
+ after completing fast dead code elimination.
+
+2002-03-06 Richard Henderson <rth@redhat.com>
+
+ PR optimization/5844
+ * genemit.c (gen_exp): New argument used. Invoke copy_rtx
+ if used indicates we've already emitted one copy of an operand.
+ (gen_insn, gen_expand, output_add_clobbers): Supply a null used.
+ (gen_split): Supply a non-null used.
+
+2002-03-06 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * simplify-rtx.c (simplify_plus_minus): Do not abort,
+ but simply fail if the expression is too complex to simplify.
+ (simplify_gen_binary): Handle simplify_plus_minus failures.
+
+2002-03-06 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * reload1.c (reload): Unshare all rtl after reload is done.
+
+2002-03-06 Jakub Jelinek <jakub@redhat.com>
+
+ * ssa-ccp.c (ssa_ccp_substitute_constants): Backout 2002-03-05
+ patch.
+
+2002-03-05 Zack Weinberg <zack@codesourcery.com>
+
+ * cppmain.c (setup_callbacks): Disable #pragma and #ident
+ callbacks when processing assembly language.
+
+2002-03-06 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa.h (ASM_FILE_END): Define.
+ * som.h (ASM_FILE_END): Delete.
+
+ * pa.c (function_arg): Don't pass floats in general registers in
+ indirect calls if TARGET_ELF32.
+
+2002-03-05 Richard Henderson <rth@redhat.com>
+
+ * config/i386/i386.md (floatsidf2): Conditionalize on hard-float.
+
+2002-03-05 Jakub Jelinek <jakub@redhat.com>
+
+ * mklibgcc.in: Prepend a tab before .hidden, add $flags to gcc
+ -r command line. Don't hide any symbols if not building
+ shared libgcc.
+
+2002-03-05 Jakub Jelinek <jakub@redhat.com>
+
+ * expmed.c (emit_store_flag): Don't test BITS_PER_WORD * 2
+ wide volatile memory by parts.
+
+2002-03-05 Jakub Jelinek <jakub@redhat.com>
+
+ * ssa-ccp.c (ssa_ccp_substitute_constants): Don't crash if def
+ is NULL.
+
+2002-03-05 Richard Henderson <rth@redhat.com>
+
+ * config/rs6000/rs6000.h (TOTAL_ALTIVEC_REGS): Fix off-by-one error.
+
+2002-03-04 Krister Walfridsson <cato@df.lth.se>
+
+ * config.gcc (*-*-netbsd*): Add t-slibgcc-elf-ver to tmake_file.
+
+2002-03-05 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * configure.in: Increase required makeinfo version to 4.1.
+ * configure: Regenerate.
+
+2002-03-04 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * doc/include/texinfo.tex: Update to version 2002-03-01.06.
+ * doc/invoke.texi: Fix @math uses.
+
+2002-03-02 Per Bothner <per@bothner.com>
+
+ * gcc.c (option_map): Suport new --bootclasspath option.
+ --CLASSPATH is now just an alias for --classpath.
+
+Sat Mar 2 06:30:14 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * config/sparc/sparc.c (sparc_initialize_trampoline): Use
+ trunc_int_for_mode.
+
+ * emit-rtl.c (offset_address): Call update_temp_slot_address.
+
+2002-03-01 Richard Henderson <rth@redhat.com>
+
+ * config/ia64/ia64.c (ia64_initial_elimination_offset): Do not
+ adjust argument_pointer by pretend_args_size.
+ (ia64_va_start): Adjust va_start address by -pretend_args_size.
+
+2002-03-01 Zack Weinberg <zack@codesourcery.com>
+
+ * doc/cpp.texi: Clarify documentation of relationship between
+ #line and #include.
+
+2002-02-28 Richard Henderson <rth@redhat.com>
+
+ * expmed.c (store_bit_field): Prevent generation of CONCATs;
+ pun complex values as integers; use gen_lowpart instead of
+ gen_rtx_SUBREG.
+ (extract_bit_field): Likewise.
+
+2002-02-28 David O'Brien <obrien@FreeBSD.org>
+
+ * config.gcc (sparc64-*-freebsd): Explicitly accept a cpu specification
+ of "ultrasparc".
+ * config/sparc/freebsd.h: Do not use MASK_FASTER_STRUCTS. It appears
+ to be broken.
+
+2002-02-28 Alexandre Oliva <aoliva@redhat.com>
+
+ * gcc.c (init_gcc_specs): Get -static and -static-libgcc to
+ override -shared and -shared-libgcc.
+
+2002-02-28 Andrew MacLeod <amacleod@redhat.com>
+
+ * dwarf2out.c (stack_adjust_offset): Add support for POST_INC,
+ POST_DEC, and POST_MODIFY.
+
+2002-02-28 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * doc/invoke.texi, doc/standards.texi: Link to
+ gcc-3.1/c99status.html.
+
+2002-02-28 Richard Henderson <rth@redhat.com>
+
+ * config/ia64/ia64.c (ia64_adjust_cost): All non-MM consumers have
+ 4 cycle latency from MM producers.
+ (ia64_internal_sched_reorder): Likewise with pipeline flush.
+
+2002-02-28 Jakub Jelinek <jakub@redhat.com>
+
+ * mklibgcc.in: Don't use GNU make extension.
+
+2002-02-28 Richard Henderson <rth@redhat.com>
+
+ * haifa-sched.c (sched_emit_insn): New.
+ (schedule_block): Use last_scheduled_insn to track last insn.
+ * sched-int.h (sched_emit_insn): Prototype.
+ * config/ia64/ia64.c (last_issued): Remove.
+ (ia64_variable_issue): Don't set it.
+ (nop_cycles_until): Use sched_emit_insn.
+
+2002-02-28 Bo Thorsen <bo@suse.de>
+
+ * config/i386/linux64.h (LINK_SPEC): Fix 32/64 bit compilation.
+ (STARTFILE_SPEC): Add 64 bit files.
+ (ENDFILE_SPEC): Likewise.
+
+Don Feb 28 16:41:19 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * cfgrtl.c (purge_dead_edges): Fix handling of EH edges.
+
+ * i386.h (CONDITIONAL_REGISTER_USAGE): Do not write to
+ PIC_OFFSET_TABLE_REGNUM when it is INVALID_REGNUM
+
+ * x86-64.h (ASM_OUTPUT_MAX_SKIP_ALIGN): Always define.
+
+2002-02-28 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/aix43.h (THREAD_MODEL_SPEC): Delete.
+ * config/rs6000/aix51.h (THREAD_MODEL_SPEC): Delete.
+
+2002-02-28 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.md (load_toc_aix_di): Handle TARGET_RELOCATABLE.
+
+2002-02-28 Jason Merrill <jason@redhat.com>
+
+ * c-decl.c (finish_function): Only warn about missing return
+ statement with -Wreturn-type.
+
+2002-02-27 Zack Weinberg <zack@codesourcery.com>
+
+ * mklibgcc.in: Don't use \n in a line subject to
+ interpretation by echo.
+
+2002-02-27 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (s390_chunkify_pool): Do not confuse
+ insn UIDs with insn addresses.
+
+2002-02-27 Graham Stott <grahams@redhat.com>
+
+ * config/rs6000/rs6000.h (ASM_OUTPUT_DEF_FROM_DECL):
+ Constify NAME.
+
+ * loop.c (prescan_loop): Handle PARALLEL.
+
+ * unroll.c (loop_iterations): Return 0 if the add_val for
+ a BIV is REG.
+
+ * final.c (output_operand_lossage): Constify PFX_STR.
+
+ * df.c (df_insn_refs_record): Use XEXP (x, 0) for USE.
+
+2002-02-26 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/alpha.md (ashldi_se): Re-enable.
+
+2002-02-26 Kelley Cook <kelleycook@comcast.net>
+
+ * config/i386/i386.c (print_operand): Don't append ATT-style
+ length suffixs to x87 opcodes when in Intel mode.
+
+2002-02-26 Ryan T. Sammartino <ryants@shaw.ca>
+
+ * emit-rtl.c (gen_const_vector_0): Remove TYPE argument.
+ (init_emit_once): Update calls.
+ * fixinc/gnu-regex.c (_GNU_SOURCE): Remove.
+ (init_syntax_once): Prototype.
+
+2002-02-26 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa-linux.h (LIB_SPEC): Update definition.
+ * pa32-linux.h (LINK_COMMAND_SPEC): Delete.
+
+2002-02-26 Alexandre Oliva <aoliva@redhat.com>
+
+ * dwarf2out.c (gen_inlined_subroutine_die): If block is abstract,
+ generate a die for the lexical block.
+
+2002-02-26 Richard Henderson <rth@redhat.com>
+
+ * expr.c (expand_expr) [MULT_EXPR]: Do not apply distributive law
+ in EXPAND_SUM case. Use host_integerp/tree_low_cst.
+
+2002-02-26 Richard Henderson <rth@redhat.com>
+
+ * config/ia64/ia64.c (nop_cycles_until): Do init_insn_group_barriers
+ if we emitted a stop bit.
+
+2002-02-26 Jakub Jelinek <jakub@redhat.com>
+
+ * configure.in (libgcc_visibility): Substitute.
+ * configure: Rebuilt.
+ * mklibgcc.in: If libgcc_visibility = yes, make libgcc.a global
+ defined symbols .hidden.
+
+2002-02-26 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/5770
+ * dwarf2out.c (rtl_for_decl_location): Return CONST_STRING for
+ STRING_CST initializer spanning the whole variable without
+ embedded zeros.
+ If expand_expr returned MEM, don't use it.
+
+2002-02-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/5755
+ * config/i386/i386.c (ix86_return_pops_args): Only pop
+ fake structure return argument if it was passed on the stack.
+
+2002-02-25 Jason Merrill <jason@redhat.com>
+
+ * attribs.c (decl_attributes): Also re-layout PARM_DECL and
+ RESULT_DECL.
+
+2002-02-25 Alexandre Oliva <aoliva@redhat.com>
+
+ * gcc.c (init_gcc_specs): Get -shared-libgcc along with -shared to
+ link with shared_name only.
+ * doc/invoke.texi (Link Options): Document new behavior.
+
+2002-02-25 Aldy Hernandez <aldyh@redhat.com>
+
+ * c-typeck.c (push_init_level): Handle vectors.
+
+2002-02-25 Alexandre Oliva <aoliva@redhat.com>
+
+ * config/sparc/sparc.c (const64_high_operand): Zero-extend
+ operands of SPARC_SETHI_P.
+ (input_operand): Likewise.
+ (sparc_emit_set_const32): Likewise.
+ * config/sparc/sparc.h (SPARC_SETHI_P): Disregard TARGET_ARCH64.
+ (SPARC_SETHI32_P): Zero-extend operand from 32 bits.
+ (CONST_OK_FOR_LETTER_P): Use SETHI32 for `K'. Add `N' as SETHI.
+ * config/sparc/sparc.md (movdi_insn_sp64_novis): Use `N'.
+ (movdi_insn_sp64_vis): Likewise.
+ (movdi split, movdf split): Use SETHI32.
+ * doc/md.texi: Document SPARC constraints L, M and N.
+
+2002-02-25 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/rs6000.md ("get_vrsave_internal"): New.
+ ("*set_vrsave_internal"): use mfspr for Darwin.
+
+ * config/rs6000/rs6000.c (rs6000_emit_prologue): Call
+ gen_get_vrsave_internal.
+
+Sun Feb 24 16:38:56 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * optabs.c (widen_operand): Properly handle CONST_INT for NO_EXTEND.
+
+2002-02-24 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * cpplex.c (cpp_interpret_charconst): Get signedness or
+ otherwise of wide character constants correct.
+ * cppexp.c (lex): Get signedness of wide charconsts correct.
+
+Sun Feb 24 07:41:31 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * optabs.c (widen_operand): Only call convert_modes for
+ promoted SUBREG if signedness matches.
+ * config/alpha/alpha.md (*addsi_se2, *subsi_se2): New patterns.
+
+2002-02-23 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * cpplib.c (glue_header_name): Use local buffer to build up
+ header name.
+
+2002-02-23 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * doc/cpp.texi, doc/invoke.texi: Update documentation for -MM.
+
+2002-02-23 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.c (output_simode_bld): Handle H8/300 and
+ H8/300[HS] separately.
+ * config/h8300/h8300.md: Remove the early clobber constraint
+ from bit field patterns.
+
+2002-02-23 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.md (mulqihi3): Tighten predicates to
+ register_operand.
+ (mulhisi3): Likewise.
+ (umulqisi3): Likewise.
+ (umulhisi3): Likewise.
+
+2002-02-23 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * cppinit.c (output_deps): Correct test for stdout output.
+ (init_dependency_output): Cure warning.
+
+Sat Feb 23 08:42:47 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expr.c (store_expr): When converting expression to promoted
+ equivalent type, allow using SUBREG_REG of TARGET as the target
+ of the expansion of EXP.
+ * loop.c (basic_induction_var, case SUBREG): Always look inside.
+ * config/alpha/alpha.c (rtx_equiv_function_matters): Delete decl.
+ (alpha_emit_set_const): Handle SImode when can't make new pseudos.
+ (alpha_emit_set_const_1, alpha_sa_mask): Use no_new_pseudos.
+ * config/alpha/alpha.md (addsi3, subsi3): Don't use if optimizing.
+
+2002-02-23 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * doc/contribute.texi, doc/extend.texi, doc/install.texi,
+ doc/invoke.texi, doc/md.texi, doc/passes.texi, doc/rtl.texi,
+ doc/standards.texi, doc/tm.texi: Remove trailing whitespace.
+
+2002-02-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR optimization/5747
+ * loop.c (scan_loop): Update reg info if move_movables created new
+ pseudos.
+
+2002-02-23 David Edelsohn <edelsohn@gnu.org>
+
+ * gcc.c (init_gcc_spec): Revert last change.
+
+2002-02-23 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.md (load_toc_aix_{si,di}): Use
+ gpc_reg_operand constraint.
+
+2002-02-23 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.c (num_insns_constant): Fix formatting.
+ Simplify comparison of `low'.
+ (add_operand): Fix formatting.
+ (non_add_cint_operand): Use CONST_OK_FOR_LETTER_P.
+ (mask_operand): Disallow mask to wrap in 64-bit mode.
+ (rs6000_stack_info): Remove redundant test setting push_p.
+ (output_toc): Fix formatting.
+ * config/rs6000/rs6000.md (boolsi3, boolcsi3 splitters): Use
+ cc_reg_not_cr0_operand constraint.
+ (booldi3, boolcdi3 splitters): Same.
+
+2002-02-23 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/altivec.h: Add extra level of parentheses on casts.
+
+2002-02-22 David Edelsohn <edelsohn@gnu.org>
+
+ * gcc.c (init_gcc_spec): Do not link with static libgcc.a if
+ gcc invoked with -shared-libgcc.
+
+2002-02-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/5748
+ * stmt.c (expand_anon_union_decl): Set TREE_USED on the anon union
+ decl if any of elements was TREE_USED.
+
+2002-02-22 Alexandre Oliva <aoliva@redhat.com>
+
+ * config/sparc/sol2.h: Don't include sys/mman.h.
+ * config/sparc/sparc.c (arith_operand): Use SMALL_INT32.
+ (arith_4096_operand): Don't throw high bits away.
+ (const64_operand): Take sign extension of CONST_INTs into account.
+ (const64_high_operand, sparc_emit_set_const32): Likewise.
+ (GEN_HIGHINT64): Likewise.
+ (sparc_emit_set_const64_quick1): Likewise.
+ (const64_is_2insns): Likewise.
+ (print_operand): Use trunc_int_for_mode for sign extension.
+ * config/sparc/sparc.h (SMALL_INT32): Likewise.
+ * config/sparc/sparc.md (movqi): Sign-extend CONST_DOUBLE
+ chars. Assume CONST_INT is already properly sign-extended.
+ (movdi split): Sign-extend each SImode part.
+ (andsi3 split): Don't mask high bits off, so that result
+ remains properly sign-extend.
+ (iorsi3 split): Likewise.
+ (xorsi3 split): Likewise.
+
+2002-02-22 Richard Sandiford <rsandifo@redhat.com>
+
+ * fold-const.c (fold): Fix typo in comments.
+
+2002-02-21 Diego Novillo <dnovillo@redhat.com>
+
+ * Makefile.in (langhooks.o): Update dependencies.
+
+2002-02-21 Diego Novillo <dnovillo@redhat.com>
+
+ * langhooks.c: Include flags.h.
+
+2002-02-21 Aldy Hernandez <aldyh@redhat.com>
+
+ * testsuite/gcc.dg/attr-alwaysinline.c: New.
+
+ * c-common.c (c_common_post_options): Set inline trees by
+ default.
+
+ * doc/extend.texi (Function Attributes): Document always_inline
+ attribute.
+ Update documentation about inlining when not optimizing.
+
+ * cp/decl.c (duplicate_decls): Merge always_inline attribute.
+
+ * cp/tree.c (cp_cannot_inline_tree_fn): Do not inline at -O0
+ unless DECL_ALWAYS_INLINE.
+
+ * c-objc-common.c (c_cannot_inline_tree_fn): Do not inline at -O0
+ unless DECL_ALWAYS_INLINE.
+ (c_disregard_inline_limits): Disregard if always_inline set.
+
+ * langhooks.c (lhd_tree_inlining_disregard_inline_limits):
+ Disregard if always_inline set.
+ (lhd_tree_inlining_cannot_inline_tree_fn): Do not inline at -O0
+ unless DECL_ALWAYS_INLINE.
+
+ * attribs.c (handle_always_inline_attribute): New.
+ (c_common_attribute_table): Add always_inline.
+
+ * config/rs6000/altivec.h: Add prototypes for builtins
+ requiring the always_inline attribute.
+
+2002-02-21 Eric Christopher <echristo@redhat.com>
+
+ * expmed.c (store_bit_field): Try to simplify the subreg
+ before generating a new one when when the mode size of
+ value is less than maxmode.
+
+2002-02-21 Richard Henderson <rth@redhat.com>
+
+ * emit-rtl.c (offset_address): Use simplify_gen_binary rather
+ than gen_rtx_PLUS to form the sum.
+ * explow.c (force_reg): Rearrange to not allocate new pseudo
+ when force_operand returns a register.
+ * expr.c (expand_assignment): Allow offset_rtx expansion to
+ return a sum. Do not force addresses into registers.
+ (expand_expr): Likewise.
+ * simplify-rtx.c (simplify_gen_binary): Use simplify_plus_minus
+ to canonicalize arithmetic that didn't simpify.
+ (simplify_plus_minus): New argument force; update
+ all callers. Don't split CONST unless we can do something with it,
+ and wouldn't lose the constness of the operands.
+
+ * config/i386/i386.c (legitimize_pic_address): Recognize UNSPECs
+ that we generated earlier.
+
+2002-02-21 Tom Tromey <tromey@redhat.com>
+
+ * dwarf2out.c (DWARF_LINE_MIN_INSTR_LENGTH): Removed.
+ (output_line_info): Use constant `1', with a long explanatory
+ comment.
+ * system.h (DWARF_LINE_MIN_INSTR_LENGTH): Poison.
+
+Thu Feb 21 22:43:44 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * jump.c (redirect_jump): If old label has no UID, don't try to
+ delete it.
+
+Thu Feb 21 21:17:21 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * sh.md (insv): Provide byte offsets for gen_rtx_SUBREG.
+ If input is constant, do shifts at compile time.
+
+2002-02-21 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * doc/extend.texi: Fix some more overfull hboxes.
+
+2002-02-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR optimization/4994
+ * config/i386/i386.md (movsi_1, movsf_1): Support MMX -> MMX
+ register moves.
+
+2002-02-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/4574
+ * expr.h (expand_and): Add mode argument.
+ * expmed.c (expand_and): Add mode argument.
+ (expand_mult_highpart_adjust, emit_store_flag): Adjust callers.
+ * expr.c (store_field, expand_expr, do_store_flag): Likewise.
+ * except.c (expand_builtin_extract_return_addr): Likewise.
+ * config/alpha/alpha.c (alpha_initialize_trampoline): Likewise.
+ * config/sparc/sparc.c (sparc_initialize_trampoline): Likewise.
+ * config/c4x/c4x.h (INITIALIZE_TRAMPOLINE): Likewise.
+ Use GEN_INT (x) instead of gen_rtx (CONST_INT, VOIDmode, x).
+ * config/c4x/c4x.md: Use GEN_INT (x) instead of
+ gen_rtx (CONST_INT, VOIDmode, x).
+
+2002-02-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/4697:
+ * stmt.c (warn_if_unused_value): Move side effects test once more.
+
+2002-02-20 Torbjorn Granlund <tege@swox.com>
+
+ * config/avr/avr.md: Add more patterns for mized-mode add and subtract
+ (addsi3_zero_extend, subhi3_zero_extend1, subsi3_zero_extend).
+
+Thu Feb 21 16:20:46 2002 Alexandre Oliva <aoliva@redhat.com>
+
+ * rtlanal.c (replace_rtx): Don't make a CONST_INT the operand of
+ SUBREG or ZERO_EXTEND.
+
+Thu Feb 21 15:35:46 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * sh.h (current_function_anonymous_args): Remove.
+ (SETUP_INCOMING_VARARGS): Don't set it - just check that one
+ of current_function_varargs and current_function_stdarg is set.
+ * sh.c (sh_expand_prologue): Check current_function_varargs /
+ current_function_stdarg / TARGET_SH5 instead of
+ current_function_anonymous_args.
+
+ * sh64.h (TARGET_VERSION): Define.
+
+2002-02-20 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.h (EPILOGUE_USES): Conditionalize
+ VRSAVE_REGNO on TARGET_ALTIVEC.
+
+2002-02-20 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.c (includes_lshift_p): Mask irrelevant
+ bits of SImode const_int.
+ (includes_rshift_p): Likewise.
+ (print_operand): Call mask_operand and mask64_operand with correct
+ mode.
+ (rs6000_output_function_epilogue): Pad traceback table to word.
+ * config/rs6000/rs6000.h (MASK_64BIT): Correct comment.
+ (EXTRA_CONSTRAINT, 'S' and 'T'): Call mask_operand and
+ mask64_operand with correct mode.
+ (FUNCTION_ARG_REGNO_P): Correct parentheses.
+
+2002-02-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/4461
+ * varasm.c (get_pool_constant_mark): New.
+ * rtl.h (get_pool_constant_mark): Add prototype.
+ * dwarf2out.c (mem_loc_descriptor): A pool constant cannot
+ be represented if it has not been output.
+
+2002-02-20 Alexandre Oliva <aoliva@redhat.com>
+
+ * combine.c (do_SUBST): Sanity check substitutions of
+ CONST_INTs, and reject them in SUBREGs and ZERO_EXTENDs.
+ (subst): Simplify SUBREG or ZERO_EXTEND instead of SUBSTing a
+ CONST_INT into its operand.
+ (known_cond): Likewise, for ZERO_EXTEND.
+ * simplify-rtx.c (simplify_unary_operation): Fix condition to
+ allow for simplification of wide modes. Reject CONST_INTs in
+ ZERO_EXTEND when their actual mode is not given.
+
+2002-02-20 Alexandre Oliva <aoliva@redhat.com>
+
+ * c-decl.c (pushdecl): If no global declaration is found for an
+ extern declaration in block scope, try a limbo one.
+
+2002-02-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/4401
+ * c-common.c (pointer_int_sum): Moved from...
+ * c-typeck.c (pointer_int_sum): ...here.
+ * c-common.h (pointer_int_sum): Add prototype.
+
+2002-02-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/5713
+ * c-decl.c (duplicate_decls): Return 0 if issued error about
+ redeclaration.
+
+2002-02-20 Roger Sayle <roger@eyesopen.com>
+ Jakub Jelinek <jakub@redhat.com>
+
+ PR c/4389
+ * tree.c (host_integerp): Ensure that the constant integer is
+ representable in a HOST_WIDE_INT or an unsigned HOST_WIDE_INT
+ when pos is zero or non-zero respectively. Clarify comment.
+ * c-format.c (check_format_info_recurse): Fix host_integerp
+ usage; the pos argument should be zero when assigning to a
+ signed HOST_WIDE_INT.
+
+2002-02-20 Richard Henderson <rth@redhat.com>
+
+ * config/i386/i386.c (ix86_expand_vector_move): Use the mode
+ of the operand, rather than assuming TImode.
+ (ix86_expand_binop_builtin): Cope with commutative patterns
+ using nonimmediate_operand for both operands.
+ (ix86_expand_timode_binop_builtin): Likewise.
+ (ix86_expand_store_builtin): Validate operand 1.
+ (ix86_expand_unop1_builtin): Likewise.
+
+2002-02-20 Philip Blundell <philb@gnu.org>
+
+ PR 5705
+ * config/arm/arm.h (HARD_REGNO_RENAME_OK): New macro.
+
+2002-02-20 Richard Henderson <rth@redhat.com>
+
+ PR c/5615
+ * expr.h (ARGS_SIZE_TREE): Convert size.var to ssizetype.
+
+2002-02-20 Tom Tromey <tromey@redhat.com>
+
+ * config/fr30/fr30.h (DWARF_LINE_MIN_INSTR_LENGTH): Removed.
+ * config/sh/sh.h (DWARF_LINE_MIN_INSTR_LENGTH): Removed.
+ * config/pj/pj.h (DWARF_LINE_MIN_INSTR_LENGTH): Removed.
+ * config/cris/cris.h (DWARF_LINE_MIN_INSTR_LENGTH): Removed.
+ * dwarf2out.c (DWARF_LINE_MIN_INSTR_LENGTH): Define
+ unconditionally.
+
+Wed Feb 20 00:03:25 EST 2002 Alan Matsuoka <alanm@redhat.com>
+
+ * config/rs6000/rs6000.h (LEGITIMATE_OFFSET_ADDRESS_P): Look
+ for (const_int 0) in X not just INTVAL.
+
+2002-02-20 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * doc/extend.texi: Avoid or reduce overfull hboxes.
+
+2002-02-20 Diego Novillo <dnovillo@redhat.com>
+
+ * expmed.c (store_bit_field): Do not store bit fields using SUBREG
+ operations if the field does not start at a mode boundary.
+
+2001-02-20 Joel Sherrill <joel@OARcorp.com>
+
+ * config/a29k/rtems.h, config/arm/rtems-elf.h, config/h8300/rtems.h,
+ config/mips/rtems.h: Use new style of -Asystem= rather than -Asystem().
+ Also done for -Acpu and -Amachine.
+
+2002-02-20 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * cppinit.c (init_dependency_output): Take deps output file
+ from -o if none given with -MF. Suppress normal output.
+ * gcc.c (cpp_unique_options): Have -M and -MM imply -E.
+ * doc/cpp.texi, doc/invoke.texi: Update.
+
+2002-02-19 Zack Weinberg <zack@codesourcery.com>
+
+ * toplev.c (output_quoted_string): Write unprintable
+ characters with octal escapes.
+
+2002-02-19 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.h (CONDITIONAL_REGISTER_USAGE): Set
+ really_call_used[VRSAVE_REGNO] if not Altivec.
+
+2002-02-19 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/rs6000.c (u_short_cint_operand): Mask op with
+ MODE_MASK.
+ (constant_pool_expr_1): Fix formatting.
+ (rs6000_legitimize_reload_address): Likewise.
+
+Tue Feb 19 20:13:57 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * config/sparc/sparc.md (nonlocal_goto): Use hard_frame_pointer_rtx
+ now that we have one.
+
+2002-02-19 Zack Weinberg <zack@codesourcery.com>
+
+ * tree.h (struct tree_common): Remove aux. Add unused_0 at
+ end of first block of bitfields (which was only seven bits);
+ rename dummy to unused_1; remove comment which is no longer true.
+
+2002-02-19 Gaute B Strokkenes <gs234@cam.ac.uk>
+
+ * doc/c-tree.texi (Classes, TYPE_BINFO): Fix typo.
+
+2002-02-19 Philip Blundell <pb@nexus.co.uk>
+
+ PR 5399
+ * config/arm/arm.h (THUMB_LEGITIMATE_CONSTANT_P): Accept anything
+ if generating PIC.
+
+ PR 5054
+ * config/arm/arm.md (call_insn) [TARGET_THUMB]: Use
+ arm_is_longcall_p rather than inspecting call-type cookie
+ directly.
+ (call_value_insn) [TARGET_THUMB]: Likewise.
+
+2002-02-19 Graham Stott <grahams@redhat.com>
+
+ * config/i386/i386.c (ix86_expand_builtin): Fix typo.
+
+2002-02-19 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/linux64.h (LINK_OS_LINUX_SPEC): Look in /lib64.
+ ({STARTFILE,ENDFILE}_LINUX_SPEC): Define.
+ (FP_SAVE_INLINE): Delete.
+
+ * config/rs6000/sysv4.h (ENDFILE_SPEC): Add crtsaveres.o.
+ * config/rs6000/eabi.asm: Remove ABI save restore routines.
+ * config/rs6000/t-ppccomm: Build crtsavres.o.
+ * config/rs6000/crtsavres.asm: New file.
+
+2002-02-19 Philip Blundell <philb@gnu.org>
+
+ * config/arm/arm.c (use_return_insn): Don't reject interrupt
+ functions.
+ (arm_compute_save_reg_mask): Save LR for interrupt functions too.
+ (output_return_instruction): Allow interrupt functions to return with
+ ldmfd sp!, {... pc}^. Use LDR to restore any single register.
+ (arm_expand_prologue): Subtract 4 before stacking LR in an
+ interrupt function.
+
+2002-02-19 Philip Blundell <pb@nexus.co.uk>
+
+ * config/arm/arm.c (arm_encode_call_attribute): Operate on any
+ decl, not just FUNCTION_DECL.
+ (legitimize_pic_address): Handle local SYMBOL_REF like LABEL_REF.
+ (arm_assemble_integer): Likewise.
+ * config/arm/arm.h (ARM_ENCODE_CALL_TYPE): Allow any decl to be
+ marked local.
+
+2002-02-19 matthew green <mrg@eterna.com.au>
+
+ * config.gcc (sparc-*-netbsdelf*): Enable target.
+ (sparc64-*-netbsd*): New target.
+ * config/sparc/netbsd-elf.h: New file.
+ * config/sparc/t-netbsd64: New file.
+
+2002-02-19 Gaute B Strokkenes <gs234@cam.ac.uk>
+
+ * doc/rtl.texi (Flags, MEM_SCALAR_P): Fix typo.
+
+2002-02-19 Ryan T. Sammartino <ryants@shaw.ca>
+
+ * doc/invoke.texi: explicitly list the style guidelines that
+ -Weffc++ checks for.
+
+Tue Feb 19 12:37:23 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * regmove.c (regmove_optimize): Avoid increasing of register pressure.
+
+2002-02-19 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ PR other/5718
+ * gcc.c (cpp_unique_options): Treat -o as indicating object file
+ only if not -E. If -E, pass -o through to the preprocessor.
+
+2002-02-19 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.h (REGNO_REG_CLASS): Replace a literal
+ register number with an appropriate macro.
+
+2002-02-19 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
+
+ * doc/rtl.texi (Constants): Close @code tag.
+
+2002-02-19 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/i386/i386.md ("mmx_uavgv8qi3"): Use const_vector.
+ ("mmx_uavgv4hi3"): Same.
+ ("pmulhrwv4hi3"): Same.
+
+ * tree-inline.c (walk_tree): Handle vectors.
+
+ * c-common.c (constant_expression_warning): Handle vectors.
+ (overflow_warning): Same.
+
+ * sched-deps.c (sched_analyze_2): Handle vectors.
+
+ * rtlanal.c (rtx_unstable_p): Handle vectors.
+ (rtx_varies_p): Same.
+ (count_occurrences): Same.
+ (regs_set_between_p): Same.
+ (modified_between_p): Same.
+ (modified_in_p): Same.
+ (volatile_insn_p): Same.
+ (volatile_refs_p): Same.
+ (side_effects_p): Same.
+ (may_trap_p): Same.
+ (inequality_comparisons_p): Same.
+ (replace_regs): Same.
+ (computed_jump_p_1): Same.
+
+ * rtl.c (DEF_MACHMODE): Change all definitions to accept 8th
+ argument.
+ (inner_mode_array): New.
+ (copy_rtx): Handle vectors.
+ (copy_most_rtx): Same.
+ (rtx_equal_p): Same.
+ (get_mode_alignment): Adjust for vectors.
+
+ * resource.c (mark_referenced_resources): Handle vectors.
+ (mark_set_resources): Same.
+
+ * reload1.c (eliminate_regs): Handle vectors.
+ (elimination_effects): Same.
+ (scan_paradoxical_subregs): Same.
+
+ * reload.c (subst_reg_equivs): Handle vectors.
+
+ * regrename.c (scan_rtx): Handle vectors.
+
+ * regclass.c (reg_scan_mark_refs): Handle vectors.
+
+ * recog.c (find_single_use_1): Handle vectors.
+
+ * local-alloc.c (equiv_init_varies_p): Handle vectors.
+ (contains_replace_regs): Same.
+ (memref_referenced_p): Same.
+
+ * integrate.c (copy_rtx_and_substitute): Handle vectors.
+ (subst_constants): Same.
+
+ * genattrtab.c (attr_copy_rtx): Handle vectors.
+ (encode_units_mask): Same.
+ (clear_struct_flag): Same.
+ (count_sub_rtxs): Same.
+
+ * gcse.c (want_to_gcse_p): Handle vectors.
+ (oprs_unchanged_p): Same.
+ (hash_expr_1): Same.
+ (oprs_not_set_p): Same.
+ (expr_killed_p): Same.
+ (compute_transp): Same.
+ (store_ops_ok): Same.
+
+ * function.c (purge_addressof_1): Do not allow paradoxical subregs
+ of vectors.
+ (fixup_var_refs_1): Same.
+ (instantiate_virtual_regs_1): Same.
+
+ * fold-const.c (operand_equal_p): Handle vectors.
+ (fold): Same.
+ (rtl_expr_nonnegative_p): Same.
+
+ * flow.c (mark_used_regs): Handle vectors.
+
+ * df.c (df_uses_record): Handle vectors.
+
+ * cselib.c (cselib_subst_to_values): Handle vectors.
+ (cselib_mem_conflict_p): Same.
+ (hash_rtx): Same.
+
+ * cse.c (canon_reg): Handle vectors.
+ (fold_rt): Same.
+ (cse_process_notes): Same.
+ (count_reg_usage): Same.
+ (canon_hash): Same.
+
+ * alias.c (nonlocal_mentioned_p): Add case for CONST_VECTOR.
+
+ * combine.c (mark_used_regs_combine): Add case for CONST_VECTOR.
+
+ * emit-rtl.c (init_emit_once): Generate const0_rtx for vectors.
+ (gen_rtx): Handle CONST_VECTOR.
+ (gen_const_vector_0): New.
+ (copy_rtx_if_shared): CONST_VECTORs can be shared.
+ (reset_used_flags): Same.
+ (copy_insn_1): Same.
+ (initializer_constant_valid_p): Handle VECTOR_CST.
+
+ * doc/c-tree.texi (Expression trees): Document VECTOR_CST.
+
+ * doc/rtl.texi (Constants): Document const_vector.
+ (CONST0_RTX): Update for vectors.
+ (RTL sharing): Same.
+
+ * print-tree.c (print_node): Add case for VECTOR_CST.
+
+ * tree.h (TREE_VECTOR_CST_ELTS): New.
+ (struct tree_vector): New.
+ (union tree_node): Add vector node.
+ (build_vector): Add prototype.
+
+ * tree.def (VECTOR_CST): New.
+
+ * tree.c (build_vector): New.
+
+ * expmed.c (make_tree): Handle CONST_VECTOR.
+
+ * rtl.h (CONSTANT_P): CONST_VECTORs are constants too.
+ (CONST_VECTOR_ELT): New.
+ (CONST_VECTOR_NUNITS): New.
+
+ * machmode.h (GET_MODE_INNER): New.
+ (DEF_MACHMODE): Accept 8th arg.
+
+ * machmode.def: Add 8th argument for vector inner mode.
+ Add inner vector modes for vectors.
+
+ * rtl.def (VEC_CONST): Remove.
+ (CONST_VECTOR): New.
+
+ * expr.c (clear_storage): Allow vectors.
+ (is_zeros_p): Handle VECTOR_CST.
+
+ * varasm.c (output_constant_pool): Handle vectors.
+ (rtx_const): Add veclo and vechi fields.
+ (kind): Add RTX_VECTOR.
+ (decode_rtx_const): Add case for vector.
+
+ * config/rs6000/rs6000-protos.h: Add zero_constant.
+
+ * config/rs6000/rs6000.c (rs6000_emit_move): Handle vector
+ constants. Force easy vector constants into memory.
+ (easy_vector_constant): New.
+ (emit_easy_vector_constant): New.
+ (rs6000_legitimize_reload_address): Do not generate bad reloads on
+ darwin.
+
+ * config/rs6000/rs6000.md ("altivec_lvx"): Reflect what
+ instruction does.
+ ("altivec_lvxl"): Same.
+ (altivec_lvebx): Same.
+ (altivec_lvehx): Same.
+ (altivec_lvewx): Same.
+ ("*movv4si_const0"): New.
+ ("*movv4sf_const0"): New.
+ ("*movv8hi_const0"): New.
+ ("*movv16qi_const0"): New.
+
+2002-02-18 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.c (notice_update_cc): Use
+ cc_status.value2.
+
+2002-02-18 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.md (divmod patterns): Change the
+ constraints for operands[1] to register_operand.
+
+2002-02-18 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300-protos.h: Remove the prototype for
+ p_operand.
+ * config/h8300/h8300.c (p_operand): Remove.
+ * config/h8300/h8300.md: Replace p_operand with
+ const_int_operand.
+
+2002-02-18 Philip Blundell <pb@nexus.co.uk>
+
+ * config/arm/arm.c (arm_compute_save_reg_mask): Fix typo in
+ comment.
+ (output_return_instruction): Allow use of LDR to unstack
+ return addresss even for interrupt handlers or when
+ interworking. If compiling for ARMv5, use interworking-safe
+ return instructions by default. Remove duplicated code and
+ lengthy "strcat" sequences.
+
+2002-02-18 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ * config/rs6000/sysv4.h (STARTFILE_SPEC): Use crtbeginT.o for -static.
+ (LINK_EH_SPEC): Define.
+ * config/rs6000/t-ppccomm (EXTRA_MULTILIB_PARTS): Add crtbeginT.o.
+
+2002-02-18 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (s390_emit_prologue): Do not set the
+ frame_related flag for call-clobbered registers.
+
+Mon Feb 18 15:07:35 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (classify_argument): Properly classify SSE/MMX modes and VOIDmode.
+ (construct_container): Fix handling of SSE operands.
+ (ix86_expand_builtin): Fix handling of 64bit pointers.
+ (mmx_maskmovq_rex): New pattern.
+
+Mon Feb 18 11:55:55 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * regrename.c (kill_set_value): Handle subregs properly.
+
+2002-02-18 David Billinghurst <David.Billinghurst@riotinto.com>
+
+ * objc/objc-act.c (handle_impent): Remove leading '*'
+ from objc_class_name.
+
+2002-02-17 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/alpha.c (some_small_symbolic_operand,
+ some_small_symbolic_operand_1, split_small_symbolic_operand,
+ split_small_symbolic_operand_1): Rename from *symbolic_mem_op*.
+ Handle small SYMBOL_REFs anywhere, not just inside memories.
+ * config/alpha/alpha-protos.h: Update.
+ * config/alpha/alpha.h (PREDICATE_CODES): Update.
+ * config/alpha/alpha.md (small symbolic operand splitter): Update.
+
+2002-02-17 Roland McGrath <roland@frob.com>
+
+ * config.gcc (powerpc-*-gnu-gnualtivec*,
+ powerpc-*-gnu*, powerpc64-*-gnu*): New configurations.
+ * config/rs6000/gnu.h: New file.
+ * config/rs6000/sysv4.h (SUBTARGET_OVERRIDE_OPTIONS):
+ Grok "gnu" in rs6000_abi_name.
+ (ASM_SPEC, CC1_SPEC, LINK_START_SPEC, LINK_OS_SPEC,
+ CPP_ENDIAN_SPEC, CPP_SPEC, STARTFILE_SPEC, LIB_SPEC, ENDFILE_SPEC):
+ Grok -mcall-gnu analogous to -mcall-linux et al.
+ (LIB_GNU_SPEC, STARTFILE_GNU_SPEC, ENDFILE_GNU_SPEC,
+ LINK_START_GNU_SPEC, LINK_OS_GNU_SPEC, CPP_OS_GNU_SPEC): New macros.
+ (SUBTARGET_EXTRA_SPECS): Add *_os_gnu specs using them.
+
+2002-02-17 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/3444:
+ * c-typeck.c (build_binary_op) [BIT_XOR_EXPR]: Remove explicit
+ shortening.
+
+2002-02-17 Philipp Thomas <pthomas@suse.de>
+
+ * config/cris/cris.h: Undefine STARTFILE_SPEC and
+ ENDFILE_SPEC before (re)defining them.
+
+2002-02-17 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.c: Fix formatting.
+ * config/h8300/h8300.h: Likewise.
+
+2002-02-17 Philipp Thomas <pthomas@suse.de>
+
+ * doc/tm.texi: Explain why empty strings should not be
+ marked for translation.
+
+2002-02-17 Philipp Thomas <pthomas@suse.de>
+
+ * final.c (output_operand_lossage): Changed to accept
+ printf style arguments. Change calls where necessary.
+ * output.h (output_operand_lossage): Change declaration
+ accordingly. Update copyright.
+ * config/arc/arc.c config/fr30/fr30.c config/m32r/m32r.c
+ config/m88k/m88k.c : Adapt all calls to output_operand_lossage.
+ Update copyright date where necessary.
+
+ * config/i386/i386.c (print_operand): Likewise. Remove use of
+ sprintf.
+
+ * config/cris/cris.c (cris_operand_lossage): Likewise.
+ Rename parameter so that exgettext recognizes it as
+ translatable message.
+ (LOSE_AND_RETURN): Rename parameter to msgid.
+
+2002-02-17 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.h (CONDITIONAL_REGISTER_USAGE): Replace a
+ hard coded register number with an appropriate macro.
+ (HARD_REGNO_MODE_OK): Likewise.
+ (ARG_POINTER_REGNUM): Likewise.
+ (STATIC_CHAIN_REGNUM): Likewise.
+ (RETURN_ADDRESS_POINTER_REGNUM): Likewise.
+ * config/h8300/h8300.md (define_constants): Define more
+ register numbers.
+
+2002-02-17 Philipp Thomas <pthomas@suse.de>
+
+ * config/i386/i386.h: Don't mark empty strings for translation.
+
+2002-02-16 H.J. Lu <hjl@gnu.org>
+
+ * config/mips/linux.h (ASM_PREFERRED_EH_DATA_FORMAT): New.
+
+2002-02-16 Zack Weinberg <zack@codesourcery.com>
+
+ * cppinit.c (merge_include_chains): Check for brack being
+ NULL before attempting to merge it with qtail.
+
+2002-02-16 Andrew Cagney <ac131313@redhat.com>
+
+ * config/rs6000/netbsd.h (PREFERRED_DEBUGGING_TYPE): Set to
+ DBX_DEBUG.
+
+2002-02-16 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa/t-pa, pa/t-pro, som.h: Revert last patch.
+
+2002-02-16 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa/t-pa (LIB2FUNCS_EXTRA): Don't build lib2funcs.asm.
+ * pa/t-pro (LIB2FUNCS_EXTRA): Likewise.
+ * som.h (DO_GLOBAL_DTORS_BODY): Delete define.
+
+Sat Feb 16 13:48:50 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * config/alpha/alpha.md (*movsi_nt_vms_nofix): Was *movsi_nt_vms;
+ now only if !TARGET_FIX.
+ (*movsi_nt_vms_fix): New pattern.
+
+2002-02-16 Douglas B Rupp <rupp@gnat.com>
+
+ * config/alpha/alpha.c: Implement null frame procedure types on VMS.
+ (alpha_procedure_type): Replaces alpha_is_stack_procedure.
+ (alpha_sa_mask, alpha_sa_size): Reflect above change.
+ (alpha_pv_save_size, alpha_expand_prologue): Likewise.
+ (alpha_start_function, alpha_expand_epilogue): Likewise.
+ (unicosmk_gen_dsib): Likewise.
+
+Sat Feb 16 13:39:09 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expr.c (store_constructor): Handle target REG case for ARRAY_TYPE.
+
+2002-02-16 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (pool_stop_uid, other_chunk, far_away,
+ check_and_change_labels, s390_final_chunkify): Delete.
+ (s390_split_branches, s390_chunkify_pool): New functions.
+ (s390_function_prologue): Call them.
+
+ * config/s390/s390.h (S390_REL_MAX): Delete.
+ (S390_CHUNK_MAX, S390_CHUNK_OV): Adjust values.
+
+ * config/s390/s390.md (cjump, icjump, jump): Fix length
+ attribute calculation.
+
+
+2002-02-15 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/linux64.h (STRIP_NAME_ENCODING): Delete.
+ * config/rs6000/ppc-asm.h (JUMP_TARGET): Define for powerpc64.
+
+2002-02-15 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * gcc.c (init_gcc_specs): Revert patch from 2002-02-15.
+ * config/pa/pa-linux.h (LIB_SPEC): Likewise.
+ * config/pa/pa32-linux.h (LINK_COMMAND_SPEC): Likewise.
+
+2002-02-15 Richard Sandiford <rsandifo@redhat.com>
+
+ * c-decl.c (grokdeclarator): Prevent a segfault on unnamed decls.
+
+2002-02-15 Richard Sandiford <rsandifo@redhat.com>
+
+ * reload.c (find_dummy_reload): Check that an output register
+ is valid for its mode.
+
+2002-02-14 Alexandre Oliva <aoliva@redhat.com>
+
+ * combine.c (known_cond): After replacing the REG of a SUBREG, try
+ to simplify it.
+
+ * function.c (assign_parms): Demote promoted argument passed by
+ transparent reference.
+
+2001-02-14 Joel Sherrill <joel@OARcorp.com>
+
+ * config/arm/rtems-elf.h, config/h8300/rtems.h: Removed redundant
+ -Acpu() and -Amachine() to eliminate warnings.
+
+2002-02-14 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/linux.h (ASM_OUTPUT_ALIGNED_BSS): New.
+
+2002-02-14 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300-protos.h: Update the prototype for
+ const_costs.
+ * config/h8300/h8300.c (const_costs): Treat SET as a little
+ more expensive operation.
+ * config/h8300/h8300.h (DEFAULT_RTX_COSTS): Update the
+ reference to const_costs.
+
+2002-02-14 Hans-Peter Nilsson <hp@axis.com>
+
+ * config.gcc (c4x-*-rtems*): Fix typo in tm_file setting.
+
+2002-02-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/5503:
+ * c-decl.c (duplicate_decls): If builtin type has TYPE_ARG_TYPES NULL,
+ use arguments from newtype.
+
+2002-02-13 Eric Christopher <echristo@redhat.com>
+
+ * config/mips/mips.c (override_options): Add check for march/mipsX
+ on the same command line. Fix error message in cpu processing.
+ Remove architecture and ISA checks.
+
+2002-02-14 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/darwin.h (ROUND_TYPE_ALIGN): Adjust for vectors.
+
+ * config/rs6000/sysv4.h (ROUND_TYPE_ALIGN): Add MAX.
+
+2002-02-14 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/rs6000.md ("*movv4si_internal"): Add m<-r and r<-r
+ alternatives.
+ ("*movv8hi_internal1"): Same.
+ ("*movv16qi_internal1"): Same.
+ ("*movv4sf_internal1"): Same.
+
+ * config/rs6000/rs6000.c (rs6000_legitimize_reload_address): Do
+ not push_reload for altivec modes.
+
+2002-02-13 Joel Sherrill <joel@OARcorp.com>
+
+ * config.gcc (a29k-*-rtems), config/a29k/rtems.h: General cleanup across
+ all RTEMS targets including removal of #includes from config/*/rtems*.h
+ file and adding them to tm_file setting. Added xm_defines=POSIX to
+ many targets.
+ * config.gcc (c4x-*-rtems), config/c4x/rtems.h: Ditto.
+ * config.gcc (h8300-*-rtems), config/h8300/rtems.h: Ditto.
+ * config.gcc (hppa1.1-*-rtems), config/pa/rtems.h: Ditto.
+ * config.gcc (i960-*-rtems), config/i960/rtems.h: Ditto.
+ * config.gcc (m68k-*-rtems*), config/m68k/rtems.h,
+ config/m68k/rtemself.h: Ditto.
+ * config.gcc (mips*-*-rtems*), config/mips/rtems.h,
+ config/mips/rtems64.h: Ditto.
+ * config.gcc (powerpc-*-rtems*), config/rs6000/rtems.h: Ditto.
+ * config.gcc (sh-*-rtems*), config/sh/rtems.h, config/sh/rtemself.h:
+ Ditto.
+ * config.gcc (sparc-*-rtems*), config/sparc/rtems.h,
+ config/sparc/rtemself.h: Ditto.
+ * config.gcc (v850-*-rtems*), config/v850/rtems.h: Ditto.
+ * config.gcc (arm-rtems), config/arm/rtems-elf.h: Ditto plus moved
+ arm-rtems stanza closer to other arm-elf targets and made arm-rtems
+ more like arm-elf.
+ * config.gcc (i[34567]86-*-rtems*), config/i386/djgpp-rtems.h,
+ config/i386/rtems.h, config/i386/rtemself.h: Ditto plus i386-rtemself
+ target made more similar to i386-elf.
+ * config/i386/t-rtems-i386: Added soft float support and multilibs.
+ * config/m68k/t-m68kbare: Add 68040 and 68060 as multilib alternatives to
+ be similar to config/m68k/t-m68kelf.
+ * gthr-rtems.h: Encapsulate with extern "C" for C++.
+
+Wed Feb 13 23:41:15 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * regmove.c (kill_value): Handle subregs.
+
+Wed Feb 13 23:34:30 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.md (mul patterns): Allow memory operand to be first;
+ add expanders where needed; fix constraints.
+ (min?f_nonieee, max?f_nonieee, SSE TImode patterns):
+ Allow memory operand to be the first.
+
+ * i386.c (ix86_prepare_fp_compare_args): Fix condition for swapping
+ operands.
+
+2002-02-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/5681:
+ * expr.c (safe_from_p): Pass VOIDmode to true_dependence instead of
+ GET_MODE (x).
+
+2002-02-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR optimization/5547:
+ * config/i386/i386.c (i386_simplify_dwarf_addr): Simplify
+ all valid IA-32 address modes involving non-scaled %ebx and
+ GOT/GOTOFF as displacement.
+
+2002-02-13 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (s390_final_chunkify): Re-run shorten_branches
+ after emitting ltorg insns.
+
+ * config/s390/s390.md (*cmpdf_ccs_0, *cmpdf_ccs, *cmpsf_ccs_0,
+ *cmpsf_ccs, truncdfsf2_ieee, *adddf3, *addsf3, *subdf3, *subsf3,
+ *muldf3, *mulsf3, *divdf3, *divsf3, *negdf2, *negsf2, *absdf2,
+ *abssf2): Fix "op_type" attribute.
+
+2002-02-13 Douglas B Rupp <rupp@gnat.com>
+
+ * mkconfig.sh: Avoid using a subshell redirect.
+ ($output.T): Change to $(output)T.
+ (ENABLE_NLS): Remove unneeded undef.
+
+ * config/alpha/vms.h (MD_EXEC_PREFIX, MD_STARTFILE_PREFIX): Define.
+ * config/alpha/x-vms (libsubdir): Define.
+
+ * config/alpha/vms.h (MD_FALLBACK_FRAME_STATE_FOR): Handle
+ register frame procedures. Optimize retrieving context.
+
+ * config/alpha/t-vms (MULTILIB_OPTIONS): Define.
+ (MULTILIB_DIRNAME, LIBGCC, INSTALL_LIBGCC): Likewise.
+ * config/alpha/vms.h (ASM_FILE_START): Write .arch directive.
+
+Wed Feb 13 09:45:08 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alias.c (find_base_term, case ZERO_EXTEND, case SIGN_EXTEND):
+ Make same change as for find_base_value.
+
+2002-02-13 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.h (MODES_TIEABLE_P): Accept a combination
+ of QImode and SImode.
+
+2002-02-13 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.c (h8300_adjust_insn_length): Correct the
+ length computation of movsi.
+ * config/h8300/h8300.md (movsi_h8300hs): Correct the length.
+
+2002-02-13 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.md (subqi3): Tighten the predicate for
+ operands[2] to register_operand.
+
+Wed Feb 13 10:35:56 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.md (fop_*_comm_*): allow nonimmediate in the first operand.
+
+2002-02-12 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/rs6000.md: Use predicate altivec_register_operand
+ for altivec_lvx* and altivec_stvx*.
+ ("*movv4si_internal"): Add constraint for loading from GPRs.
+ ("*movv8hi_internal1"): Same.
+ ("*movv16qi_internal1"): Same.
+ ("*movv4sf_internal1"): Same.
+
+ * config/rs6000/rs6000.c (altivec_register_operand): New.
+
+ * config/rs6000/rs6000.h (PREDICATE_CODES): Add
+ altivec_register_operand.
+
+2002-02-13 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * config/mmix/mmix.c (mmix_assemble_integer) <case 4>: Don't
+ handle SYMBOL_REF.
+
+2002-02-13 Stan Shebs <shebs@apple.com>
+
+ * c-typeck.c (digest_init): Handle vectors.
+ (really_start_incremental_init): Same.
+ (pop_init_level): Same.
+ (process_init_element): Same.
+
+ * varasm.c (output_constant): Same.
+
+ * expr.c (clear_storage): Same.
+ (store_constructor): Same.
+
+2002-02-12 Eric Christopher <echristo@redhat.com>
+
+ * explow.c (hard_function_value): Add comment explaining
+ signed/unsigned comparison.
+
+2002-02-12 Jakub Jelinek <jakub@redhat.com>
+
+ * jump.c (never_reached_warning): Add finish argument.
+ If finish is NULL, stop on CODE_LABEL, otherwise stop before first
+ real insn after end.
+ * rtl.h (never_reached_warning): Adjust prototype.
+ * cse.c (cse_insn): Pass NULL as finish to never_reached_warning.
+ * cfgrtl.c (flow_delete_block): Pass b->end as finish to
+ never_reached_warning.
+
+2002-02-12 Graham Stott <grahams@redhat.com>
+
+ * config/hp/pa.h (GO_IF_LEGITIMATE_ADDRESS): Fix typos.
+
+2002-02-12 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.c (shift_alg_hi): Improve the 15-bit
+ logical shifts on H8/300.
+ (shift_alg_si): Improve several shifts on H8/300.
+ (get_shift_alg): Likewise.
+
+2002-02-12 Graham Stott <grahams@redhat.com>
+
+ * config/pa/pa.c (compute_movstrsi_length): Fix typos.
+
+Tue Feb 12 10:12:56 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alias.c (find_base_value, case ZERO_EXTEND, case SIGN_EXTEND):
+ Handle #ifdef POINTERS_EXTEND_UNSIGNED.
+
+2002-02-11 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * config/mmix/mmix.c (mmix_assemble_integer) <case 1, 2>: Handle
+ non-CONST_INT through default_assemble_integer.
+ <case 4>: Likewise, for non-CONST_INT, non-SYMBOL_REF.
+ <case 8>: Abort for CONST_DOUBLE.
+
+2002-02-11 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * gcc.c (init_gcc_specs): Add static libgcc to link when "-shared"
+ is specified.
+ * config/pa/pa-linux.h (LIB_SPEC): Delete.
+ * config/pa/pa32-linux.h (LINK_COMMAND_SPEC): Delete.
+
+2002-02-11 Andrew Haley <aph@cambridge.redhat.com>
+
+ * config/stormy16/stormy16.md (zero_extendqihi2): New.
+
+2002-02-11 Alexandre Oliva <aoliva@redhat.com>
+
+ * regrename.c (regrename_optimize): Don't accept a
+ part-clobbered register if the replaced register is not part
+ clobbered.
+
+ * calls.c (store_one_arg): In the non-BLKmode non-partial case,
+ take padding into account when computing the argument value.
+
+ * config/sh/sh.h (FUNCTION_ARG_REGNO_P): Fix parenthesizing error.
+
+ * combine.c (try_combine): Apply substitutions in
+ CALL_INSN_FUNCTION_USAGE too.
+
+2002-02-11 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/rs6000.c (altivec_init_builtins): Handle
+ __builtin_altivec_abs*.
+ (bdesc_abs): New.
+
+ * config/rs6000/rs6000.h (rs6000_builtins): Add
+ ALTIVEC_BUILTIN_ABS*.
+
+ * config/rs6000/altivec.h: Use const char for builtins expecting
+ literals.
+ (vec_abs): New versions for C and C++.
+ (vec_abss): Same.
+
+2002-02-10 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.h (INITIALIZE_TRAMPOLINE): Simplify by
+ using Pmode.
+
+2002-02-10 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.h (STACK_POINTER_REGNUM): Use the
+ constant definition from h8300.md.
+ (FRAME_POINTER_REGNUM): Likewise.
+ * config/h8300/h8300.md (define_constants): Add FP_REG.
+
+2002-02-10 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.c (print_operand): Remove redundant code.
+
+2002-02-10 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300-protos.h: Remove the prototype for byte_reg.
+ * config/h8300/h8300.c (byte_reg): Make it static.
+
+2002-02-10 Richard Henderson <rth@redhat.com>
+
+ PR c/5623
+ * c-typeck.c (incomplete_type_error): Handle flexible array members.
+
+2002-02-10 Richard Henderson <rth@redhat.com>
+
+ PR c++/5624
+ * tree.c (append_random_chars): Don't abort if main_input_filename
+ does not exist.
+
+2002-02-10 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * config/mmix/t-mmix (MULTILIB_EXTRA_OPTS): Disable.
+
+2002-02-10 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.md (pushhi1_h8300): Correct the mode used.
+ (pushhi1): Likewise.
+
+2002-02-10 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa.c (reg_before_reload_operand): Don't accept a SUBREG operand.
+ * pa.h (PREDICATE_CODES): Adjust codes for reg_before_reload_operand.
+
+2002-02-09 David O'Brien <obrien@FreeBSD.org>
+
+ * config/sparc/freebsd.h(TARGET_DEFAULT): Add MASK_EPILOGUE setting and
+ remove MASK_VIS.
+ (ASM_CPU_DEFAULT_SPEC): Remove. Default setting is fine.
+
+2002-02-09 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.c (output_logical_op): Use sub.w to clear
+ a half of an SImode register on H8/300.
+
+Sat Feb 9 18:28:02 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386.md (movdi_2): Add missing '!'.
+
+2002-02-09 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.h: Fix formatting. Remove commented-out
+ definitions.
+
+2002-02-09 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.md (length): Correct the distance valid
+ for the short branch.
+
+2002-02-09 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.md (iorhi3): Tighten the predicates.
+
+2002-02-09 Alexandre Oliva <aoliva@redhat.com>
+
+ * config/sh/sh.h (REGISTER_NATURAL_MODE): Save part-clobbered
+ registers in SImode.
+ (HARD_REGNO_CALL_PART_CLOBBERED) [TARGET_SHMEDIA32]: Set r18 as
+ part-clobbered.
+
+ * config/sh/sh.c (expand_prologue): Fix mis-applied 2001-11-09's
+ patch.
+
+ Contribute sh64-elf.
+ 2002-02-09 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (TARGET_CANNOT_MODIFY_JUMPS_P): Define to...
+ (sh_cannot_modify_jumps_p): New function.
+ 2002-02-05 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (TARGET_MS_BITFIELD_LAYOUT_P): Define to...
+ (sh_ms_bitfield_layout_p): New function.
+ 2002-02-04 Alexandre Oliva <aoliva@redhat.com>
+ Zack Weinberg <zack@codesourcery.com>
+ * config/sh/sh.h (TRAMPOLINE_ADJUST_ADDRESS): Use
+ expand_simple_binop instead of expand_binop.
+ 2002-02-03 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (OVERRIDE_OPTIONS) [! TARGET_SH5]: Disable
+ use of .quad and .uaquad.
+ * config/sh/sh.c (TARGET_ASM_UNALIGNED_DI_OP,
+ TARGET_ASM_ALIGNED_DI_OP): Add comment pointing to the above.
+ 2002-01-24 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (movdi_const, movdi_const_32bit,
+ movdi_const_16bit): Make sure all CONSTs have modes.
+ (sym2PIC): Ditto, but by adjusting all callers.
+ * config/sh/sh.c (calc_live_regs) [TARGET_SHCOMPACT]: Set pr_live
+ if the prologue calls the SHmedia argument decoder or register
+ saver.
+ 2002-01-24 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (TARGET_ASM_UNALIGNED_DI_OP): Define.
+ (TARGET_ASM_ALIGNED_DI_OP): Likewise.
+ (sh_expand_epilogue): Don't emit USE of return target register.
+ (prepare_move_operands): Legitimize DImode PIC addresses.
+ (sh_media_register_for_return): Skip tr0, used to initialize the
+ PIC register.
+ (sh_expand_prologue): Remove explicit USE of return register.
+ (nonpic_symbol_mentioned_p): PC is non-PIC. Don't recurse in
+ CONST_DOUBLEs. UNSPEC_GOTPLT is PIC.
+ * config/sh/sh.h (ASM_OUTPUT_DOUBLE_INT): Removed, obsolete.
+ (OVERRIDE_OPTIONS): Don't disable PIC on SH5.
+ (EXTRA_CONSTRAINT_S): Use MOVI_SHORI_BASE_OPERAND_P instead of
+ EXTRA_CONSTRAINT_T.
+ (GOT_ENTRY_P, GOTPLT_ENTRY_P, GOTOFF_P, PIC_ADDR_P): New.
+ (MOVI_SHORI_BASE_OPERAND_P): New.
+ (NON_PIC_REFERENCE_P, PIC_REFERENCE_P): New.
+ (EXTRA_CONSTRAINT_T): Define in terms of them.
+ (OUTPUT_ADDR_CONST_EXTRA): Handle UNSPEC_GOTPLT.
+ * config/sh/sh.md (movsi_media, movsi_media_nofpu,
+ movdi_media, movdi_media_nofpu): Add SIBCALL_REGS class to
+ alternatives supporting TARGET_REGS.
+ (UNSPEC_GOTPLT): New constant.
+ (movdi split): Move incrementing of LABEL_NUSES...
+ (movdi_const, movdi_const_32bit): Here. Use
+ MOVI_SHORI_BASE_OPERAND_P instead of EXTRA_CONSTRAINT_T.
+ (movdi_const_16bit): New.
+ (call, call_value) [flag_pic]: Use GOTPLT.
+ (call_pop, call_value_pop): New expands.
+ (call_pop_compact, call_pop_rettramp): New insns.
+ (call_value_pop_compact, call_value_pop_rettramp): New insns.
+ (sibcall) [flag_pic]: Use GOT.
+ (builtint_setjmp_receiver): Remove bogus, unused expand.
+ (GOTaddr2picreg): Implement for SHcompact and SHmedia.
+ (*pt, *ptb, ptrel): New insns.
+ (sym2GOT): Handle DImode GOT.
+ (sym2GOTPLT, symGOTPLT2reg): New expands.
+ (sym2PIC): New expand.
+ (shcompact_return_tramp): Use GOTPLT to return trampoline.
+ (shcompact_return_tramp_i): Use return register explicitly.
+ * config/sh/sh.h (OVERRIDE_OPTIONS) [TARGET_SHMEDIA]: Don't
+ disable flag_reorder_blocks.
+ 2002-01-19 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (sibcall_compact): Reorder return, uses and
+ clobbers, for clarity.
+ (sibcall_epilogue) [TARGET_SHCOMPACT]: Mark saving and
+ restoring of r0 in macl as MAYBE_DEAD.
+ 2002-01-18 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (LONG_DOUBLE_TYPE_SIZE): Define.
+ * config/sh/sh.md (movv4sf_i, movv16sf_i): Fix uses of
+ alter_subreg all over.
+ (jump) [TARGET_SHMEDIA]: FAIL to create new jumps after
+ reload, instead of emitting instructions that would require
+ reloading.
+ (casesi_load_media): Add missing modes.
+ 2001-11-09 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (sh_expand_prologue): Mark the PIC register
+ as used if the argument decoder is called.
+ 2001-08-28 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (udivsi3, divsi3): Load libcall symbol name in
+ Pmode, then extend it to DImode if necessary.
+ 2001-08-28 Stephen Clarke <Stephen.Clarke@st.com>
+ * config/sh/sh.h (LEGITIMATE_CONSTANT_P): Don't accept DFmode
+ constants in FPU-enabled SHmedia, let them be loaded from memory.
+ 2001-08-28 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (cmpeqdi_media, cmpgtdi_media, cmpgtudi_media):
+ Adjust whitespace in assembly output templates.
+ 2001-08-28 Stephen Clarke <Stephen.Clarke@st.com>
+ * config/sh/sh.md (movdicc_false, movdicc_true, movdicc): Adjust
+ mode of if_then_else.
+ 2001-08-04 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh64.h (CPP_DEFAULT_CPU_SPEC): Override definition in
+ sh.h.
+ 2001-07-26 Andrew Haley <aph@cambridge.redhat.com>
+ Joern Rennecke <amylaar@redhat.com>
+ * config/sh/sh64.h (CPP_DEFAULT_CPU_SPEC): New.
+ (SUBTARGET_CPP_PTR_SPEC): New.
+ (SUBTARGET_CPP_SPEC): Remove.
+ 2001-07-06 Chandrakala Chavva <cchavva@redhat.com>
+ * config/sh/sh.md (movsf_media_nofpu+1, movdf_media_nofpu+1):
+ Fix typo in previous checkin.
+ 2001-07-11 Chandrakala Chavva <cchavva@redhat.com>
+ * config/sh/sh.h (MODES_TIEABLE_P): Fix redact indentations.
+ 2001-07-10 Chandrakala Chavva <cchavva@cygnus.com>
+ Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (MODES_TIEABLE_P): Don't tie modes wider than
+ what single FP register can hold for SHmedia target.
+ 2001-07-06 Chandrakala Chavva <cchavva@redhat.com>
+ Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (movsf_media_nofpu+1, movdf_media_nofpu+1):
+ Do not split into SUBREG.
+ 2001-06-14 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/ushmedia.h, config/sh/sshmedia.h: Updated signatures
+ and added new functions as specified in SH5 ABI r9.
+ 2001-06-04 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/lib1funcs.asm (GCC_nested_trampoline): Align to an
+ 8-byte boundary.
+ 2001-06-03 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (dump_table): Add const0_rtx in calls of
+ gen_consttable_4 and gen_consttable_8. Emit multiple labels
+ and consttable_window_ends.
+ 2001-06-03 Graham Stott <grahams@redhat,com>
+ * config/sh/sh.md (movdi split): Remove unused variable last_insn.
+ 2001-05-16 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (print_operand): Handle floating-point pair,
+ vector and matrix registers.
+ * config/sh/sh.h (REGISTER_MOVE_COST): Take floating-pointer
+ vector modes into account.
+ * config/sh/sh.md (movv2sf): Split move between registers into
+ movdf.
+ (movv4sf, movv16sf): Introduce insns that get split only after
+ reload.
+ * config/sh/shmedia.h: Fix Copyright dates.
+ * config/sh/ushmedia.h: Likewise. Move loop counter
+ declarations into conditionals that uses them.
+ (sh_media_FVADD_S, sh_media_FVSUB_S): Fix off-by-one error in
+ loop boundary.
+ * config/sh/sshmedia.h: Fix Copyright dates.
+ (sh_media_PUTCFG): Fix constraints.
+ 2001-05-12 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (TARGET_PTRMEMFUNC_VBIT_LOCATION): Define to
+ ptrmemfunc_vbit_in_delta for SH5.
+ 2001-05-08 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (TARGET_SWITCHES): Document -m5-*.
+ * invoke.texi: Likewise.
+ 2001-04-14 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/lib1funcs.asm (GCC_push_shmedia_regs,
+ GCC_push_shmedia_regs_nofpu, GCC_pop_shmedia_regs,
+ GCC_pop_shmedia_regs_nofpu): New global symbols.
+ * config/sh/t-sh64 (LIB1ASMFUNCS): Add them.
+ * config/sh/sh.h (SHMEDIA_REGS_STACK_ADJUST): New macro.
+ * config/sh/sh.c (calc_live_regs): Account for PR's saving in
+ compact function with nonlocal labels.
+ (sh_expand_prologue) [SHcompact]: Push SHmedia regs if needed.
+ (sh_expand_epilogue) [SHcompact]: Pop them when appropriate.
+ (initial_elimination_offset): Account for their stack space.
+ * config/sh/sh.md (shmedia_save_restore_regs_compact): New insn.
+ * config/sh/sh.md (movsi_media, movsi_media_nofpu, movqi_media,
+ movhi_media, movdi_media, movdi_media_nofpu, movdf_media,
+ movdf_media_nofpu, movsf_media, movsf_media_nofpu): Require at
+ least one of the operands to be a register.
+ (movv2sf): Likewise. Renamed to movv2sf_i.
+ (movdi, movdf, movv2sf, movv4sf, movv16sf, movsf):
+ prepare_move_operands() before emitting SHmedia insns.
+ 2001-04-03 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/crti.asm (init, fini) [__SH5__ && ! __SHMEDIA__]:
+ Don't save nor initialize r12. Don't mis-align the stack.
+ Pad the code with a nop.
+ * config/sh/crti.asm: Don't restore r12. Don't mis-align the
+ stack.
+ 2001-03-13 Alexandre Oliva <aoliva@redhat.com>
+ * gcc/longlong.h (__umulsidi3, count_leading_zeros)
+ [__SHMEDIA__]: Implement.
+ 2001-03-11 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md: Set latency of `pt' closer to reality.
+ (movsi_media, movsi_media_nofpu, movdi_media, movdi_media_nofpu,
+ movdf_media, movdf_media_nofpu, movsf_media, movsf_media_nofpu):
+ Set move, load and store type attributes.
+ * config/sh/sh.c (sh_loop_align) [TARGET_SH5]: Set to 3.
+ * config/sh/sh.h (OVERRIDE_OPTIONS) [TARGET_SH5]: Disable
+ profiling.
+ * config/sh/sh.h (PROMOTE_MODE): Sign-extend SImode to DImode.
+ * config/sh/sh-protos.h (sh_media_register_for_return): Declare.
+ * config/sh/sh.c (sh_media_register_for_return): New function.
+ (sh_expand_prologue) [TARGET_SHMEDIA]: Copy r18 to an available
+ branch-target register.
+ (sh_expand_epilogue) [TARGET_SHMEDIA]: Explicitly USE it.
+ * config/sh/sh.md (return_media_i): Use any call-clobbered
+ branch-target register.
+ (return_media): If r18 wasn't copied in the prologue, copy it
+ here.
+ * config/sh/sh.h (CONDITIONAL_REGISTER_USAGE) [TARGET_SHMEDIA]:
+ Clear class FP0_REGS.
+ * config/sh/sh64.h (LINK_SPEC): Removed incorrect default copied
+ from elf.h.
+ 2001-03-08 DJ Delorie <dj@redhat.com>
+ * config/sh/sh.h (OVERRIDE_OPTIONS): Disable relaxing for SHMEDIA.
+ 2001-02-09 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (sibcall_compact): Set fp_mode to single.
+ 2001-02-07 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (INT_ASM_OP) [SHMEDIA64]: Use `.quad'.
+ 2001-02-03 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (INIT_CUMULATIVE_ARGS): Compute size of BLKmode
+ return value correctly for call_cookie.
+ 2001-02-01 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/crt1.asm (start): Modified so as to call
+ ___setup_argv_and_call_main.
+ 2001-01-26 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (FUNCTION_ARG_ADVANCE): Don't count stack_regs in
+ SHmedia mode.
+ 2001-01-20 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (STRIP_DATALABEL_ENCODING): New macro.
+ (STRIP_NAME_ENCODING): Use it.
+ (ASM_OUTPUT_LABELREF): Likewise. Don't call assemble_name().
+ 2001-01-19 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (sgeu) [! SHMEDIA]: Fix invocation of
+ prepare_scc_operands().
+ * config/sh/sh.h (SH_DATALABEL_ENCODING): Change to "#"...
+ (DATALABEL_SYMNAME_P): ... so that we don't need memcmp here.
+ 2001-01-17 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (STRIP_NAME_ENCODING): Strip leading `*'.
+ 2001-01-13 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (shcompact_incoming_args): Use R0_REG.
+ * config/sh/sh.md (R7_REG, R8_REG, R9_REG): Define as constants,
+ used in shcompact_incoming_args.
+ * config/sh/sh.c (sh_expand_epilogue): Fix thinko in previous
+ change.
+ * config/sh/crt1.asm (start) [SH5]: Switch to single-precision
+ mode.
+ * config/sh/lib1funcs.asm (sdivsi3_i4, udivsi3_i4, set_fpscr):
+ Adjust accordingly.
+ * config/sh/sh.c (sh_expand_prologue, sh_expand_epilogue):
+ Simplify. Adjust. Add sanity check.
+ * config/sh/sh.h (TARGET_SWITCHES) [5-compact]: Set
+ FPU_SINGLE_BIT.
+ * config/sh/sh.md (udivsi3_i4_single, divsi3_i4_single): Match
+ TARGET_SHCOMPACT.
+ (udivsi3, divsi3): Use them.
+ (force_mode_for_call): New insn.
+ (call, call_value, sibcall_value): Emit it before SHcompact
+ calls.
+ 2001-01-11 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (call, call_value, sibcall): Make sure the
+ call cookie is non-NULL before taking its value.
+ 2001-01-10 Alexandre Oliva <aoliva@redhat.com>
+ * config.gcc (sh64): Set target_requires_64bit_host_wide_int.
+ 2001-01-09 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (shcompact_incoming_args): Set argument memory
+ block.
+ * config/sh/sh.h (STATIC_CHAIN_REGNUM) [SH5]: Use r1.
+ * config/sh/sh.c (sh_expand_prologue) [SH5]: Use r0 as
+ temporary for stack adjusts. Use MACL and MACH to pass
+ arguments to shcompact_incoming_args.
+ * config/sh/sh.md (shcompact_incoming_args): Adjust. Don't
+ clobber r1.
+ * config/sh/lib1funcs.asm (shcompact_incoming_args): Likewise.
+ (nested_trampoline): Load static chain address into r1.
+ * config/sh/sh.md (movdi_media splits): Fix sign-extension.
+ 2001-01-07 Alexandre Oliva <aoliva@redhat.com
+ * config/sh/sh.c (fpul_operand) [SHMEDIA]: Just call
+ fp_arith_reg_operand().
+ 2001-01-06 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (casesi): Sign-extend the first two operands,
+ and use signed compares for them.
+ * config/sh/sh.c (dump_table): Don't emit 8-byte constants after
+ 4-byte ones. Instead, inter-leave them, maintaining the 8-byte
+ ones properly aligned.
+ (find_barrier): Account for extra alignment needed for 8-byte wide
+ constants.
+ (machine_dependent_reorg): Require a label for the second 4-byte
+ constant after an 8-byte one.
+ * config/sh/lib1funcs.asm (sdivsi3): Fix typo in yesterday's
+ change.
+ 2001-01-05 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (machine_dependent_reorg) [SHCOMPACT]: Reset
+ last_float when switching float modes.
+ * config/sh/sh.md (movdf) [SH5]: Don't use stack-pointer
+ auto-increment for general-purpose registers.
+ * config/sh/lib1funcs.asm (sdivsi3) [SHMEDIA]: Sign-extend the
+ result.
+ * config/sh/sh.c (sh_expand_prologue) [SH5]: Use r1 as temporary
+ for stack adjust.
+ * config/sh/sh.c (sh_builtin_saveregs): Support using all
+ registers for varargs.
+ 2001-01-01 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (FUNCTION_ARG_ADVANCE): Simplify.
+ * config/sh/sh.h (CALL_COOKIE_STACKSEQ,
+ CALL_COOKIE_STACKSEQ_SHIFT, CALL_COOKIE_STACKSEQ_GET): New macros.
+ (CALL_COOKIE_INT_REG_SHIFT): Adjust.
+ (FUNCTION_ARG_ADVANCE): Use SHCOMPACT_FORCE_ON_STACK. Adjust
+ call_cookie accordingly.
+ (FUNCTION_ARG): Test SHCOMPACT_FORCE_ON_STACK.
+ (SHCOMPACT_BYREF): Likewise.
+ (SHCOMPACT_FORCE_ON_STACK): New macro.
+ * config/sh/sh.c (sh_expand_prologue): Use new call_cookie format.
+ (sh_builtin_saveregs): Likewise.
+ * config/sh/lib1funcs.asm (shcompact_call_trampoline,
+ shcompact_incoming_args): Use new shift values. Support
+ sequences of consecutive and non-consecutive pushes/pops.
+ * config/sh/sh.md (return): Don't explicitly use PR_REG.
+ 2001-01-05 Hans-Peter Nilsson <hpn@cygnus.com>
+ * config/sh/sh.h (TEXT_SECTION): Define.
+ * config/sh/elf.h (ASM_FILE_START): Output TEXT_SECTION_ASM_OP.
+ 2001-01-05 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (INIT_CUMULATIVE_LIBCALL_ARGS): New macro.
+ * config/sh/sh.h (BASE_RETURN_VALUE_REG): Use FP regs for
+ return values on FPU-enabled SHmedia.
+ (FUNCTION_VALUE_REGNO_P): Mark FIRST_FP_RET_REG as used on
+ FPU-enabled SHmedia.
+ (INIT_CUMULATIVE_ARGS): Set up return trampoline only if
+ value is returned in a non-FP reg and is not returned by
+ reference.
+ * config/sh/sh.md (shcompact_return_tramp_i): Change type to
+ jump_ind.
+ 2000-01-04 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (SH_MIN_ALIGN_FOR_CALLEE_COPY): New.
+ (FUNCTION_ARG_CALLEE_COPIES): Require argument to be
+ quad-aligned to be passed by callee-copy reference.
+ 2001-01-03 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/elf.h (MAX_WCHAR_TYPE_SIZE): Define.
+ * config/sh/sh64.h (MAX_WCHAR_TYPE_SIZE): Undefine.
+ 2001-01-02 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/lib1funcs.asm (shcompact_call_trampoline): Fix error in
+ copying low-numbered FP regs to r7 and r8.
+ * config/sh/sh.h (FUNCTION_ARG_ADVANCE): Don't request copying of
+ FP regs to general-purpose regs only if the copy was passed on the
+ stack.
+ * config/sh/lib1funcs.asm (shcompact_call_trampoline): Fix typo in
+ copying FP reg to r9.
+ * config/sh/sh.h (FUNCTION_ARG_ADVANCE): Use trampoline to
+ copy FP regs to general-purpose regs only in outgoing calls.
+ * config/sh/sh.md (movdf_media, movsf_media): Revert incorrect
+ change from 2000-10-30. Adjust for 64-bit (or 32-bit)
+ HOST_WIDE_INT.
+ * config/sh/sh.h (struct sh_args): Document all fields.
+ (FUNCTION_OK_FOR_SIBCALL): Functions that receive arguments
+ passed partially on the stack should not consider making
+ sibcalls.
+ * config/sh/sh.h (FUNCTION_ARG_ADVANCE): Add byref regs to
+ stack_regs only for incoming calls. When passing FP args,
+ make sure there are FP regs available before modifying
+ call_cookie.
+ (SHCOMPACT_BYREF): Pass double args in general-purpose
+ registers by reference.
+ 2000-12-30 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (FUNCTION_OK_FOR_SIBCALL) [SHCOMPACT]: Don't
+ attempt to generate sibcalls if the caller got any arguments
+ by reference.
+ * config/sh/lib1funcs.asm (set_fpscr) [SH5]: Default to double.
+ * config/sh/sh.c (dump_table) [SHCOMPACT]: Align DImode and DFmode
+ to 8-byte boundaries.
+ * config/sh/sh.md (shcompact_preserve_incoming_args): New insn.
+ * config/sh/sh.h (CALL_COOKIE_INT_REG_GET): New macro.
+ * config/sh/sh.c (sh_expand_prologue): Preserve args that will be
+ stored in the stack.
+ * config/sh/lib1funcs.asm (ct_main_table, ia_main_table): Arrange
+ for the offsets to have the ISA bit set.
+ (shcompact_call_trampoline): Document. Swap r0 and r1, to match
+ invocation. Use beq instead of bgt to mark end of sequence of
+ loads.
+ (shcompact_incoming_args): Fix store of r2. Use beq instead of
+ bgt to mark end of sequence of stores.
+ * config/sh/sh.c (arith_operand): Don't check whether
+ CONST_OK_FOR_J for now.
+ * config/sh/sh.md (movdf_media, movsf_media): Use HOST_WIDE_INT
+ instead of long for conversion.
+ 2000-12-29 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (print_operand_address): Convert INTVAL to int
+ before passing it to fprintf.
+ 2000-12-28 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/crt1.asm (start): Reset SR.FD, to enable the FP unit.
+ Call set_fpscr before reading/writing SR.
+ * config/sh/crt1.asm (start): Set SR.SZ and SR.PR, but not SR.FR.
+ Call set_fpscr.
+ * config/sh/lib1funcs.asm: Add `.align 2' directives before
+ SHmedia code.
+ (FMOVD_WORKS): Define on SH5 with FPU.
+ (set_fpscr): Define on SH5. Remove separate _fpscr_values
+ setting.
+ * config/sh/t-sh64 (LIB1ASMFUNCS): Add _set_fpscr instead of
+ _fpscr_values.
+ 2000-12-28 Hans-Peter Nilsson <hpn@cygnus.com>
+ * config/sh/lib1funcs.asm (ct_main_table): Align contents to even
+ address.
+ (ia_main_table): Ditto.
+ 2000-12-27 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (MAX_WCHAR_TYPE_SIZE): Don't define.
+ * config/sh/sh64.h (WCHAR_TYPE, WCHAR_TYPE_SIZE): Reinstate
+ the definitions from sh.h.
+ * config/sh/sh.h (PTRDIFF_TYPE): Define as conditional on
+ TARGET_SH5.
+ (SUBTARGET_CPP_SPEC): Arrange for __PTRDIFF_TYPE__ to be defined.
+ * config/sh/elf.h (PTRDIFF_TYPE): Likewise.
+ * config/sh/sh64.h (SUBTARGET_CPP_SPEC): Likewise.
+ 2000-12-26 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (movdi_media split): Don't add REG_LABEL notes.
+ Increment LABEL_NUSES.
+
+ * config/sh/sh.h (SIZE_TYPE): Define as conditional on
+ TARGET_SH5.
+ (SUBTARGET_CPP_SPEC): Arrange for __SIZE_TYPE__ to be always
+ defined.
+ * config/sh/elf.h (SIZE_TYPE): Likewise.
+ * config/sh/sh64.h (SUBTARGET_CPP_SPEC): Likewise.
+ * config/sh/lib1funcs.asm (shcompact_call_trampoline,
+ shcompact_incoming_args): Load switch table addresses using
+ datalabel.
+ * config/sh/sh.h (SUBTARGET_CPP_SPEC): Define __SIZE_TYPE__.
+ (NO_BUILTIN_SIZE_TYPE): Define.
+ (SIZE_TYPE): Don't define.
+ * config/sh/sh64.h (SUBTARGET_CPP_SPEC): Define __SIZE_TYPE__.
+ * config/sh/sh.h (CPP_SPEC): Fixed typo that prevented the
+ definition of __SH5__=32 for -m5-compact-nofpu.
+ * config/sh/sh.c (barrier_align): Ensure 32-bit alignment after
+ ADDR_DIFF_VEC.
+ 2000-12-24 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (FUNCTION_ARG_PADDING): Removed.
+ 2000-12-23 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (TARGET_CACHE32): Enable on SH5.
+ (FUNCTION_BOUNDARY): Ensure 32-bit alignment for SHmedia.
+ (INSN_LENGTH_ALIGNMENT): Likewise.
+ 2000-12-22 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (call, call_value, sibcall): Simplify
+ copying of non-branch-target register.
+ 2000-12-22 Alexandre Oliva <aoliva@redhat.com>
+ * glimits.h (__LONG_MAX__): Revert 2000-12-13's patch.
+ * config/sh/sh.h (CPP_SPEC): Define it here for 64-bit SHmedia.
+ 2000-12-22 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (GET_SH_ARG_CLASS): Handle complex
+ floating-point values as structs.
+ (FUNCTION_ARG): Use SH5_PROTOTYPED_FLOAT_ARG.
+ (SH5_PROTOTYPELESS_FLOAT_ARG): List FP registers before
+ general-purpose register.
+ (SH5_PROTOTYPED_FLOAT_ARG): New macro.
+ 2000-12-20 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (addsi3): Force operand1 to reg for SHmedia.
+ * config/sh/sh.md (movsi_media): Split CONST_DOUBLE loads too.
+ * config/sh/sh.h (DATALABEL_REF_P): Don't require the CONST.
+ (ENCODE_SECTION_INFO): Enclose variables and constants in
+ DATALABEL unspecs.
+ (SH_DATALABEL_ENCODING, DATALABEL_SYMNAME_P): Define.
+ (STRIP_NAME_ENCODING): Strip SH_DATALABEL_ENCODING off.
+ (ASM_OUTPUT_LABELREF, AMS_OUTPUT_SYMBOL_REF): Define.
+ * config/sh/sh.c (gen_datalabel_ref): Use UNSPEC_DATALABEL
+ only for LABEL_REFs. For SYMBOL_REFs, prepend
+ SH_DATALABEL_ENCODING to the symbol name.
+ * config/sh/sh.md (indirect_jump): Use SUBREG instead of
+ convert_mode().
+ 2000-12-20 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (casesi): Enclose ADDR_DIFF_VEC address in
+ UNSPEC_DATALABEL.
+ * config/sh/sh.c (gen_datalabel_ref): Accept LABEL_REFs.
+ * config/sh/sh.h (DATALABEL_REF_NO_CONST_P): Likewise.
+ (DATALABEL_REF_P): Don't require CONST.
+ (ASM_OUTPUT_ADDR_DIFF_ELT): On SH5, output datalabel before
+ REL label.
+ 2000-12-19 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (extendhidi2, extendqidi2): Use arithmetic shift
+ right.
+ 2000-12-18 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (movsi_media, call, call_value, sibcall):
+ Use shallow_copy_rtx and PUT_MODE to change the mode of
+ SYMBOL_REFs, LABEL_REFs, CONSTs, etc.
+ * config/sh/sh.h (PREFERRED_RELOAD_CLASS): Reload SYMBOL_REFs
+ on SHmedia using GENERAL_REGs.
+ * config/sh/sh.md (ble_media_i, blt_media_i, bleu_media_i,
+ bltu_media_i): Fix reversion of conditions.
+ 2000-12-18 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.md (zero_extendhidi2): Use logical shift right.
+ * config/sh/sh.c (output_far_jump): Save r13 in macl.
+ 2000-12-17 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (gen_datalabel_ref): Fix mode of the UNSPEC.
+ 2000-12-16 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/lib1funcs.asm (ic_invalidate): Define for SH5.
+ (GCC_nested_trampoline): Likewise.
+ * config/sh/sh-protos.h (gen_datalabel_ref): Declare.
+ * config/sh/sh.c (gen_datalabel_ref): Define.
+ * config/sh/sh.h (TRAMPOLINE_SIZE): Adjust for SH5.
+ (INITIALIZE_TRAMPOLINE): Likewise.
+ (TRAMPOLINE_ADJUST_ADDRESS): Define.
+ (DATALABEL_REF_NO_CONST_P, DATALABEL_REF_P): Define.
+ (EXTRA_CONSTRAINT_T): Match DATALABEL unspecs.
+ (OUTPUT_ADDR_CONST_EXTRA): Handle DATALABEL unspecs.
+ * config/sh/sh.md (UNSPEC_DATALABEL): New constant.
+ (ic_invalidate): Adjust for SH5.
+ (ic_invalidate_line_media, ic_invalidate_line_compact): New insns.
+ * config/sh/t-sh64 (LIB1ASMFUNCS): Added _ic_invalidate and
+ _nested_trampoline.
+ 2000-12-15 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (MOVE_MAX): Set to 8 for SHmedia, 4 elsewhere.
+ (MOVE_MAX_PIECES): Set to 8 on SHmedia too.
+ 2000-12-14 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (DBX_REGISTER_NUMBER): Adjust for sh64-elf-gdb.
+ * config/sh/elf.h (DBX_REGISTER_NUMBER): Likewise.
+ 2000-12-14 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (target_reg_operand): Match only target-branch
+ registers and pseudos that aren't virtual registers.
+ * config/sh/sh.md (call, call_value, sibcall) [TARGET_SHMEDIA]:
+ Copy operands that don't match target_reg_operand to pseudos.
+ (call_media, call_value_media, sibcall_media): Use
+ target_reg_operand instead of target_operand.
+ 2000-12-13 Alexandre Oliva <aoliva@redhat.com>
+ * glimits.h (__LONG_MAX__) [SH5 == 64]: Adjust for 64 bits.
+ * config/sh/sh.c (target_reg_operand): Match hardware registers
+ other than branch-target registers.
+ * config/sh/sh.md (zero_extendqidi2): Input operand is %1.
+ * config/sh/lib1funcs.asm (sdivsi3) [SH5]: Make it global.
+ (fpscr_values) [SH5 == 32]: Define.
+ * config/sh/t-sh64 (LIB1ASMFUNCS): Add fpscr_values.
+ * config/sh/sh.md (call, call_value, sibcall) [TARGET_SHMEDIA]:
+ Handle function addresses coming in SUBREGs.
+ 2000-12-12 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/lib1funcs.asm (shcompact_call_trampoline,
+ shcompact_return_trampoline): Use datalabel where appropriate.
+ 2000-12-09 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (SECONDARY_OUTPUT_RELOAD_CLASS): Use a
+ general-purpose register to copy one branch-target register to
+ another.
+ 2000-12-06 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (target_operand): Accept LABEL_REFs and
+ SYMBOL_REFs with VOIDmode.
+ * config/sh/sh.md (ble_media_i, blt_media_i, bleu_media_i,
+ bltu_media_i): New insns.
+ 2000-12-06 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (RETURN_IN_MEMORY): Adjust for SH5 ABI.
+ (INIT_CUMULATIVE_ARGS): Likewise.
+ 2000-12-01 Alexandre Oliva <aoliva@redhat.com>
+ * machmode.def (V16SFmode): New mode.
+ * c-common.c (type_for_mode): Support V2SF and V16SF.
+ * tree.c (build_common_tree_nodes_2): Likewise.
+ * tree.h (tree_index): Likewise.
+ * calls.c (emit_call_1): Take args_so_far. Adjust all
+ callers. Introduce CALL_POPS_ARGS.
+ * tm.texi (CALL_POPS_ARGS): Document.
+ * config/sh/crt1.asm: Implement in SHmedia mode.
+ * config/sh/crti.asm, config/sh/crtn.asm: Likewise
+ * config/sh/elf.h (ASM_SPEC, LINK_SPEC): Support SH5 flags.
+ (DBX_REGISTER_NUMBER): Renumber registers for SH5.
+ * config/sh/lib1funcs.asm: Disable functions unused in SH5.
+ Implement divsi and udivsi in SHmedia mode. Introduce
+ SHcompact trampolines.
+ * config/sh/sh.c (GEN_MOV, GEN_ADD3, GEN_SUB3): Use DImode
+ only in SHmedia64.
+ (regno_reg_class): Rewrite.
+ (fp_reg_names): Remove.
+ (sh_register_names, sh_additional_register_names): New.
+ (print_operand): Added `u'. Support SUBREGs in addresses.
+ Add parentheses around shifted CONSTs.
+ (output_file_start): Output .mode and .abi directives.
+ (shiftcosts, addsubcosts, multcosts): Adjust.
+ (output_stack_adjust): Compute alignment. Sanity-check SIZE.
+ (push_regs): Take array of HOST_WIDE_INTs. Adjust callers.
+ (calc_live_regs): Output to array of HOST_WIDE_INTs. Count
+ bytes, not registers. Take into account the need for the
+ SHcompact incoming args trampoline. Adjust all callers.
+ (sh_expand_prologue): Take stack_regs into account. Call
+ incoming args trampoline. Keep stack aligned as per SH5 ABI.
+ (sh_expand_epilogue): Take stack_regs into accoutn. Keep
+ stack aligned as per SH5 ABI.
+ (sh_builtin_saveregs): Support SH5 ABI.
+ (sh_build_va_list, sh_va_start): Likewise.
+ (initial_elimination_offset): Take alignment into account.
+ Compute location of PR according to the SH5 stack frame.
+ (arith_reg_operand): Reject branch-target registers.
+ (shmedia_6bit_operand): New.
+ (logical_operand): Use CONST_OK_FOR_P on SHmedia.
+ (target_reg_operand): Match DImode only. Accept SUBREGs.
+ (target_operand): New.
+ * config/sh/sh.h (CPP_SPEC, SUBTARGET_CPP_SPEC): Support SH5 flags.
+ (CONDITIONAL_REGISTER_USAGE): Implement SH5 ABI. Initialize
+ SIBCALL_REGS for SHmedia.
+ (TARGET_SH3E, TARGET_SH4): Only if SH1_BIT is set too.
+ (TARGET_FPU_DOUBLE, TARGET_FPU_ANY): New.
+ (TARGET_SHMEDIA32, TARGET_SHMEDIA64): New.
+ (TARGET_SWITCHES): New SH5 flags.
+ (OVERRIDE_OPTIONS): Set SH5-specific options. Use
+ VALID_REGISTER_P to disable unsupported registers.
+ (LONG_TYPE_SIZE, LONG_LONG_TYPE_SIZE): Set.
+ (POINTER_SIZE, PARM_BOUNDARY): Adjust.
+ (FUNCTION_ARG_PADDING): Define.
+ (FASTEST_ALIGNMENT): Adjust.
+ (SH_REGISTER_NAMES_INITIALIZER): New.
+ (sh_register_names): Declare.
+ (DEBUG_REGISTER_NAMES): Define.
+ (REGISTER_NAMES): Define based on sh_register_names.
+ (SH_ADDITIONAL_REGISTER_NAMES_INITIALIZER): New.
+ (sh_additional_register_names): Declare.
+ (LAST_GENERAL_REG, LAST_FP_REG, LAST_XD_REG): Adjust for SHmedia.
+ (FIRST_TARGET_REG, LAST_TARGET_REG): Define.
+ (TARGET_REGISTER_P, SHMEDIA_REGISTER_P, VALID_REGISTER_P): Define.
+ (REGISTER_NATURAL_MODE): Define.
+ (FIRST_PSEUDO_REGISTER): Adjust.
+ (FIXED_REGISTERS, CALL_USED_REGISTERS): Adjust.
+ (HARD_REGNO_CALL_PART_CLOBBERED): Define.
+ (HARD_REGNO_NREGS, HARD_REGNO_MODE_OK): Adjust.
+ (VECTOR_MODE_SUPPORTED_P): Define.
+ (REG_CLASS_CONTENTS): Adjust.
+ (SMALL_REGISTER_CLASSES): Adjust.
+ (REG_ALLOC_ORDER): Adjust.
+ (INDEX_REG_CLASS): Adjust.
+ (CONST_OK_FOR_O, CONST_OK_FOR_P): New.
+ (CONST_OK_FOR_LETTER_P): Adjust.
+ (PREFERRED_RELOAD_CLASS): Adjust.
+ (SECONDARY_OUTPUT_RELOAD_CLASS): Adjust.
+ (SECONDARY_INPUT_RELOAD_CLASS): Adjust.
+ (NPARM_REGS, FIRST_PARM_REG, FIRST_RET_REG): Adjust.
+ (FIRST_FP_PARM_REG): Adjust.
+ (CALL_POPS_ARGS): Define.
+ (FUNCTION_ARG_REGNO_P): Adjust.
+ (struct sh_args): New fields.
+ (GET_SH_ARG_CLASS): Adjust.
+ (INIT_CUMULATIVE_ARGS): Adjust.
+ (INIT_CUMULATIVE_INCOMING_ARGS): Define.
+ (FUNCTION_ARG_ADVANCE): Adjust.
+ (FUNCTION_ARG): Adjust.
+ (FUNCTION_ARG_PASS_BY_REFERENCE, SHCOMPACT_BYREF): Define.
+ (FUNCTION_ARG_CALLEE_COPIES): Define.
+ (SH5_PROTOTYPELESS_FLOAT_ARG): Define.
+ (STRICT_ARGUMENT_NAMING): Define.
+ (PRETEND_OUTGOING_VARARGS_NAMED): Adjust.
+ (FUNCTION_ARG_PARTIAL_NREGS): Adjust.
+ (SH5_WOULD_BE_PARTIAL_NREGS): Define.
+ (SETUP_INCOMING_VARARGS): Adjust.
+ (HAVE_POST_INCREMENT, HAVE_PRE_DECREMENT): Adjust.
+ (USE_LOAD_POST_INCREMENT, USE_STORE_PRE_DECREMENT): Adjust.
+ (REGNO_OK_FOR_INDEX_P, REG_OK_FOR_INDEX_P): Adjust.
+ (SUBREG_OK_FOR_INDEX_P): Adjust.
+ (EXTRA_CONSTRAINT_S): Update.
+ (EXTRA_CONSTRAINT_T): New.
+ (EXTRA_CONSTRAINT): Adjust.
+ (GO_IF_LEGITIMATE_INDEX): Adjust.
+ (GO_IF_LEGITIMATE_ADDRESS): Adjust.
+ (LEGITIMIZE_ADDRESS, LEGITIMIZE_RELOAD_ADDRESS): Adjust.
+ (MOVE_MAX): Adjust.
+ (MAX_MOVE_MAX): Define.
+ (Pmode): Adjust.
+ (CONST_COSTS): Adjust.
+ (REGISTER_MOVE_COST): Adjust.
+ (BRANCH_COST): Adjust.
+ (TEXT_SECTION_ASM_OP): Adjust.
+ (DBX_REGISTER_NUMBER): Adjust.
+ (ASM_OUTPUT_DOUBLE_INT): New.
+ (UNALIGNED_DOUBLE_INT_ASM_OP): New.
+ (PREDICATE_CODES): Adjust.
+ (PROMOTE_MODE): Adjust.
+ (CRT_CALL_STATIC_FUNCTION): Do not define for SHmedia.
+ * config/sh/sh.md (AP_REG, PR_REG, T_REG, GBR_REG): Renumber.
+ (MACH_REG, MACL_REG, FPUL_REG, RAP_REG, FPSCR_REG): Renumber.
+ (PR_MEDIA_REG, T_MEDIA_REG, R10_REG): New.
+ (DR0_REG, DR2_REG, DR4_REG): Renumber.
+ (TR0_REG, TR1_REG, TR2_REG): New.
+ (XD0_REG): Renumber.
+ (UNSPEC_COMPACT_ARGS): New.
+ (type): Added pt and ptabs.
+ (length): Default to 4 on SHmedia. Default pt length to 12
+ and 20 on SHmedia32 and SHmedia64, respectively.
+ (pt): New function unit.
+ (movdi, movsi): Add types pt and ptabs. Don't increment LABEL_NUSES.
+ Add whitespace between operands of SHmedia instructions.
+ (movdicc): Fix.
+ (adddi3_media, addsi3_media): Adjust constraints.
+ (subsi3) [SHmedia]: Force operand 1 into a register.
+ (udivsi3_i1_media, udivsi3_i4_media): New.
+ (udivsi3): Support SHmedia.
+ (divsi3_i1_media, divsi3_i4_media): New.
+ (divsi3): Support SHmedia.
+ (anddi3, iordi3, xordi3): Adjust constraints.
+ (zero_extendhidi2, zero_extendqidi2): New.
+ (extendsidi2, extendhidi2, extendqidi2): New.
+ (push, pop, push_e, push_fpul, push_4): Disable on SH5.
+ (pop_e, pop_fpul, pop_4): Likewise.
+ (movsi_media): Support FP and BT registers.
+ (movsi_media_nofpu): New. Adjust splits to DImode.
+ (lduw, ldub): Renamed to zero_extend* above.
+ (movqi_media): Fix typo.
+ (movdi_media): Support FP and BT registers.
+ (movdi_media_nofpu): New. Adjust splits for SHmedia32.
+ (movdi_const_32bit): New.
+ (shori_media): Require immediate operand. Use `u' for output.
+ (movdf_media, movsf_media): Simplified.
+ (movdf_media_nofpu, movsf_media_nofpu): New.
+ (movdf, movsf): Adjust
+ (movv2sf, movv2sf, movv16sf): New.
+ (beq_media, beq_media_i): Adjust constraints. Don't use
+ scratch BT register.
+ (bne_media, bne_media_i): Likewise.
+ (bgt_media, bgt_media_i): Likewise.
+ (bge_media, bge_media_i): Likewise.
+ (bgtu_media, bgtu_media_i): Likewise.
+ (bgeu_media, bgeu_media_i): Likewise.
+ (beq, bne, bgt, blt, ble, bge, bgtu, bltu, bgeu, bleu,
+ bunordered): Emit jump insn. Force operands to registers when
+ needed.
+ (jump_media, jump): Simplify.
+ (call_compact, call_compact_rettramp): New.
+ (call_value_compact, call_value_compact_rettramp): New.
+ (call_media, call_value_media): Simplify.
+ (sibcall_compact, sibcall_media): New.
+ (call, call_value): Adjust for SHmedia and SHcompact.
+ (sibcall, sibcall_value, untyped_call): Likewise.
+ (sibcall_epilogue): Preserve r0 across epilogue for SHcompact.
+ (indirect_jump): Adjust for SHmedia.
+ (casesi_jump_media): New.
+ (nop): Re-enable for SHmedia.
+ (call_site): Restrict to SH1.
+ (casesi): Adjust for SHmedia.
+ (casesi_shift_media, casesi_load_media): New.
+ (return): Explicitly use PR register. Call return trampoline
+ on SHcompact.
+ (return_i): Explicitly use PR register.
+ (shcompact_return_tramp, shcompact_return_tramp_i): New.
+ (return_media): Adjust.
+ (shcompact_incoming_args): New.
+ (epilogue): Adjust.
+ (seq, slt, sle, sgt, sge, sgtu, sltu, sleu, sgeu, sne): Adjust.
+ (movstrsi): Disable on SH5.
+ (fpu_switch0, fpu_switch1, movpsi): Enable on SH4.
+ (addsf3, addsf3_media): Test TARGET_SHMEDIA_FPU.
+ (subsf3, subsf3_media): Likewise.
+ (mulsf3, mulsf3_media, mac_media): Likewise.
+ (divsf3, divsf3_media): Likewise.
+ (floatdisf2, floatsisf2_media): Likewise. Adjust constraints.
+ (floatsisf2, fux_truncsfsi2): Likewise.
+ (fix_truncsfdi2, fix_truncsfsi2_media): Likewise. Adjust
+ constraints.
+ (cmpeqsf_media, cmpgtsf_media, cmpgesf_media): Likewise.
+ (cmpunsf_media, cmpsf): Likewise.
+ (negsf2, negsf2_media, sqrtsf2, sqrtsf2_media): Likewise.
+ (abssf2, abssf2_media): Likewise.
+ (adddf3, adddf3_media, subdf3, subdf3_media): Likewise.
+ (muldf3, muldf3_media, divdf3, divdf3_media): Likewise.
+ (floatdidf2, floatsidf2_media): Likewise. Adjust constraints.
+ (floatsidf2, fix_truncdfsi2): Likewise.
+ (fix_truncdfdi2, fix_truncdfsi2_media): Likewise. Adjust
+ constraints.
+ (cmpeqdf_media, cmpgtdf_media): Likewise.
+ (cmpgedf_media, cmpundf_media, cmpdf): Likewise.
+ (negdf2, negdf2_media, sqrtdf2, sqrtdf2_media): Likewise.
+ (absdf2, absdf2_media): Likewise.
+ (extendsfdf2, extendsfdf2_media): Likewise.
+ (truncsfdf2, truncsfdf2_media): Likewise.
+ * config/sh/sh64.h: New file.
+ * config/sh/t-sh64: New file.
+ * config/sh/shmedia.h: New file.
+ * config/sh/ushmedia.h: New file.
+ * config/sh/sshmedia.h: New file.
+ * configure.in: Added sh64-*-elf.
+ * configure: Rebuilt.
+ 2000-10-10 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (GEN_MOV, GEN_ADD3, GEN_SUB3): New macros.
+ (reg_class_from_letter): Use `b' for TARGET_REGS.
+ (print_operand): Support `%M', `%m', `AND' and
+ `ASHIFTRT'. Do not precede constants with `#' on SHmedia.
+ (andcosts): Adjust for SHmedia.
+ (output_stack_adjust, sh_expand_prologue, sh_expand_epilogue):
+ Likewise.
+ (target_reg_operand): New function.
+ * config/sh/sh-protos.h (target_reg_operand): Declare.
+ * config/sh/sh.h (CONDITIONAL_REGISTER_USAGE): Don't disable
+ FP registers on SH5.
+ (HARD_REGNO_MODE_OK): Accept them whenever they're acceptable
+ on SH4.
+ (TARGET_REGISTER_P): New macro.
+ (reg_class, REG_CLASS_NAMES, REG_CLASS_CONTENTS): Added TARGET_REGS.
+ (FUNCTION_VALUE): Use DImode for promoted types on SHmedia.
+ (EXTRA_CONSTRAINT_S): New macro.
+ (EXTRA_CONSTRAINT): Adjust.
+ (FLOAT_TYPE_SIZE): Define to 32.
+ (Pmode): DImode on SHmedia.
+ (CONST_COSTS): Adjust for SHmedia literals.
+ (PREDICATE_CODES): Added target_reg_operand.
+ (PROMOTE_MODE): Promote signed types to DImode on SHmedia.
+ * config/sh/sh.md: Remove all attrs from SHmedia insns.
+ (cmpeqdi_media, cmpgtdi_media, cmpgtudi_media): New insns.
+ (cmpdi): Accept SHmedia.
+ (movdicc_false, movdicc_true): New insns.
+ (movdicc): New expand.
+ (adddi3): Accept arith_operand for op2, but FAIL on SH1 if
+ no_new_pseudos.
+ (addsi3_media): Match `S' constraint.
+ (anddi3, andcdi3, iordi3, xordi3, negdi_media): New insns.
+ (negdi2): Expand for SHmedia.
+ (one_cmpldi2): New expand.
+ (zero_extendsidi2): Change from expand to insn.
+ (extendsidi2): Add constraints.
+ (movdi_media, movsi_media): Change `%x' to `%M'. Use `%m' for
+ LD/ST address. Fix SI immediate loading split.
+ (movhi_media, movqi_media, lduw, ldub): New insns.
+ (movhi, movqi): Accept SHmedia.
+ (shori_media, movdi_media): Relax input constraints. Split
+ symbolic constants.
+ (movdf_media, movsf_media): New insn. New split to movdi.
+ (movdf, movsf): Match on SHmedia.
+ (beq_media, bne_media, bgt_media, bge_media, bgtu_media,
+ bgeu_media): New insns and splits. New insns with `_i' suffix.
+ (beq, bne, bgt, blt, ble, bge, bgtu, bltu, bgeu, bleu): Adjust.
+ (bunordered): New expand.
+ (jump_compact): Renamed from `jump'.
+ (jump_media): New insn.
+ (jump): New expand.
+ (call_media, call_value_media): New insns.
+ (call, call_value): Adjust.
+ (indirect_jump_compact): Renamed from `indirect_jump'.
+ (indirect_jump_media): New insn.
+ (indirect_jump): New expand.
+ (untyped_call, return): Accept SHmedia.
+ (return_media): New insn.
+ (prologue, epilogue, blockage): Accept SHmedia.
+ (seq, slt, sle, sgt, sge, sgtu, sltu, sleu, sgeu, sne): Adjust.
+ (sunordered): New expand.
+ (addsf3, subsf3, mulsf3, divsf3, floatsisf2, fix_truncsfsi2,
+ cmpsf, negsf2, sqrtsf2, abssf2): Adjust for SHmedia.
+ (addsf3_media, subsf3_media, mulsf3_media, mac_media,
+ divsf3_media, floatdisf2, floatsisf2_media, fix_truncsfdi2,
+ fix_truncsfsi2_media, cmpeqsf_media, cmpgtsf_media,
+ cmpgesf_media, cmpunsf_media, negsf2_media, sqrtsf2_media,
+ abssf2_media): New insns.
+ (adddf3, subdf3, muldf3, divdf3, floatsidf2, fix_truncdfsi2,
+ cmpdf, negdf2, sqrtdf2, absdf2): Adjust for SHmedia.
+ (adddf3_media, subdf3_media, muldf3_media, divdf3_media,
+ floatdidf2, floatsidf2_media, fix_truncdfdi2,
+ fix_truncdfsi2_media, cmpeqdf_media, cmpgtdf_media,
+ cmpgedf_media, cmpundf_media, negdf2_media, sqrtdf2_media,
+ absdf2_media): New insns.
+ (extendsfdf2, truncdfsf2): Adjust for SHmedia.
+ (extendsfdf2_media, truncdfsf2_media): New insns.
+ 2000-09-14 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (machine_dependent_reorg): On shmedia, skip for now.
+ * config/sh/sh.h (CONST_OK_FOR_J): Document.
+ (LEGITIMATE_CONSTANT_P): Accept CONST_DOUBLEs on shmedia.
+ * config/sh/sh.md (adddi3): New expand.
+ (adddi3_media, adddi3z_media): New insns.
+ (adddi3_compact): Renamed from adddi3.
+ (addsi3_media): Use add.l r63 to add constant zero.
+ (subdi3): New expand.
+ (subdi3_media): New insn.
+ (subdi3_compact): Renamed from subdi3.
+ (mulsidi3): New expand.
+ (mulsidi3_media): New insn.
+ (mulsidi3_compact): Renamed from mulsidi3.
+ (umulsidi3): New expand.
+ (umulsidi3_media): New insn.
+ (umulsidi3_compact): Renamed from umulsidi3.
+ (ashlsi3_media, ashrsi3_media, lshrsi3_media): New insns.
+ (ashlsi3, ashrsi3, lshrsi3): Use them.
+ (ashldi3_media, ashrdi3_media, lshrdi3_media): New insns.
+ (ashldi3, ashrdi3, lshrdi3): Use them.
+ (zero_extendsidi2): New expand.
+ (extendsidi2): New insn.
+ (movsi_media): New insn. Split to movdi to load constants.
+ (movsi): Enable for shmedia.
+ (movdi_media): New insn. Use shori_media to load wide constants.
+ (short_media): New insn.
+ (movdi): Enable for shmedia.
+ 2000-09-08 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.h (CPP_SPEC): Added `m5'.
+ (SUBTARGET_CPP_SPEC): Added `!m5'.
+ (SH5_BIT, TARGET_SH5, TARGET_SHMEDIA, TARGET_SHCOMPACT): New macros.
+ (TARGET_SWITCHES): Added `5' and `5-compact'. Added SH1_BIT
+ to all other SH variants.
+ (TARGET_DEFAULT): Set to SH1_BIT.
+ (OVERRIDE_OPTIONS): Recognize sh5 CPU.
+ (BITS_PER_WORD): Raise to 64 on shmedia.
+ (MAX_BITS_PER_WORD): Change to 64.
+ (MAX_LONG_TYPE_SIZE, MAX_WCHAR_TYPE_SIZE): Set to MAX_BITS_PER_WORD.
+ (INT_TYPE_SIZE): Keep as 32.
+ (UNITS_PER_WORD): Raise to 8 on shmedia.
+ (MIN_UNITS_PER_WORD): Keep as 4.
+ (POINTER_SIZE): Raise to 64 on shmedia.
+ (CONST_OK_FOR_J): New macro.
+ (CONST_OK_FOR_LETTER_P): Use it.
+ (processor_type): Add PROCESSOR_SH5.
+ * config/sh/sh.md: Conditionalize all expands, insns and
+ splits to TARGET_SH1.
+ (cpu): Added sh5.
+ (addsi3_compact): Renamed from...
+ (addsi3): Now an expand.
+ (addsi3_media, subsi3_media): New insns.
+ (subsi3): Don't negate constants with SHmedia.
+
+ * hooks.c: New file.
+ * hooks.h: New file.
+ * Makefile.in (HOOKS_H): New.
+ (TARGET_DEF_H): Added $(HOOKS_H).
+ (OBJS): Added hooks.o.
+ (cfgcleanup.o, bb-reorder.o): Added target.h.
+ (hooks.o): Added dependencies.
+ * target-def.h (TARGET_CANNOT_MODIFY_JUMPS_P): New, added to...
+ (TARGET_INITIALIZER): this.
+ * doc/tm.texi (TARGET_CANNOT_MODIFY_JUMPS_P): Document.
+ * target.h (struct gcc_target): Added cannot_modify_jumps_p.
+ * bb-reorder.c: Include target.h.
+ (reorder_basic_blocks): Skip if cannot modify jumps.
+ * cfgcleanup.c: Include target.h.
+ (try_optimize_cfg): Skip merge blocking if cannot modify jumps.
+
+2002-02-08 Chris Demetriou <cgd@broadcom.com>
+
+ * config/mips/mips.md (casesi_internal, casesi_internal_di):
+ Protect jump delay slot instructions with .set noreorder and
+ .set nomacro.
+
+2002-02-08 Chris Demetriou <cgd@broadcom.com>
+
+ * config/mips/mips.md (casesi_internal_di): Calculate
+ the index into the target offset table correctly.
+
+2002-02-08 Richard Henderson <rth@redhat.com>
+
+ * expr.c (expand_expr): Mind EXPAND_INITIALIZER for truncation also.
+ * final.c (output_addr_const): Accept and discard SUBREG.
+ * varasm.c (decode_addr_const): Don't abort on unknown expressions --
+ mark them unknown instead.
+ (simplify_subtraction): Handle RTX_UNKNOWN.
+ (initializer_constant_valid_p): Strip NOP_EXPRs that narrow the mode.
+
+2002-02-08 David Edelsohn <edelsohn@gnu.org>
+
+ * doc/invoke.texi (RS/6000 and PowerPC Options): Fix typo.
+
+2002-02-08 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/elf.h (ASM_OUTPUT_ALIGNED_BSS): New.
+
+2002-02-08 Andreas Jaeger <aj@suse.de>
+
+ * config.gcc (x86_64-*-linux): Add t-linux64 makefile fragment.
+ * config/i386/t-linux64: New file.
+
+2002-02-08 Jakub Jelinek <jakub@redhat.com>
+
+ * c-common.c (c_expand_expr): Revert 2002-02-06 patch.
+ * c-parse.in (compstmt): Clear last_expr_type.
+
+2002-02-07 Richard Henderson <rth@redhat.com>
+
+ * loop.c (strength_reduce): Sink final_value when not
+ eliminating a biv.
+
+2002-02-07 David O'Brien <obrien@FreeBSD.org>
+
+ * config/sparc/freebsd.h: Fix mismatched spec {.
+
+2002-02-07 Richard Henderson <rth@redhat.com>
+
+ * cfgrtl.c: Include recog.h and insn-config.h.
+ (keep_with_call_p): Fix general_operand invocation.
+ * Makefile.in (cfgrtl.o): Update dependencies.
+
+2002-02-07 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.c (two_insn_adds_subs_operand): Revise a
+ comment. Accept HImode only if TARGET_H8300.
+
+2002-02-07 Eric Christopher <echristo@redhat.com>
+
+ * config/mips/crtn.asm: Cleanup #ifdefs.
+
+2002-02-07 Eric Christopher <echristo@redhat.com>
+
+ * config/mips/crti.asm: Add changes for mips16. mips16 uses
+ register 7 as RA instead of $31.
+ * config/mips/crtn.asm: Ditto.
+ * config/mips/mips.c (mips_move_2words): Add case for
+ TARGET_MIPS16 when HOST_BITS_PER_WIDE_INT >= 64.
+ (compute_frame_size): Fix typo.
+ (save_restore_insns): Ditto. Make documentation about using
+ register $7 as return register more precise.
+ (mips_expand_epilogue): Fix comment. Add code to work around not
+ being able to add to the stack pointer directly.
+ * config/mips/mips.h (EH_RETURN_DATA_REGNO): Change register number
+ to 2 for TARGET_MIPS16 as we need 6 and 7 as clobbers in the
+ epilogue.
+
+2002-02-07 Tom Rix <trix@redhat.com>
+
+ * config/rs6000/rs6000.c (reg_or_aligned_short_operand): New. For
+ immediates in ldu and stdu DS opcode field.
+ * config/rs6000/rs6000.md (movdi_update, movdi_update1): Use.
+ * config/rs6000/rs6000-protos.h: Add reg_or_aligned_short_operand.
+ * config/rs6000/rs6000.h (PREDICATE_CODES): Same.
+
+2002-02-07 Jeff Sturm <jsturm@one-point.com>
+
+ * config/sparc/sparc.c (compute_frame_size): Don't correct frame
+ offset for stack bias.
+
+2002-02-07 H.J. Lu <hjl@gnu.org>
+
+ * config/mips/linux.h (SUBTARGET_ASM_DEBUGGING_SPEC): Defined.
+
+2002-02-07 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * testsuite/gcc.dg/cpp/charconst-2.c: Add -fsigned-char option.
+
+Thu Feb 7 12:14:17 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * i386-protos.h (x86_order_regs_for_local_alloc): Declare
+ * i386.c (x86_order_regs_for_local_alloc): New global function.
+ * i386.h (REG_ALLOC_ORDER): CLeanup.
+ (ORDER_REGS_FOR_LOCAL_ALLOC): New.
+
+2002-02-07 Richard Henderson <rth@redhat.com>
+
+ PR optimization/2463
+ * alias.c (find_base_value): Recall base values for fixed hard regs.
+ * loop.c (loop_regs_update): Don't use single_set on non-insns.
+
+2002-02-07 Alexandre Oliva <aoliva@redhat.com>
+
+ * config/mips/mips.md (define_delay) [mips16]: Adjust required
+ length.
+
+2002-02-06 Richard Henderson <rth@redhat.com>
+
+ PR c/5609
+ * stmt.c (resolve_operand_name_1): Take more care with mixed
+ named and unnamed operands.
+
+2002-02-06 Janis Johnson <janis187@us.ibm.com>
+ Jan Hubicka <jh@suse.cz>
+
+ * loop.c (remove_constant_addition): Avoid clobbering a shared
+ CONST expression.
+
+2002-02-06 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config.gcc (s390x-*-linux*): Add t-linux64 makefile fragment.
+ * config/s390/t-linux64: New file.
+ * config/s390/libgcc-glibc.ver: New file.
+
+2002-02-06 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/linux64.h: Delete file.
+ * config/s390/s390x.h: New file.
+ * config.gcc (s390x-*-linux*): Use s390x.h instead of linux64.h
+ as target header file.
+ * config/s390/linux.h (TARGET_VERSION): Define depending on
+ DEFAULT_TARGET_64BIT.
+ (CPP_SPEC, ASM_SPEC, LINK_SPEC): Likewise.
+ (SIZE_TYPE, PTRDIFF_TYPE): Likewise.
+ (NO_BUILTIN_SIZE_TYPE, NO_BUILTIN_PTRDIFF_TYPE): Define.
+ (CPP_ARCH31_SPEC, CPP_ARCH64_SPEC): New defines.
+ (LINK_ARCH31_SPEC, LINK_ARCH64_SPEC): New defines.
+ (EXTRA_SPEC): New define.
+ * config/s390/s390.h (TARGET_VERSION): Define depending on
+ DEFAULT_TARGET_64BIT.
+ (MASK_RETURN_ADDR): Add run-time check for TARGET_64BIT.
+
+2002-02-06 Jason Merrill <jason@redhat.com>
+
+ * c-decl.c (finish_function): Warn about a non-void function with
+ no return statement and no abnormal exit.
+ (current_function_returns_abnormally): New variable.
+ (start_function): Clear it.
+ (struct c_language_function): Add returns_abnormally.
+ (push_c_function_context): Save it.
+ (pop_c_function_context): Restore it.
+ (builtin_function): Set TREE_THIS_VOLATILE on return fns.
+ (grokdeclarator): Set C_FUNCTION_IMPLICIT_INT on functions without
+ an explicit return type.
+ * c-tree.h: Declare current_function_returns_abnormally.
+ (C_FUNCTION_IMPLICIT_INT): New macro.
+ * c-typeck.c (build_function_call): Set it.
+ (c_expand_return): Set current_function_returns_value even if the
+ value is erroneous.
+
+2002-02-06 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/5420:
+ * c-common.c (c_unsafe_for_reeval): Make COMPOUND_LITERAL_EXPR
+ unsafe for reevaluation.
+
+2002-02-06 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/5482:
+ * c-common.c (c_expand_expr) [STMT_EXPR]: If last expression is not
+ EXPR_STMT, but COMPOUND_STMT, recurse into it.
+
+2002-02-06 Richard Henderson <rth@redhat.com>
+
+ * cfganal.c (keep_with_call_p): Source for fixed_reg dest must
+ be a general_operand. Dest for function value must be a pseudo.
+
+2002-02-06 Nick Clifton <nickc@cambridge.redhat.com>
+
+ * dbxout.c (dbxout_symbol_location): Accept LABEL_REFs as well
+ as SYMBOL_REFs from the constant pool.
+
+2002-02-06 Alexandre Oliva <aoliva@redhat.com>
+
+ * dbxout.c (dbxout_parms): Apply DEBUGGER_ARG_OFFSET to parameters
+ passed by invisible reference.
+
+2002-02-05 Richard Henderson <rth@redhat.com>
+
+ * config/sparc/sparc.h (ARG_POINTER_CFA_OFFSET): No stack bias.
+
+2002-02-06 Hans-Peter Nilsson <hp@bitrange.com>
+
+ Implement using "base addresses" in insn operands as default.
+ * config/mmix/mmix.c (mmix_conditional_register_usage): if
+ -mabi=gnu, modify fixed_regs to fit the GNU ABI.
+ (mmix_extra_constraint): Use 'R' to indicate that GETA should be
+ used to read the rtx value.
+ (mmix_target_asm_function_epilogue): Fix spacing.
+ (mmix_constant_address_p): Handle TARGET_BASE_ADDRESSES.
+ (mmix_legitimate_address): Ditto.
+ (mmix_encode_section_info): Set SYMBOL_REF_FLAG on rtx:es that
+ should be loaded with a GETA insn. Don't allocate needless extra
+ char for nul termination and fix misleading comment.
+ (mmix_print_operand_address): Handle constants if
+ TARGET_BASE_ADDRESSES.
+ (mmix_output_register_setting): Use base addressing if
+ TARGET_BASE_ADDRESSES and the number of insns is 3.
+ * config/mmix/t-mmix (MULTILIB_EXTRA_OPTS): New.
+ * config/mmix/mmix.md ("movdi"): Change the alternative with GETA
+ to use R as constraint, add LDA to match s.
+ * config/mmix/mmix.h (TARGET_BASE_ADDRESSES): New.
+ (TARGET_DEFAULT): Add TARGET_MASK_BASE_ADDRESSES.
+ (TARGET_SWITCHES): Add -mbase-addresses, -mno-base-addresses.
+ (FIXED_REGISTERS): Make registers $231..$246 fixed by default.
+ (MMIX_MMIXWARE_ABI_REG_ALLOC_ORDER): Move $231..$246 last, in
+ order with other fixed registers.
+ (MMIX_GNU_ABI_REG_ALLOC_ORDER): Put forward $231, in order with
+ other parameter/call-clobbered registers.
+ * doc/invoke.texi (Option Summary) <MMIX Options>: Add
+ -mbase-addresses, -mno-base-addresses.
+ (MMIX Options): Ditto.
+
+2002-02-05 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa.h (PREDICATE_CODES): Add reg_before_reload_operand.
+
+2002-02-06 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/altivec.h: Change elem to _S_elem.
+
+2002-02-05 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/netbsd.h (WCHAR_TYPE): Define.
+ (WCHAR_TYPE_SIZE): Ditto.
+ (WINT_TYPE): Ditto.
+ * config/alpha/netbsd.h (WCHAR_TYPE): Remove.
+ (WCHAR_UNSIGNED): Ditto.
+ (WCHAR_TYPE_SIZE): Ditto.
+ (WINT_TYPE): Ditto.
+ * config/arm/netbsd.h: Likewise.
+ * config/i386/netbsd-elf.h: Likewise.
+ * config/i386/netbsd.h: Likewise.
+ * config/m68k/netbsd-elf.h: Likewise.
+ * config/m68k/netbsd.h: Likewise.
+ * config/ns32k/netbsd.h: Likewise.
+ * config/sparc/netbsd.h: Likewise.
+ * config/vax/netbsd.: Likewise.
+
+2002-02-05 Alexandre Oliva <aoliva@redhat.com>
+
+ * target.h (struct gcc_target): Added ms_bitfield_layout_p.
+ * target-def.h (TARGET_MS_BITFIELD_LAYOUT_P): New. Added to...
+ (TARGET_INITIALIZER): this.
+ * doc/tm.texi (TARGET_MS_BITFIELD_LAYOUT_P): Document.
+ (BITFIELD_NBYTES_LIMITED): Markup fix.
+ * tree.h (default_ms_bitfield_layout_p): Declare.
+ (record_layout_info): Added prev_field.
+ * tree.c (default_ms_bitfield_layout_p): New fn.
+ * c-decl.c (finish_struct): Disregard EMPTY_FIELD_BOUNDARY and
+ PCC_BITFIELD_TYPE_MATTERS for MS bit-field layout.
+ * stor-layout.c: Include target.h.
+ (start_record_layout): Initialize prev_field.
+ (place_field): Handle MS bit-field layout, and disregard
+ EMPTY_FIELD_BOUNDARY, BITFIELD_NBYTES_LIMITED and
+ PCC_BITFIELD_TYPE_MATTERS in this case. Update prev_field.
+ * Makefile.in (stor-layout.o): Adjust dependencies.
+
+2002-02-05 Jason Merrill <jason@redhat.com>
+
+ * collect2.c (dump_file): Pass DMGL_VERBOSE to cplus_demangle.
+
+2002-02-05 Andreas Jaeger <aj@suse.de>
+
+ * crtstuff.c: Fix comments.
+
+2002-02-05 Richard Henderson <rth@redhat.com>
+
+ PR fortran/3393
+ * loop.c (loop_iv_add_mult_emit_before): Copy multiplier as well.
+ (loop_iv_add_mult_sink, loop_iv_add_mult_hoist): Likewise.
+
+ PR fortran/3392
+ * config/mips/mips.c (function_arg): Handle TImode.
+ (function_arg_advance): Likewise.
+
+2002-02-05 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/altivec.h (vec_step_help): Rename to
+ __vec_step_help.
+
+2002-02-05 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/altivec.h: Fix typos.
+
+2002-02-05 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config/arm/netbsd.h: Correct a comment.
+
+2002-02-05 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/rs6000.c (altivec_init_builtins): Fix typo
+ building void typed builtins.
+
+ * config/rs6000/altivec.h (vec_ld*): Fix typos.
+ (vec_step): Implement for C++.
+
+Mon Feb 4 19:23:19 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * final.c (final_scan_insn): Add case for NOTE_INSN_LOOP_END_TOP_COND.
+
+2002-02-04 Richard Henderson <rth@redhat.com>
+
+ * combine.c (nonzero_bits): Re-introduce special case for
+ sp/fp/ap wrt REGNO_POINTER_ALIGN.
+
+2002-02-05 Aldy Hernandez <aldyh@redhat.com>
+
+ * doc/extend.texi: Warn about unsupported usage of altivec
+ builtins.
+
+ * config/rs6000/rs6000.md (altivec_vcmp*_p): Remove.
+ (altivec_predicate_*): New.
+
+ * config/rs6000/altivec.h: Rewrite predicates to use new builtins.
+ Add C++ version of vec_*() functions.
+
+ * config/rs6000/rs6000.c (bdesc_altivec_preds): New.
+ (bdesc_2arg): Remove altivec predicates.
+ (altivec_expand_builtin): Handle predicates.
+ (altivec_init_builtins): Handle predicates.
+ (altivec_expand_predicate_builtin): New.
+
+2002-02-04 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa.c (DO_FRAME_NOTES): Move forward.
+ (store_reg): Revise handling of frame notes.
+ (load_reg): Likewise.
+ (set_reg_plus_d): Likewise.
+ (hppa_expand_prologue): Likewise.
+ (hppa_expand_epilogue): Likewise.
+
+2002-02-04 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * unwind-dw2-fde-glibc.c: Define _GNU_SOURCE if not defined.
+
+2002-02-04 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/4475, c++/3780:
+ * c-common.def (SWITCH_STMT): Add SWITCH_TYPE operand.
+ * c-common.h (SWITCH_TYPE): Define.
+ * c-typeck.c (c_start_case): Set SWITCH_TYPE.
+ * stmt.c (all_cases_count): Set lastval to thisval at end of loop.
+ Rename spareness variable to sparseness.
+ (expand_end_case_type): Renamed from expand_end_case, use orig_type
+ if non-NULL instead of TREE_TYPE (orig_index).
+ * tree.h (expand_end_case_type): Renamed from expand_end_case.
+ (expand_end_case): Define using expand_end_case_type.
+ * c-semantics.c (genrtl_switch_stmt): Pass SWITCH_TYPE
+ to expand_end_case_type.
+ * doc/c-tree.texi (SWITCH_STMT): Document SWITCH_TYPE.
+
+2002-02-04 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa.h (PREFERRED_STACK_BOUNDARY): Define to match standard rounding.
+ (BIGGEST_ALIGNMENT): Change to 128.
+
+2002-02-04 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa32-linux.h (LINK_COMMAND_SPEC): Define.
+
+2002-02-04 John David Anglin <dave@hiauly1.hia.nrc.ca>
+
+ * pa.md (call_internal_reg_64bit): Remove unused variable.
+
+2002-02-04 Nick Clifton <nickc@cambridge.redhat.com>
+
+ * config/arm/arm.h (machine_function): Add uses_anonymous_args
+ field.
+ (SETUP_INCOMING_VARARGS): Set uses_anonymous_args.
+ * config/arm/arm.c (current_function_anonymous_args): Delete,
+ replace uses with cfun->machine->uses_anonymous_args.
+ (arm_reorg): Do not reset uses_anonymous_args.
+
+ * config/arm/arm.c (arm_hard_regno_mode_ok): Allow any value in
+ any geenral register.
+
+2001-02-04 Bernd Schmidt <bernds@redhat.com>
+
+ * cfgrtl.c (force_nonfallthru_and_redirect): Don't try to redirect
+ the entry block.
+
+2002-02-04 Richard Henderson <rth@redhat.com>
+
+ * combine.c (force_to_mode): Remove STACK_BIAS code.
+ (nonzero_bits): Likewise. Replace sp/fp special case with
+ REGNO_POINTER_ALIGN.
+
+ * config/sparc/sparc.h (FRAME_POINTER_REGNUM): Change to SFP.
+ (HARD_FRAME_POINTER_REGNUM): New.
+ (FIRST_PSEUDO_REGISTER, REG_CLASS_CONTENTS): Update.
+ (FIXED_REGS, CALL_USED_REGS): Update.
+ (REG_ALLOC_ORDER, REGISTER_NAMES): Update.
+ (CONDITIONAL_REGISTER_USAGE): Update for HFP.
+ (HARD_REGNO_NREGS): Update for SFP.
+ (STACK_POINTER_OFFSET): Include bias here ...
+ (FIRST_PARM_OFFSET): ... not here.
+ (STACK_BIAS): Remove.
+ (INIT_EXPANDERS): New.
+ (STARTING_FRAME_OFFSET): Do not include bias.
+ (ELIMINABLE_REGS, CAN_ELIMINATE, INITIAL_ELIMINATION_OFFSET): New.
+ (REGNO_OK_FOR_INDEX_P, REGNO_OK_FOR_BASE_P): Update for SFP.
+ (REG_OK_FOR_INDEX_P, REG_OK_FOR_BASE_P): Likewise.
+ * config/sparc/aout.h (DBX_REGISTER_NUMBER): Update for HFP.
+ * config/sparc/litecoff.h, config/sparc/sol2.h: Likewise.
+ * config/sparc/sparc.c (mem_min_alignment): Update for HFP.
+ (sparc_nonflat_function_prologue, epilogue_renumber): Likewise.
+ (MUST_SAVE_REGISTER): Likewise.
+ (sparc_flat_function_prologue): Likewise.
+ (sparc_flat_function_epilogue): Likewise.
+ (HARD_FRAME_POINTER_MASK): Rename from FRAME_POINTER_MASK.
+ (sparc_init_modes): SFP is GENERAL_REGS.
+ (sparc_builtin_saveregs): SFP does not have bias applied.
+
+2002-02-04 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/alpha.c (current_function_is_thunk): Don't check
+ current_function_is_thunk.
+ (alpha_sa_mask): Distinguish between current_function_is_thunk
+ called from ASM_OUTPUT_MI_THUNK and not.
+ (alpha_does_function_need_gp): Thunks always need gp.
+ (alpha_start_function, alpha_output_function_end_prologue): Likewise.
+ (alpha_output_mi_thunk_osf): New.
+ * config/alpha/alpha-protos.h: Update.
+ * config/alpha/alpha.h (ASM_OUTPUT_MI_THUNK): New.
+
+2002-02-04 Richard Sandiford <rsandifo@redhat.com>
+
+ * c-typeck.c (build_c_cast): Warn when qualifiers are added to
+ function types, not when they're taken away.
+
+Mon Feb 4 09:05:58 2002 Jeffrey A Law (law@redhat.com)
+
+ * cfgrtl.c (try_redirect_by_replacing_jump): Remove associated
+ CODE_LABEL and jump table when replacing a table jump with a
+ simple jump.
+
+2002-02-04 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390-protos.h (legitimize_la_operand,
+ s390_secondary_input_reload_class, s390_plus_operand,
+ s390_expand_plus_operand): Add prototypes.
+
+ config/s390/s390.c (s390_secondary_input_reload_class,
+ s390_plus_operand, s390_expand_plus_operand): New functions.
+
+ (struct s390_address): New member 'pointer'.
+ (s390_decompose_address): Compute it.
+ (legitimate_la_operand_p): Use it.
+ (legitimize_la_operand): New function.
+ (movti, movdi, movdf splitters): Call it.
+
+ config/s390/s390.h (SECONDARY_INPUT_RELOAD_CLASS): Define.
+ (PREDICATE_CODES): Add s390_plus_operand.
+
+ config/s390/s390.md (adddi3_inv_64, addaddr_ccclobber): Delete.
+ (la_ccclobber): Allow GENERAL_REGS as output operand.
+
+ (reload_load_address, *reload_load_address_reg_0, *la, *do_la_reg_0,
+ *reload_la_64, *reload_la_31 and splitters): Delete, replace by ...
+ (*la_64, *la_31, reload_indi, reload_insi): ... these.
+
+2002-02-04 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * gcc/config/s390/s390.h (CRT_CALL_STATIC_FUNCTION): Fixed
+ register names for regular asm () construct.
+
+2002-02-04 Jakub Jelinek <jakub@redhat.com>
+
+ * config/i386/i386.md (movsf_1): Allow moving SF values in MMX
+ registers.
+
+2002-02-04 Jakub Jelinek <jakub@redhat.com>
+
+ * combine.c (recog_for_combine): Create a dummy insn with PATTERN
+ pat for recog.
+
+2002-02-04 Hartmut Penner <hpenner@de.ibm.com>
+
+ * varasm.c (decode_rtx_const): Allow unspec (symbol_ref) in
+ constant pool to be identical by string address and index.
+
+2002-02-04 Anthony Green <green@redhat.com>
+
+ * output.h (SECTION_OVERRIDE): Define.
+ * varasm.c (named_section): Obey SECTION_OVERRIDE.
+
+2002-02-03 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config.gcc (arm*-*-netbsdelf*): Placeholder to prevent match
+ by existing arm*-*-netbsd* (a.out) target.
+ (ns32k-*-netbsdelf*): Likewise.
+ (sparc-*-netbsdelf*): Likewise.
+ (vax-*-netbsdelf*): Likewise.
+
+2002-02-03 Danny Smith <dannysmith@users.sourceforge.net>
+
+ * gthr-win32.h: Protect against conflicting typedef for BOOL in windows
+ headers and libobjc headers.
+
+2002-02-03 Mumit Khan <khan@nanotech.wisc.edu>
+
+ * gthr-win32.h (__mingwthr_key_dtor): Use extern "C" linkage for C++.
+ (_mingw.h): Remove duplicate include.
+
+2002-02-03 Jason Thorpe <thorpej@wasabisystems.com>
+
+ * config.gcc: Set cpu_type to m68k for 68010, as well.
+ (m68010-*-netbsdelf*): New...
+ (m68k*-*-netbsdelf*): ...targets.
+ * config/m68k/netbsd-elf.h: New file.
+
+2002-02-02 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.c (hand_list): Move inside function_arg.
+
+2002-02-02 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.c (h8_push_ops): Move inside
+ h8300_init_once.
+ (h8_pop_ops): Likewise.
+ (h8_move_ops): Likewise.
+
+2002-02-02 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.c (os_task): Make it static.
+ (monitor): Likewise.
+ (pragma_saveall): Likewise.
+
+2002-02-02 Alexandre Oliva <aoliva@redhat.com>
+
+ * config/sh/sh.md (ic_invalidate_line): Make sure the immediate
+ constant is a valid sign-extension for Pmode.
+
+2002-02-02 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.c: Fix formatting.
+
+2002-02-02 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.md: Fix formatting.
+
+2002-02-02 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.md (one_cmpl patterns): Tighten the
+ predicates of operands[1]. Split the patterns for each
+ processor variant.
+
+2002-02-02 Kazu Hirata <kazu@hxi.com>
+
+ * config/h8300/h8300.md (xor patterns): Tighten the predicates
+ of operands[1] to register_operand.
+
+2002-02-02 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * cpphash.h (struct spec_nodes): Remove n__CHAR_UNSIGNED__.
+ * cpphash.c (_cpp_init_hashtable): Similarly.
+ * cppinit.c (cpp_create_reader): Default the signed_char flag.
+ (init_builtins): Define __CHAR_UNSIGNED__ appropriately.
+ (COMMAND_LINE_OPTIONS): Recognise -f{un,}signed-char.
+ (cpp_handle_option): Handle the new options.
+ * cpplex.c (cpp_interpret_charconst): Use new flag.
+ * cpplib.h (struct cpp_options): New member signed_char.
+ * gcc.c (cpp_unique_options): Remove %c spec and documentation.
+ (cpp_options): Handle -fsigned-char and -funsigned-char.
+ (static_specs): Remove signed_char_spec.
+ (do_spec1): Don't handle %c.
+ * system.h: Poison SIGNED_CHAR_SPEC.
+ * tradcif.y (yylex): Use flag_signed_char.
+ * tradcpp.h (flag_signed_char): New.
+ * tradcpp.c (flag_signed_char): New.
+ (main): Handle new command-line options.
+ (initialize_builtins): Define __CHAR_UNSIGNED__ if appropriate.
+config:
+ * alpha/alpha.h (SIGNED_CHAR_SPEC): Remove.
+ * avr/avr.h: Remove old comments.
+ * i960/i960.h (CPP_SPEC): Pass -fsigned-char if -mic*.
+ (CC1_SPEC): Pass -fsigned-char if -mic*.
+ (SIGNED_CHAR_SPEC): Remove.
+doc:
+ * tm.texi (SIGNED_CHAR_SPEC): Remove documentation.
+
+2002-02-01 Eric Christopher <echristo@redhat.com>
+
+ From Daniel Jacobowitz <dmj+@andrew.cmu.edu>
+ * config/mips/mips.h (FUNCTION_PROFILER): Fix function profiling.
+ * config/mips/linux.h (ASM_OUTPUT_REG_PUSH): Undefine.
+ (ASM_OUTPUT_REG_POP): Ditto.
+
+2002-02-02 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * c-decl.c, tree.c, tree.h, objc/objc-act.c: Revert bitfield
+ patch.
+
+2002-02-02 Jakub Jelinek <jakub@redhat.com>
+
+ * config/i386/i386.h (CPP_CPUCOMMON_SPEC): Add missing | separators.
+
+2002-02-02 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/5304:
+ * expmed.c (expand_mult_highpart): Use immed_double_const for wide_op1
+ unconditionally.
+
+2002-02-01 Janis Johnson <janis187@us.ibm.com>
+
+ * cfganal.c: Include tm_p.h.
+ (keep_with_call_p): Fix the test that determines if a register holds
+ the return value of a call.
+
+2002-02-01 DJ Delorie <dj@redhat.com>
+
+ * config/sparc/sparc.c (sparc_emit_set_symbolic_const64): If
+ we are given conflicting registers, switch to the other one we
+ had allocated for us.
+ * config/sparc/sparc.md (reload_indi, reload_outdi): Pass op[2]
+ as TImode so we know when the "other" register is available.
+
+2002-02-01 David O'Brien <obrien@FreeBSD.org>
+
+ * config/sparc/sol2-sld-64.h: Include sparc/biarch64.h rather than
+ sparc/sparc_bi.h.
+
+2002-02-01 Janis Johnson <janis187@us.ibm.com>
+
+ * cfganal.c (keep_with_call_p): New function.
+ (flow_call_edges_add): Prevent splitting a block between a call and
+ a single-set instruction that should be kept in the same block.
+
+2002-02-01 Craig Rodrigues <rodrigc@gcc.gnu.org>
+
+ * doc/install.texi (avr): Update outdated URL.
+
2002-01-30 Andrew Haley <aph@cambridge.redhat.com>
- * config/stormy16/stormy16.md (pushqi): New.
- (popqi): New.
- (pushhi): New.
- (pophi): New.
- (movhi): Remove stack operands.
- (movqi): Likewise.
- * config/stormy16/stormy16.h (PREDICATE_CODES): Add
- nonimmediate_nonstack_operand.
- * config/stormy16/stormy16.c (nonimmediate_nonstack_operand):
- New.
- * config/stormy16/stormy16-protos.h (nonimmediate_nonstack_operand)
- New.
+ * config/stormy16/stormy16.md (pushqi): New.
+ (popqi): New.
+ (pushhi): New.
+ (pophi): New.
+ (movhi): Remove stack operands.
+ (movqi): Likewise.
+ * config/stormy16/stormy16.h (PREDICATE_CODES): Add
+ nonimmediate_nonstack_operand.
+ * config/stormy16/stormy16.c (nonimmediate_nonstack_operand):
+ New.
+ * config/stormy16/stormy16-protos.h (nonimmediate_nonstack_operand)
+ New.
2002-01-31 Jason Merrill <jason@redhat.com>
@@ -508,7 +6937,7 @@ Fri Jan 25 20:43:56 CET 2002 Jan Hubicka <jh@suse.cz>
* flow.c (propagate_one_insn): Use it.
(mark_used_regs): Handle NIL.
-2001-01-25 Geoffrey Keating <geoffk@redhat.com>
+2002-01-25 Geoffrey Keating <geoffk@redhat.com>
* config/stormy16/stormy16.md (tablejump_pcrel): Use a MEM
to help folding.
@@ -1800,7 +8229,7 @@ Thu Jan 10 22:35:54 CET 2002 Jan Hubicka <jh@suse.cz>
* config/h8300/h8300.h: Fix formatting.
-2001-01-10 Ira Ruben <ira@apple.com>
+2002-01-10 Ira Ruben <ira@apple.com>
Add __attribute__ ((deprecated)).
* extend.texi: Document __attribute__ ((deprecated)).
@@ -1836,7 +8265,7 @@ Thu Jan 10 22:35:54 CET 2002 Jan Hubicka <jh@suse.cz>
* cp/lex.c (do_identifier): Test for deprecated primaries.
* cp/typeck.c (build_component_ref): Test for deprecated fields.
-2001-01-10 Ira Ruben <ira@apple.com>
+2002-01-10 Ira Ruben <ira@apple.com>
Fix to assign attributes to inline member functions.
* cp/decl.c (start_method): Handle attrlist.
@@ -2547,7 +8976,7 @@ Fri Jan 4 11:45:05 2002 Jeffrey A Law (law@redhat.com)
* config/pa/pa64-hpux.h (ASM_FILE_START): Likewise.
* config/pa/som.h (ASM_FILE_START): Likewise.
-2001-01-04 Daniel Berlin <dan@cgsoftware.com>
+2002-01-04 Daniel Berlin <dan@cgsoftware.com>
* lcm.c: Include df.h.
Add available_transfer_function prototype.
diff --git a/contrib/gcc/ChangeLog.lib b/contrib/gcc/ChangeLog.lib
new file mode 100644
index 0000000..7b85b56
--- /dev/null
+++ b/contrib/gcc/ChangeLog.lib
@@ -0,0 +1,3781 @@
+Wed Jan 1 17:54:47 1998 J.J. van der Heijden <J.J.vanderHeijden@student.utwente.nl>
+
+ * pexecute.c (pexecute, [_WIN32]): Yes, mask termstat for mingw32.
+
+Mon Dec 22 18:59:34 1997 Pascal Obry <pascal.obry@der.edfgdf.fr>
+
+ * pexecute.c (pexecute, [_WIN32]): For mingw32, don't mask termstat.
+
+Sat Dec 13 09:39:32 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * pexecute.c (fix_argv): Remove outer "const" from return type.
+ (pexecute): errmsg_arg is pointer to const.
+
+Sat Nov 29 08:06:34 1997 Jan-Jaap van der Heijden <janjaap@student.utwente.nl>
+
+ * pexecute.c: Include signal.h for _WIN32.
+
+Wed Nov 26 17:31:44 1997 J.J. van der Heijden <J.J.vanderHeijden@student.utwente.nl>
+
+ * pexecute.c (pwait): For _WIN32, distinguish whether child process
+ caught fatal signal or reported nonzero exit code.
+
+Wed Nov 26 13:24:30 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * choose-temp.c (sys/file.h): Include if HAVE_SYS_FILE_H.
+
+Mon Nov 17 09:07:52 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * choose-temp.c (choose_temp_base): Remove incorrect code for VMS.
+
+Sun Oct 19 10:34:11 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * pexecute.c (fix_argv, pexecute): Cast result of xmalloc.
+
+Sat Oct 18 16:55:18 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * obstack.h (obstack_empty_p): New macro.
+
+Mon Sep 29 12:27:59 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * pexecute.c: Use spawn if __CYGWIN32__.
+
+Wed Sep 10 15:14:20 1997 Jeffrey A Law (law@cygnus.com)
+
+ * config.sub: Use "amigaos" instread of "amigados". Still
+ recognize "amigados" for backward compatibility.
+
+Tue Sep 9 18:23:57 1997 Doug Evans <dje@cygnus.com>
+
+ * config.sub: Recognize ARC cpu.
+
+1997-09-09 Richard Kenner Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * config.guess (alpha): Replace CPU-determining program with one
+ that's more precise and also supports pca56 and ev6.
+ Handle those in returned name.
+
+1997-09-08 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * config.guess (alpha:OSF1:*:*): For V4.0, get the letter suffix.
+
+1997-09-05 Jeffrey A Law (law@cygnus.com)
+
+ * config.sub: Recognize v850-elf.
+
+1997-08-26 Richard Henderson <rth@cygnus.com>
+
+ * config.guess (*:Linux:*:*): Recognize alpha-linux-gnulibc1.
+
+1997-08-17 Jeff Law <law@cygnus.com>
+
+ * config.sub: Recognize tx39/r3900.
+
+1997-08-08 Paul Eggert <eggert@twinsun.com>
+
+ * choose-temp.c, pexecute.c:
+ Include "config.h" first, as per autoconf manual.
+
+1997-08-01 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
+
+ * config.sub: Translate -svr4 to -sysv4 and -unixware to -sysv4.2uw.
+
+1997-07-26 Per Bothner <bothner@pogo.gnu.ai.mit.edu>
+
+ * config.guess: Recognize SunOS 3.x.
+ From Tom Schmidt <tschmidt@micron.com>.
+
+1997-07-22 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
+
+ * getloadavg.c: Test `__unix' along with `unix'.
+
+Sun Jul 20 20:58:43 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * config.guess (alpha*): Run program to see if ev4, ev5, or ev56.
+ * config.sub (alphaev5, alphaev56): New CPU types.
+
+Wed Jul 16 10:46:14 1997 Richard Earnshaw <rearnsha@cambridge.arm.com>
+
+ * config.guess (arm32:NetBSD:*:*): Canonicalize to normal format
+ for ARM systems.
+
+Tue Jul 15 09:13:05 1997 Jim Meyering <meyering@psilocin.gnu.ai.mit.edu>
+
+ * getloadavg.c: Add comment describing HAVE_PSTAT_GETDYNAMIC.
+
+1997-07-14 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
+
+ * config.guess (pc:*:*:*): New entry, for DJGPP.
+
+1997-07-07 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
+
+ * config.guess (i?86:UNIX_SV:4.2MP:2.*): Recognize unixware.
+
+1997-07-06 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
+
+ * getloadavg.c [OSF_ALPHA]:
+ Include sys/mbuf.h, sys/socket.h, net/route.h.
+
+1997-06-30 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
+
+ * getloadavg.c [__GNU__]: Test for not NeXT.
+
+Fri Jun 27 15:20:29 1997 Scott Christley <scottc@net-community.com>
+
+ * config.sub (-mingw32*): New OS.
+ * config.guess (i*:MINGW*:*): New case.
+ * pexecute.c (fix_argv): New function.
+ (pexecute): Win32 but not Cygwin32 needs its arguments fixed.
+ Add underscore to cwait function call.
+
+Mon Jun 23 10:51:53 1997 Jeffrey A Law (law@cygnus.com)
+
+ * config.sub (mn10200): Recognize new basic machine.
+
+1997-06-22 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
+
+ * config.guess: Add mips-sony-newsos6.
+
+1997-06-09 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
+
+ * config.guess: Use i?86, not i.86.
+ Don't test /usr/lib/ldscripts; instead, test whether ld_help_string
+ does not contain "supported emulations".
+ Use a case statement to distinguish systems when there IS
+ "supported emulations".
+
+1997-06-07 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * config.guess (*:Linux:*:*): Always use ${VENDOR}.
+
+1997-06-05 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
+
+ * config.guess (*:Linux:*:*): Don't test for elf_i.86 or m68kelf.
+
+ * config.guess (*:Linux:*:*): Recognize sparclinux.
+ Don't recognize UNAME_MACHINE = sparc.
+ Make the sample program check for libc version
+ and handle various machine types.
+
+ * config.sub (mipsel*-linux* and mips*-linux*):
+ Set `os' to -linux-gnu directly, don't go via -linux.
+
+Mon May 26 12:46:25 1997 Paul Eggert <eggert@twinsun.com>
+
+ * getopt.c, getopt.h, getopt1.c: Moved to libc-copy/copies.
+
+Wed May 7 15:17:59 1997 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
+
+ * config.guess: Recognize either / or - as a machine/suptype
+ separator from uname -m to cope with older systems that have the
+ older uname. Suggested by Michael Snyder (msnyder@cygnus.com).
+
+Mon May 5 18:05:35 1997 Per Bothner <bothner@frobnitz.gnu.ai.mit.edu>
+
+ * config.guess: CLIX patch from Thomas Dickey via
+ urs@akk.uni-karlsruhe.de (Urs Janssen).
+
+Thu Apr 17 13:59:13 1997 Per Fogelstrom <pefo@openbsd.org>
+
+ * config.guess: Fixes for MIPS OpenBSD systems.
+
+Fri Apr 11 16:39:06 1997 Niklas Hallqvist <niklas@appli.se>
+
+ * config.guess: Recognize OpenBSD systems correctly.
+
+Mon Mar 24 15:38:37 1997 Doug Evans <dje@cygnus.com>
+
+ * config.sub: Recognize m32r and mn10300 cpus.
+
+Sat Feb 22 22:36:44 1997 Miles Bader <miles@gnu.ai.mit.edu>
+
+ * getloadavg.c [__GNU__] (NeXT, host_self): New macros, to make
+ hurd systems use the NeXT code for getting load averages.
+
+Sat Feb 15 19:03:48 1997 Geoffrey Noer (noer@cygnus.com)
+
+ * pexecute.c: Remove special cases for cygwin32.
+ (pwait): Remove local definition of `pid'.
+
+Wed Jan 15 22:36:59 1997 Jim Meyering <meyering@kropotkin.gnu.ai.mit.edu>
+
+ * getloadavg.c [hpux && HAVE_PSTAT_GETDYNAMIC]: Use HPUX's
+ pstat_getdynamic function so we don't need any special privileges
+ to determine load averages. Patch from Kaveh Ghazi, based on a
+ sample implementation from Richard J. Rauenzahn.
+ Indent cpp-directives to reflect nesting.
+
+Tue Jan 7 14:29:37 1997 David J. MacKenzie <djm@geech.gnu.ai.mit.edu>
+
+ * config.guess: Add hppa1.1-hitachi-hiuxmpp support, passed along
+ by rms.
+
+Sat Jan 4 22:43:21 1997 Miles Bader <miles@gnu.ai.mit.edu>
+
+ * config.guess (*:GNU:*:*): The machine/subtype separator printed
+ by uname -m is now `-', not '/'.
+
+Fri Jan 3 08:38:49 1997 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * config.guess (M68*:*:R3V[567]*:*): Use uppercase 'M'.
+
+Tue Dec 31 15:51:13 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * config.guess, config.sub: Recognize mips-unknown-linux-gnu.
+
+Tue Dec 10 09:44:57 1996 Paul Eggert <eggert@twinsun.com>
+
+ * choose-temp.c (choose_temp_base): Don't dump core if TMPDIR is empty.
+
+ * choose-temp.c (try): Insist that temp dir be searchable.
+
+Sat Dec 7 17:48:02 1996 Dave Love <d.love@dl.ac.uk>
+
+ * config.guess (PENTIUM:CPunix:4.0*:*): New case.
+
+Sun Nov 24 19:41:31 1996 Per Bothner <bothner@frobnitz.gnu.ai.mit.edu>
+
+ * config.guess: Recognize machten.
+ From Eric W. Bates <ericx@vineyard.net>.
+
+Sun Nov 24 18:17:53 1996 Dave Love <d.love@dl.ac.uk>
+
+ * config.guess (PENTIUM:CPunix:4.0*:*): New case.
+
+Fri Nov 22 11:44:13 1996 David J. MacKenzie <djm@geech.gnu.ai.mit.edu>
+
+ * config.guess: Undo accidental lowercasing in
+ m68k-motorola-sysv regexp.
+
+Wed Nov 20 16:27:37 1996 David J. MacKenzie <djm@churchy.gnu.ai.mit.edu>
+
+ * config.guess, config.sub: Additions for the Fujitsu UXP/V.
+ From joda@pdc.kth.se (Johan Danielsson).
+
+Tue Nov 19 13:34:12 1996 David J. MacKenzie <djm@churchy.gnu.ai.mit.edu>
+
+ * getpagesize.h: If no sys/param.h, default to 8k.
+ Indent for readability.
+
+Wed Nov 13 14:59:46 1996 Per Bothner <bothner@deneb.cygnus.com>
+
+ * config.guess: Patch for Dansk Data Elektronik servers,
+ from Niels Skou Olsen <nso@dde.dk>.
+
+ For ncr, use /bin/uname rather than uname, since GNU uname does not
+ support -p. Suggested by Mark Mitchell <mmitchell@usa.net>.
+
+ Patch for MIPS R4000 running System V,
+ from Eric S. Raymond <esr@snark.thyrsus.com>.
+
+ Fix thinko for nextstep.
+
+ Patch for OSF1 in i?86, from Dan Murphy <dlm@osf.org> via Harlan Stenn.
+
+ Sat Jun 24 18:58:17 1995 Morten Welinder <terra+@cs.cmu.edu>
+ * config.guess: Guess mips-dec-mach_bsd4.3.
+
+ Thu Oct 10 04:07:04 1996 Harlan Stenn <harlan@pfcs.com>
+ * config.guess (i?86-ncr-sysv*): Emit just enough of the minor
+ release numbers.
+ * config.guess (mips-mips-riscos*): Emit just enough of the
+ release number.
+
+ Tue Oct 8 10:37:22 1996 Frank Vance <fvance@waii.com>
+ * config.guess (sparc-auspex-sunos*): Added.
+ (f300-fujitsu-*): Added.
+
+ Wed Sep 25 22:00:35 1996 Jeff Woolsey <woolsey@jlw.com>
+ * config.guess: Recognize a Tadpole as a sparc.
+
+Wed Nov 13 00:53:09 1996 David J. MacKenzie <djm@churchy.gnu.ai.mit.edu>
+
+ * config.guess: Don't assume that NextStep version is either 2 or
+ 3. NextStep 4 (aka OpenStep 4) has come out now.
+
+Tue Nov 12 18:26:15 1996 Doug Rupp (rupp@gnat.com)
+
+ * pexecute.c (vfork): Supply new definition for VMS.
+ (pwait): Use waitpid instead of wait for VMS.
+
+Mon Nov 11 23:52:03 1996 David J. MacKenzie <djm@churchy.gnu.ai.mit.edu>
+
+ * config.guess: Support Cray T90 that reports itself as "CRAY TS".
+ From Rik Faith <faith@cs.unc.edu>.
+
+Fri Nov 8 11:34:58 1996 David J. MacKenzie <djm@geech.gnu.ai.mit.edu>
+
+ * config.sub: Contributions from bug-gnu-utils to:
+ Support plain "hppa" (no version given) architecture, reported by
+ OpenStep.
+ OpenBSD like NetBSD.
+ LynxOs is not a hardware supplier.
+
+ * config.guess: Contributions from bug-gnu-utils to add support for:
+ OpenBSD like NetBSD.
+ Stratus systems.
+ More Pyramid systems.
+ i[n>4]86 Intel chips.
+ M680[n>4]0 Motorola chips.
+ Use unknown instead of lynx for hardware manufacturer.
+
+Mon Oct 28 17:15:52 1996 Christian Limpach <chris@nice.ch>
+
+ * config.sub: Recognize hppa-next as a valid CPU-COMPANY combination.
+
+Wed Oct 23 17:36:39 1996 Doug Rupp (rupp@gnat.com)
+
+ * choose-temp.c (choose_temp_base): On VMS, use proper syntax
+ for current directory.
+
+Wed Oct 9 23:30:18 1996 Jim Meyering <meyering@wombat.gnu.ai.mit.edu>
+
+ * getloadavg.c: [__hpux]: Define hpux. From Eric Backus.
+ [__sun]: Define sun. Reported by Kaveh Ghazi.
+
+Mon Sep 23 22:45:15 1996 Sean McNeil <sean@mcneil.com>
+
+ * config.sub (-vxsim*): New operating system.
+
+ 1996-09-12 Richard Stallman <rms@ethanol.gnu.ai.mit.edu>
+
+ * config.guess: Use pc instead of unknown, for pc clone systems.
+ Change linux to linux-gnu.
+
+Thu Sep 12 20:12:26 1996 Richard Stallman <rms@ethanol.gnu.ai.mit.edu>
+
+ * config.sub: Use pc instead of unknown, for pc clones.
+ Use -linux-gnu for Linux-based GNU systems.
+
+1996-09-04 Richard Stallman <rms@ethanol.gnu.ai.mit.edu>
+
+ * getloadavg.c (getloadavg): Add new code for SUNOS_5 to use -lkstat.
+
+Sat Aug 17 15:23:39 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * choose-temp.c: Delete !defined(_WIN32) condition when including
+ sys/file.h (NO_SYS_FILE_H is still used).
+ * getopt.c: Change win32 test from WIN32 to _WIN32.
+ * pexecute.c: Update test for win32 (&& ! cygwin32).
+
+Mon Jul 15 23:51:11 1996 Karl Heuer <kwzh@gnu.ai.mit.edu>
+
+ * config.guess: Avoid non-portable tr syntax.
+
+Mon Jul 15 11:53:00 1996 Jeffrey A Law (law@cygnus.com)
+
+ * config.guess (HP 9000/811): Recognize this as a PA1.1
+ machine.
+
+Thu Jul 11 17:02:23 1996 David J. MacKenzie <djm@geech.gnu.ai.mit.edu>
+
+ * install-sh: Add MIT copyright notice. From gordoni@cygnus.com.
+
+Sun Jul 7 13:27:04 1996 Joel Sherrill <joel@merlin.gcs.redstone.army.mil>
+
+ * config.sub: Recognize rtems as an o/s.
+
+Tue Jul 2 16:45:02 1996 Torbjorn Granlund <tege@spiff.gnu.ai.mit.edu>
+
+ * config.guess: Generalize C90 alternative to all x90 machines.
+
+Fri Jun 28 13:29:05 1996 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * config.guess (mips:*:*:UMIPS): Fix typo in last change.
+
+Tue Jun 25 22:43:48 1996 Doug Evans <dje@cygnus.com>
+
+ * pexecute.c (PEXECUTE_VERBOSE): Define.
+ (MPW pexecute): Check flags & PEXECUTE_VERBOSE instead of verbose_flag.
+
+Mon Jun 24 14:32:22 1996 Jim Wilson <wilson@cygnus.com>
+
+ * getopt.c (getpid): Don't redefine it if __CYGWIN32__ is defined.
+
+Thu Jun 20 12:20:33 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * config.guess (*:Linux:*:*): Add support for PowerPC Linux.
+
+Mon Jun 10 16:10:57 1996 Doug Evans <dje@cygnus.com>
+
+ * pexecute.c: New file.
+
+Fri Jun 7 18:16:52 1996 Harlan Stenn <harlan@pfcs.com>
+
+ * config.guess (i?86-ncr-sysv*): Emit minor release numbers.
+ Recognize the NCR 4850 machine and NCR Pentium-based platforms.
+
+Wed Jun 5 00:09:17 1996 Per Bothner <bothner@wombat.gnu.ai.mit.edu>
+
+ * config.guess: Combine mips-mips-riscos cases, and use cpp to
+ distinguish sysv/svr4/bsd variants.
+ Based on a patch from Harlan Stenn <harlan@pfcs.com>.
+
+Mon Jun 3 08:49:14 1996 Karl Heuer <kwzh@gnu.ai.mit.edu>
+
+ * config.guess (*:Linux:*:*): Add guess for sparc-unknown-linux.
+
+Mon May 27 20:16:42 1996 Karl Heuer <kwzh@gnu.ai.mit.edu>
+
+ * getloadavg.c [SOLARIS2]: Define SUNOS_5.
+
+Fri May 24 18:34:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
+
+ * config.guess (AViiON:dgux:*:*): Fix typo in recognizing mc88110.
+
+Wed May 22 17:20:59 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
+
+ * getloadavg.c [WIN32]: No-op as for [MSDOS].
+
+ * getopt.c [WIN32] (getpid): Define using GetCurrentProcessId.
+
+ * getopt.c [VMS]: Include unixlib.h, string.h.
+
+Tue May 21 18:55:59 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
+
+ * config.sub: Restore `hp9k2[0-9][0-9] | hp9k31[0-9])' case line
+ apparently accidentally removed in the last change.
+
+Mon May 20 11:58:15 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * config.sub: Recognize -proelf as a basic system type.
+
+Fri May 3 02:35:56 1996 Noah Friedman <friedman@prep.ai.mit.edu>
+
+ * mkinstalldirs: Don't report an error if mkdir fails because
+ a directory was created by another process.
+
+Sun Apr 21 09:50:09 1996 Stephen L Moshier (moshier@world.std.com)
+
+ * choose-temp.c: Include sys/types.h before sys/file.h for sco3.2v5.
+
+Tue Apr 9 14:37:31 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * obstack.h [__STDC__] (obstack_init, obstack_begin,
+ obstack_specify_allocation, obstack_specify_allocation_with_arg,
+ obstack_chunkfun, obstack_freefun): Duplicate definition with complete
+ type cast.
+
+Wed Apr 17 14:28:43 1996 Doug Evans <dje@cygnus.com>
+
+ * choose-temp.c: Don't include sys/file.h ifdef NO_SYS_FILE_H.
+ #include <stdio.h>.
+ (choose_temp_base): Make tmp,usrtmp, static locals.
+
+Mon Apr 15 14:08:12 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * choose-temp.c: New file.
+
+Fri Apr 12 20:03:59 1996 Per Bothner <bothner@spiff.gnu.ai.mit.edu>
+
+ * config.guess: Combine two OSF1 rules.
+ Also recognize field test versions. From mjr@zk3.dec.com.
+
+ * config.guess (dgux): Use /usr/bin/uname rather than uname,
+ because GNU uname does not support -p. From pmr@pajato.com.
+
+Mon Apr 8 16:16:20 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * config.guess (prep*:SunOS:5.*:*): Turn into
+ powerpele-unknown-solaris2.
+
+Thu Mar 28 02:06:03 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
+
+ * error.c (_): New macro, define iff undefined.
+ (private_strerror): Use it for message string.
+ (error_at_line): New function.
+ (error_one_per_line): New variable.
+ * error.h (error_at_line, error_one_per_line): Declare them.
+
+Thu Mar 21 14:42:26 1996 Doug Evans <dje@cygnus.com>
+
+ * config.sub (os): sunos[3456] -> sunos[34],
+ sunos[56] have their own entries.
+
+Wed Mar 20 09:59:30 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
+
+ * signame.c [HAVE_STRING_H]: Include string.h.
+
+Tue Mar 19 20:07:39 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
+
+ * alloca.c (NULL): Define only if not already defined.
+
+ * alloca.c [HAVE_STRING_H]: Include string.h.
+ [HAVE_STDLIB_H]: Include stdlib.h.
+
+Thu Mar 14 19:12:52 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * config.guess: Recognize mips-*-sysv*, with a specific case for
+ NEC (which has its own compiler and libraries).
+
+Sat Mar 9 23:52:33 1996 Jim Meyering (meyering@na-net.ornl.gov)
+
+ * getdate.y (RelativeMonth): Add 1900 to the year so that relative
+ date specs that push the year through the end of the century work.
+ For example, `date -d "01/01/1998 3 years" +%Y' now prints 2001.
+ From Peter Dalgaard (pd@kubism.ku.dk).
+
+Tue Mar 5 18:43:43 1996 Richard Henderson <rth@tamu.edu>
+
+ * config.sub: Add -apple and -aux.
+
+Tue Mar 5 03:02:53 1996 Erik Naggum <erik@naggum.no>
+
+ * config.sub (moss): Fix previous change.
+
+Mon Mar 4 18:03:38 1996 Bryan Ford (baford@cs.utah.edu)
+
+ * config.sub: Accept -moss* as op sys.
+
+Fri Mar 1 09:57:54 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
+
+ * config.sub: Recognize cpu-vendor [ctj]90-cray, default
+ c90-cray-unicos. From tege.
+
+Wed Feb 28 19:55:05 1996 Miles Bader <miles@gnu.ai.mit.edu>
+
+ * getopt.c (_getopt_internal): Always set OPTOPT to *something* if
+ returning '?', so it can be distinguished from an option.
+
+Thu Feb 22 15:51:09 1996 Karl Heuer <kwzh@gnu.ai.mit.edu>
+
+ * getdate.y (Convert): Accept dates beyond 1999.
+
+Tue Feb 13 13:20:32 1996 Miles Bader <miles@gnu.ai.mit.edu>
+
+ * getopt.c (_getopt_internal): Give FIRST_NONOPT & LAST_NONOPT
+ rational values if OPTIND has been moved back by the user.
+
+Mon Feb 12 18:23:35 1996 Doug Evans <dje@cygnus.com>
+
+ * config.sub: Recognize sparclet cpu.
+
+Sun Feb 11 18:40:11 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * config.sub: Fix typo in previous change.
+
+Sat Feb 10 08:28:12 1996 Martin Anantharaman <martin@goofy.imech.uni-duisburg.de>
+
+ * config.sub (-psos*): New case.
+
+Thu Feb 8 15:37:52 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * config.guess (UNAME_VERSION): Recognize X4.x as an OSF version.
+
+Sun Feb 4 16:51:11 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * config.guess (*:CYGWIN*): New
+
+Mon Feb 12 15:33:59 1996 Christian Bauernfeind <chrisbfd@theorie3.physik.uni-erlangen.de>
+
+ * config.guess: Support m68k-cbm-sysv4.
+
+Sat Feb 10 12:06:42 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * config.guess (*:Linux:*:*): Guess m68k-unknown-linux and
+ m68k-unknown-linuxaout from linker help string. Put quotes around
+ $ld_help_string.
+
+Wed Feb 7 15:31:09 1996 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * getopt.c [__GNU_LIBRARY__]: Include <unistd.h>.
+
+ * getopt.c (nonoption_flags, nonoption_flags_len): New variables.
+ (_getopt_initialize): If not POSIXLY_CORRECT, check for special
+ environment variable from Bash 2.0 and set those vars from it.
+ (_getopt_internal): Do not consider as options argv elts whose
+ nonoption_flags elt from the shell is '1'.
+
+Thu Feb 1 09:10:02 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * config.sub (-cygwin32): New.
+
+Wed Jan 31 14:13:25 1996 Richard Henderson <rth@tamu.edu>
+
+ * config.sub: Add support for A/UX.
+ * config.guess: Recognize A/UX.
+
+Tue Jan 23 13:15:50 1996 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * obstack.h [__STDC__] (struct obstack, _obstack_begin,
+ _obstack_begin_1): Use prototypes in function decls.
+ * obstack.c (CALL_CHUNKFUN, CALL_FREEFUN): Cast function type for
+ call w/o extra_arg.
+
+ * error.c (error_print_progname) [__STDC__]: Declare with
+ prototype.
+ [_LIBC]: Include errno.h to declare program_invocation_name.
+
+ * getopt.c [__STDC__] (exchange, _getopt_initialize): Declare
+ prototypes for these.
+
+Mon Jan 22 08:53:45 1996 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * xmalloc.c [__STDC__] (fixup_null_alloc): Declare prototype.
+
+Sun Jan 21 01:08:09 1996 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * error.h: Declare error_print_progname. Add comments.
+
+Wed Jan 17 17:39:51 1996 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * config.sub: Default OS to nextstep if machine vendor is Next.
+ -ns2 is an alias for -nextstep.
+
+Wed Jan 17 09:51:58 1996 Doug Evans <dje@cygnus.com>
+
+ * config.sub: Recognize go32* as an os.
+
+Sun Jan 7 02:00:27 1996 Karl Heuer <kwzh@gnu.ai.mit.edu>
+
+ * alloca.c (alloca): If malloc fails, just abort.
+
+Mon Jan 15 20:59:49 1996 J. Kean Johnston <hug@netcom.com>
+
+ * config.sub (sco5): New case.
+
+Tue Dec 19 15:56:15 1995 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * getloadavg.c (getloadavg) [MSDOS]: Return 0 load instead of
+ failing the call.
+
+Fri Dec 15 22:34:08 1995 Stan Coxs <coxs@dg-rtp.dg.com>
+
+ * config.guess (AViiON): Add ix86-dg-dgux
+ * config.sub (i*86*) Change [345] to [3456]
+
+Thu Dec 7 09:03:24 1995 Tom Horsley <Tom.Horsley@mail.hcsc.com>
+
+ * config.guess (powerpc-harris-powerunix): Add guess for port
+ to new target.
+
+Wed Dec 6 09:44:53 1995 Paul Eggert <eggert@twinsun.com>
+
+ * install-sh (transformbasename): Fix misspelling in initialization.
+
+Wed Dec 6 06:58:23 1995 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * config.sub: Recognize aof in the OS field.
+
+Tue Dec 5 18:36:41 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * error.c [_LIBC]: Adapt for use in GNU libc.
+
+Mon Dec 4 13:21:51 1995 Jeffrey A. Law <law@mole.gnu.ai.mit.edu>
+
+ * config.guess: Recognize HP model 816 machines as having
+ a PA1.1 processor.
+
+Thu Nov 30 16:57:33 1995 Per Bothner <bothner@wombat.gnu.ai.mit.edu>
+
+ * config.guess: Recognize Pentium under SCO.
+ From Robert Lipe <robertl@arnet.com>.
+
+Tue Nov 21 16:59:12 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * getdate.y: If config.h defines FORCE_ALLOCA_H, include alloca.h.
+
+Mon Oct 16 11:34:00 1995 Jeffrey A. Law <law@mole.gnu.ai.mit.edu>
+
+ * config.guess: Recognize HP model 819 machines as having
+ a PA 1.1 processor.
+
+Sat Sep 30 14:03:17 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * getopt.c (_): New macro, define if not already defined.
+ (gettext): Never define as a macro.
+ (_getopt_internal): Use ``_("message")'' instead of
+ `gettext ("message")''.
+
+Mon Aug 14 19:27:56 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * config.guess (*Linux*): Add missing "exit"s.
+ Also, need specific check for alpha-unknown-linux (uses COFF).
+
+Fri Jul 28 00:16:31 1995 Jeffrey A. Law <law@rtl.cygnus.com>
+
+ * config.guess: Recognize lynx-2.3.
+
+Thu Jul 27 13:31:05 1995 Fred Fish (fnf@cygnus.com)
+
+ * config.guess (*:Linux:*:*): First try asking the linker what the
+ default object file format is (elf, aout, or coff). Then if this
+ fails, try previous methods.
+
+Mon Aug 7 16:48:13 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * getloadavg.c [ps2]: Use nlist instead of knlist #ifdef _AIX.
+
+Fri Aug 4 10:27:54 1995 Jim Meyering (meyering@comco.com)
+
+ * getopt.c (_getopt_internal) [lint]: Initialize INDFOUND to
+ avoid warning from gcc.
+
+Tue Aug 1 14:29:43 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * getloadavg.c (getloadavg): Set FD_CLOEXEC flag on /dev/kmem file
+ descriptor.
+
+Wed Jul 26 00:26:34 1995 David J. MacKenzie <djm@geech.gnu.ai.mit.edu>
+
+ * mkinstalldirs: Remove weird unnecessary shell construction.
+
+Wed Jun 28 17:57:27 1995 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * config.guess (AIX4): More robust release numbering discovery.
+
+Thu Jun 22 19:01:24 1995 Kenneth Stailey (kstailey@eagle.dol-esa.gov)
+
+ * config.guess (i386-sequent-ptx): Properly get version number.
+
+Thu Jun 22 18:36:42 1995 Uwe Seimet (seimet@iris1.chemie.uni-kl.de)
+
+ * config.guess (mips:*:4*:UMIPS): New case.
+
+Tue Jun 20 02:41:41 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * getloadavg.c [convex] (LOAD_AVE_TYPE, LDAV_CVT): Define to
+ double, no conversion.
+
+ * obstack.c (OBSTACK_INTERFACE_VERSION): New macro. Rewrote
+ conditionals to use that macro to ensure that the installed GNU
+ libc supports the interface the obstack.h corresponding to this
+ obstack.c needs, and only then elide the code in this file.
+
+Sun May 28 18:53:29 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * config.guess (21064:Windows_NT:50:3): New case.
+
+Fri May 19 16:52:50 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * error.c (error_message_count): New variable.
+ (error): Increment it.
+ * error.h: Declare error_message_count.
+
+Mon May 15 17:47:55 1995 Per Bothner (bothner@spiff.gnu.ai.mit.edu)
+
+ * config.guess: Recognize Cray90 (from Pete TerMaat).
+
+Thu May 11 17:13:14 1995 Per Bothner (bothner@wombat.gnu.ai.mit.edu)
+
+ * config.guess: Recognize PCs running Solaris2.
+ (Patch from Bruno Haible <haible@ma2s2.mathematik.uni-karlsruhe.de>.)
+ * config.guess: Merge two CRAY*Y-MP entries.
+ Ignore system field for Cray xmp and cray2 since "uname -s" on
+ a Cray gets you the hostname, which is useless.
+ (According to Pete TerMaat <pete@guava.cray.com>.)
+
+Wed May 10 11:03:56 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * getloadavg.c: AIX support from Tim Bell <tbel@afsmail.cern.ch>:
+ [_AIX] (LOAD_AVE_TYPE, FSCALE, NLIST_STRUCT): Define these for AIX.
+ (getloadavg) [_AIX]: Use `knlist' instead of `nlist'.
+
+Fri May 5 05:50:56 1995 Allen Briggs (briggs@puma.bevd.blacksburg.va.us)
+
+ * config.guess: Add more NetBSD cases: atari, sun3*, and mac68k.
+
+Wed May 3 16:22:31 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * crt0.c: Add APOLLO alternative.
+
+Sat Apr 29 15:48:03 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * signame.c: Move include of config.h before all others.
+
+Thu Apr 27 11:33:29 1995 Michael Meissner (meissner@cygnus.com)
+
+ * config.guess (*:Linux:*:*): Check for whether the pre-BFD linker is
+ installed, and if so return linuxoldld as the system name.
+
+Thu Apr 27 13:11:11 1995 Jim Meyering (meyering@comco.com)
+
+ * error.h: Use __-protected versions of `format' and `printf'
+ attributes only with gcc-2.7 and later.
+
+Thu Apr 27 09:22:33 1995 Peder Chr. Norgaard <pcn@tbit.dk>
+
+ * config.guess (i[34]86:*:3.2:*) test for /usr/options/cb.name
+ before calling uname.
+
+Wed Apr 26 17:19:34 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * signame.c [HAVE_UNISTD_H]: Include unistd.h so it can declare
+ sys_siglist.
+
+Wed Apr 26 14:00:00 1995 Michael Meissner (meissner@cygnus.com)
+
+ * config.guess (*:Linux:*:*): Determine whether the default compiler is
+ a.out or ELF based.
+ (parisc*:Lites*:*:*): New entry from Jeff Law.
+
+Wed Apr 26 11:48:21 1995 Jim Meyering (meyering@comco.com)
+
+ * error.h: New file.
+
+Wed Apr 26 10:27:50 1995 Travis L Priest (T.L.Priest@larc.nasa.gov)
+
+ * config.guess (CRAY*Y-MP:*:*:*): New entry.
+
+Wed Apr 26 12:54:26 1995 Jeffrey A. Law <law@snake.cs.utah.edu>
+
+ * config.guess: Add hppa1.1-hp-lites support.
+
+Thu Apr 6 19:55:54 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * crt0.c [__bsdi__]: Maybe declare __progname.
+
+Fri Mar 24 00:52:31 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * getopt.c (_getopt_internal): When optind is zero, bump it to 1
+ after initializing; we don't want to scan ARGV[0], which is the
+ program name.
+
+Tue Mar 21 16:44:37 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * signame.c (signame_init): Define SIGINFO.
+
+Tue Mar 7 01:41:09 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * signame.c (strsignal): Cast sys_siglist elt to char *.
+
+Thu Feb 23 18:42:16 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * signame.h [! __STDC__]: Don't use prototype for strsignal decl.
+
+Wed Feb 22 19:08:43 1995 Niklas Hallqvist (niklas@appli.se)
+
+ * config.guess: Recognize NetBSD/Amiga as m68k-cbm-netbsd.
+
+Tue Feb 21 22:13:19 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * signame.h (strsignal): Declare it.
+ * signame.c [! HAVE_STRSIGNAL] (strsignal): New function.
+
+Wed Feb 8 10:03:36 1995 David J. MacKenzie <djm@geech.gnu.ai.mit.edu>
+
+ * install-sh config.guess mkinstalldirs: Add a blank in the #!
+ line for 4.2BSD, Dynix, etc.
+
+Sat Feb 4 12:59:59 1995 Jim Wilson <wilson@cygnus.com>
+
+ * config.guess (IRIX): Sed - to _.
+
+Sat Jan 28 20:09:49 1995 Daniel Hagerty <hag@duality.gnu.ai.mit.edu>
+
+ * error.c: Under older versions of SCO, strerror is a preprocessor
+ macro. Added a check for this.
+
+Fri Jan 27 09:55:28 1995 Jim Meyering (meyering@comco.com)
+
+ * getdate.y: Remove obsolete comments. Rewrite others.
+
+Mon Jan 23 19:41:57 1995 Karl Heuer <kwzh@hal.gnu.ai.mit.edu>
+
+ * config.guess (i[34]86:*:3.2:*): Test for ISC before SCO; newer
+ ISC releases have uname -X.
+
+Tue Jan 10 09:26:41 1995 Jim Meyering (meyering@comco.com)
+
+ * getdate.y (ToSeconds): Interpret 12am as 00:00 and 12pm as 12:00.
+ Before, `date -d 'Jan 1 12am'' printed `...12:00:00...'.
+ From Takeshi Sone <ts1@tsn.or.jp>.
+
+Sat Jan 7 11:57:40 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * getloadavg.c: Include config.h first.
+
+Wed Jan 4 15:52:17 1995 Per Bothner (bothner@spiff.gnu.ai.mit.edu)
+
+ * config.guess: Recognize BSD/OS as bsdi.
+ Patch from Chris Torek <torek@BSDI.COM>.
+
+Wed Dec 21 15:51:08 1994 Warner Losh (imp@boulder.openware.com)
+
+ * config.guess (sun4:SunOS:*:*): Handle Solbourne OS/MP systems.
+
+Tue Dec 6 02:29:42 1994 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * config.guess (dummy.c) [sony]: Include <sys/param.h> and emit
+ newsos4 #ifdef NEWSOS4.
+
+Tue Nov 29 17:01:29 1994 Mark Dapoz (md@bsc.no)
+
+ * config.guess (ibmrt): Add more cases for various forms of BSD.
+
+Tue Nov 29 16:19:54 1994 Paul Eggert <eggert@twinsun.com>
+
+ * getopt.c (_getopt_internal): Add gettext wrappers around
+ message strings.
+
+ * xmalloc.c (fixup_null_alloc): Add gettext wrapper.
+ Capitalize initial letter of error message, for consistency
+ with regex.c.
+
+Fri Nov 25 19:22:24 1994 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * crt0.c (start1): Add self reference.
+
+Wed Nov 23 16:51:11 1994 R. Bernstein (rocky@panix.com)
+
+ * config.guess: Add cases for romp-ibm-aix and romp-ibm-bsd.
+
+Mon Nov 14 19:03:29 1994 Per Bothner (bothner@spiff.gnu.ai.mit.edu)
+
+ * config.guess: Support paragon as i860-intel-osf1. (From RMS.)
+
+Fri Nov 11 14:04:58 1994 Andreas Luik (luik@isa.de)
+
+ * obstack.h: Add one missing test on value of __STDC__.
+
+Sat Nov 05 08:08:52 1994 Jim Meyering (meyering@comco.com)
+
+ * obstack.h: NextStep 2.0 cc is really gcc 1.93 but it defines
+ __GNUC__ = 2 and does not implement __extension__. So add
+ `|| (__NeXT__ && !__GNUC_MINOR__)' to the test for whether to
+ define-away __extension__. Reported by Kaveh Ghazi.
+
+Thu Nov 03 14:36:58 1994 Jim Meyering (meyering@comco.com)
+
+ * filemode.c (rwx): Use S_IRUSR, S_IWUSR, S_IXUSR instead of
+ obsolete S_IREAD, S_IWRITE, S_IEXEC.
+ Make sure the former three are defined.
+
+Tue Nov 1 14:24:39 1994 Per Bothner (bothner@spiff.gnu.ai.mit.edu)
+
+ * config.guess (*-unknown-freebsd): Remove [-(] from
+ UNAME_RELEASE. Patch from Warner Losh <imp@village.org>.
+
+Mon Oct 31 07:02:15 1994 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * getopt.h: Change #if __STDC__ to #if defined (__STDC__) &&
+ __STDC__.
+ * getopt.c: Change #ifndef __STDC__ to #if !defined (__STDC__) ||
+ !__STDC__.
+ * getopt1.c: Likewise.
+ * obstack.c: Change #ifdef __STDC__ to #if defined (__STDC__) &&
+ __STDC__.
+ * obstack.h: Likewise.
+
+Wed Oct 26 20:34:59 1994 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * getloadavg.c [alliant && i860] (FSCALE): Move defn before
+ #ifndef FSCALE.
+
+Tue Oct 25 19:10:41 1994 Paul Eggert <eggert@twinsun.com>
+
+ * xmalloc.c (fixup_null_alloc): New function.
+ (xmalloc, xrealloc): Use it to fix up returned NULL values,
+ instead of preemptively adjusting a zero N to 1.
+
+Tue Oct 25 11:22:30 1994 David J. MacKenzie <djm@duality.gnu.ai.mit.edu>
+
+ * xmalloc.c (xmalloc, xrealloc): If 0 bytes requested, pretend
+ it's 1, for diff.
+
+Thu Oct 20 18:47:53 1994 Per Bothner (bothner@wombat.gnu.ai.mit.edu)
+
+ * config.guess: Better support for NCR - covers more machines,
+ and prints sysv4.3 if uname says the OS is 4.3.
+ Patch from Tom McConnell <tmcconne@sedona.intel.com>.
+
+Wed Oct 19 15:55:38 1994 David J. MacKenzie <djm@duality.gnu.ai.mit.edu>
+
+ * config.guess: Add licensing exception for Autoconf.
+
+Tue Oct 18 19:26:31 1994 David Edelsohn (edelsohn@npac.syr.edu)
+
+ * config.guess: Revise support for AIX 4.1 on POWER and PowerPC.
+
+Mon Oct 17 19:16:38 1994 David Edelsohn <edelsohn@npac.syr.edu>
+
+ * config.guess: Add support for AIX 4.1 and architecture.
+
+Wed Oct 12 16:51:35 1994 David J. MacKenzie (djm@duality.gnu.ai.mit.edu)
+
+ * error.c: Add hook for alternate name printing function.
+ From Franc,ois Pinard.
+ Use varargs for _doprnt too.
+
+ * xmalloc.c: Add hook for alternate exit status.
+ From Franc,ois Pinard.
+
+Mon Oct 10 17:35:19 1994 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * getpagesize.h: If NBPC is not defined, try PAGESIZE.
+
+Fri Oct 07 18:53:28 1994 Jim Meyering (meyering@comco.com)
+
+ * filemode.c: Remove #if 0'd block around mode_t definition.
+ From Andreas Luik (luik@marx.isa.de).
+
+Thu Oct 06 21:15:16 1994 Jim Meyering (meyering@comco.com)
+
+ * pathmax.h: Fix typo: HAVE_SYS_PATH_MAX_H -> HAVE_SYS_PARAM_H.
+ From Andreas Schwab (schwab@issan.informatik.uni-dortmund.de).
+
+Thu Oct 6 18:02:32 1994 Per Bothner (bothner@wombat.gnu.ai.mit.edu)
+
+ * config.guess: Patch from Chris Smith <csmith@mozart.convex.com>
+ to handle old Convex systems without uname.
+
+Tue Oct 4 03:02:39 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * getdate.y (main): Use MAX_BUFF_LEN consistently.
+ Clear the last element of buf.
+
+Mon Oct 3 01:48:48 1994 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * config.guess: Recognize GNU.
+
+Thu Sep 29 18:47:34 1994 Jerry Frain (jerry@sneffels.tivoli.com)
+
+ * config.guess (i[34]86:UNIX_SV:4.*:*): Remove "UNIX_SV" for
+ Unixware; move DYNIX above this one now that this is wildcard.
+
+Wed Sep 28 17:00:12 1994 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * getloadavg.c [alliant && i860] (LOAD_AVE_TYPE, FSCALE,
+ NLIST_STRUCT): Define.
+
+Mon Sep 26 17:53:05 1994 David J. MacKenzie (djm@churchy.gnu.ai.mit.edu)
+
+ * alloca.c error.c filemode.c getopt.c getopt1.c getdate.y
+ getloadavg.c getugroups.c getusershell.c signame.c:
+ Remove CONFIG_BROKETS ifdef. No one should use "config.h".
+
+Sat Sep 24 21:20:12 1994 Jim Meyering (meyering@comco.com)
+
+ * getdate.y [struct _TABLE]: Add `const' to NAME member dcl.
+
+Fri Sep 23 02:39:55 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * crt0.c [__FreeBSD__] (__progname): Declared.
+
+Tue Sep 20 23:27:02 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * getdate.y: Whitespace reformatted.
+ (MAX_BUFF_LEN): New macro.
+ (main): Use fgets, not gets. Use MAX_BUFF_LEN to declare buff.
+
+Mon Sep 19 18:25:40 1994 Per Bothner (bothner@kalessin.cygnus.com)
+
+ * config.guess (HP-UX): Patch from Harlan Stenn
+ <harlan@landmark.com> to also emit release level.
+
+Wed Sep 7 13:15:25 1994 Jim Wilson (wilson@sphagnum.cygnus.com)
+
+ * config.guess (sun4*:SunOS:*:*): Change '-JL' to '_JL'.
+
+Fri Sep 16 20:16:36 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * getloadavg.c (getloadavg): Add OSF_ALPHA support.
+
+Fri Sep 16 18:34:22 1994 Paul Eggert <eggert@twinsun.com>
+
+ * getdate.y (difftm): Don't store a long value into an int variable.
+
+Thu Sep 08 00:26:29 1994 Jim Meyering (meyering@comco.com)
+
+ * getdate.y: Accept `MESZ' timezone.
+
+Sun Aug 28 18:13:45 1994 Per Bothner (bothner@kalessin.cygnus.com)
+
+ * config.guess (*-unknown-freebsd*): Get rid of possible
+ trailing "(Release)" in version string.
+ Patch from Paul Richards <paul@isl.cf.ac.uk>.
+
+Sat Aug 27 15:00:49 1994 Per Bothner (bothner@kalessin.cygnus.com)
+
+ * config.guess: Fix i486-ncr-sysv43 -> i486-ncr-sysv4.3.
+ Fix type: *-next-neststep -> *-next-nextstep.
+
+Sat Jun 4 17:23:54 1994 Per Bothner (bothner@kalessin.cygnus.com)
+
+ * configure.in: Use mh-ncrsvr43. Patch from
+ Tom McConnell <tmcconne@sedona.intel.com>.
+
+Sat Aug 27 17:21:04 1994 Jim Meyering (meyering@comco.com)
+
+ * filemode.c [STAT_MACRO_BROKEN]: Remove spurious #ifdef's.
+
+Fri Aug 26 19:17:22 1994 Per Bothner (bothner@spiff.gnu.ai.mit.edu)
+
+ * config.guess (netbsd, freebsd, linux): Accept any machine,
+ not just i[34]86.
+
+Fri Aug 26 18:45:25 1994 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * config.guess: Recognize powerpc-ibm-aix3.2.5.
+
+Fri Aug 26 15:12:50 1994 Per Bothner (bothner@kalessin.cygnus.com)
+
+ * config.guess: Merges from Cygnus version.
+ (alpha-dec-osf*): More general.
+ (*-hp-hpux*): Combine cases.
+ (*-next-ns[23]): Rename to *-next-neststep[23].
+ Make code fragment shorter.
+ (config.guess, i386-unknown-bsd): Don't recognize __bsdi__ here;
+ it is handled using uname.
+
+ Sat Jul 16 12:03:08 1994 Stan Shebs (shebs@andros.cygnus.com)
+
+ * config.guess: Recognize m88k-harris-csux7.
+
+ Tue Jun 28 13:43:25 1994 Jim Kingdon (kingdon@lioth.cygnus.com)
+
+ * config.guess: Recognize Mach.
+
+ Wed Apr 6 20:44:56 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
+
+ * config.guess: Add SINIX support.
+
+ Sun Mar 6 23:13:38 1994 Hisashi MINAMINO (minamino@sra.co.jp)
+
+ * config.guess: about target *-hitachi-hiuxwe2, fixed
+ machine guessing order. [Hitachi's CPU_IS_HP_MC68K
+ macro is incorrect.]
+
+ Thu Feb 24 07:09:04 1994 Jeffrey A. Law (law@snake.cs.utah.edu)
+
+ * config.guess: Handle OSF1 running on HPPA processors
+
+ Fri Feb 11 15:33:33 1994 Stu Grossman (grossman at cygnus.com)
+
+ * config.guess: Add Lynx/rs6000 config support.
+
+Thu Aug 25 20:28:51 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * config.guess (Pyramid*:OSx*:*:*): New case.
+ (PATH): Add /.attbin at end for finding uname.
+ (dummy.c): Handle i860-alliant-bsd. Follow whitespace conventions.
+
+Wed Aug 17 18:21:02 1994 Tor Egge (tegge@pvv.unit.no)
+
+ * config.guess (M88*:DolphinOS:*:*): New case.
+
+Thu Aug 11 17:00:13 1994 Stan Cox (coxs@dg-rtp.dg.com)
+
+ * config.guess (AViiON:dgux:*:*): Use TARGET_BINARY_INTERFACE
+ to select whether to use ELF or COFF.
+
+Thu Jul 28 19:16:24 1994 Uwe Seimet (seimet@chemie.uni-kl.de)
+
+ * config.guess: Recognize m68k-atari-sysv4.
+
+Sun Jul 24 16:20:53 1994 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * config.guess: Recognize i860-stardent-sysv and i860-unknown-sysv.
+
+Sat Jul 23 02:15:01 1994 Karl Heuer (karl@hal.gnu.ai.mit.edu)
+
+ * config.guess (isc): Distinguish isc from generic sysv32.
+
+Mon Jul 11 23:55:13 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getopt.c (posixly_correct): New variable.
+ (_getopt_initialize): Set posixly_correct from envvar.
+ (_getopt_internal): Don't use "illegal" in error message
+ unless posixly_correct.
+
+Sun Jul 03 08:46:58 1994 Jim Meyering (meyering@comco.com)
+
+ * pathmax.h: Add HAVE_SYS_PARAM_H to and remove !MS_DOS from
+ preprocessor conditional guarding inclusion of sys/param.h.
+
+Mon Jun 20 23:45:34 1994 Jim Meyering (meyering@comco.com)
+
+ * modechange.c (mode_compile) [lint]: Initialize CHANGE to suppress
+ used uninitialized compiler warning.
+
+Wed Jun 15 19:07:49 1994 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * config.guess (alpha): Supoort OSF/1 V2.0 and later.
+
+Tue Jun 14 17:50:05 1994 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * obstack.h (obstack_grow{,0}): Cast WHERE to char * before
+ passing to bcopy.
+
+Mon Jun 6 04:59:28 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * config.guess: Add support for bsdi.
+
+Sat Jun 4 01:24:59 1994 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * getloadavg.c: Put #include of errno.h and decl of errno before
+ #ifndef HAVE_GETLOADAVG.
+
+Thu Jun 2 13:42:39 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * alloca.c [emacs]: Block input around the garbage reclamation.
+ Include blockinput.h.
+
+Tue May 10 16:53:55 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * config.guess: Add trap cmd to remove dummy.c and dummy when
+ interrupted.
+
+Sun May 1 10:23:10 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * config.guess: Guess the OS version for HPUX.
+
+Wed Apr 27 15:14:26 1994 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * install.sh: If $dstdir exists, don't check whether each
+ component does.
+
+Mon Apr 25 14:39:06 1994 Poul-Henning Kamp (phk@login.dkuug.dk)
+
+ * config.guess: Recognize FreeBSD.
+
+Sun Apr 24 17:56:58 1994 Jim Meyering (meyering@comco.com)
+
+ * getdate.y (difftm, get_date): Revert my April 18 changes.
+ Paul Eggert pointed out that that hack probably wouldn't work
+ for places like Chile that had DST in effect on 31 Dec 1970.
+ * (get_date): Instead, add 60 minutes to timezone if DST is in
+ effect locally. From andy@eng.kvaerner.no (Andrew Walker).
+ Remove static declaration of `RCS.'
+
+Fri Apr 22 22:15:28 1994 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * install.sh: Add -d, -t, -b options. Make leading directories.
+ Don't partially install files.
+ From zoo@cygnus.com.
+
+Wed Apr 20 18:07:13 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * config.guess (dummy.c): Redirect stderr for `hostinfo' command.
+ (dummy): Redirect stderr from compilation of dummy.c.
+
+Wed Apr 20 06:36:32 1994 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * config.guess: Recognize UnixWare 1.1 (UNAME_SYSTEM is SYSTEM_V
+ instead of UNIX_SV for UnixWare 1.0).
+
+Mon Apr 18 22:01:27 1994 Jim Meyering (meyering@comco.com)
+
+ * getdate.y (difftm): Remove function.
+ (get_date): Get timezone *without DST bias* from localtime(&zero).
+ Modeled after the hack in localtime.pl from the perl distribution.
+ This fixes an error that had `date -d '4apr94'' producing
+ `Sun Apr 3 23:00:00 CDT 1994'.
+
+Fri Apr 15 22:46:59 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getdate.y: Delete special alloca code.
+
+Tue Apr 12 15:05:08 1994 Noah Friedman (friedman@prep.ai.mit.edu)
+
+ * config.guess: Merge rms' new entry for i486-ncr-sysv4 with the
+ previously existing one.
+
+Mon Apr 11 00:54:33 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getopt.c [not __GNU_LIBRARY__] [__GCC__] [not __STDC__]:
+ Declare strlen to return int. Don't include stddef.h.
+
+ * config.guess: Add 3[34]??,3[34]??:*:4.0:* for i486-ncr-sysv4.
+
+Sat Apr 9 14:59:28 1994 Christian Kranz (kranz@sent5.uni-duisburg.de)
+
+ * config.guess: Distinguish between NeXTStep 2.1 and 3.x.
+
+Fri Apr 1 00:38:17 1994 Jim Wilson (wilson@mole.gnu.ai.mit.edu)
+
+ * obstack.h, getopt.c: Delete use of IN_GCC to control whether
+ stddef.h or gstddef.h is included.
+
+Fri Mar 25 23:01:17 1994 David J. MacKenzie (djm@geech.gnu.ai.mit.edu)
+
+ * mkinstalldirs: Preserve leading slash in file names.
+ From Jim Meyering.
+
+Sun Mar 20 01:29:20 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * alloca.s [emacs]: Use <...> to include config.h.
+
+Tue Mar 1 21:53:03 1994 Karl Heuer (kwzh@hal.gnu.ai.mit.edu)
+
+ * config.guess (UNAME_VERSION): Recognize aix3.2.4 and aix3.2.5.
+
+Thu Feb 24 14:54:23 1994 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * getopt.c: Remove #ifdef GETOPT_COMPAT and #if 0 code.
+ (_getopt_initialize): New function, broken out of _getopt_internal.
+ (_getopt_internal):
+ If long_only and the ARGV-element has the form "-f", where f is
+ a valid short option, don't consider it an abbreviated form of
+ a long option that starts with f. Otherwise there would be no
+ way to give the -f short option.
+
+Thu Feb 10 14:44:16 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getopt.c [not __GNU_LIBRARY__] [__GNUC__] [not IN_GCC]:
+ Test just __STDC__, not emacs.
+
+Wed Feb 9 17:46:31 1994 Karl Heuer (kwzh@mole.gnu.ai.mit.edu)
+
+ * getdate.y (difftm): Simplify return expression.
+
+Wed Feb 9 00:14:00 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getopt.c [not __GNU_LIBRARY__] [__GNUC__] [not IN_GCC]
+ [emacs] [not __STDC__]: Don't include stddef.h. Don't declare strlen.
+
+Tue Feb 8 14:14:31 1994 David J. MacKenzie (djm at douglas.gnu.ai.mit.edu)
+
+ Handle obstack_chunk_alloc returning NULL. This allows
+ obstacks to be used by libraries, without forcing them
+ to call exit or longjmp.
+ * obstack.c (_obstack_begin, _obstack_begin_1, _obstack_newchunk):
+ If CALL_CHUNKFUN returns NULL, set alloc_failed, else clear it.
+ (_obstack_begin, _obstack_begin_1): Return 1 if successful, 0 if not.
+ * obstack.h (struct obstack): Add alloc_failed flag.
+ _obstack_begin, _obstack_begin_1): Declare to return int, not void.
+ (obstack_finish): If alloc_failed, return NULL.
+ (obstack_base, obstack_next_free, objstack_object_size):
+ If alloc_failed, return 0.
+ (obstack_grow, obstack_grow0, obstack_1grow, obstack_ptr_grow,
+ obstack_int_grow, obstack_blank): If alloc_failed, do nothing that
+ could corrupt the obstack.
+ (obstack_chunkfun, obstack_freefun): New macros, used in GDB.
+
+Sun Jan 30 17:58:06 1994 Ken Raeburn (raeburn@cujo.cygnus.com)
+
+ * config.guess: Recognize vax hosts.
+
+Mon Jan 24 18:40:06 1994 Per Bothner (bothner@kalessin.cygnus.com)
+
+ * config.guess: Clean up NeXT support, to allow nextstep
+ on Intel machines. Make OS be nextstep.
+
+Sun Jan 23 18:47:22 1994 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * config.guess: Add alternate forms for Convex.
+
+Thu Jan 6 14:00:23 1994 david d `zoo' zuhn (zoo@cygnus.com)
+
+ * config.guess: add support for Tektronix 68k and 88k boxes;
+ better Apollo, Sony NEWS information
+
+Sun Dec 26 03:58:32 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * filemode.c (ftypelet): Don't use mode_t. Take long arg.
+ (mode_t): Don't ever define it.
+ (mode_string): Cast ftypelet's arg to long.
+
+Fri Dec 24 19:43:00 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu)
+
+ * getopt.c (_NO_PROTO): Define before config.h is included.
+
+Wed Dec 22 17:01:19 1993 Jim Meyering (meyering@comco.com)
+
+ * getdate.y (date): Parse dates like 17-JUN-1991.
+
+Tue Dec 07 14:52:39 1993 Jim Meyering (meyering@comco.com)
+
+ Mon Dec 6 11:13:07 1993 Jason Merrill (jason@deneb.cygnus.com)
+
+ * getdate.y (number): Change parsing of number > 10000 to
+ YYMMDD rather than YYHHmm.
+
+Sat Nov 20 17:47:50 1993 Noah Friedman (friedman@gnu.ai.mit.edu)
+
+ * error.c (error): fflush stdout before writing to stderr.
+
+Tue Nov 09 10:05:48 1993 Jim Meyering (meyering@comco.com)
+
+ * getdate.y (ToSeconds): Add a `default: abort ();' case.
+
+Thu Nov 4 12:59:19 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com)
+
+ * config.guess: add support for {i386,m68k,sparc} LynxOS; Hitachi
+ HPPA machines; Acorn Risc Machines; DG/UX; Motorola SVr3 on m88k
+
+Wed Nov 3 08:06:08 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c (getloadavg) [__NetBSD__]: Fix typo.
+
+Tue Nov 02 16:03:41 1993 Jim Meyering (meyering@comco.com)
+
+ * getdate.y [!defined(USG) && defined(HAVE_FTIME)]: Don't test
+ these when deciding whether to include sys/timeb.h. Test only
+ HAVE_SYS_TIMEB_H.
+
+Sat Oct 16 23:31:34 1993 Jim Meyering (meyering@comco.com)
+
+ * getusershell.c (getusershell): Always return a string allocated
+ by malloc.
+
+Tue Oct 12 00:53:26 1993 Jim Meyering (meyering@comco.com)
+
+ * getugroups.c [HAVE_CONFIG_H, CONFIG_BROKETS]: Include <config.h>
+ or "config.h".
+ * getusershell.c: Ditto.
+
+Thu Oct 07 19:08:00 1993 Jim Meyering (meyering@comco.com)
+
+ * getdate.y [!__GNUC__ && !HAVE_ALLOCA_H]: Declare alloca as void*
+ rather than char*. The latter conflicts with a dcl from bison.simple.
+
+Tue Oct 05 14:52:02 1993 Jim Meyering (meyering@comco.com)
+
+ * error.c [CONFIG_BROKETS]: Include <config.h> only under
+ this condition, else "config.h".
+ * modechange.c: Likewise.
+
+ * filemode.c, modechange.c [STAT_MACROS_BROKEN]: Test this.
+
+Sun Oct 3 15:33:07 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c (getloadavg) [__NetBSD__]: New netbsd support using
+ /kern/loadavg.
+
+Mon Sep 20 15:59:03 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * alloca.c [emacs || CONFIG_BROKETS]: Include <config.h> only under
+ these, else "config.h".
+ * filemode.c: Likewise.
+ * signame.c, getloadavg.c, getopt.c, getopt1.c: Likewise.
+
+Wed Sep 15 00:03:40 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * config.guess: New version from Cygnus; has netbsd support.
+
+Mon Sep 13 19:25:24 1993 david d 'zoo' zuhn (zoo@geech.gnu.ai.mit.edu)
+
+ * config.guess: add support for OSF/1 v1.3 and 4.4 and 4.3BSD
+ on hp300 machines
+
+Fri Sep 10 00:22:04 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * config.guess: Recognize netbsd on i[34]86 and hp300.
+
+ * alloca.c: Include <config.h> instead of "config.h".
+ * crt0.c: Likewise.
+ * filemode.c: Likewise.
+ * getdate.y: Likewise.
+
+Fri Aug 27 10:27:13 1993 Paul Eggert (eggert@twinsun.com)
+
+ * xmalloc.c: Include "config.h" if HAVE_CONFIG_H. Use size_t,
+ not int, when needed.
+ (VOID): New macro. Use it when needed.
+ (error): Declaration uses varargs if required.
+
+Fri Aug 27 09:59:26 1993 Paul Eggert (eggert@wombat.gnu.ai.mit.edu)
+
+ * error.c: Include "config.h" if HAVE_CONFIG_H.
+
+Wed Aug 25 17:46:01 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * signame.c [! HAVE_SYS_SIGLIST] [! SYS_SIGLIST_DECLARED]: Declare
+ sys_siglist.
+
+Mon Aug 16 15:10:30 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * alloca.c: Reverse sense of GCC 2 #ifdef.
+
+Sat Aug 14 23:26:30 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * config.guess: Detect mips-mips-ricos...
+ Handle 9000/4??:HP-UX like 9000/3??:HP-UX.
+ Fix 9000/7??:4.3bsd...
+
+Thu Aug 12 16:18:12 1993 Paul Eggert (eggert@twinsun.com)
+
+ * getdate.y (get_date): To determine the time zone, compare localtime
+ to gmtime output, instead of trying to use buggy and unportable
+ OS timezone primitives.
+ (difftm): New function.
+ (HAVE_GETTIMEOFDAY): Remove.
+ (timezone): Undef it if defined (not if sgi).
+
+Thu Aug 12 18:16:49 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c, getopt.c, getopt1.c [HAVE_CONFIG_H]: Include
+ <config.h> instead of "config.h".
+
+Wed Aug 11 03:27:12 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * alloca.c: Do nothing if compiling with GCC version 2.
+
+Tue Aug 10 17:27:27 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * alloca.c: Always declare malloc, whether or not it is defined
+ as xmalloc.
+
+Sat Aug 7 16:55:06 1993 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * getopt1.c: Declare const the way getopt.c does.
+
+Mon Aug 2 16:48:14 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [OSF_ALPHA]: #undef and redefine FSCALE.
+
+Sun Aug 1 16:39:00 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [TEST] (main): If NAPTIME is zero, don't set it to 5.
+ Break out of loop at end if NAPTIME is zero.
+ [! HAVE_GETLOADAVG]: Protect all but [TEST] portion with this.
+
+Fri Jul 30 18:28:40 1993 David J. MacKenzie (djm@wookumz.gnu.ai.mit.edu)
+
+ * getpagesize.h: Don't define HAVE_GETPAGESIZE; assume
+ configure has detected it.
+
+Thu Jul 29 23:20:52 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [__linux__]: Test this instead of [LINUX].
+
+Mon Jul 26 13:36:55 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c (OSF_ALPHA): Test [__alpha] as well as [__alpha__].
+
+ * signame.h (psignal) [!HAVE_PSIGNAL]: Don't test [! HAVE_SYS_SIGLIST].
+ * signame.c (psignal) [!HAVE_PSIGNAL]: Test this instead of
+ [! HAVE_SYS_SIGLIST].
+
+ * getloadavg.c [sgi || sequent]: #undef FSCALE before defining it.
+
+Wed Jul 21 17:08:07 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * obstack.c [__STDC__]: Declare prototype for _obstack_allocated_p.
+
+Wed Jul 14 00:55:24 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * config.guess: Add case for Bull dpx/2.
+
+Tue Jul 13 12:38:13 1993 Jim Meyering (meyering@comco.com)
+
+ * alloca.c: Enable the Cray stack-segment unwinding code only
+ if configure defines CRAY_STACKSEG_END. The C-90 doesn't need
+ (and can't use) any of the Cray-specific code.
+
+Mon Jul 12 18:13:16 1993 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * getloadavg.c (getloadavg) [NEXT]: It's ok if the user asks
+ for >1 numbers -- just return 1.
+
+Wed Jul 7 14:03:45 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getopt.c: Separate __STDC__ conditional from const conditional.
+
+Tue Jul 6 19:03:25 1993 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * getloadavg.c (getloadavg) [SUNOS_5]: Set `offset' from
+ kvm_nlist. Don't do the nlist but do initialize the struct
+ nlist for use by kvm_nlist.
+
+Mon Jun 28 14:55:05 1993 David J. MacKenzie (djm@wookumz.gnu.ai.mit.edu)
+
+ * pathmax.h: Use !__GNUC__ instead of USG to check for whether
+ to include limits.h on non-POSIX systems.
+
+Sat Jun 26 15:26:13 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getopt.c [not __GNU_LIBRARY__, but __GNUC__] (strlen):
+ Include stddef.h or gstddef.h, and declare strlen.
+
+Fri Jun 25 15:44:11 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getopt.c (exchange): Declare missing variables I.
+
+Tue Jun 22 00:03:11 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getopt.c (exchange): Use just one slot of temporary space.
+ (alloca, __alloca): All definitions deleted.
+ (my_bcopy): All definitions deleted.
+
+Wed Jun 16 17:09:47 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * crt0.c: [hp9000s300, ! OLD_HP_ASSEMBLER] Add flag_68040 to
+ the list of flags already present.
+
+Thu Jun 10 16:28:34 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * config.guess: New version from Cygnus.
+
+Wed Jun 9 16:28:36 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [! LOAD_AVE_TYPE]: Protect LOAD_AVE_TYPE definitions
+ with this. Use "#if defined (ardent) && defined (titan)", instead
+ of the bogus "#ifdef ardent && titan". Fix typo tex4300 -> tek4300.
+
+Wed Jun 9 05:19:56 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * getopt.c: Remove "|| defined(__sgi)" from the conditions for
+ #including "alloca.h"; autoconf ought to be able to figure
+ this out accurately, and that change was supposedly made for
+ the sake of Emacs, which does use autoconf.
+
+ * getloadavg.c: Break up #if lines longer than 256 characters,
+ for VMS.
+
+Tue Jun 8 07:56:45 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * config.guess: Add clause to the first big case statement to
+ detect Motorola Delta 68k, up to r3v7.
+
+Sun Jun 6 03:52:21 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * filemode.c: Include config.h if HAVE_CONFIG_H.
+ (mode_t): Define, if NO_MODE_T.
+
+Fri May 28 03:21:21 1993 Jim Blandy (jimb@geech.gnu.ai.mit.edu)
+
+ * getopt.c: If __sgi is defined, #include <alloca.h> too.
+
+Mon May 24 20:43:38 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * alloca.c [!emacs]: Define malloc as xmalloc. Declare xmalloc.
+
+Mon May 24 17:40:32 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c (getloadavg) [OSF_MIPS]: Don't define
+ LDAV_PRIVILEGED. Cast LOAD_AVE.tl_lscale to double.
+
+Mon May 24 11:53:18 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * alloca.c: Make this safe for Emacs.
+ [! emacs] Declare malloc.
+ (alloca): Call malloc, not xmalloc.
+
+Mon May 24 00:59:13 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getloadavg.c (getloadavg) [NO_GET_LOAD_AVG]: Just fail.
+
+Sun May 23 21:56:11 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * getdate.y [__GNUC__] (alloca): #undef this before we give
+ our new definition.
+
+Sun May 23 13:53:12 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * alloca.c: Call xmalloc (once again).
+ [emacs]: Define xmalloc as malloc.
+ [!emacs]: Declare xmalloc.
+
+Sun May 23 05:47:31 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu)
+
+ * mkinstalldirs (errstatus): New variable.
+ Use inner `for' loop instead of `while test' on $#.
+
+Sat May 22 20:14:23 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * mkinstalldirs: Set IFS to % instead of / and use sed to translate
+ /s in the directory name into %s first. Initialize PATHCOMP always
+ to empty.
+
+Fri May 21 19:32:43 1993 Jim Blandy (jimb@geech.gnu.ai.mit.edu)
+
+ * alloca.c (free): Don't #define this to be xfree whenever
+ emacs is #defined. That's only appropriate for some of the
+ files in Emacs which use alloca.
+ (xmalloc): Remove this declaration. It's inappropriate.
+ (alloca): Call malloc, not xmalloc.
+
+Thu May 20 16:22:12 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c (getloadavg) [LINUX]: Close FD if read fails.
+ Check return value of sscanf.
+
+Wed May 19 21:16:24 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * getloadavg.c (getloadavg): Add support for Linux, from
+ Michael K. Johnson.
+
+Wed May 19 13:47:02 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [__osf__ && (mips || __mips__)]: Include
+ <sys/table.h> and #define OSF_MIPS.
+ (getloadavg) [OSF_MIPS]: Special code using `table'.
+
+Mon May 17 15:55:47 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [butterfly]: Define NLIST_STRUCT; not LOAD_AVE_TYPE.
+
+Sun May 16 22:00:06 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * a.out.gnu.h [sequent && i386] (N_MAGIC, N_MACHTYPE, N_FLAGS,
+ N_SET_INFO, M_SET_MAGIC, N_SET_MACHTYPE, N_SET_FLAGS, [OZN]MAGIC,
+ N_BADMAG, N_ADDRADJ, N_DATOFF, N_TRELOFF, N_SYMOFF, N_TXTADDR,
+ N_COMM, N_FN, PAGE_SIZE, SEGMENT_SIZE): Define.
+
+Sat May 15 00:50:03 1993 Jim Meyering (meyering@comco.com)
+
+ * getdate.y: Fix the time.h versus sys/time.h problem once and
+ for all. Packages that use this file should use autoconf's
+ AC_TIME_WITH_SYS_TIME and AC_HAVE_HEADERS(sys/time.h) macros.
+
+Fri May 14 16:38:56 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [butterfly] (LOAD_AVE_TYPE): Define as long.
+
+Thu May 13 01:49:31 1993 Jim Meyering (meyering@comco.com)
+
+ * error.c: Move extern dcl of program_name out of error.
+
+Sun May 9 15:21:11 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [HPUX && ! hpux]: Define hpux.
+
+Sat May 8 20:35:04 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getloadavg.c: Rename initialized to getloadavg_initialized.
+
+Sat May 8 13:32:15 1993 Jim Meyering (meyering@comco.com)
+
+ * alloca.c: Indent and reformat comments.
+
+ * alloca.c (i00afunc): New functions for determining relative
+ stack frame ordering for Crays. From Otto Tennant.
+
+Fri May 7 15:54:30 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [NeXT]: Include <mach/mach.h> #ifdef
+ HAVE_MACH_MACH_H, else <mach.h>.
+
+Wed May 5 13:31:55 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c (LDAV_SYMBOL) [hpux && ! hp9000s300]: Use this
+ conditional, not just [hpux], to define as "avenrun".
+
+ * getloadavg.c [unix && m68k && mc68000 && mc68020 &&
+ _MACH_IND_SYS_TYPES]: Define tek4300.
+ [tek4300] (LOAD_AVE_TYPE): Define as long.
+ [tek4300] (FSCALE): Define as 100.0.
+
+Mon May 3 22:17:45 1993 Jim Meyering (meyering@comco.com)
+
+ * getugroups.c: Don't define GETGROUPS_T. Now configure does it.
+
+Mon May 3 17:12:41 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c (getloadavg) [VMS]: Don't define LDAV_DONE.
+
+ * getloadavg.c [ardent && titan]
+ (LOAD_AVE_TYPE): Define as long.
+ (FSCALE): Define as 65536.0.
+ (LDAV_SYMBOL): Define as "avenrun".
+
+Tue Apr 27 14:07:18 1993 Jim Blandy (jimb@geech.gnu.ai.mit.edu)
+
+ * getdate.y: If HAVE_SYS_TIMEB_H is #defined, then include
+ <sys/timeb.h> instead of defining struct timeb ourselves.
+
+Thu Apr 22 17:23:42 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c (getloadavg) [!LDAV_DONE && LOAD_AVE_TYPE && !VMS]:
+ Don't #define LDAV_DONE here.
+ [!LDAV_DONE && LOAD_AVE_TYPE]: Define it here instead.
+
+Mon Apr 19 18:09:18 1993 Jim Meyering (meyering@comco.com)
+
+ * getdate.y: Use TM_IN_SYS_TIME.
+
+Fri Apr 16 18:10:06 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * getdate.y [emacs] (static): If the Emacs configuration files
+ have #defined static to be the empty string, then #undefine
+ it; this file doesn't need that hack.
+
+Fri Apr 16 12:13:37 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * obstack.c, getopt.c, getopt1.c: Surround code with
+ #if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+Fri Apr 16 10:52:12 1993 Michael Meissner (meissner@osf.org)
+
+ * getopt.h (getopt): Do not declare getopt with a prototype of
+ (void) for a non-ANSI compiler. If not GNU library and a
+ standard compiler, do not declare a prototype for getopt, just
+ like the comments say, due to different libraries having
+ different signatures for getopt.
+
+Thu Apr 15 16:36:03 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c: Move #include <sys/types.h> to top and out of [USG].
+ [sgi, UMAX]: Don't include it again later.
+
+Wed Apr 14 13:06:50 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c: "#ifdef !define ..." -> "#if !defined ..."
+
+ * getopt.c (_NO_PROTO): Don't define if already defined.
+
+Tue Apr 13 14:56:33 1993 Jim Meyering (meyering@comco.com)
+
+ * getdate.y [HAVE_MEMCPY && !HAVE_BCOPY]: Define bcopy in terms
+ of memcpy for old versions of bison that generate parsers that
+ use bcopy.
+
+Tue Apr 13 00:48:41 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * getloadavg.c: Changes for Mach from Thorston Ohl
+ <ohl@chico.harvard.edu>:
+ #include <mach/mach.h>, instead of <mach.h>.
+ (getloadavg): Don't forget to test LDAV_DONE in the CPP
+ conditional protecting the last load average technique.
+
+Mon Apr 12 23:03:20 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * getloadavg.c: Changes for VMS from Richard Levitte:
+ (LOAD_AVE_TYPE, NLIST_STRUCT): Collapse multi-line #if
+ directives into one line; VMS CPP can't handle that.
+ [VMS] (getloadavg): Add static `initialized' variable, and
+ set the dsc$w_length and dsc$a_pointer fields of descriptior
+ instead of the size and ptr fields.
+
+Mon Apr 12 13:55:34 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getopt.c (my_index): Rename arg STRING to STR.
+
+Sun Apr 11 17:37:19 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getopt.h: Declare optopt.
+
+ * getopt.c (my_index): First arg is `const char *'.
+ (my_bcopy): Likewise.
+
+Tue Apr 6 13:23:28 1993 Jim Meyering (meyering@comco.com)
+
+ * getdate.y [hp9000 && !hpux]: Change erroneous #ifdef to #if.
+
+Mon Apr 5 17:28:35 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * getdate.y: #include <sys/times.h> whenever HAVE_GETTIMEOFDAY
+ is #defined. If it isn't defined, try to guess it.
+ (main): If HAVE_GETTIMEOFDAY is #defined, use it.
+
+Sun Apr 4 11:24:59 1993 Jim Meyering (meyering@comco.com)
+
+ * getdate.y [sgi]: Undefine timezone before including <time.h>.
+
+ * getdate.y [time.h vs sys/time.h]: Fix boolean algebra typo from
+ Mar 31 consolidation.
+
+ * getdate.y: Move static dcls of yyerror and yylex to a point
+ following the definition of those symbols to getdate_{yyerror,yylex}.
+
+ * getdate.y [_AIX]: AIX needs time.h as well as sys/time.h.
+
+Fri Apr 2 13:30:03 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getopt.c: Define _NO_PROTO before including <stdio.h>.
+
+Wed Mar 31 18:38:05 1993 Jim Blandy (jimb@geech.gnu.ai.mit.edu)
+
+ * getdate.y: Consolidate the expressions saying when to
+ #include <sys/time.h>, to avoid multiple inclusions.
+
+ * getdate.y (yylex, yyerror): Added forward static declarations.
+
+ * getdate.y: Note that David Mackenzie's change of March 16
+ 1992 introduces another shift/reduce conflict.
+
+Wed Mar 31 17:30:29 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * alloca.c [emacs]: Define free as xfree.
+ (alloca): Use free, not xfree.
+
+Mon Mar 29 13:46:17 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * a.out.gnu.h [i386] (SEGMENT_SIZE): Don't use this defn on [sequent].
+ [sequent && i386]: #include "/usr/include/a.out.h" explicitly,
+ since in glibc this is installed as <a.out.h>.
+
+Mon Mar 15 17:34:53 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * getopt.c (optopt): Initialize it.
+
+Sun Mar 14 16:39:57 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * getpagesize.h: Add definition for VMS.
+
+Wed Mar 10 20:57:21 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * getloadavg.c: If USG is defined, #include <sys/types.h>.
+ Move the test for HAVE_FCNTL_H and _POSIX_VERSION down after this.
+
+ * alloca.c: Use xfree instead of free.
+
+Wed Mar 10 15:22:56 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * getloadavg.c [__osf__ && __alpha__] (OSF_ALPHA): Define this.
+ [OSF_ALPHA] (LOAD_AVE_TYPE): Define as long.
+ [OSF_ALPHA] (NLIST_STRUCT): Define this.
+
+Wed Feb 24 12:45:00 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [NeXT]: #undef FSCALE to indicate that the nlist
+ method is not the desireable one.
+ (getloadavg) [NeXT]: Return with errno==EINVAL if called with NELEM>1,
+ since we can get only the one-minute load average on this system.
+
+Mon Feb 22 08:59:03 1993 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * getloadavg.c (LDAV_CVT): If LDAV_CVT has already been
+ defined above in terms of Emacs's LOAD_AVE_CVT, don't redefine
+ it just because we have FSCALE.
+
+Sun Feb 21 14:52:01 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getopt.c (optopt): New variable.
+ (_getopt_internal): On any failure for a single-letter option, set
+ `optopt' to the losing option character.
+ When a required arg is missing, return ':' instead of '?' if the
+ first char in OPTSTRING (possibly after the - or +) is a ':'.
+ Use 1003.2-standard formats for error messages (it specifies
+ precise formats for unrecognized option and for missing arg).
+
+ * signame.c: #include <sys/types.h> before <signal.h>.
+
+Thu Jan 28 17:10:08 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c (LOAD_AVE_TYPE) [sequent]: Define as long.
+ (FSCALE) [sequent]: Define as 1000.0, like sgi.
+ (LDAV_CVT) [FSCALE]: Move outside if #ifndef FSCALE.
+
+Fri Jan 22 14:51:36 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c (NLIST_STRUCT): Put defined(sony_news) inside the
+ parens so we don't redefine NLIST_STRUCT when it's already defined.
+
+ * signame.h [!__STDC__] (psignal): Surround decl with #ifndef
+ HAVE_SYS_SIGLIST || HAVE_PSIGNAL.
+ (sys_siglist): Surround decl with #ifndef HAVE_SYS_SIGLIST.
+
+Sun Jan 17 19:55:30 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getopt.c, getopt1.c: Do define const if IN_GCC.
+
+Thu Jan 14 15:35:33 1993 David J. MacKenzie (djm@kropotkin.gnu.ai.mit.edu)
+
+ * getopt.c, getopt1.c: Don't redefine const; let callers do it.
+
+Wed Jan 13 15:38:40 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getopt.c [_AIX]: Put #pragma alloca before all else.
+
+Tue Jan 12 16:48:04 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * getloadavg.c: Removed #ifdef TEST around #include of errno.h.
+
+Mon Jan 11 15:17:29 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * getloadavg.c [ultrix]: Define BSD.
+
+ * signame.h [!HAVE_SYS_SIGLIST && !HAVE_PSIGNAL]: Put psignal decl
+ inside these #ifs.
+ [!HAVE_SYS_SIGLIST]: Put sys_siglist decl inside this #if.
+
+Fri Jan 8 17:36:41 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [HAVE_CONFIG_H]: Test this only for actually
+ including "config.h". Everything else that HAVE_CONFIG_H used to
+ turn off is now turned on always.
+ (KERNEL_FILE) [sequent, hpux], (LDAV_SYMBOL) [alliant]: Don't
+ define if already defined.
+ [!LDAV_DONE && LOAD_AVE_TYPE && !VMS]: Define LDAV_PRIVILEGED.
+
+ * getloadavg.c (getloadavg) [!LDAV_DONE]: Set errno to zero.
+
+Wed Jan 6 18:17:28 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * signame.c: #include "signame.h" after possibly defining `const',
+ so signame.h and signame.c consistently use it or don't use it.
+
+ * signame.h: Use "#if defined (__STDC__) && __STDC__", in place of
+ "#ifdef __STDC__".
+
+Sat Jan 2 18:32:01 1993 David J. MacKenzie (djm@kropotkin.gnu.ai.mit.edu)
+
+ * getopt.c: Turn off GETOPT_COMPAT by default.
+
+Thu Dec 31 12:34:41 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * signame.c [HAVE_CONFIG_H]: #include "config.h".
+
+Tue Dec 8 21:10:29 1992 David J. MacKenzie (djm@kropotkin.gnu.ai.mit.edu)
+
+ * getloadavg.c: Include fcntl.h if HAVE_FCNTL_H, not USG.
+
+ * getdate.y: Include alloca.h if HAVE_ALLOCA_H, not sparc.
+
+Tue Dec 1 13:27:40 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * getopt.c, getopt1.c, getdate.y, alloca.c, getloadavg.c
+ [HAVE_CONFIG_H]: Include config.h.
+
+Tue Nov 24 09:42:29 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * getugroups.c: Use HAVE_STRING_H, not USG.
+
+Mon Nov 23 14:36:33 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * signame.c (init_sigs): Renamed to signame_init, made global.
+ (sig_abbrev, sig_number): Changed callers.
+ * signame.h (signame_init): Declare it.
+
+ * signame.c (init_sigs): Add SIGDANGER.
+
+Thu Nov 19 21:34:43 1992 Jim Blandy (jimb@totoro.cs.oberlin.edu)
+
+ * getloadavg.c: #include <sys/param.h> whether or not the
+ "emacs" CPP symbol is defined.
+
+Mon Nov 16 13:35:30 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * a.out.gnu.h (SEGMENT_SIZE): Define as PAGE_SIZE if undefined.
+ (PAGE_SIZE): Define as 16 if undefined; for i386-minix, which has
+ no predefine we can test.
+
+Thu Nov 12 23:31:53 1992 Jim Meyering (meyering@hal.gnu.ai.mit.edu)
+
+ * getdate.y, getusershell.c: Give statically initialized arrays
+ const attribute.
+
+Sat Nov 7 13:50:27 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * getopt1.c: Only include stdlib.h for __GNU_LIBRARY__.
+ [!__STDC__]: Don't define const if it was already defined.
+
+Sat Nov 7 03:28:08 1992 Jim Blandy (jimb@apple-gunkies.gnu.ai.mit.edu)
+
+ * getdate.y [emacs]: Include <config.h>; under Emacs, we get
+ some additional configuration information from that.
+
+Sat Nov 7 00:53:35 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * getopt.c [!__STDC__]: Don't define const if it was already defined.
+
+Tue Nov 3 20:12:01 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * getloadavg.c: Added `!defined (LDAV_DONE) &&' to all the #if's
+ for different system types. We want to get one and only one of the
+ chunks of code which defines LDAV_DONE.
+
+Tue Oct 27 23:51:02 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * getloadavg.c [sequent]: implies NLIST_STRUCT.
+ [SYSV || _POSIX_VERSION]: include fcntl.h, not sys/file.h.
+
+Mon Oct 26 22:43:25 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * install.sh: Move or copy first to temp file, then mv to real dest.
+
+Mon Oct 19 18:35:04 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * obstack.h (__need_ptrdiff_t): Don't define, if __NeXT__.
+
+Sat Oct 17 03:17:01 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getopt.c: Include string.h only with GNU library.
+
+Fri Oct 16 17:40:54 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * getopt.h (no_argument, required_argument, optional_argument):
+ Define as macros.
+ (enum _argtype): Removed.
+
+Fri Oct 2 18:18:35 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * signame.c (NSIG): #define if not #define'd.
+
+Thu Oct 1 23:33:55 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * getpagesize.h: That should have been HAVE_UNISTD_H, Mike . . .
+ (no initial underscore).
+
+ * pathmax.h [__MSDOS__]: Don't include sys/param.h.
+
+Wed Sep 30 13:54:36 1992 Michael I Bushnell (mib@geech.gnu.ai.mit.edu)
+
+ * getpagesize.h: Test for _HAVE_UNISTD_H, because
+ _POSIX_VERSION is defined by unistd.h, and thus can't be used
+ in deciding whether to include it.
+
+Tue Sep 29 07:36:29 1992 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu)
+
+ * getloadavg.c: if symbol `sony_news' is defined, define
+ NLIST_STRUCT and declare LOAD_AVE_TYPE as long.
+
+Thu Sep 17 20:10:03 1992 Karl Berry (karl@geech.gnu.ai.mit.edu)
+
+ * regex.[ch]: made links into ../regex/, per rms' suggestion.
+ Please put further ChangeLog entries there.
+
+Tue Sep 15 20:13:30 1992 Michael I Bushnell (mib@geech.gnu.ai.mit.edu)
+
+ * getpagesize.h: Posix-ify.
+
+Mon Sep 14 23:48:55 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * getloadavg.c: Define SUNOS_5 if appropriate.
+
+Mon Sep 14 16:31:01 1992 Michael I Bushnell (mib@geech.gnu.ai.mit.edu)
+
+ * getdate.y: AIX needs sys/time.h as well as time.h.
+
+Sun Sep 13 07:17:09 1992 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * getdate.y: Don't forget to include the file which defines
+ struct timeval and struct timezone, if we're using those.
+
+Fri Sep 11 10:42:24 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * getopt.h: Only prototype getopt for the GNU libc.
+
+Fri Sep 11 07:46:21 1992 Karl Berry (karl@hal.gnu.ai.mit.edu)
+
+ * regex.h (_RE_ARGS) [!__STDC__]: expand to empty parens.
+
+Fri Sep 11 00:57:56 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * regex.c (SET_LIST_BIT): Always treat c as positive.
+
+Thu Sep 10 19:38:59 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * getugroups.c: Always declare getgrent. getgroups fills in
+ an array of int on 386BSD, too.
+
+Thu Sep 10 16:35:10 1992 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * getdate.y: Generalize previous change; always use
+ gettimeofday to find the current time zone's Greenwich offset,
+ unless we're being compiled under USG or some other system
+ which already has CPP conditionals saying how to get the time
+ zone offset.
+
+ * getdate.y: Don't divide the Greenwich offset returned by
+ gettimeofday by 60; it's already expressed in minutes, so it
+ doesn't need to be converted.
+
+Wed Sep 9 21:49:20 1992 Karl Berry (karl@apple-gunkies.gnu.ai.mit.edu)
+
+ * regex.[ch]: version 0.10, incorporating below changes and
+ more. See /gd/gnu/lib/regex-*/ChangeLog.
+
+Wed Sep 9 03:09:55 1992 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu)
+
+ * malloc.c: if USG, define macros for bcopy and bzero.
+ Don't redefine USG for hpux if already defined.
+
+Tue Sep 1 16:46:47 1992 Jim Blandy (jimb@pogo.cs.oberlin.edu)
+
+ * getdate.y: If __ultrix__ is defined, then we don't have the
+ timezone array, but we do have ftime, so use that instead.
+
+Fri Aug 28 15:52:40 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * getloadavg.c [SUNOS_5]: New code from Epoch 4.2.
+
+Thu Aug 27 16:38:22 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * getloadavg.c: Don't check NLIST_STRUCT to decide whether to
+ define LOAD_AVE_TYPE.
+
+Wed Aug 26 16:45:54 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * getloadavg.c (FSCALE): Don't #define if already defined.
+
+Mon Aug 24 13:00:34 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * getopt.c: Include string.h if USG or STDC_HEADERS as well as
+ if __GNU_LIBRARY__.
+
+Sun Aug 23 02:51:31 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * regex.[ch] (re_comp): Remove const from return value, to
+ avoid conflict with 386BSD unistd.h.
+
+Sat Aug 22 18:30:58 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * getloadavg.c: Define FCALE, then LDAV_CVT in terms of that.
+
+Fri Aug 21 16:02:20 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * getloadavg.c (_SEQUENT_): Define NLIST_STRUCT.
+
+Wed Aug 19 16:35:33 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [NLIST_NAME_UNION]: Test this intead of convex.
+
+Tue Aug 18 23:06:47 1992 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * regex.c (DO_RANGE): Make end and this_char integers, and
+ fetch this_char's initial value using an 'unsigned char *', so that
+ character ranges including '\177' through '\377' will work.
+
+Tue Aug 18 17:32:40 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * getopt.c, getopt1.c, getopt.h: Change license back to GPL from LGPL.
+
+Fri Aug 14 07:38:34 1992 Torbjorn Granlund (tege@jupiter.sics.se)
+
+ * obstack.h: Fix spelling errors.
+
+Sat Aug 1 18:12:07 1992 Michael Meissner (meissner@osf.org)
+
+ * obstack.c (CALL_FREEFUN): Recode to use if/else instead of
+ ?:, since the MIPS compiler does not like ?: expressions where
+ the two alternate values are both void.
+
+Sat Aug 1 00:11:25 1992 Fred Fish (fnf at fishpond)
+
+ * obstack.h (obstack_specify_allocation): Use malloc/free
+ compatible calling convention.
+ * obstack.h (obstack_specify_allocation_with_arg): Use mmalloc/
+ mfree compatible calling convention.
+
+Wed Jul 29 18:53:13 1992 Karl Berry (karl@hal)
+
+ * regex.c: version 0.9; fixes bug wrt always finding the longest
+ match. See /gd/gnu/lib/regex-*/ChangeLog.
+
+Sun Jul 26 18:24:13 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [NeXT]: #undef BSD after <sys/param.h>.
+
+Sun Jul 26 17:04:20 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * obstack.h (struct obstack): extra_arg is now char *.
+ (obstack_alloc_arg): Deleted.
+ (obstack_specify_allocation): Take new arg, to specify extra_arg.
+ Call _obstack_begin_1.
+ * obstack.c (_obstack_begin_1): New function.
+
+Fri Jul 24 16:29:17 1992 Fred Fish (fnf at fishpond)
+
+ * obstack.h (struct obstack): Change maybe_empty_object to
+ bitfield. Add use_extra_arg bitfield and extra_arg.
+ * obstack.h (obstack_init, obstack_begin): Cast type of
+ obstack_chunk_free as well as obstack_chunk_alloc.
+ * obstack.h (obstack_specify_allocation, obstack_alloc_arg):
+ New macros.
+ * obstack.c (CALL_CHUNKFUN, CALL_FREEFUN): New macros to hide
+ details of chunk allocator/deallocator calls.
+ * obstack.c (_obstack_begin, _obstack_newchunk): Use CALL_CHUNKFUN.
+ * obstack.c (_obstack_free, _obstack_newchunk): Use CALL_FREEFUN.
+
+Fri Jul 24 16:09:37 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * getugroups.c [_POSIX_SOURCE]: Define endgrent as empty.
+
+ * getloadavg.c [HAVE_UNISTD_H]: Include unistd.h.
+
+Sun Jul 19 23:29:27 1992 John Gilmore (gnu@cygnus.com)
+
+ * stab.def: Order values numerically, and add some stabs
+ used by Solaris.
+
+Fri Jul 17 20:21:20 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * getopt.c: Only include stdlib.h for GNU C library, due to
+ conflicting getopt prototypes.
+
+Fri Jul 17 05:49:07 1992 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * obstack.c (DEFAULT_ALIGNMENT): Cast to widest integer type to
+ avoid possible warning if int is narrower than pointer.
+
+Fri Jul 17 03:47:16 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * getdate.y: Use HAVE_FTIME instead of FTIME_MISSING.
+ * signame.c: Use HAVE_SYS_SIGLIST instead of SYS_SIGLIST_MISSING.
+
+Tue Jul 14 18:53:46 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getopt.c (exchange): Cast args to my_bcopy to (char *).
+
+Tue Jul 14 14:34:33 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * getopt.c: Include stdlib.h and string.h if STDC_HEADERS as
+ well as if __GNU_LIBRARY__.
+
+Sat Jul 11 13:24:12 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * obstack.h: Define __need_ptrdiff_t for gstddef.h.
+
+Fri Jul 10 15:01:25 1992 Karl Berry (karl@hal)
+
+ * regex.[ch]: new version (0.8), incorporating the changes
+ below. See /gd/gnu/regex/ChangeLog.
+
+Fri Jul 10 03:46:24 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * obstack.h: Get ptrdiff_t from gstddef.h when building GCC with GCC.
+
+Thu Jul 9 21:38:37 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getloadavg.c [DGUX]: Cast first arg to dg_sys_info to (long int *).
+
+Wed Jul 8 19:43:26 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * error.c (private_strerror): Ok if errnum == sys_nerr.
+
+Wed Jul 8 12:38:37 1992 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * regex.c: Applied tentative patches from Karl Berry:
+ Miscellaneous doc fixes and reformatting.
+ (REGEX_REALLOCATE): Parenthesize call to realloc.
+ Test HAVE_ALLOCA_H, instead of testing for things like sparc,
+ etc. Don't declare alloca under AIX, since that's done with
+ the pragma at the top of the file.
+ (IS_IN_FIRST_STRING): Renamed to FIRST_STRING_P.
+ (re_match_2): Uses of IS_IN_FIRST_STRING changed.
+ (TALLOC): Parenthesize call to malloc.
+ (REGEX_TALLOC): New macro.
+ (FREE_NONNULL): New macro.
+ (FREE_VARIABLES): Use FREE_NONNULL instead of always freeing.
+ (re_match_2): Don't use initializers in declarations of
+ regstart, regend, old_regstart, old_regend, reg_info,
+ best_regstart, best_regend, reg_dummy, and reg_info_dummy.
+ Initialize them only if we actually use the registers.
+ New variable match_end for use instead of best_regend[0], in
+ case we don't allocate the registers. Don't fuss with
+ best_regend[0] directly.
+
+Sat Jul 4 07:53:45 1992 Karl Berry (karl@hal)
+
+ * regex.c (re_compile_fastmap): init succeed_n_p (to false).
+
+Fri Jul 3 14:45:29 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
+
+ * error.c: Change FOO_MISSING to HAVE_FOO.
+
+Thu Jul 2 15:47:20 1992 David J. MacKenzie (djm@wookumz.gnu.ai.mit.edu)
+
+ * getloadavg.c: Tweak #defines for SVR4.
+ Include sys/param.h if unix, not if BSD.
+
+Wed Jul 1 11:48:37 1992 Karl Berry (karl@hal)
+
+ * regex.[ch]: new version (0.7). See /gd/gnu/regex/ChangeLog.
+
+Sun Jun 28 06:05:39 1992 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * obstack.h: Define a type for the result of __PTR_TO_INT.
+
+Sat Jun 27 10:50:59 1992 Jim Blandy (jimb@pogo.cs.oberlin.edu)
+
+ * xregex.c (re_match_2): When we have accepted a match and
+ restored d from best_regend[0], we need to set dend
+ appropriately as well. It may happen that dend == end_match_1
+ while the restored d is in string2, so we should be prepared
+ to set dend to end_match_2 in this case.
+
+Tue Jun 23 22:27:36 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
+
+ * getloadavg.c (getloadavg) [DGUX]: Don't initialize structure;
+ the error handling doesn't work that way now.
+
+Fri Jun 19 13:14:57 1992 David J. MacKenzie (djm@wookumz.gnu.ai.mit.edu)
+
+ * install.sh: Use - instead of :- in variable assignments.
+
+Tue Jun 16 19:32:46 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getopt.c [HAVE_ALLOCA_H]: Test to include <alloca.h>.
+
+Thu Jun 11 15:15:38 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * arscan.c: Removed. It is now part of Make.
+
+Mon Jun 8 18:03:28 1992 Jim Blandy (jimb@pogo.cs.oberlin.edu)
+
+ * regex.h (RE_NREGS): Doc fix.
+
+ * xregex.c (re_set_registers): New function.
+ * regex.h (re_set_registers): Declaration for new function.
+
+Wed Jun 3 16:59:49 1992 Karl Berry (karl@geech.gnu.ai.mit.edu)
+
+ * regex.[ch]: new version (0.6). See ~karl/regex/ChangeLog.
+
+Sat May 23 22:28:54 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * getopt.c [LIBC]: No longer need to #include <ansidecl.h>.
+
+ * getopt.h, getopt.c, getopt1.c: Changed copyright notice to LGPL.
+
+Fri May 22 14:50:25 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getopt.c: Change sparc conditional so that sun && sparc
+ causes use of alloca.h.
+
+Thu May 14 16:50:28 1992 Karl Berry (karl@kropotkin.gnu.ai.mit.edu)
+
+ * regex.c, regex.h: new version (0.5). See ~karl/regex/ChangeLog.
+
+Tue May 12 03:27:19 1992 David J. MacKenzie (djm@churchy.gnu.ai.mit.edu)
+
+ * getopt.c (_getopt_internal): Don't allow it.
+
+Tue May 12 00:33:31 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu)
+
+ * getopt.c (_getopt_internal): Allow optional arg to be in ARGV elt
+ after switch.
+
+Thu May 7 11:46:18 1992 Jim Blandy (jimb@pogo.cs.oberlin.edu)
+
+ * crt0.c (_start): When m68000 is #defined, don't use the
+ simple C version of _start that simply calls start1; GCC 2.1
+ without optimization has _start push a word of garbage on the
+ stack, which screws up the CRT0_DUMMIES hack. Instead, use an
+ assembly-language version of _start.
+
+Mon May 4 16:26:49 1992 David J. MacKenzie (djm@churchy.gnu.ai.mit.edu)
+
+ * getopt.h: #ifdef __STDC__ -> #if __STDC__.
+
+Thu Apr 30 18:53:52 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * a.out.gnu.h [NeXT]: Define PAGE_SIZE, and not SEGMENT_SIZE.
+
+Sun Apr 26 02:33:50 1992 Jim Blandy (jimb@pogo.cs.oberlin.edu)
+
+ * crt0.c: Don't #include "config.h" unless emacs is #defined.
+
+Tue Apr 21 17:45:54 1992 Jim Blandy (jimb@pogo.cs.oberlin.edu)
+
+ * regex.c (re_match_2): If we've already allocated memory for
+ the search buffers, don't allocate them again.
+
+Mon Apr 13 20:17:47 1992 David J. MacKenzie (djm@wookumz.gnu.ai.mit.edu)
+
+ * getopt.h: Make the multiple inclusion protection look like
+ the rest of libc's.
+
+Wed Apr 1 06:10:15 1992 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * regex.c [emacs]: Include <sys/types.h>, since regex.h wants it.
+
+Tue Mar 31 12:01:32 1992 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * crt0.c: The changes below are the results of a merge with
+ the Emacs 19 sources:
+ (start1): Declare this static before all uses.
+ Add conditionals for ALLIANT_2800.
+
+ * (_start) for alliant: Set _curbrk and _minbrk from _setbrk,
+ to help with Emacs dumping.
+
+Mon Mar 30 18:00:41 1992 Jim Blandy (jimb@wookumz.gnu.ai.mit.edu)
+
+ * malloc.c [VMS]: Include vlimit.h.
+ (calloc): Add a quick implementation of this, in case
+ something from another library uses it.
+ (get_lim_data): There are several versions of this function,
+ tailored for different operating systems; the appropriate
+ version is chosen by checking for preprocessor symbols which
+ indicate which operating system Emacs is being compiled for.
+ Re-arrange the preprocessor conditionals so that the generic
+ "none of the above" version is last, in the final "else" clause.
+
+ * alloca.c: Do nothing if alloca is defined as a macro.
+
+Fri Mar 20 02:53:14 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * a.out.gnu.h: Added missing backslash in #if.
+
+Mon Mar 16 23:46:18 1992 David J. MacKenzie (djm@apple-gunkies.gnu.ai.mit.edu)
+
+ * getdate.y: Support ISO 8601 format. yyyy-mm-dd.
+
+Sun Mar 15 22:50:30 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * a.out.gnu.h [NeXT || mips] (SEGMENT_SIZE): Define as PAGE_SIZE.
+ [NeXT] (PAGE_SIZE): Define as 0x2000.
+ [mips] (PAGE_SIZE): Define as 4096.
+
+ * getopt.c [sparc && svr4]: No <alloca.h>.
+
+Thu Mar 12 14:26:48 1992 Karl Berry (karl@apple-gunkies.gnu.ai.mit.edu)
+
+ * regex.[ch]: new version (0.4). See ~karl/regex/ChangeLog.
+
+Tue Mar 10 22:26:14 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu)
+
+ * a.out.gnu.h [sun && mc68000]: SEGMENT_SIZE == 0x2000.
+
+Thu Feb 27 21:37:53 1992 Michael I Bushnell (mib@geech.gnu.ai.mit.edu)
+
+ * getdate.y: `#undef timezone' on SGI systems to avoid naming
+ clash.
+ (get_date): Use underscore version for SGI.
+ [This fix is from beebe@mach.utah.edu.]
+
+Tue Feb 25 21:23:50 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu)
+
+ * getopt.c [__GNU_LIBRARY__]: #include <string.h>.
+
+Thu Feb 20 13:04:57 1992 Karl Berry (karl@wombat.gnu.ai.mit.edu)
+
+ * regex.[ch]: new version (0.3). See ~karl/regex/ChangeLog for all
+ the details.
+
+Wed Feb 19 23:04:05 1992 Charles Hannum (mycroft@gnu.ai.mit.edu)
+
+ * regex.c [_AIX]: Move #pragma alloca to top of file to accommodate
+ AIX C compiler.
+
+Mon Feb 17 03:44:03 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu)
+
+ * a.out.gnu.h [sparc] (_N_HDROFF): Define as (-sizeof (struct exec)).
+ That is as if SEGMENT_SIZE were 0, but that would be wrong.
+
+ * a.out.gnu.h [i386] (SEGMENT_SIZE): Define.
+
+Sun Feb 16 03:10:23 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu)
+
+ * a.out.gnu.h [sparc] (PAGE_SIZE, SEGMENT_SIZE): Define.
+ (PAGSIZ): Define as PAGE_SIZE.
+ (SEGSIZ): Define as SEGMENT_SIZE.
+
+Thu Jan 30 19:03:29 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * regex.c (re_search_2): Improve comments.
+
+Tue Jan 28 00:28:15 1992 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * getopt.h (struct option): Change has_arg back to an int.
+
+Mon Jan 27 23:03:33 1992 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * getopt.c (_getopt_internal): Don't use a relational operator (>)
+ on the has_arg field, which is now an enum.
+
+Fri Jan 17 21:34:02 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu)
+
+ * getopt.h: Don't declare envopt.
+
+ * envopt.c: Tweaks to compile under libc.
+
+Fri Jan 17 21:23:02 1992 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * getopt.c: Describe the new args to _getopt_internal.
+
+Fri Jan 17 19:26:54 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * getopt.h: Remove decls of _getopt_* and option_index.
+ Make `name' elt of `struct option' const char *.
+ Make `has_arg' an enum (integer values same).
+ * getopt.c (_getopt_internal): Renamed from getopt, taking 3 new args
+ in place of global vars _getopt_long_options, _getopt_long_only,
+ and option_index (which are all now gone).
+ (getopt): New fn, front end to _getopt_internal.
+ * getopt1.c (getopt_long, getopt_long_only): Use _getopt_internal.
+
+Tue Jan 7 02:08:10 1992 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * regex.c (malloc, realloc): Don't specify arg types--can
+ cause error.
+
+Mon Jan 6 12:53:42 1992 Karl Berry (karl at apple-gunkies.gnu.ai.mit.edu)
+
+ * regex.[ch]: new versions. See ~karl/regex/ChangeLog for all
+ the details.
+
+Tue Dec 24 22:42:59 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * obstack.h: Indentation fix.
+
+Mon Dec 23 23:41:39 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * regex.c, putenv.c, getugroups.c: Change POSIX ifdefs to
+ HAVE_UNISTD_H and _POSIX_VERSION.
+
+Wed Dec 18 14:24:35 1991 Michael Meissner (meissner at osf.org)
+
+ * getopt.h (whole file): Protect getopt.h from being included
+ twice.
+
+Fri Dec 6 13:00:42 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * getopt.c (getopt): Cast argv to (char **) (with no const)
+ when passing to exchange, to be explicit about what's happening.
+
+ * getopt.c: Change POSIX_ME_HARDER to POSIXLY_CORRECT.
+
+Thu Dec 5 12:12:18 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * getopt.c (my_bcopy, my_index): New functions.
+ Use instead of bcopy and index.
+ Avoid conditionals on USG, NeXT, hpux, __GNU_LIBRARY__, etc.
+
+ * getopt1.c, getopt.h (getopt_long*): Like yesterday's getopt change.
+
+Wed Dec 4 10:51:45 1991 Ron Guilmette (rfg at ncd.com)
+
+ * getopt.c, getopt.h (getopt): Correct the type of the second
+ parameter so that it agrees with ANSI/POSIX standards.
+
+ * getopt.h: Make all function declarations explicitly `extern'.
+
+Tue Dec 3 01:34:59 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * getopt.c: Fix some wrong comments.
+
+Mon Dec 2 17:49:50 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * getopt.c (getopt): Support `+' to introduce long-named
+ options, as well as `--', if GETOPT_COMPAT is defined.
+ It is defined by default.
+
+Sun Dec 1 21:12:32 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * getopt.c (getopt): Long-named options are introduced by `--'
+ instead of `+'.
+ Protect all fprintfs with checks of opterr.
+ Include getopt.h instead of redeclaring things, to stay in sync.
+ * getopt1.c (getopt_long): No longer disable long options if
+ POSIX_ME_HARDER is set.
+ (main): Handle -d. Remove unused var.
+
+Mon Nov 4 23:06:54 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * regex.h [!__STDC__]: regerror was declared to return size_t *
+ instead of size_t.
+
+Sat Nov 2 21:26:42 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * error.c: Use STRERROR_MISSING instead of STDC_HEADERS to
+ control compiling strerror.
+
+Fri Oct 18 00:33:43 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * getugroups.c: GID_T -> GETGROUPS_T, for clarity.
+
+Wed Oct 9 14:14:31 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getopt.c: Treat hpux like USG.
+
+Tue Oct 8 21:36:52 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * alloca.c: Add some parens to make precedence clearer.
+
+Sat Oct 5 13:17:59 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * getopt.c: Treat NeXT like USG.
+
+Sat Sep 28 02:01:45 1991 David J. MacKenzie (djm at churchy.gnu.ai.mit.edu)
+
+ * regex.c: Include stdlib.h only if STDC_HEADERS, not if POSIX
+ (POSIX.1 doesn't require it to exist).
+
+Wed Sep 4 17:32:51 1991 Kathryn A. Hargreaves (letters at apple-gunkies)
+
+ * regex.[ch]: Put current version (0.1) here, after backing up old
+ files. For ChangeLog details, please refer to the ChangeLog
+ file in my regex directory.
+
+Sat Aug 24 04:22:01 1991 David J. MacKenzie (djm at apple-gunkies)
+
+ * getopt1.c: Declare getenv.
+
+Mon Aug 19 01:35:48 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * regex.c, getopt.c: Indent '#pragma alloca' so non-ANSI
+ compilers won't choke on it.
+
+Mon Aug 12 16:43:17 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * getopt.c: _POSIX_OPTION_ORDER renamed to POSIX_ME_HARDER.
+ * getopt1.c: Support POSIX_ME_HARDER.
+
+Wed Aug 7 00:53:00 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
+
+ * getdate.y: Add patch from perf@efd.lth.se to support
+ explicit "dst", for European timezones.
+
+Tue Jul 30 17:00:23 1991 David J. MacKenzie (djm at apple-gunkies)
+
+ * getdate.y: Rename NEED_TZSET to FTIME_MISSING.
+
+Fri Jul 26 23:09:22 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * regex.h: Delete `#pragma once'.
+
+Fri Jul 26 17:07:39 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
+
+ * a.out.gnu.h [sparc]: #define SEGMENT_SIZE 0. Is that right??
+
+Wed Jul 24 03:29:26 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * getopt.c, regex.c: Put alloca stuff first, where RS6000 requires it.
+ * getopt.c: Use const instead of CONST, and define it to
+ nothing if not __STDC__.
+
+ * xmalloc.c (xmalloc, xrealloc): Exit with value 2 on error,
+ not 1, so cmp can use it.
+
+Tue Jul 23 15:01:26 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * getugroups.c: GID_T is int if ultrix as well as if sun.
+
+Mon Jul 22 17:39:35 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * getugroups.c: If POSIX and not sun (bogus!), take an array
+ of gid_t instead of an array of int.
+
+Tue Jul 16 21:24:43 1991 Michael Meissner (meissner at wookumz.gnu.ai.mit.edu)
+
+ * obstack.h (__extension__): If compiling with a 1.xx GCC
+ compiler define __extension__ as nothing.
+
+Tue Jul 16 20:25:22 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * obstack.h [not __GNUC__] (obstack_finish): Add extra parens for clarity.
+ (conditionals for __GNUC__): Do not test __STRICT_ANSI__.
+ [__GNUC__] (most macros): Use __extension__ to avoid -pedantic warning.
+
+Tue Jul 16 17:12:02 1991 Michael Meissner (meissner at wookumz.gnu.ai.mit.edu)
+
+ * obstack.h (obstack_finish): If compiling with a non-GCC
+ compiler, use the argument (h) to point to the obstack
+ structure, rather than the __o1 pointer, which only exists in
+ the GNU side of the macros.
+ (#if __GNUC__ && __STDC__): If -pedantic is used do not use
+ the GNU CC ({}) optimizations, since these cause warnings to
+ be omitted.
+
+Tue Jul 16 01:59:58 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
+
+ * getdate.y (TimezoneTable): #if 0 zones which would require
+ storing a float in a time_t.
+
+Fri Jul 12 17:01:58 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * obstack.h (struct obstack): New flag maybe_empty_object.
+ (obstack_finish, both versions): Set the flag if allocate empty object.
+ Don't make the object nonempty. This replaces May 7 change.
+ * obstack.c (_obstack_begin, _obstack_newchunk): Clear the flag.
+ (_obstack_newchunk): Don't free "empty" chunk if flag is set.
+ (_obstack_free): Set the flag if we change chunks.
+
+Sat Jul 6 21:09:31 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
+
+ * getdate.y [NEED_TZSET]: Declare `timezone'.
+
+Thu Jun 20 01:11:31 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
+
+ * getopt.c: Separate decls of getenv and malloc from decls of
+ index and bcopy, to reduce duplicated code.
+
+Tue Jun 11 00:11:07 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
+
+ * regex.c (re_match_2): In case wordbeg, check whether we are
+ at the start of the string before checking the previous
+ character, not after, just like in case wordend.
+
+ * getdate.y: Declare alloca for old bisons.
+
+Mon May 20 13:13:32 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * obstack.c (obstack_free, _obstack_free): Define both, the same way.
+
+Sun May 19 18:37:38 1991 David J. MacKenzie (djm at churchy.gnu.ai.mit.edu)
+
+ * getdate.y: Rename getdate to get_date to avoid conflict with SVR4.
+
+Fri May 17 21:09:14 1991 David J. MacKenzie (djm at churchy.gnu.ai.mit.edu)
+
+ * filemode.c (ftypelet): Only test for S_ISBLK if it's defined.
+
+Sat May 11 14:49:43 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * obstack.h (obstack_finish): Typo in last change (non-GNUC version).
+
+Tue May 7 15:38:51 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * obstack.h (obstack_finish): Make each object at least 1 byte.
+
+Tue Apr 30 13:58:16 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
+
+ * getopt.c, regex.c [_AIX]: Do #pragma alloca.
+
+Wed Apr 10 19:08:02 1991 Per Bothner (bothner at pogo.gnu.ai.mit.edu)
+
+ * signame.h: Make sys_siglist be const char[] if __STDC__
+ is defined (thus making it compatible with signame.c).
+
+Tue Apr 2 16:49:02 1991 Roland McGrath (roland at churchy.gnu.ai.mit.edu)
+
+ * glob.c: Put #ifndef alloca around alloca goop.
+ (glob_vector): Put #ifdef SHELL around label used only there.
+
+Tue Apr 2 14:32:47 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
+
+ * glob.c: Attempt to reconcile with bash and make versions of
+ #ifdefs and #includes.
+
+ * glob.c (glob_vector): If _POSIX_SOURCE, don't use
+ (non-POSIX) d_ino field of struct dirent. (from bfox)
+
+Sun Mar 17 16:25:23 1991 Richard Stallman (rms@mole.ai.mit.edu)
+
+ * regex.c (PUSH_FAILURE_POINT): Was multiplying stack size by
+ a big number. Multiply by 2 instead.
+
+ * signame.c (init_sigs): Define i.
+
+Fri Feb 22 12:38:22 1991 Mike Haertel (mike at apple-gunkies)
+
+ * obstack.c (_obstack_allocated_p): Use >=, not >, when
+ comparing with the beginning of the chunk, for the exact
+ same reason as RMS' change below.
+
+Thu Feb 21 21:29:50 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * obstack.h [not __GNUC__] (obstack_free): Use >, not >=,
+ when comparing with beginning of chunk.
+
+ * getopt.c (bcopy): Never declare it.
+
+Thu Feb 21 09:18:47 1991 David J. MacKenzie (djm at geech.ai.mit.edu)
+
+ * glob.c: Don't declare bcopy if it is a macro.
+ Use BSD strings for NeXT. Don't include memory.h on POSIX.
+
+Mon Feb 18 23:41:20 1991 David J. MacKenzie (djm at geech.ai.mit.edu)
+
+ * glob.c: Add special code for bash, #ifdef SHELL.
+ (glob_pattern_p): Only recognize `[' as a metacharacter if
+ there is a matching `]', for POSIX.2. (from bfox)
+
+Mon Jan 28 00:30:39 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * crt0.c [m68k]: Add conditionals for sun_68881, sun_fpa, sun_soft.
+
+Sun Jan 27 15:18:26 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * getopt.c (bcopy): Don't declare it if it's a macro.
+
+Thu Jan 24 22:16:14 1991 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * regex.c (re_compile_pattern): Don't translate chars in char set
+ until the time the bits are set for them.
+
+Sat Dec 15 18:36:50 1990 David J. MacKenzie (djm at apple-gunkies)
+
+ * filemode.c: Define each S_ISFOO function if not defined by
+ sys/stat.h.
+
+Sat Dec 15 15:10:14 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * obstack.h (obstack_init): Cast the chunk alloc function.
+ (obstack_begin): Likewise.
+
+Thu Dec 13 17:58:07 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * obstack.h: At all calls to _obstack_newchunk,
+ enclose in (..., 0), so that both alternatives are ints.
+
+Thu Dec 6 11:39:11 EST 1990 Jay Fenlason (hack@ai.mit.edu)
+
+ * getdate.y: Add support for 'date' style yymmddhhss dates.
+
+Mon Dec 3 14:09:40 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * obstack.h:
+ At all calls to _obstack_newchunk, cast the other alternative to void.
+
+Sat Dec 2 21:56:25 1990 Roland McGrath (roland at albert.ai.mit.edu)
+
+ * a.out.gnu.h (N_COMM): Define this.
+
+Thu Nov 30 00:04:35 1990 Roland McGrath (roland at geech.ai.mit.edu)
+
+ * a.out.gnu.h (_N_HDROFF): Use SEGMENT_SIZE rather than a hard-coded
+ 1024. What moron did this??
+
+Wed Nov 29 17:41:09 1990 Roland McGrath (roland at albert.ai.mit.edu)
+
+ * a.out.gnu.h [vax, hp300, pyr] (SEGMENT_SIZE): Define as PAGE_SIZE,
+ not page_size.
+
+Wed Nov 14 00:35:16 1990 David J. MacKenzie (djm at apple-gunkies)
+
+ * regex.c (SIGN_EXTEND_CHAR): If UNSIGNED_CHAR is defined, use
+ an alternate definition (suggested in the GNU grep README).
+
+Thu Nov 8 12:08:52 1990 David J. MacKenzie (djm at apple-gunkies)
+
+ * filemode.c (ftypelet): Pass a mode_t instead of unsigned
+ short, so it works on Evans' Minix. If _POSIX_SOURCE is not
+ defined, define mode_t as unsigned short. Define S_ISTYPE
+ macros if needed. Use them.
+
+ * modechange.c: Use S_ISDIR. Define if needed.
+
+Fri Oct 26 16:50:01 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * obstack.c (_obstack_newchunk): If old_chunk becomes empty, free it.
+
+Mon Oct 15 13:50:17 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * obstack.h (obstack_free): In non-GNU C case, don't use
+ value of _obstack_free.
+
+Sun Oct 14 18:51:51 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * crt0.c (new hp assembler): Double flag_fpa and flag_68881 if %d2!=0.
+
+ * alloca.s [MOTOROLA_DELTA]: Avoid putting sp above stack top.
+
+Mon Oct 1 16:20:02 EDT 1990 Jay Fenlason (hack@ai.mit.edu)
+
+ * obstack.h Declare _obstack_free and _obstack_begin as void instead
+ of int. Otherwise, GCC won't let you compile obstack.c
+
+Fri Sep 28 23:53:28 1990 Richard Stallman (rms at mole.ai.mit.edu)
+
+ * obstack.h: Declare the functions we use from obstack.c.
+ (obstack_blank): In both definitions, rearrange pointer math to avoid
+ pointing past end of allocated memory.
+
+Wed Sep 19 21:09:26 1990 Richard Kenner (kenner at vlsi1.ultra.nyu.edu)
+
+ * obstack.h (obstack_int_grow): In non-GCC case, don't try to
+ post-increment a cast.
+
+Mon Sep 3 22:18:38 1990 David J. MacKenzie (djm at apple-gunkies)
+
+ * error.c [DOPRNT_MISSING]: Pass args as a fixed number of
+ `char *'.
+
+Sun Sep 2 20:51:02 1990 David J. MacKenzie (djm at apple-gunkies)
+
+ * regex.c: Use standard string functions if STDC_HEADERS is
+ defined.
+
+Fri Aug 31 06:59:47 1990 Jim Kingdon (kingdon at albert.ai.mit.edu)
+
+ * getopt1.c (getopt_long{,_only}): If opt_index is NULL, don't
+ try to store into *opt_index.
+
+Tue Aug 28 18:45:16 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * regex.c: Include some system header files if appropriate.
+
+Wed Aug 15 14:38:15 1990 David J. MacKenzie (djm at apple-gunkies)
+
+ * regex.c: Define isgraph if ctype.h doesn't (as on Sequents).
+
+Sun Aug 12 00:20:19 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * getopt.c (getopt): If optstring starts with '+', don't
+ permute; this is for utilities like time, nice, xargs, and
+ env, which don't want to mix up their options with those of
+ the programs they run, but don't want to turn off permuting
+ for those programs by setting _POSIX_OPTION_ORDER.
+
+Fri Aug 3 14:25:35 1990 David J. MacKenzie (djm at pogo.ai.mit.edu)
+
+ * getopt.c (main), getopt1.c (main): Read option chars into an
+ int, not a char.
+
+ * getopt.c (getopt): Increment `optind' after finding
+ unrecognized or ambiguous long named option.
+
+Thu Jul 5 09:50:25 1990 David J. MacKenzie (djm at apple-gunkies)
+
+ * getopt.c: If long option's `flag' field is zero, return the
+ contents of the `val' field.
+
+Fri Jun 29 01:30:22 1990 David J. MacKenzie (djm at apple-gunkies)
+
+ * getopt.h: Mention in comment how to handle long options that
+ don't just store a constant in an int.
+
+Mon Jun 25 18:15:46 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * filemode.c (ftypelet): Distinguish between regular files and
+ unknown file types using '-' and '?'.
+
+Sat Jun 16 11:18:26 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * getopt.c: If STDC_HEADERS or __GNU_LIBRARY__ is defined,
+ include ANSI C header files.
+
+Thu Jun 14 13:21:42 1990 David J. MacKenzie (djm at apple-gunkies)
+
+ * glob.c (glob_match): Eliminate '^' as a character class
+ negator, leaving just the POSIX '!'.
+
+Thu Jun 7 01:01:40 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU)
+
+ * glob.c: __GNU_LIBRARY__ implies DIRENT and STDC_HEADERS.
+
+Thu Jun 7 03:45:33 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * glob.c: Use <dirent.h> if DIRENT is defined, not _POSIX_SOURCE.
+
+Wed Jun 6 00:05:03 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * glob.c (glob_filename): Remove tilde expansion code.
+
+Tue Jun 5 00:35:48 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * error.c: Use VPRINTF_MISSING instead of VPRINTF to control
+ use of _doprnt.
+ (error): Use strerror.
+ (strerror) [!STDC_HEADERS]: New function.
+
+ * glob.c: Optionally support POSIX and STDC headers.
+ (glob_filename): Make tilde expansion work for patterns
+ containing subdirectories.
+
+Mon Jun 4 16:31:40 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * glob.c (glob_match): Allow '!' as well as '^' to negate
+ character classes. Check for end of filename when comparing
+ with char class. Check for end of pattern after backslash in
+ character class.
+ (glob_vector): Only calculate D_NAMLEN once, for efficiency.
+ Don't allocate name_vector if a previous malloc failed.
+ (glob_dir_to_array): Make string copying more efficient.
+ (glob_filename): directory_size was off by 1.
+ Reallocation of result had '1' instead of 'l'.
+
+Thu May 31 01:45:16 1990 David J. MacKenzie (djm at apple-gunkies)
+
+ * glob.c: Reformat to resemble the bash version more.
+
+ * filemode.c: If _POSIX_SOURCE is defined, use POSIX macro
+ names for mode bits.
+
+Sat May 19 15:17:42 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * filemode.c (mode_string): New function.
+ (filemodestring): Reimplement in terms of mode_string.
+ (ftypelet): Take an unsigned short instead of a struct stat *.
+ Fix up comments.
+
+Thu May 10 12:57:11 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * error.c: If __STDC__, use stdarg instead of varargs.
+
+Tue May 1 16:07:32 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * alloca.s [hp9000s300]: Avoid using sp as temporary.
+
+Fri Apr 20 16:58:24 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * obstack.c, obstack.h (obstack_free): Use >, not >=, to compare
+ object with chunk address.
+
+Mon Apr 9 15:11:22 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu)
+
+ * a.out.encap.h: Protect against multiple inclusion.
+
+Fri Apr 6 23:27:46 1990 Jim Kingdon (kingdon at apple-gunkies.ai.mit.edu)
+
+ * a.out.gnu.h (enum machine_type): Put missing comma after M_SPARC.
+
+Mon Apr 2 04:49:18 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu)
+
+ * malloc.c: Make get_lim_data always "static void" regardless
+ of #ifdefs. Declare it before using it.
+
+Mon Mar 26 00:36:52 1990 David J. MacKenzie (djm at spike.ai.mit.edu)
+
+ * getopt.c (getopt): For long-named options that take optional
+ args, never use the next argv-element as an arg; args for
+ these must be part of the same argv-element, separated from
+ the option name by a '='. This makes them consistent with how
+ short-named options with optional args are handled.
+
+ * getopt.h, getopt.c, getopt1.c: Add some const declarations
+ if __STDC__.
+
+Sun Mar 4 12:11:31 1990 Kathy Hargreaves (kathy at hayley)
+
+ * regex.h: Added syntax bit RE_NO_EMPTY_RANGES which is set if
+ an ending range point has to collate higher or equal to the
+ starting range point.
+ Added syntax bit RE_NO_HYPHEN_RANGE_END which is set if a hyphen
+ can't be an ending range point.
+ Set to two above bits in RE_SYNTAX_POSIX_BASIC and
+ RE_SYNTAX_POSIX_EXTENDED.
+
+ regex.c: (re_compile_pattern): Don't allow empty ranges if the
+ RE_NO_EMPTY_RANGES syntax bit is set.
+ Don't let a hyphen be a range end if the RE_NO_HYPHEN_RANGE_END
+ syntax bit is set.
+ (ESTACK_PUSH_2): renamed this PUSH_FAILURE_POINT and made it
+ push all the used registers on the stack, as well as the number
+ of the highest numbered register used, and (as before) the two
+ failure points.
+ (re_match_2): Fixed up comments.
+ Added arrays best_regstart[], best_regstart_seg1[], best_regend[],
+ and best_regend_seg1[] to keep track of the best match so far
+ whenever reach the end of the pattern but not the end of the
+ string, and there are still failure points on the stack with
+ which to backtrack; if so, do the saving and force a fail.
+ If reach the end of the pattern but not the end of the string,
+ but there are no more failure points to try, restore the best
+ match so far, set the registers and return.
+ Compacted some code.
+ In stop_memory case, if the subexpression we've just left is in
+ a loop, push onto the stack the loop's on_failure_jump failure
+ point along with the current pointer into the string (d).
+ In finalize_jump case, in addition to popping the failure
+ points, pop the saved registers.
+ In the fail case, restore the registers, as well as the failure
+ points.
+
+
+Sun Feb 18 15:08:10 1990 Kathy Hargreaves (kathy at hayley)
+
+ * regex.c: (global): Defined a macro GET_BUFFER_SPACE which
+ makes sure you have a specified number of buffer bytes
+ allocated.
+ Redefined the macro BUFPUSH to use this.
+ Added comments.
+
+ (re_compile_pattern): Call GET_BUFFER_SPACE before storing or
+ inserting any jumps.
+
+ (re_match_2): Set d to string1 + pos and dend to end_match_1
+ only if string1 isn't null.
+ Force exit from a loop if it's around empty parentheses.
+ In stop_memory case, if found some jumps, increment p2 before
+ extracting address to which to jump. Also, don't need to know
+ how many more times can jump_n.
+ In begline case, d must equal string1 or string2, in that order,
+ only if they are not null.
+ In maybe_finalize_jump case, skip over start_memorys' and
+ stop_memorys' register numbers, too.
+
+Thu Feb 15 15:53:55 1990 Kathy Hargreaves (kathy at hayley)
+
+ * regex.c (BUFPUSH): off by one goof in deciding whether to
+ EXTEND_BUFFER.
+
+Wed Jan 24 17:07:46 1990 Kathy Hargreaves (kathy at hayley)
+
+ * regex.h: Moved definition of NULL to here.
+ Got rid of ``In other words...'' comment.
+ Added to some comments.
+
+ regex.c: (re_compile_pattern): Tried to bulletproof some code,
+ i.e., checked if backward references (e.g., p[-1]) were within
+ the range of pattern.
+
+ (re_compile_fastmap): Fixed a bug in succeed_n part where was
+ getting the amount to jump instead of how many times to jump.
+
+ (re_search_2): Changed the name of the variable ``total'' to
+ ``total_size.''
+ Condensed some code.
+
+ (re_match_2): Moved the comment about duplicate from above the
+ start_memory case to above duplicate case.
+
+ (global): Rewrote some comments.
+ Added commandline arguments to testing.
+
+
+Wed Jan 17 11:47:27 1990 Kathy Hargreaves (kathy at hayley)
+
+ * regex.c: (global): Defined a macro STORE_NUMBER which stores a
+ number into two contiguous bytes. Also defined STORE_NUMBER_AND_INCR
+ which does the same thing and then increments the pointer to the
+ storage place to point after the number.
+ Defined a macro EXTRACT_NUMBER which extracts a number from two
+ continguous bytes. Also defined EXTRACT_NUMBER_AND_INCR which
+ does the same thing and then increments the pointer to the
+ source to point to after where the number was.
+
+
+Tue Jan 16 12:09:19 1990 Kathy Hargreaves (kathy at hayley)
+
+ * regex.h: Incorporated rms' changes.
+ Defined RE_NO_BK_REFS syntax bit which is set when want to
+ interpret back reference patterns as literals.
+ Defined RE_NO_EMPTY_BRACKETS syntax bit which is set when want
+ empty bracket expressions to be illegal.
+ Defined RE_CONTEXTUAL_ILLEGAL_OPS syntax bit which is set when want
+ it to be illegal for *, +, ? and { to be first in an re or come
+ immediately after a | or a (, and for ^ not to appear in a
+ nonleading position and $ in a nontrailing position (outside of
+ bracket expressions, that is).
+ Defined RE_LIMITED_OPS syntax bit which is set when want +, ?
+ and | to always be literals instead of ops.
+ Fixed up the Posix syntax.
+ Changed the syntax bit comments from saying, e.g., ``0 means...''
+ to ``If this bit is set, it means...''.
+ Changed the syntax bit defines to use shifts instead of integers.
+
+ * regex.c: (global): Incorporated rms' changes.
+
+ (re_compile_pattern): Incorporated rms' changes
+ Made it illegal for a $ to appear anywhere but inside a bracket
+ expression or at the end of an re when RE_CONTEXTUAL_ILLEGAL_OPS
+ is set. Made the same hold for $ except it has to be at the
+ beginning of an re instead of the end.
+ Made the re "[]" illegal if RE_NO_EMPTY_BRACKETS is set.
+ Made it illegal for | to be first or last in an re, or immediately
+ follow another | or a (.
+ Added and embellished some comments.
+ Allowed \{ to be interpreted as a literal if RE_NO_BK_CURLY_BRACES
+ is set.
+ Made it illegal for *, +, ?, and { to appear first in an re, or
+ immediately follow a | or a ( when RE_CONTEXTUAL_ILLEGAL_OPS is set.
+ Made back references interpreted as literals if RE_NO_BK_REFS is set.
+ Made recursive intervals either illegal (if RE_NO_BK_CURLY_BRACES
+ isn't set) or interpreted as literals (if is set), if RE_INTERVALS
+ is set.
+ Made it treat +, ? and | as literals if RE_LIMITED_OPS is set.
+ Cleaned up some code.
+
+
+Thu Dec 21 15:31:32 1989 Kathy Hargreaves (kathy at hayley)
+
+ * regex.c: (global): Moved RE_DUP_MAX to regex.h and made it
+ equal 2^15 - 1 instead of 1000.
+ Defined NULL to be zero.
+ Moved the definition of BYTEWIDTH to regex.h.
+ Made the global variable obscure_syntax nonstatic so the tests in
+ another file could use it.
+
+ (re_compile_pattern): Defined a maximum length (CHAR_CLASS_MAX_LENGTH)
+ for character class strings (i.e., what's between the [: and the
+ :]'s).
+ Defined a macro SET_LIST_BIT(c) which sets the bit for C in a
+ character set list.
+ Took out comments that EXTEND_BUFFER clobbers C.
+ Made the string "^" match itself, if not RE_CONTEXT_IND_OPS.
+ Added character classes to bracket expressions.
+ Change the laststart pointer saved with the start of each
+ subexpression to point to start_memory instead of after the
+ following register number. This is because the subexpression
+ might be in a loop.
+ Added comments and compacted some code.
+ Made intervals only work if preceded by an re matching a single
+ character or a subexpression.
+ Made back references to nonexistent subexpressions illegal if
+ using POSIX syntax.
+ Made intervals work on the last preceding character of a
+ concatenation of characters, e.g., ab{0,} matches abbb, not abab.
+ Moved macro PREFETCH to outside the routine.
+
+ (re_compile_fastmap): Added succeed_n to work analogously to
+ on_failure_jump if n is zero and jump_n to work analogously to
+ the other backward jumps.
+
+ (re_match_2): Defined macro SET_REGS_MATCHED to set which
+ current subexpressions had matches within them.
+ Changed some comments.
+ Added reg_active and reg_matched_something arrays to keep track
+ of in which subexpressions currently have matched something.
+ Defined MATCHING_IN_FIRST_STRING and replaced ``dend == end_match_1''
+ with it to make code easier to understand.
+ Fixed so can apply * and intervals to arbitrarily nested
+ subexpressions. (Lots of previous bugs here.)
+ Changed so won't match a newline if syntax bit RE_DOT_NOT_NULL is set.
+ Made the upcase array nonstatic so the testing file could use it also.
+
+ (main.c): Moved the tests out to another file.
+
+ (tests.c): Moved all the testing stuff here.
+
+
+Sat Nov 18 19:30:30 1989 Kathy Hargreaves (kathy at hayley)
+
+ * regex.c: (re_compile_pattern): Defined RE_DUP_MAX, the maximum
+ number of times an interval can match a pattern.
+ Added macro GET_UNSIGNED_NUMBER (used to get below):
+ Added variables lower_bound and upper_bound for upper and lower
+ bounds of intervals.
+ Added variable num_fetches so intervals could do backtracking.
+ Added code to handle '{' and "\{" and intervals.
+ Added to comments.
+
+ (store_jump_n): (Added) Stores a jump with a number following the
+ relative address (for intervals).
+
+ (insert_jump_n): (Added) Inserts a jump_n.
+
+ (re_match_2): Defined a macro ESTACK_PUSH_2 for the error stack;
+ it checks for overflow and reallocates if necessary.
+
+ * regex.h: Added bits (RE_INTERVALS and RE_NO_BK_CURLY_BRACES)
+ to obscure syntax to indicate whether or not
+ a syntax handles intervals and recognizes either \{ and
+ \} or { and } as operators. Also added two syntaxes
+ RE_SYNTAX_POSIX_BASIC and RE_POSIX_EXTENDED and two command codes
+ to the enumeration regexpcode; they are succeed_n and jump_n.
+
+
+Sat Nov 18 19:30:30 1989 Kathy Hargreaves (kathy at hayley)
+
+ * regex.c: (re_compile_pattern): Defined INIT_BUFF_SIZE to get rid
+ of repeated constants in code. Tested with value 1.
+ Renamed PATPUSH as BUFPUSH, since it pushes things onto the
+ buffer, not the pattern. Also made this macro extend the buffer
+ if it's full (so could do the following):
+ Took out code at top of loop that checks to see if buffer is going
+ to be full after 10 additions (and reallocates if necessary).
+
+ (insert_jump): Rearranged declaration lines so comments would read
+ better.
+
+ (re_match_2): Compacted exactn code and added more comments.
+
+ (main): Defined macros TEST_MATCH and MATCH_SELF to do
+ testing; took out loop so could use these instead.
+
+
+Tue Oct 24 20:57:18 1989 Kathy Hargreaves (kathy at hayley)
+
+ * regex.c (re_set_syntax): Gave argument `syntax' a type.
+ (store_jump, insert_jump): made them void functions.
+
+Tue Mar 6 23:29:26 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu)
+
+ * signame.c (sig_number): Return -1 if not found.
+
+Fri Mar 2 16:32:20 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu)
+
+ * signame.h [!__STDC__]: Remove comments cuz they're in [__STDC__].
+ signame.{c,h}: Make sig_abbrev return char *, not const char *.
+
+Thu Mar 1 14:10:32 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * getopt.c (getopt): If _getopt_long_only, for options that
+ start with '-' and are not a valid long-named option, only
+ interpret them as short options if the first letter is a valid
+ short option. Otherwise the error message would be printed
+ naming the short option letter instead of the whole option, and
+ if, for example, there is a 'T' long option, '-Tfoo' would print
+ "prog: invalid option `-T'" (which is wrong).
+
+Wed Feb 28 19:38:49 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * signame.h: Use ANSI C prototypes ifdef __STDC__.
+ * signame.c: Add const declarations ifdef __STDC__.
+
+Wed Feb 28 19:06:36 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu)
+
+ * signame.c (SIGPWR): Change name to "Power failure".
+
+Wed Feb 28 18:46:36 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * getopt.h: ifdef out decl of _getopt_option_name.
+
+Wed Feb 28 15:05:54 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu)
+
+ * getopt.c (getopt): Change typo (optstr -> optstring).
+
+ * getopt.c: Remove all _getopt_option_name stuff.
+ If RETURN_IN_ORDER, return one, not zero, to distinguish between
+ this and a long option.
+
+ * signame.{c,h}: New files.
+
+Tue Feb 27 13:32:45 1990 David J. MacKenzie (djm at rice-chex)
+
+ * getopt.c (getopt): In RETURN_IN_ORDER mode, set
+ _getopt_option_name to zero when returning a non-option arg in
+ optarg, to distinguish it from getting a long-named option
+ that takes an arg.
+ Print the correct option-introducing character (can be
+ either `+' or `-') in error messages for long-named options.
+ If _getopt_long_only is nonzero, no long options match an
+ option arg that starts with a dash, and there are valid short
+ options, try matching the arg against the short options.
+
+Thu Feb 22 19:50:49 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu)
+
+ * obstack.c (_obstack_begin): Use slightly smaller default size
+ so that it still fits in one block if malloc range checking is
+ in use.
+
+Mon Feb 19 15:41:14 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu)
+
+ * getopt1.c (getopt_long_only): New function.
+ getopt.h: Declare getopt_long_only and _getopt_long_only.
+ getopt.c: Define _getopt_long_only.
+ (getopt): If _getopt_long_only, accept '-' as well as '+' to start
+ long option.
+
+Sat Feb 3 16:28:00 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * alloca.s [MOTOROLA_DELTA]: New alternative for 68k.
+
+Sun Jan 28 22:29:17 1990 David J. MacKenzie (djm at hobbes.ai.mit.edu)
+
+ * getopt1.c (main): Fix bug that prevented the first long
+ option from being recognized.
+
+ * getopt.c: Move comment on the return value for long-named
+ options to a more appropriate place.
+
+Wed Jan 24 19:11:27 1990 David J. MacKenzie (djm at hobbes.ai.mit.edu)
+
+ * glob.c (glob_filename): Change '==' to '=' in what was
+ clearly supposed to be an assignment statement.
+
+Mon Jan 22 18:14:40 1990 David J. MacKenzie (djm at rice-chex)
+
+ * regcmp.c (regcmp): Allocate whole return value with one call
+ to malloc, so freeing the buffer works the same way as it does
+ on System V.
+
+Tue Jan 16 22:17:03 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu)
+
+ * a.out.gnu.h [hp300, pyr]: Define SEGMENT_SIZE to be page_size
+
+Wed Jan 10 06:57:10 1990 David J. MacKenzie (djm at hobbes.ai.mit.edu)
+
+ * glob.c: Use <sys/ndir.h> if SYSNDIR is defined (some Xenix
+ systems need this).
+
+Mon Jan 8 12:33:55 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * regex.c (re_compile_pattern): Add missing break in prev change.
+
+Mon Jan 1 12:16:56 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * regex.c (re_compile_pattern): Ignore \<, etc., checking
+ context of $.
+
+Mon Dec 25 12:00:16 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * obstack.h (obstack_object_size, obstack_room): Eliminate _obstack.
+
+Sat Dec 23 16:20:13 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * regex.c (re_compile_fastmap): Put back deleted local k.
+
+Wed Dec 20 02:03:43 1989 David J. MacKenzie (djm at hobbes.ai.mit.edu)
+
+ * getopt.h: Add function decls/prototypes for getopt and
+ getopt_long.
+
+ * getopt.c: Bring some comments up to date with the code.
+
+Tue Dec 19 03:12:48 1989 David J. MacKenzie (djm at hobbes.ai.mit.edu)
+
+ * regex.h: Add function prototypes if __STDC__ is defined.
+
+ * regex.c: Declare some external functions if emacs is not
+ defined. Add a few casts.
+ (re_compile_fastmap): Remove unused variable.
+
+Mon Dec 18 14:12:53 1989 David J. MacKenzie (djm at hobbes.ai.mit.edu)
+
+ * getopt.c: Declare some external functions.
+
+Mon Nov 20 19:57:00 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
+
+ * a.out.gnu.h: Wrap N_MAGIC in #ifndef...#endif.
+
+Fri Nov 17 03:12:28 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
+
+ * a.out.gnu.h: Wrap many things in #ifndef...#endif so file
+ can be used in addition to a system-supplied a.out.h.
+
+Tue Oct 31 17:03:06 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * getopt1.c (getopt_long): Delete mistaken test for index == 0.
+
+Wed Oct 25 17:50:51 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * getopt.c (getopt): Set option_index properly for long options.
+
+Tue Oct 24 23:41:06 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * getopt1.c (main): Fix initializers.
+
+ * getopt.c (getopt): Was off by 1, checking for missing arg
+ for long option.
+
+Wed Oct 18 13:15:18 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * getopt.c: Improve comments and an error message.
+ Don't initialize most variables, for the sake of unexec.
+
+Tue Oct 17 03:06:14 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * getopt.c (getopt): Uniformly don't recognize `+' as option
+ if program doesn't use long options.
+
+ * getopt.c (getopt): Complain about ambiguous option abbreviations.
+ But accept any exact match even if ambiguous.
+
+ * getopt.c (getopt): Report error for unrecognized long options.
+
+Sat Sep 30 14:47:29 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
+
+ * malloc.c: "#else rcheck" -> "#else /* rcheck */".
+
+Tue Sep 19 19:00:58 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * regex.h: Define RE_SYNTAX_POSIX_AWK.
+
+Sun Sep 17 15:20:46 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * regex.h: Last change in RE_SYNTAX_AWK broke RE_SYNTAX_EGREP.
+
+Sat Sep 16 01:53:53 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * regex.c (re_search_2): Stupid error propagating return code -2.
+
+Tue Sep 12 13:50:05 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * crt0.c [ISI68K]: Reinstall label __start.
+
+Tue Sep 5 15:43:24 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
+
+ * malloc.c: Define USG if hpux defined.
+
+Mon Aug 28 17:50:27 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * regex.c (re_compile_pattern): With RE_AWK_CLASS_HACK, \ quotes
+ all characters inside [...].
+
+Sat Aug 26 00:20:26 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu)
+
+ * regex.h: Define RE_AWK_CLASS_HACK and change RE_SYNTAX_AWK.
+ * regex.c (re_compile_pattern): Change syntax of \ inside [...]
+ when RE_AWK_CLASS_HACK is set.
+
+ * regex.c (re_match_2): Declare strings to search as char *,
+ and cast inside the function.
+
+Sat Aug 19 14:55:19 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu)
+
+ * regex.c (EXTEND_BUFFER): Don't clobber c; do pointer arith
+ to update b in portable fashion.
+
+Thu Aug 17 15:56:36 1989 Joseph Arceneaux (jla at spiff)
+
+ * regex.c (EXTEND_BUFFER): Set c to bufp->buffer - old_buffer.
+
+Sun Aug 13 15:21:02 1989 Richard Stallman (rms at hobbes.ai.mit.edu)
+
+ * obstack.h: Typos in comments.
+
+Sun Jul 30 20:24:52 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * obstack.c (_obstack_newchunk): Never copy bytes past the end
+ of the object. Copy by COPYING_UNIT only for complete units
+ that fit in the object; then copy remaining bytes singly.
+ If obstack has less than the default alignment,
+ copy all bytes singly.
+
+Thu Jul 20 01:51:56 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * crt0.c: Delete spaces at ends of lines.
+ [ISI68K]: Unconditionally enclose asms in function `_start'.
+ Delete assembler definition of that function.
+ Use a6, not fp, as register name.
+
+Sun Jul 16 16:32:52 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
+
+ * a.out.encap.h: Remove #ifdef ALTOS code because according to
+ Jyrki Kuoppala <jkp@sauna.hut.fi> it doesn't do what he put it
+ in to do (which was work around a kernel bug).
+
+Thu Jun 29 19:59:16 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu)
+
+ * malloc.c (valloc): Changed to be conditionalized on ! hpux
+ instead of ! HPUX (hpux this is generated by the OS).
+
+Tue Jun 20 21:14:57 1989 Roland McGrath (roland at hobbes.ai.mit.edu)
+
+ * Makefile: include ../Makerules.
+ Added .y->.tab.c implicit rule and rule to make unctime.tab.o.
+ Use $(archpfx) in front of object files.
+ Made some rules use $({LINK,COMPILE}.?) instead of $(CC), etc.
+
+Sat Jun 17 14:22:53 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * regex.h (struct re_pattern_buffer): Make ALLOCATED and USED long.
+ * regex.c (EXTEND_BUFFER): Use long constants to compare with them.
+ Move assignment outside if-condition.
+ Do pointer relocation arithmetic in strictly correct order.
+
+Sat Jun 10 00:26:01 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * glob.c [USG]: Define rindex; declare getpwent, etc.
+
+Wed Jun 7 22:36:51 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * alloca.s [hp9000s300]: Increase MAXREG for fpregs.
+
+ * crt0.c: For new hp assembler, define float_loc as fixed location.
+
+Wed May 31 17:51:41 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * a.out.gnu.h: Define SEGMENT_SIZE for Altos.
+
+Mon May 22 17:59:17 1989 Roland McGrath (mcgrath at tully.Berkeley.EDU)
+
+ * glob.c: Several changes for USG compatibility, etc. that have been
+ in the version distributed with Make for a while.
+ Today added new variable glob_tilde which makes glob_filename expand
+ ~ or ~USER, and made glob_filename, when given a directory with the
+ file name pattern, return the directory alone.
+
+Wed May 17 16:45:36 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * getopt.c (getopt): Add feature for long-named options;
+ starting with `+'.
+
+Mon May 8 17:21:40 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * crt0.c [sps7]: Handle mostly like orion, etc.
+
+Fri May 5 15:26:58 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * obstack.c (_obstack_free): If __STDC__, define this as well as
+ obstack_free.
+
+ * crt0.c [hp9000s300]: Give fixed address to fpa_loc, per cph.
+
+Tue May 2 14:42:26 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * crt0.c [hp9000s300]: Allocate fpa_loc and float_loc.
+
+Sun Apr 23 00:22:37 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * a.out.encap.h (COFF_MAGIC, SEGMENT_SIZE, N_DATADDR):
+ Alternate definitions if ALTOS or if m68k.
+
+ * getopt.c: If __GNUC__, use builtin alloca.
+ Define index if USG.
+
+Wed Apr 19 13:03:18 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * crt0.c [m68000]: Call finitfp_() if nec on Sun.
+
+Fri Apr 7 22:22:38 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * malloc.c: Rename BSD42 to BSD4_2, as in Emacs.
+ If `emacs', let config.h decide whether to define that.
+ (morecore): Change malloc_sbrk_used, etc., after error check.
+
+Thu Mar 23 18:21:56 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu)
+
+ * glob.c: Added new copyright notice.
+
+Thu Mar 16 16:56:54 1989 Randall Smith (randy at gluteus.ai.mit.edu)
+
+ * malloc.c (malloc): Made sure that the MAGIC1 bytes written at
+ the end of the space were positioned with regard to the new
+ offset.
+
+Fri Mar 10 16:50:12 1989 Randall Smith (randy at sugar-bombs.ai.mit.edu)
+
+ * malloc.c (realloc): Make sure that the start of the mhead is
+ found correctly even when sizeof (struct mhead) doesn't divide 8
+ properley.
+
+ * malloc.c (morecore): Added code to reset sigmask to correct
+ value on a "no-more-room" return.
+
+ * malloc.c (malloc, free, realloc): Leave 8 bytes of space, not 4,
+ before the actual data block.
+
+Fri Mar 3 10:52:14 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu)
+
+ * a.out.encap.h, stab.def: Modified to use new GNU General Public
+ License.
+
+Thu Mar 2 15:45:46 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu)
+
+ * a.out.gnu.h [nlist]: Made n_type an unsigned char (for compilers
+ where chars default to signed, which can screw up comparisons) and
+ made n_value an unsigned long.
+
+Wed Mar 1 13:04:25 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu)
+
+ * getopt.c: Changed copyright header to reflect new GNU General
+ public license.
+
+Fri Feb 24 13:00:21 1989 Randall Smith (randy at gluteus.ai.mit.edu)
+
+ * regex.c, regex.h: Changed copyright header to reflect new GNU
+ General public license.
+
+Sun Feb 19 08:02:01 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu)
+
+ * getopt.c: If option argument is missing, return `?'.
+
+Fri Feb 10 13:31:05 1989 Randall Smith (randy at plantaris.ai.mit.edu)
+
+ * stab.def: Changed comment on LSYM; also used for type
+ descriptions.
+
+Wed Feb 1 23:15:39 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * filemode.c (setst): Give `T' if sticky but not executable.
+
+Mon Jan 9 10:31:20 1989 Pace Willisson (pace at prep.ai.mit.edu)
+
+ * a.out.gnu.h: Change a_magic to a_info, and define macros
+ to access it. Programs that refer to the magic number should
+ access it with N_MAGIC (exec), and set it with N_SET_MAGIC (exec,
+ val). This is a step to having a header that is unambiguous
+ between big and little endian machines.
+
+ * a.out.encap.h: Use macros to access a_info fields.
+
+Wed Dec 28 18:58:53 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * crt0.c (hp9000s300): Changes from Jinx: new flag `flag_fpa'
+ set with a subx. d0 loaded from a0 and doubled before first subx.
+
+Tue Dec 20 22:13:49 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
+
+ * a.out.gnu.h (N_DATADDR): Always define this if not already defined.
+ (SEGMENT_SIZE): Define this for the vax.
+
+Tue Dec 20 14:57:38 1988 Pace Willisson (pace at prep.at.mit.edu)
+
+ * a.out.gnu.h: Changed exec header to have two bytes
+ (a_machtype and a_flags) instead of a_encap. a_machtype
+ is the same as on modern sun systems; a_flags can have
+ machine specific flags. (There may be some endian problems
+ here: You would like to have the magic number be the
+ first two bytes in the file, and then the next two could
+ be these options. It looks like the 68000 definitions
+ have to declare the options first to force this to happen.)
+ Defined M_386 for a_machtype.
+ Added definitions for N_DATOFF, N_TRELOFF, N_DRELOFF,
+ N_DATADDR, N_BSSADDR (which are present in sun release 4.0)
+
+ * a.out.encap.h: Defined A_ENCAP as an a_flags value. Changed
+ uses of a_encap to a_flags & A_ENCAP
+
+Wed Dec 7 11:18:30 1988 Randall Smith (randy at apple-gunkies.ai.mit.edu)
+
+ * malloc.c: Added functions malloc_mem_used and malloc_mem_free to
+ return total amount of space allocated to program, and total space
+ left in free pool before sbrk must be called.
+
+Tue Nov 22 13:05:25 1988 Randall Smith (randy at cream-of-wheat.ai.mit.edu)
+
+ * glob.c: Incorporated some bug fixes and changes sent by Brian.
+ None of them look disasterous.
+
+Fri Oct 21 12:40:24 1988 Randall Smith (randy at cream-of-wheat.ai.mit.edu)
+
+ * malloc.c (free): Added code (within #ifdef rcheck) to given
+ slightly more verbose warnings then an abort if free was called
+ with garbage.
+
+Local Variables:
+add-log-time-format: current-time-string
+mode: indented-text
+left-margin: 8
+version-control: never
+End:
diff --git a/contrib/gcc/FSFChangeLog.10 b/contrib/gcc/FSFChangeLog.10
new file mode 100644
index 0000000..0fea553
--- /dev/null
+++ b/contrib/gcc/FSFChangeLog.10
@@ -0,0 +1,10110 @@
+Sun Mar 31 05:10:10 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * stor-layout.c (layout_decl): Don't make a bitfield an integral mode
+ if the mode of the field type is not MODE_INT.
+
+ * sched.c (schedule_block): CALL_INSNs don't affect fixed regs.
+ * flow.c (propagate_block): CALL_INSNs don't kill fixed regs.
+
+Sat Mar 30 03:32:48 1996 Torbjorn Granlund <tege@noisy.tmg.se>
+
+ * expmed.c (expand_divmod, case TRUNC_DIV_EXPR): Move some code
+ to avoid shifting by a too large count.
+
+Fri Mar 29 15:45:51 1996 Doug Evans <dje@cygnus.com>
+
+ * configure (i[3456]86-*-sunos5*): Delete, config.sub converts
+ sunos5 to solaris2.
+ (sparc-*-sunos5*): Likewise.
+ (sparc64-*-{solaris2*,sunos5*}): Delete. Stick with sparc-*-solaris2*.
+
+ * sparc.h (FUNCTION_PROFILER): Save/restore %g2 around mcount call.
+
+Fri Mar 29 14:20:31 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.c (notice_update_cc): Clear cc_status if ref modified MEM.
+
+Fri Mar 29 09:37:52 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * calls.c (expand_call): Remove current_call_is_indirect nonsense.
+ Add additional argument to INIT_CUMULATIVE_ARGS.
+ (emit_library_call): Likewise.
+ (emit_library_call_value): Likewise.
+ * expr.c (expand_builtin): Likewise.
+ * function.c (assign_parms): Likewise.
+ * pa.h (hppa_args): New field "indirect".
+ (INIT_CUMULATIVE_ARGS): Initialize "indirect" field.
+ (FUNCTION_ARG): Check "indirect" field, rather than
+ "current_call_is_indirect".
+ * a29k.h (INIT_CUMULATIVE_ARGS):New arg, INDIRECT.
+ * alpha.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * arm.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * clipper.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * convex.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * dsp16xx.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * elxsi.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * fx80.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * gmicro.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * h8300.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * i370/mvs.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * i386.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * i860.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * i960.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * m68k.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * m68k/mot3300.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * m88k.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * mips.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * ns32k.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * pdp11.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * pyr.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * romp.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * rs6000.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * sh.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * sparc.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * spur.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * tahoe.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * vax.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * we32k.h (INIT_CUMULATIVE_ARGS): Likewise.
+ * mips.c (mips_expand_prologue): Add extra arg to
+ INIT_CUMULATIVE_ARGS call.
+
+Thu Mar 28 18:45:49 1996 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alpha.c (summarize_insn): Fix three "off-by-one" bugs in loop bounds.
+
+Thu Mar 28 16:50:10 1996 Doug Evans <dje@cygnus.com>
+
+ * ginclude/inl-sparc.h: Deleted.
+
+Thu Mar 28 12:07:31 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * va-h8300.h (va_arg): Don't assume sizeof (int) == 4.
+
+ * pa.c (hppa_legitimize_address): Don't lose for
+ (plus (plus (mult (A) (shadd_const)) (B)) (C)) if
+ B + C isn't a valid address for indexing.
+ (basereg_operand): Only accept base registers after
+ cse has completed. Don't accept the frame pointer if
+ it's likely to be eliminated.
+ * pa.md (unscaled indexing patterns): Add variants with
+ basereg and index register reversed.
+ (HImode and QImode loads): Add zero extended variants.
+
+Wed Mar 27 07:45:27 1996 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expmed.c (negate_rtx): Fix typo in previous change.
+
+Tue Mar 26 13:50:43 1996 Jim Wilson <wilson@mole.gnu.ai.mit.edu>
+
+ * calls.c (expand_call): In convert_to_mode call, use word_mode
+ not SImode.
+
+Tue Mar 26 13:44:34 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * configure: Delete unnecessary special handling of --with-cpu.
+
+Tue Mar 26 10:41:57 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * expr.c (emit_push_insn): When doing a partial push, emit
+ a CLOBBER so that flow doesn't think the entire register
+ is live.
+
+Tue Mar 26 10:00:52 1996 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alpha.c (summarize_insn, default case): Properly use format_ptr.
+
+Tue Mar 26 09:51:09 1996 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k.h (output_move_simode_const): New extern declaration.
+ * m68k.c (output_move_simode_const): New function.
+ (singlemove_string): Call it.
+ * m68k.md (fullword move): Likewise.
+
+Tue Mar 26 05:43:06 1996 Torbjorn Granlund <tege@noisy.tmg.se>
+
+ * vax.md (insv matcher): Call CC_STATUS_INIT.
+ * vax.h (NOTICE_UPDATE_CC): Handle ZERO_EXTRACT destination.
+
+Mon Mar 25 19:18:08 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * function.c (expand_function_start): Don't set up context_display
+ unless current_function_needs_context.
+
+Mon Mar 25 18:48:18 1996 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * fold-const.c (fold, case BIT_IOR_EXPR): Recognize rotates
+ with variable count.
+
+Mon Mar 25 18:05:28 1996 Jim Wilson <wilson@cygnus.com>
+
+ * Makefile.in (libgcc1-test): Undo Feb 12 change.
+
+Mon Mar 25 08:09:59 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * objc/thread-single.c (objc_mutex_unlock): Properly declare thread_id.
+
+Mon Mar 25 08:02:50 1996 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * configure (m68k-motorola-sysv*): Fixed indentation.
+
+Sun Mar 24 08:16:42 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expmed.c (negate_rtx): Don't try to negate a constant ourself;
+ instead call simplify_unary_operation.
+
+Sun Mar 24 07:29:06 1996 Richard Henderson <rth@tamu.edu>
+
+ * gcc.c (process_command): Instead of hardcoding non-empty
+ switches_need_spaces to turn on "o" and "L", make the string
+ contain the switches that need the spaces.
+ * m68k/ccur-GAS.h (SWITCHES_NEED_SPACES): Change definition
+ correspondingly.
+
+Sat Mar 23 18:34:44 1996 Harry Dolan <dolan@ssd.intel.com>
+
+ * i860/paragon.h (LIB_SPEC): Always output -lmach.
+
+Sat Mar 23 18:25:39 1996 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * c-typeck.c (set_init_index): Check for use outside an array
+ initializer.
+
+ * defaults.h (ASM_OUTPUT_ADDR_DIFF_ELT): Delete.
+ * pdp11.h (ASM_OUTPUT_ADDR_DIFF_ELT): Don't define.
+
+Sat Mar 23 15:55:35 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * combine.c (make_extraction): In BITS_BIG_ENDIAN correction of POS,
+ need to treat MEM and REG differently.
+
+ * sparc.h (SPARC_SIMM{10,11,13}_P): Define.
+ (SMALL_INT): Use SPARC_SIMM13_P.
+ (CONST_OK_FOR_LETTER_P): Support new letters L,M.
+ * sparc.c (arith11_operand): Use SPARC_SIMM11_P.
+ (arith10_operand): Use SPARC_SIMM10_P.
+ * sparc.md (*mov{qi,hi,si,di}_cc_sp64): Fix constraints.
+ (*mov{qi,hi,si,di}_cc_reg_sp64): Likewise.
+
+Sat Mar 23 07:47:19 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m68k/linux.h (TRAMPOLINE_TEMPLATE): Correct first instruction.
+ * m68k/m68kv4.h (TRAMPOLINE_TEMPLATE): Likewise.
+
+Sat Mar 23 07:06:55 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * bc-emit.c (bc_emit_instruction): Add missing va_end call.
+
+ * c-typeck.c (build_array_ref): Give error if subscripting a function.
+
+Fri Mar 22 09:11:45 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * local-alloc.c (optimize_reg_copy_1): Only update reg_live_length
+ if it is non-negative.
+
+Thu Mar 21 14:42:26 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc/splet.h (STARTFILE_SPEC,LINK_SPEC): Define.
+
+Wed Mar 20 17:23:18 1996 Jim Wilson <wilson@cygnus.com>
+
+ * cse.c (note_mem_written): Delete obsolete code for handling
+ (mem (scratch)).
+
+ * mips.c (mips_expand_prologue): In initialization of fnargs, delete
+ special treatment of METHOD_TYPE.
+
+Wed Mar 20 17:07:45 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc/sol2.h (ASM_CPU_SPEC): Recognize -mcpu=v8plus, not v9.
+ Fix typo in ultrasparc entry.
+ * sparc.h (CPP_CPU_SPEC): Add v8plus entry.
+ (ASM_CPU_SPEC): Likewise.
+
+ * sparc.c (fcc_reg_operand): Ensure correct mode.
+ (icc_or_fcc_reg_operand): Likewise.
+ (gen_v9_scc): IF_THEN_ELSE must have a mode.
+ (print_operand): New operand code `x' for all condition codes.
+ New operand codes `c,d' for reversed conditional moves.
+ * sparc.md (movqicc,movhicc): New named patterns.
+ (movdicc): if_then_else must have a mode.
+ (movsicc,movsfcc,movdfcc,movtfcc): Likewise.
+ Change condition to TARGET_V9, not TARGET_ARCH64.
+ Fail if DImode compare and ! TARGET_ARCH64.
+ (conditional move matchers): Rewrite.
+
+Wed Mar 20 16:12:29 1996 Stan Cox <coxs@wombat.gnu.ai.mit.edu>
+
+ * i386.h (HARD_REGNO_MODE_OK): Relax QImode constraint to
+ avoid a reload problem.
+
+Wed Mar 20 13:12:22 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.c (hppa_legitimize_address): Don't lose for x[n-const]
+ when n-const will not be shifted. Don't pessimize code for
+ x[n-const] when const is small.
+
+Wed Mar 20 11:42:32 1996 Markus Theissinger <Markus.Theissinger@gmd.de>
+
+ * m68k/sun3.h (LIB_SPEC): Don't link /usr/lib/bb_link.o with `gcc -a'.
+ (__bb_init_func): Deleted.
+ (BLOCK_PROFILER_CODE): Don't set macro to nothing.
+
+ * m68k/xm-sun3.h: New file.
+ * configure (m68k-sun-sunos*): Use it.
+
+ * xm-linux.h (HAVE_POPEN): New define.
+
+Wed Mar 20 11:28:37 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m68k/linux.h (ASM_SPEC): Deleted.
+ (STRUCT_VALUE_REGNUM): Redefine as register a0.
+ (STATIC_CHAIN_REGNUM): Redefine as register a1.
+ (TRAMPOLINE_TEMPLATE): Redefine to use the right register.
+
+Wed Mar 20 08:04:34 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * libgcc2.c (__dummy): New function.
+ * Makefile.in (LIB2FUNCS): Add __dummy.
+ * expr.c (expand_builtin, case BUILT_IN_SETJMP): Call "setjmp"
+ pattern, if any.
+ Call dummy function pointed to by static chain pointer.
+ (expand_builtin, case BUILT_IN_LONJMP): Ignore second expression.
+ Set address of __dummy into static chain pointer.
+ Copy the label to return to into a pseudo earlier.
+
+ * stupid.c (last_setjmp_suid, regs_crosses_setjmp): New variables.
+ (stupid_life_analysis, stupid_mark_refs): Use them to track which
+ regs are live over a setjmp; don't allocate such regs.
+
+Tue Mar 19 22:02:07 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * cplus-dem.c (demangle_template): Fix for non-mangled pointer
+ arguments.
+
+Tue Mar 19 13:54:06 1996 Jeffrey A. Law <law@wombat.gnu.ai.mit.edu>
+
+ * pa.c (compute_frame_size): Update comments to reflect reality.
+ (hppa_expand_prologue): Don't save registers which aren't
+ used, even if it creates holes. Partially undoes changes from
+ early March.
+ (hppa_expand_epilogue): Likewise.
+
+Tue Mar 19 08:25:17 1996 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * stmt.c (struct case_node): New member balance.
+ (add_case_node): New function.
+ (pushcase, pushcase_range): Use it.
+ (case_tree2list): New function.
+ (expand_end_case): Use it.
+
+Tue Mar 19 07:44:22 1996 Stephen L Moshier (moshier@world.std.com)
+
+ * regstack.c (move_for_stack_reg): Avoid stack overflow while
+ storing XFmode from fp reg to memory.
+
+Tue Mar 19 07:38:03 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * m68k.h (MASK_*): New macros.
+ (OVERRIDE_OPTIONS): Use them.
+ (TARGET_SWITCHES): Likewise.
+ Treat -m68332 like -m68000.
+
+Mon Mar 18 20:04:13 1996 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * expmed.c (emit_store_flag): If expanding (GE X 0) will need two
+ insns, don't use subtarget for the result of the first insn.
+ Move a likely constant to the start of a condition.
+
+Mon Mar 18 19:48:14 1996 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * m68k.h (CONST_OK_FOR_LETTER_VALUE): New constraint 'M'.
+ * m68k.c (output_function_epilogue): Restore registers using sp+
+ instead of fp(n) in leaf functions.
+ (USE_MOVQ, use_movq): Function replaced by macro.
+ * m68k.md (pushexthisi_const, movsi_const0): New names.
+ (andsi3, iorsi3): Allow only 'M', not 'K' constants, if dest is 'd'.
+
+Mon Mar 18 19:33:20 1996 Fila Kolodny <fila@ibi.com>
+
+ * i370/t-mvs: New file.
+ * configure (i370-*-mvs*): Use it.
+ * i370/mvs.h (FUNCTION_PROLOGUE): LE/370 takes 120 bytes for DSA.
+ Have only one copy of timestamp and PPA2 per object module.
+ Only have unnamed CSECT to match IBM C.
+
+Mon Mar 18 19:26:21 1996 Paul Russell (Rusty.Russell@adelaide.maptek.com.au)
+
+ * combine.c (simplify_if_then_else): Allow for case that
+ condition might no longer be a condition.
+
+Mon Mar 18 19:14:42 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-typeck.c (build_conditional_expr): If OP1 is null, set
+ both OP1 and ORIG_OP1 to IFEXP.
+
+ * c-iterate.c (iterator_loop_epilogue): Don't clear DECL_RTL
+ for a static decl.
+
+Mon Mar 18 08:02:25 1996 Stephen L Moshier <moshier@world.std.com>
+
+ * alpha.c (summarize_insn, case SUBREG, CONST_*): New cases.
+
+Sun Mar 17 16:55:00 1996 Doug Evans <dje@cygnus.com>
+
+ * combine.c (find_split_point): Handle NULL return from
+ make_extraction.
+ (make_field_assignment): Likewise.
+
+Sat Mar 16 18:56:47 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * tree.c (substitute_in_expr, case COMPONENT_REF): Ignore
+ if inner PLACEHOLDER_EXPR has not yet been initialized.
+
+ * i386.c (standard_80386_constant_p): -0.0 is not 0.0.
+ * i386.md (insv): Restore missing end of comment.
+
+ * combine.c (make_extraction): Correct typo in force_to_mode
+ call in previous change.
+ Return 0 if pos+len out of range of want desired mode.
+
+Sat Mar 16 16:20:43 1996 David Mosberger-Tang <davidm@azstarnet.com>
+
+ * alpha.md (trap): New attribute.
+ Modify patterns for all floating-point trap generating instructions.
+ * alpha.h (CPP_SPEC): Added -mieee and -mieee-with-inexact.
+ (alpha_trap_precision, alpha_fp_rounding_mode, alpha_fp_trap_mode):
+ New enum types.
+ (target_flags, alpha_tp, alpha_fprm, alpha_fptm): New external vars.
+ (alpha_fprm_string, alpha_fptm_string, alpha_tp_string): Likewise.
+ (TARGET_IEEE{,_WITH_INEXACT,_CONFORMANT}): New macros.
+ (MASK_IEEE{,_WITH_INEXACT,_CONFORMANT}): Likewise.
+ (MASK_FP, MASK_FPREGS,
+ (TARGET_SWITCHES): Added "ieee-conformant", "ieee", and
+ "ieee-with-inexact"; use MASK symbols.
+ (TARGET_OPTIONS): New macro.
+ (OVERRIDE_OPTIONS, FINAL_PRESCAN_{INSN,LABEL}): New macros.
+ (PRINT_OPERAND_PUNCT_VALID_P): Allow operand codes for FP insns.
+ (CC1_SPEC): New macro.
+ * alpha.c (alpha_tp, alpha_fprm, alpha_fptm): New variables.
+ (alpha_tp_string, alpha_fprm_string, alpha_fptm_string
+ (trap_pending): Likewise.
+ (override_options, summarize_insn, final_prescan_insn): New functions.
+ (print_operand): Handle cases '&', '\'', ')', and '+'.
+ (output_prolog): Emit ".eflag 48" if TARGET_IEEE_CONFORMANT.
+ (output_epilog): Call final_prescan_insn before emitting epilog.
+
+ * final.c (final_scan_insn, case CODE_LABEL): Invoke
+ FINAL_PRESCAN_INSN if FINAL_SCAN_LABEL is defined.
+
+ * alpha/{linux.h,x-linux,xm-linux.h}: New files.
+ * configure (alpha-*-linux*): New case.
+ * alpha.c (output_prolog): Set alpha_function_needs_gp if profiling
+ and TARGET_PROFILING_NEEDS_GP defined.
+
+Thu Mar 14 22:28:20 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.h (LEGITIMATE_OFFSET_ADDRESS_P): Fix last change.
+ * aix41.h (LINK_SPEC): add -bnoentry if shared and no explicit entry.
+
+Thu Mar 14 12:47:33 1996 Jim Wilson <wilson@cygnus.com>
+
+ * mips.h (ASM_OUTPUT_DOUBLE_INT): Use 'X' if CONST_INT and
+ HOST_BITS_PER_WIDE_INT == 64.
+
+ * mips.c (mips_expand_prologue): Change TYPE_NEEDS_CONSTRUCTING to
+ TREE_ADDRESSABLE;
+
+Thu Mar 14 11:21:37 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.h (LEGITIMATE_OFFSET_ADDRESS_P): For 32-bit mode,
+ allow TImode variables with int offsets, so that structures
+ greater than 8 bytes and less than or equal to 16 bytes can be
+ instantiated correctly.
+
+ * rs6000.c (rs6000_valid_type_attribute_p): Add exception
+ attribute for Windows NT.
+
+ * win-nt.h (ASM_OUTPUT_FUNCTION_PREFIX): Delete, merge into
+ ASM_DECLARE_FUNCTION_NAME.
+ (ASM_DECLARE_FUNCTION_NAME): Add support for exception attribute
+ setting fields 3 & 4 of the structured exception handling table.
+
+Thu Mar 14 01:53:19 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.h (ASM_DECLARE_FUNCTION_NAME): Change TYPE_NEEDS_CONSTRUCTING
+ to TREE_ADDRESSABLE. From Jim Wilson.
+
+Wed Mar 13 13:40:32 1996 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * c-tree.h (warn_sign_compare): Add extern to declaration.
+
+Wed Mar 13 13:37:00 1996 Doug Evans <dje@cygnus.com>
+
+ * configure: Use cross-make and build-make if building
+ cross compiler with cross compiler.
+
+Wed Mar 13 12:00:34 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * i386/cygwin32.h (ASM_OUTPUT_ALIGN): Correct defination.
+
+ * rs6000/{win-nt,cygwin32}.h (STARTFILE_SPEC): Add crti.o before
+ all objects.
+ (ENDFILE_SPEC): Add crtn.o after all objects.
+
+ * configure (powerpcle-*-cygwin32): Use t-winnt, not t-cygin32
+ * rs6000/t-cygwin32: Delete, no longer used.
+
+ * rs6000/t-winnt ({,INSTALL_}LIBGCC): Build and install crti.o and
+ crtn.o.
+
+ * rs6000/win-nt.h (EXTRA_SECTION_FUNCTIONS): Add ctors_section and
+ dtors_section.
+ (INVOKE__main): Define, so that __main is called.
+ (ASM_OUTPUT_{CONSTRUCTOR,DESTRUCTOR}): Define to put pointers to
+ the constructor/destructor in the appropriate section.
+
+ * nt-c{i,n}.asm: New files to be linked before/after all of the users'
+ objects.
+
+Wed Mar 13 00:42:17 1996 Per Bothner <bothner@cygnus.com>
+
+ * dbxout.c (dbxout_type): Better "variant" handling to ignore
+ const/volatile but not typedef names. Improves Feb 12 change.
+
+Tue Mar 12 17:25:14 1996 David Mosberger-Tang <davidm@azstarnet.com>
+
+ * glimits.h (__LONG_MAX__): On Alpha, use 64 bit value.
+
+Tue Mar 12 15:07:49 1996 Torbjorn Granlund <tege@tmg.se>
+
+ * m68k.c (valid_dbcc_comparison_p): Don't test cc_prev_status here.
+ (flags_in_68881): New function.
+ * m68k.md (dbra peepholes): Use flags_in_68881.
+
+Tue Mar 12 13:54:15 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * sparc.md (nonlocal_goto): Emit barrier after jump.
+ (setjmp{,_64,_32}): New patterns.
+
+Tue Mar 12 12:43:27 1996 Jim Wilson <wilson@cygnus.com>
+
+ * i960.h (ROUND_TYPE_SIZE): Return round_up result instead of
+ COMPUTED.
+
+ * expr.c (expand_expr, case COMPONENT_REF): For unaligned object in
+ an aligned union, delete check for EXPAND_SUM.
+
+ * expr.h (clear_storage): Add comment terminator.
+
+Mon Mar 11 19:07:50 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * recog.c (constrain_operands, case 'V'): Don't call
+ offsettable_memref_p before reload has completed.
+
+Mon Mar 11 16:06:13 1996 Doug Evans <dje@cygnus.com>
+
+ * h8300.h (SP_AND_G_REGS): Renamed from SP_AND_G_REG.
+ (CC_DONE_CBIT): Delete.
+ (CC_OVERFLOW_0,CC_OVERFLOW_UNUSABLE,CC_NO_CARRY): Define.
+ * h8300.c (cond_string): Delete CC_DONE_CBIT handling.
+ (notice_update_cc): Delete CC_CBIT, CC_WHOOPS. Add CC_SET_ZN_C0.
+ (restore_compare_p): New function.
+ (shift_one): Use shll instead of shal so overflow bit is usable.
+ Set cc_valid bits to cc_status.flags values.
+ (emit_a_shift): Set cc_status.flags.
+ * h8300.md (attr cc): Delete whoops,cbit. Add set_zn_c0.
+ (all patterns) Update cc attr setting.
+ (tstqi,tsthi,tstsi): Delete CC_DONE_CBIT handling.
+ (addhi3,subhi3): Change define_expand to define_insn.
+ (branch_true,branch_false): Check if compare needs to be restored.
+
+Mon Mar 11 13:55:23 1996 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.h (CONST_DOUBLE_OK_FOR_LETTER_P): Add 'H' for movdi
+ patterns in 32 bit that generate 3 instructions.
+ (num_insns_constant): Add declaration.
+
+ * rs6000.c (num_insns_constant{,_wide}) Functions to determine the
+ number of insns it takes to generate an integer constant.
+ (easy_fp_constant): Allow DImode in easy constants. Use
+ num_insns_constant_wide.
+ (input_operand): Allow any CONST_{INT,DOUBLE}'s for {SI,DI}mode.
+
+ * rs6000.md (movdi): Generate a normal movdi using a CONST_DOUBLE
+ for 32 bit mode rather than using SUBREG's. For 64 bit mode,
+ break large integer constants into smaller pieces. Add various
+ define_splits to handle loading the various DImode constants.
+
+Mon Mar 11 06:54:19 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * combine.c (make_extraction): Use proper mode for INNER in all cases.
+ (simplify_comparison, case ZERO_EXTRACT): For bits big endian and
+ no extzv, use BITS_PER_WORD.
+ * fx80.md, gmicro.md, i386.md, m68k.md, tahoe.md, vax.md:
+ Use proper modes and predicates for {sign,zero}_extract.
+
+Sun Mar 10 06:23:52 1996 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * emit-rtl.c (free_insn): New variable.
+ (init_emit, restore_emit_status): Clear it.
+ (gen_sequence): Store insn in free_insn when sequence length is 1.
+ (make_insn_raw): Use free_insn if available and still in the
+ rtl generation phase.
+
+Fri Mar 8 15:37:31 1996 Mike Stump <mrs@cygnus.com>
+
+ * expr.c (expand_expr, case TARGET_EXPR): Delay putting the cleanup
+ on the cleanup chain until after the subexpression has been expanded.
+
+Fri Mar 8 16:14:51 1996 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * i386.c (ix86_binary_operator_ok): One memory operand is OK.
+ This is independent of commutativity.
+
+Fri Mar 8 14:07:43 1996 Jim Wilson <wilson@cygnus.com>
+
+ * expr.c (store_constructor_field): Call store_field if bitpos is
+ nonzero and target is not a MEM.
+
+ * jump.c (jump_optimize): When handle a USE insn before an
+ unconditional jump, disable the optimization if the USE is the
+ only insn in the loop.
+
+ * sh.c (reg_unused_after): Return 0 if see a JUMP_INSN.
+
+Fri Mar 8 12:08:36 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc/lynx.h (CPP_SPEC): Use %(cpp_cpu).
+
+ * sparc/sparc.md (move_pic_label_si,move_label_di): Rewrite length
+ attr calcs to be more conservative.
+
+Thu Mar 7 19:14:21 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc/t-splet: New file.
+ * sparc/splet.h: New file.
+ * configure (sparclet-*-aout*): Use them.
+
+ * sparc.h (MASK_LIVE_G0,TARGET_LIVE_G0): Define.
+ (FIRST_PSEUDO_REGISTER): Add 1 for %icc (now 101).
+ (FIXED_REGISTERS,CALL_USED_REGISTERS): Update.
+ (FIXED_REGISTERS): %g0 is fixed by default.
+ (SPARC_{FIRST,LAST}_V9_FCC_REG): Define.
+ (SPARC_{ICC,FCC}_REG): Define.
+ (CONDITIONAL_REGISTER_USAGE): Don't fix %fcc0 if v8.
+ (REG_CLASS_CONTENTS): Reg 0 is an int reg, reg 100 is %icc.
+ (REGNO_REG_CLASS): Rewrite to use global `sparc_regno_reg_class'.
+ (REG_ALLOC_ORDER,REG_LEAF_ALLOC_ORDER,LEAF_REGISTERS): Add %icc.
+ (REG_CLASS_FROM_LETTER): Handle 'c' for FPCC_REGS in non-v9 case.
+ (REGNO_OK_FOR_{BASE,INDEX}_P): Treat %g0 as a normal reg.
+ (REG_OK_FOR_{BASE,INDEX}_P,EXTRA_CONSTRAINT): Likewise.
+ (REGISTER_NAMES): Add %icc.
+ (ADDITIONAL_REGISTER_NAMES): Use SPARC_ICC_REG.
+ * sparc.c (leaf_reg_remap): Add %icc=100.
+ (reg_or_0_operand): Don't allow 0 if TARGET_LIVE_G0.
+ (fcc_reg_operand): Renamed from ccfp_reg_operand.
+ Use SPARC_FCC_REG. Don't treat reg 0 as an fcc reg. Don't match
+ modes if `mode' argument is VOIDmode.
+ (icc_or_fcc_reg_operand): New function.
+ (gen_compare_reg): Use SPARC_FCC_REG for v8 fp compares.
+ Use SPARC_ICC_REG for int compares.
+ (eligible_for_epilogue_delay): Don't allow anything if TARGET_LIVE_G0.
+ Delete unnecessary test for %g0.
+ (emit_move_sequence): Don't emit (set (mem) (const_int 0)) if
+ TARGET_LIVE_G0.
+ (output_scc_insn): Label moved to operand 3. Condition code reg
+ moved to operand 2.
+ (sparc_mode_class): Enum C_MODE renamed to CC_MODE.
+ (hard_32bit_mode_classes): Set reg 0 to S_MODES. Add entry for %icc.
+ (hard_64bit_mode_classes): Set reg 0 to D_MODES. Add entry for %icc.
+ (sparc_regno_reg_class): New global.
+ (sparc_init_modes): Initialize it.
+ (output_cbranch): Delete fp_cond_reg argument.
+ (print_operand, MEM op): Don't print "%g0+" if TARGET_LIVE_G0.
+ (sparc_flat_eligible_for_epilogue_delay): Don't allow anything if
+ TARGET_LIVE_G0.
+ * sparc.md (live_g0): New attribute.
+ (*): Integer condition code register is now reg 100.
+ Use SPARC_ICC_REG instead of hardcoding reg 100 where possible.
+ Non-v9 floating point condition code register is now reg 96.
+ (*cmp{sf,df,tf}_{fpe,fp}_sp{32,64}): Combine v9/non-v9 cases.
+ (*{normal,inverted}_{,fp,fpe}_branch): Update call to output_cbranch.
+ (*mov{qi,hi,si}_insn): Don't use if TARGET_LIVE_G0.
+ (*mov{qi,hi,si}_insn_liveg0): New patterns.
+ (*mov{si,di,sf,df,tf}_ccfp{,e}_sp64): ccfp_reg_operand renamed to
+ fcc_reg_operand.
+ (*negdi2_sp32,negsi2,one_cmplsi2,ffssi2): Ensure %%g0 is 0 if
+ TARGET_LIVE_G0.
+ (*one_cmpldi2_sp32): Move operand 1 to rs1 and use 0 as rs2.
+ (patterns that use %g0 in rs2): Use 0 immediate value instead.
+ (patterns that read %g0): Don't use if TARGET_LIVE_G0.
+
+Thu Mar 7 15:39:16 1996 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * sh.h (PASS_IN_REG_P): Change < to <=.
+ * va-sh.h (va_start): Change __SH3E___ to __SH3E__.
+ (va_arg): Add little-endian SH3E support. Fix big-endian version
+ to work for arguments smaller than the word size.
+
+Thu Mar 7 10:37:37 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * lib2funcs.asm: Remove entry/exit routines. Move them into...
+ * ee.asm: New file. Entry/exit code.
+ * ee_fp.asm: New file. Entry/exit code with frame pointer.
+ * t-pa: Corresponding changes.
+ * t-pro: Corresponding changes.
+
+ * pa.c: Fix misc small typos/thinkos in recent changes.
+
+Wed Mar 6 17:36:03 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * cplus-dem.c (demangle_template): Fix for address-of-extern arguments.
+
+Wed Mar 6 15:12:55 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * t-pro (dp-bit rule): Fix typo.
+
+ * lib2funcs.asm (__outline_prologue): Remove frame pointer
+ support.
+ (__outline_prologue_fp): Out of line prologue with frame pointer.
+ (__outline_epilogue, outline_epilogue_fp): Similarly.
+ * pa.c (compute_frame_size): Allocate enough space to avoid holes
+ in the callee register saves. Remove some special handling of %r3.
+ (hppa_expand_prologue): Don't do an out of line prologue/epilogue
+ if it would take more insns than an inline prologue/epilogue.
+ Don't leave holes in the callee register save set.
+ (hppa_expand_prologue): Corresponding changes. Pass stack size
+ to out of line epilogue code.
+ * pa.h (FRAME_POINTER_REQUIRED): Revert last change.
+ * pa.md (outline_prologue_call): Handle outline prologues which
+ don't need frame pointers.
+ (outline_epilogue_call): Similarly.
+ * t-pro: Reenable multilib code. Build a set of libraries that
+ optimize for space.
+
+Wed Mar 6 14:28:14 1996 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * Makefile.in (USER_H): Add ginclude/va-sh.h.
+ * ginclude/stdarg.h, ginclude/varargs.h: Use va-sh.h.
+ * ginclude/va-sh.h: New file.
+
+ * sh.h (PASS_IN_REG_P): Fix typo in last change.
+
+Wed Mar 6 11:42:06 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.h (enum processor_type): Remove PROCESSOR_PPC602.
+ (RTX_COSTS): Remove PROCESSOR_PPC602. PPC603 MULT cost depends
+ on constant and domain.
+ * rs6000.c (processor_target_table): 602 uses PROCESSOR_PPC603.
+ (get_issue_rate): Remove CPU_PPC602.
+ * rs6000.md (function units): Remove PPC602. Add store and
+ fpstore type attribute values. Update patterns.
+
+Tue Mar 5 18:43:43 1996 Richard Henderson <rth@tamu.edu>
+
+ * m68k/coff.h (ASM_OUTPUT_SECTION_NAME): New define.
+
+ * m68k/{aux-crt1.c,aux-crt[2n].asm}: New files.
+ * m68k/{aux-exit.c,aux-low.gld,aux-mcount.c}: More new files.
+ * m68k/{aux.h,auxgnu.h,auxstd.h}: Even more new files.
+ * m68k/{t-aux,xm-aux.h}: The rest of the new files.
+ * m68k/sgs.h (ASM_OUTPUT_CASE_END): Add missing semicolon.
+ (switch_table_difference_label_flag): Make extern.
+ * fixincludes (sys/param.h): Fix c89 __asm statements.
+ * configure (m68k-apple-aux*): New target.
+
+Tue Mar 5 17:38:19 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc.md (*mov{qi,hi,si}_insn): Simplify length attribute.
+ (*movsi_insn): Use fpload/fpstore attributes for fp loads/stores.
+ %r1 -> %1 for fpstore alternative.
+ (*movsf_insn,*movsf_no_f_insn): %r1 -> %1.
+
+Tue Mar 5 17:19:17 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * expr.c (expand_expr, case *_DECL): If we make a non-local
+ reference from a function with DECL_NO_STATIC_CHAIN set, abort.
+ (expand_expr, case ADDR_EXPR): We don't need a trampoline for a
+ function with DECL_NO_STATIC_CHAIN set.
+ * function.c (lookup_static_chain): If we're checking on a function
+ that doesn't need a static chain, return 0.
+ (init_function_start): We don't need context if DECL_NO_STATIC_CHAIN
+ is set.
+ * tree.c (staticp): Check DECL_NO_STATIC_CHAIN on nested functions.
+
+Tue Mar 5 15:04:29 1996 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * sh.md (push_e, pop_e): Add TARGET_SH3E to condition.
+ * sh.h (JUMP_TABLES_IN_TEXT_SECTION): Define.
+ * sh.c (find_barrier): Set si_limit to 1018 instead of 1020, and
+ hi_limit to 510 instead of 512.
+
+Tue Mar 5 13:39:44 1996 Doug Evans <dje@cygnus.com>
+
+ * loop.c (init_loop): Use pseudo reg in add_cost computation
+ so cost doesn't vary depending on whether reg 0 happens to be
+ fixed or not.
+
+Tue Mar 5 09:32:24 1996 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * reg-stack.c (record_label_references): Check for undefined label.
+
+Tue Mar 5 09:22:20 1996 Scott Christley (scottc@net-community.com)
+
+ * objc/objc-api.h, objc/runtime.h: Include objc/thread.h.
+ * objc/class.c (__objc_init_class_tables): Surround sarray access
+ with mutex lock/unlock.
+ (__objc_add_class_to_hash, objc_lookup_class): Likewise.
+ (objc_get_class, objc_get_next_class): Likewise.
+ (__objc_resolve_class_links, class_pose_as): Likewise.
+ * objc/init.c (__objc_runtime_mutux, __objc_runtime_thread_alive):
+ New variables.
+ (objc_init_statics, __objc_init_protocols): Surround sarray access
+ with mutex lock/unlock
+ (__objc_exec_class): Likewise.
+ Initialization for thread-safe global variables.
+ Declarations for thread-safe functions and global variables
+ * objc/sendmsg.c (get_imp, __objc_responds_to):
+ Surround sarray access with mutex lock/unlock.
+ (__objc_init_install_dtable): Likewise.
+ (__objc_update_dispatch_table_for_class): Likewise.
+ (__objc_print_dtable_stats): Likewise.
+ * objc/selector.c (sel_get_typed_uid, sel_get_any_typed_uid): Likewise.
+ (sel_get_any_uid, sel_get_name, sel_register_name): Likewise.
+ (sel_register_typed_name): Likewise.
+ * objc/sarray.h (union sversion): New.
+ (struct sarray): Maintain multiple versions.
+ (sarray_remove_garbage): Add prototype.
+ * objc/sarray.c (sarray_{remove,free}_garbage): New functions.
+ (sarray_at_put, sarray_new, sarray_lazy_copy):
+ Modify/copy sarray structure/data in a thread-safe manner
+ (sarray_{realloc,free}): Reallocate/free sarray structure/data in a
+ thread-safe manner.
+
+ * objc/THREADS, objc/thread.c, objc/thread.h: New files.
+ * objc/thread-{decosf1,irix,solaris,win32,single}.c: New files.
+ * objc/objc-list.h: Renamed from objc/list.h.
+ * objc/Makefile: Changes to compile new files and name renaming.
+ * objc/makefile.dos: Likewise.
+
+Tue Mar 5 07:51:31 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * bc-emit.c, bc-optab.c (free): Delete declaration of library function.
+
+ * c-decl.c (duplicate_decl): If making decl non-external, copy
+ context from old to new.
+
+Tue Mar 5 02:27:35 1996 Jeffrey A. Law <law@cygnus.com
+
+ * lib2funcs.asm (__outline_prologue): New "function".
+ (__outline_epilogue): New "function".
+ * pa.h (TARGET_SPACE): Define.
+ (target_flags): Add -mspace and -mno-space. Enable/disable
+ space saving optimizations.
+ (FRAME_POINTER_REQUIRED): Frame pointers are always required
+ when generating out of line prologues and epilogues.
+ * pa.c (compute_frame_size): Handle out of line prologues/epilogues.
+ (hppa_expand_prologue): If optimizing for space, emit an out of
+ line prologue.
+ (hppa_expand_epilogue): Similarly.
+ (override_options): Optimizing for space is not compatible with
+ either profiling or PIC code generation.
+ * pa.md (outline_prologue_call): New pattern.
+ (outline_epilogue_call): Likewise.
+
+Tue Mar 5 02:17:32 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc.md (*cmp{si,di}_insn): %r0 -> %0.
+ (DFmode move define_split): Ensure registers not extended v9 fp regs.
+ (*mov{sf,df,tf}_cc_reg_sp64): %r3 -> %3.
+
+Mon Mar 4 18:46:37 1996 Manfred Hollstein <manfred@lts.sel.alcatel.de>
+
+ * Makefile.in (CRT0STUFF_T_CFLAGS): New macro.
+ (stamp-crt0, crt0.o, mcrt0.o): New goals.
+ (STAGESTUFF): stamp-crt0 added.
+
+ * collect2.c (main): Check new define DEFAULT_A_OUT_NAME.
+
+ * m68k.c (print_operand): Emit .l as scale factor #ifdef MOTOROLA.
+ * m68k/mot3300-crt0.S, m68k/mot3300Mcrt0.S: New files.
+ * m68k/mot3300g.h: Deleted.
+ * m68k/mot3300.h (FUNCTION_PROFILER): Emit label references
+ corresponding to those generated by ASM_OUTPUT_INTERNAL_LABEL.
+ (MOTOROLA, MOTOROLA_BSR, ...): Define #ifndef USE_GAS.
+ (ASM_SPEC): Define properly #ifdef USE_GAS.
+ (LIB_SPEC): -L/usr/lib/libp deleted.
+ (STARTFILE_SPEC): -L/usr/lib/libp added.
+ (DEFAULT_A_OUT_NAME): Define.
+ (LINK_SPEC): Pass -v if GNU ld is used.
+ (LOCAL_LABEL_PREFIX): Local labels start with .L using GAS, else L%.
+ (USER_LABEL_PREFIX): Undefine.
+ (FUNCTION_PROFILER): Call asm_fprintf instead of normal fprintf.
+ (ASM_APP_ON, ASM_FILE_START): GAS supports it.
+ (CTORS_.../DTORS_...): Define if GNU ld is used.
+ (ASM_FILE_START): Define properly for Motorola and GNU as syntax.
+ (TARGET_VERSION): Re-define only #ifndef USE_GAS.
+ (CALL_USED_REGISTERS): Deleted.
+ (GLOBAL_ASM_OP): Re-define only #ifndef USE_GAS.
+ (ASM_{LONG,SHORT,CHAR,BYTE,BYTE_OP}): New macros.
+ (ASM_OUTPUT_{DOUBLE,LONG_DOUBLE,FLOAT,INT,SHORT}): Use them.
+ (ASM_OUTPUT_{CHAR,BYTE,ASCII,FLOAT_OPERAND,DOUBLE_OPERAND}): Likewise.
+ (ALIGN_ASM_OP, SKIP_ASM_OP): New macros.
+ (ASM_OUTPUT_{ALIGN,SKIP}): Use them.
+ (ASM_OUTPUT_SOURCE_FILENAME): Define only if not using GNU as.
+ (ASM_{GENERATE,OUTPUT}_INTERAL_LABEL): Provide proper definitions for
+ Motorola and GNU as syntax.
+ (ASM_OUTPUT_ADDR_{VEC,DIFF}_ELT): Changed for portability between
+ Motorola and GNU as syntax.
+ (ASM_OUTPUT_{CASE_LABEL,OPCODE}): Define only if not using GNU as.
+ (ASM_OUTPUT_CASE_FETCH, ASM_RETURN_CASE_JUMP): New macros.
+ (ASM_OUTPUT_{COMMON,LOCAL}): Proper defns for Motorola and gas syntax.
+ (SDB_...): Define only for Motorola as.
+ (ALT_LIBM): New define to tell g++.c about an alternative name for
+ `-lm'.
+ (MATH_LIBRARY, NEED_ATEXIT, HAVE_ATEXIT, EXIT_BODY): New macros.
+ * m68k/t-mot3300, m68k/t-mot3300-{gald,gas,gld}: New files.
+ * m68k/x-mot3300-gas: New file.
+ * m68k/xm-mot3300.h (USG): Set to 1.
+ * configure (m68k-motorola-sysv*): Keep track of new different
+ combinations (--with-gnu-...), and provide proper definitions for
+ tm_file, xmake_file, tmake_file, use_collect2, and extra_parts.
+
+ * gbl-ctors.h (HAVE_ATEXIT): Define if NEED_ATEXIT is defined.
+ (atexit): Use `int atexit' prototype also if NEED_ATEXIT is defined.
+ (on_exit): According to man on_exit on the Sun it returns int not void.
+ * libgcc2.c (L_bb/atexit, onexit): Declarations replaced by
+ #include'ing "gbl-ctors.h".
+ (L_exit/atexit): New function.
+ (L_exit/exit): Call any registered functions.
+
+Mon Mar 4 18:03:38 1996 Bryan Ford (baford@cs.utah.edu)
+
+ * configure (i[3456]86-moss-msdos*): New target.
+ * i386/moss.h: New file.
+
+Mon Mar 4 17:38:50 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sh.h (PASS_IN_REG_P): Don't reject BLKmode for SH3e.
+ For SH3e, do reject parameter that won't fit entirely in registers.
+
+ * sh.md (mulhisi3-2, mulhisi3-1, mulsidi3_i, umulsidi3_i,
+ smulsi3_highpart, umulsi3_highpart): Renames operands 1/2 to 0/1.
+ (mulsidi3, umulsidi3): Add support for TARGET_LITTLE_ENDIAN.
+
+ * sh.c (machine_dependent_reorg): In TARGET_RELAX code, when scan
+ forward from LINK, fail if pass a CODE_LABEL before finding INSN.
+ Fail if SCAN not INSN is a JUMP_INSN.
+
+Mon Mar 4 11:27:10 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.h (CALL_LONG): Change CALL_xx values from an enumeration
+ to bitmasks. Add CALL_LONG to support longcall attributes.
+ (rs6000_args): Call_cookie field is now an int.
+ (rs6000_longcall_ref): Add declaration.
+
+ * rs6000.c (init_cumulative_args): Add support for longcall
+ attributes to always call through a pointer.
+ (function_arg): Ditto.
+ (rs6000_valid_type_attribute_p): Ditto.
+ (rs6000_longcall_ref): New function for long calls.
+
+ * rs6000.md (call insns): Add support for longcall attributes.
+
+Mon Mar 4 08:42:14 1996 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * real.c (significand_size): Don't test the modes, but their sizes.
+
+ * dwarfout.c (xstrdup): Moved from here.
+ * toplev.c (xstrdup): New function.
+ * tree.h (xstrdup): Declare.
+ * bc-emit.c (bc_xstrdup): Delete.
+ * expr.c (bc_strdup): Delete.
+ (bc_load_externaddr_id): Use xstrdup instead of bc_xstrdup.
+ * function.c (bc_expand_function_start): Likewise.
+ * 1750a.c (strdup): Delete.
+ (float_label): Use xstrdup instead of strdup.
+ * 1750a.h (xstrdup): Declare instead of instead of strdup.
+ (ASM_OUTPUT_LABEL): Use xstrdup instead of strdup.
+ (FIX_FRAME_POINTER_ADDRESS): Don't use DEPTH in string.
+
+Mon Mar 4 08:23:23 1996 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * xm-we32k.h (NO_WAIT_H): Deleted.
+
+ * collect2.c: Never include wait.h.
+
+Sat Mar 2 22:43:07 1996 Torbjorn Granlund <tege@spiff.gnu.ai.mit.edu>
+
+ * configure (code for making links): Work around sh bug on FreeBSD.
+
+Sat Mar 2 13:40:29 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.h (BIGGEST_FIELD_ALIGNMENT): Replace uses of
+ TARGET_ALIGN_STRUCT_300 with TARGET_ALIGN_300.
+ (BIGGEST_ALIGNMENT): Likewise.
+
+Sat Mar 2 08:04:50 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * calls.c (expand_call): If passing by invisible ref, not const.
+
+ * sparc.c (SKIP_CALLERS_UNIMP_P): Make agree with test used in call.
+
+ * expr.c (do_jump, case COMPOUND_EXPR): Call preserve_temp_slots.
+
+ * fold-const.c (fold, case *_DIV_EXPR): Ignore SAVE_EXPR if has RTL.
+
+Fri Mar 1 17:59:17 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * optabs.c (emit_cmp_insn): Immediately copy the return
+ value from the library call into a pseudo register.
+ (emit_float_lib_cmp): Likewise.
+
+Fri Mar 1 14:37:40 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sysv4.h (BSS_SECTION_ASM_OP): Define.
+ (*_SECTION_ASM_OP): Change tab after .section into a space.
+ (ASM_OUTPUT_INT): Ditto.
+ (ASM_OUTPUT_ALIGNED_LOCAL): Rewrite to use bss_section.
+ (ASM_OUTPUT_ALIGNED_BSS): Define to use ASM_GLOBALIZE_LABEL and
+ ASM_OUTPUT_ALIGNED_LOCAL.
+
+ * rs6000/win-nt.h (BSS_SECTION_ASM_OP): Define.
+ (ASM_OUTPUT_ALIGNED_LOCAL): Define.
+ (ASM_OUTPUT_LOCAL): Don't define any more.
+ (ASM_OUTPUT_ALIGNED_BSS): Define to use ASM_GLOBALIZE_LABEL and
+ ASM_OUTPUT_ALIGNED_LOCAL.
+
+Thu Feb 29 17:33:12 1996 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * c-typeck.c (push_init_level): When output padding to align structure
+ field, set constructor_unfilled_fields.
+
+ * dbxout.c (dbxout_type, case METHOD_TYPE): Add CHARS (1) call
+ after emitting second '#' character.
+
+Thu Feb 29 13:59:27 1996 Doug Evans <dje@charmed.cygnus.com>
+
+ * h8300.h (ASM_OUTPUT_BSS): Define.
+ * m68k/coff.h (BSS_SECTION_ASM_OP): Define.
+ (ASM_OUTPUT_ALIGNED_BSS): Define.
+ * m68k/m68k-aout.h (BSS_SECTION_ASM_OP): Define.
+ (ASM_OUTPUT_BSS): Define.
+
+Thu Feb 29 13:39:39 1996 Per Bothner <bothner@cygnus.com>
+
+ * varasm.c (compare_constant_1): For a SET_TYPE CONSTRUCTOR,
+ first extract and compare the set length.
+
+ * varasm.c (record_constant_1): For SET_TYPE CONSTRUCTOR,
+ permanent_obstack.next_free is *end* of available space.
+
+Thu Feb 29 13:14:14 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.h (TARGET_SWITCHES): Add new flags "-mlong-load-store" and
+ "-mno-long-load-store".
+ (TARGET_LONG_LOAD_STORE): Define.
+ * pa.md (symbolic high part): Handle TARGET_LONG_LOAD_STORE.
+
+Thu Feb 29 11:39:30 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.md (cmpxf*): XF compare cannot have mem operands.
+ (casesi expand): Put (minus:SI..) into subsi3 format.
+ * i386.c (i386_return_pops_args): Cleanup extra argument
+ used as address of a returned structure.
+
+Wed Feb 28 22:24:28 1996 Doug Evans <dje@cygnus.com>
+
+ * varasm.c (enum in_section): Define in_bss if BSS_SECTION_ASM_OP
+ is defined.
+ (bss_section,asm_output_bss,asm_output_aligned_bss): New functions.
+ (assemble_variable): Delete redundant test for too large an object.
+ Rewrite test for uninitialized variables. Use new macros
+ ASM_OUTPUT{,_ALIGNED}_BSS if defined to output global uninitialized
+ but not common variables.
+ * bytecode.h (BC_OUTPUT_BSS): Define.
+ * lynx.h (EXTRA_SECTIONS): Delete in_bss.
+ (EXTRA_SECTION_FUNCTIONS): Delete BSS_SECTION_FUNCTION.
+ * svr3.h (EXTRA_SECTIONS): Likewise.
+ (BSS_SECTION_FUNCTION): Delete.
+ * convex.h (EXTRA_SECTIONS,EXTRA_SECTIONS_FUNCTIONS): Delete.
+ * dsp16xx.h (EXTRA_SECTIONS): Delete in_bss.
+ (EXTRA_SECTION_FUNCTIONS): Delete bss_section.
+ * gmicro.h (EXTRA_SECTIONS,EXTRA_SECTIONS_FUNCTIONS): Delete.
+ * i386/aix386ng.h (EXTRA_SECTION_FUNCTIONS): Delete
+ BSS_SECTION_FUNCTION.
+ * i386/att.h (BSS_SECTION_FUNCTION): Delete.
+ * i386/sco5.h (EXTRA_SECTIONS): Delete in_bss.
+ (EXTRA_SECTION_FUNCTIONS): Delete BSS_SECTION_FUNCTION.
+ (BSS_SECTION_FUNCTION): Delete.
+ * i386/seq-sysv3.h (BSS_SECTION_FUNCTION): Delete.
+ * i386/svr3gas.h (EXTRA_SECTIONS): Delete in_bss.
+ (EXTRA_SECTION_FUNCTIONS): Delete BSS_SECTION_FUNCTION.
+ (BSS_SECTION_FUNCTION): Delete.
+ * i860/paragon.h (EXTRA_SECTIONS,EXTRA_SECTIONS_FUNCTIONS): Undef.
+ * m68k/crds.h (EXTRA_SECTIONS,EXTRA_SECTIONS_FUNCTIONS): Delete.
+ (BSS_SECTION_ASM_OP): Define.
+ * m68k/m68k.h (BC_OUTPUT_BSS): Define.
+ * mips/iris6.h (EXTRA_SECTIONS): Delete in_bss.
+ * pa.h (EXTRA_SECTIONS): Delete in_bss.
+ (EXTRA_SECTION_FUNCTIONS): Delete bss_section.
+ * sparc/litecoff.h (EXTRA_SECTIONS): Delete in_bss.
+
+Wed Feb 28 14:12:25 1996 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * sh.h (FUNCTION_VALUE_REGNO_P, FUNCTION_ARG_REGNO_P): Include FP
+ registers only when TARGET_SH3E.
+ (PASS_IN_REG_P): Exclude BLKmode only when ! TARGET_SH3E.
+
+Wed Feb 28 12:03:26 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.c (rs6000_trampoline_{template,size}): Change Windows NT
+ trampoline template so it doesn't require making stack executable.
+ Add support for 64 bit systems.
+ (rs6000_initialize_trampoline): Ditto.
+
+Tue Feb 27 16:42:00 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.c (print_operand): New code 'H'.
+ * rs6000.md (insv, extzv): Add DImode patterns. Use 'h'
+ consistently for masking SImode shifts.
+ (rotldi3, ashldi3, lshrdi3, ashrdi3): Use 'H'.
+ (movsf split): Generate CONST_INT instead of SUBREG.
+
+Tue Feb 27 15:02:17 1996 Doug Evans <dje@cygnus.com>
+
+ * sh.h (HANDLE_PRAGMA): Delete `return'.
+
+Tue Feb 27 08:18:12 1996 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * arm.c (aof_text_section): Remove pseudo read-only hack. Doesn't
+ take a parameter any more.
+ * arm/aof.h (EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS): Remove
+ readonly data sections.
+ (READONLYDATA_SECTION, READONLY_DATA_SECTION): Delete.
+
+ * arm.h (enum arm_cond_code): New enum.
+ (ARM_INVERSE_CONDITION_CODE): Moved here from arm.c.
+ (SELECT_CC_MODE): Call arm_select_cc_mode to do the work.
+ (PREDICATE_CODES): Add dominant_cc_register; delete
+ reversible_cc_register.
+ * arm.c (arm_current_cc): Now an enum.
+ (ARM_INVERSE_CONDITION_CODE): Moved to arm.h
+ (revsersible_cc_register): Delete.
+ (dominant_cc_register): New function.
+ (select_dominance_cc_mode): New function.
+ (arm_select_cc_mode): New function.
+ (output_return_instruction): New parameter REVERSE, used to
+ reverse the condition of a conditional return. All callers
+ changed.
+ (arm_print_operand case 'D'): Only suppress condition printing
+ if the operand is a NULL pointer.
+ (get_arm_condition_code): Now a static function returning
+ enum arm_cond_code. Handle dominance expressions. Return enum
+ values rather than integers.
+ * arm.md (*addsi3_compare0_scratch): New insn.
+ (*movsi_compare0, *cmpsi_insn, *cmpsi_shiftsi): Make sure the
+ compare has mode CC.
+ (cmp{si,sf,df,xf} expands): Just provide sufficient information
+ to allow the parameters to be matched properly.
+ (*cmpsi_negsi): Delete (of dubious validity).
+ (*cmpsi_shiftsi_swp): New pattern.
+ (*condbranch_reversed): No longer needs to check REVERSIBLE_CC_MODE.
+ (mov{si,sf,df}cc, *mov{si,sf,df}{,_hard,_soft}_insn): The mode of the
+ IF_THEN_ELSE must be appropriate to the target (not void).
+ (*and_scc): Match cc_register, not reversible_cc_register.
+ (*ior_compare_compare): Delete.
+ (split for ior_compare_compare + condjump): Delete.
+ (*impossible_cond_compare): Delete.
+ (*condition_compare_ior): Delete.
+ (*cond_move): Mode for the IF_THEN_ELSE must be SImode.
+ (*and_scc_scc): Delete.
+ (split for and_scc_scc + condjump): Delete.
+ (*impossible_cond_branch_and): Delete.
+ (*cmp_ite0, *cmp_ite1): New patterns.
+ (if_compare_not): Should be an anonymous pattern.
+ (Peephole for move and compare): Compare mode must be mode CCmode.
+ (Split pattern for comparing shifted reg then branch): Delete.
+ (*loadqi_compare): Delete, replaced with a split pattern to do
+ the same thing.
+ (*cond_move_not): Match cc_register, not reversible_cc_register.
+
+ * arm.c ({load,store}_multiple_sequence): New functions.
+ (emit_{ldm,stm}_seq): New functions.
+ * arm.md (load/store multiple peepholes): Rewrite using the above
+ functions.
+ (all patterns taking immediate_operand): If the code later assumes
+ this is a CONST_INT, then match const_int_operand instead.
+
+Mon Feb 26 17:26:13 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc.md: Add sparclet scheduling parameters.
+ (compare define_insn's): Move closer to compare define_expand's.
+ (32 bit multiply patterns): Use for TARGET_SPARCLET.
+ (*smacsi,*smacdi,*umacdi): Multiply/accumulate patterns for the
+ sparclet.
+
+Sat Feb 24 19:13:29 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.md (movsf split): Fix typo in last patch.
+
+Sat Feb 24 10:02:55 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * toplev.c (fatal_insn): Flush stdout/stderr.
+
+Sat Feb 24 02:03:28 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.md (abssi2): Rework to avoid matching constraints.
+
+Fri Feb 23 11:21:43 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.c (override_options): Warn if both PIC code generation and
+ profiling are requested.
+
+Fri Feb 23 08:47:38 1996 Richard Kenner (kenner at vlsi1)
+
+ * expr.c (expand_builtin, case BUILT_IN_SETJMP): Set CONST_CALL_P
+ on NOTE_INSN_SETJMP instead of emitting USE insns for call-saved regs.
+ * reload1.c (reload): For special CONST_CALL_P NOTE_INSN_SETJMP,
+ mark all call-saved regs as used.
+ * sched.c (sched_analyze): Record NOTE_INSN_SETJMP if no
+ CALL_INSN as prev; preserve CONST_CALL_P bit.
+ (reemit_notes): Restore CONST_CALL_P.
+
+Thu Feb 22 17:45:12 1996 Doug Evans <dje@cygnus.com>
+
+ * configure (sparclet-*-aout*): Set extra_headers.
+ * ginclude/inl-sparc.h: New file.
+
+Wed Feb 21 20:39:53 1996 Doug Evans <dje@cygnus.com>
+
+ * configure (sparc64-*-solaris2*): Merge with sparc-*-solaris2*.
+ * sparc.h (enum processor_type): Declare.
+ (sparc_cpu_attr): Define.
+ (TARGET_OPTIONS): Add -mtune=.
+ (sparc_select): Declare.
+ (sparc_cpu_string): Delete.
+ (FIRST_PSEUDO_REGISTER): Set to 100.
+ ({FIXED,CALL_USED}_REGISTERS): Merge !v9/v9 cases.
+ (CONDITIONAL_REGISTER_USAGE): Mark %g5 as fixed if !v9.
+ Mark %g1 as fixed if v9. Fix v9-only regs if !v9.
+ Mark fp{16..47} as call-saved if v9.
+ (enum reg_class): Merge !v9/v9 cases.
+ (REG_CLASS_NAMES,REG_CLASS_CONTENTS,REGNO_REG_CLASS): Likewise.
+ (REG_ALLOC_ORDER,REG_LEAF_ALLOC_ORDER,LEAF_REGISTERS): Likewise.
+ (FP_REG_CLASS_P,SPARC_REGISTER_NAMES): Likewise.
+ (REG_CLASS_FROM_LETTER): Test TARGET_V9 at runtime.
+ * sparc.c (sparc_cpu_string): Delete.
+ (sparc_select): New global.
+ (sparc_override_options): Handle -mtune=xxx.
+ * sparc.md (cpu attr): Add sparc{lite,let} implementations.
+ * sparc/sp64-sol2.h: Deleted.
+
+ * arm.md (consttable_end): Delete call to text_section.
+ (align_4): Delete call to readonly_data_section.
+
+Wed Feb 21 14:29:06 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * cplus-dem.c (demangle_template): Initialize is_bool. Correctly
+ handle 0 as a pointer value parameter.
+
+Wed Feb 21 14:13:29 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * tree.c (decl_function_context): Do decl_function_context right for
+ function-local classes.
+
+Wed Feb 21 12:42:52 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * c-typeck.c (initializer_constant_valid_p): Don't dereference
+ a null pointer on partial structure initialization.
+
+Wed Feb 21 11:49:58 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.h (ASM_OUTPUT_EXTERNAL): Append section info
+ even when verbatim symbol prefix '*' present.
+ * rs6000/aix3newas.h (ASM_OUTPUT_EXTERNAL): Same.
+ * rs6000/aix41.h (ASM_OUTPUT_EXTERNAL): Same.
+ * rs6000/powerpc.h (ASM_OUTPUT_EXTERNAL): Same.
+ * rs6000/win-nt.h (ASM_OUTPUT_EXTERNAL): Same.
+
+Wed Feb 21 03:55:32 1996 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (validate_else): Don't loop given `#endif /'.
+ Handle multiple adjacent backslash-newlines correctly.
+ Accept a new parameter LIMIT to specify end of input;
+ this prevents confusion when the input contains '\0' characters.
+ (collect_expansion): Fix off-by-1 error when searching for `*/'
+ at end of a comment used for traditional token concatenation.
+ (macarg1): Fix off-by-1 error when skipping past `*/'
+ at end of comment.
+
+Tue Feb 20 16:12:31 1996 Doug Evans <dje@cygnus.com>
+
+ * hard-reg-set.h (twice unrolled GO_IF_HARD_REG_EQUAL): Add missing \.
+
+Tue Feb 20 14:21:16 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.h (DBX_CONTIN_LENGTH): Define to 4000 characters.
+
+ * pa.c (hppa_expand_epilogue): Always emit a blockage insn
+ before cutting back the stack.
+
+Mon Feb 19 19:42:15 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * sparc.h (TARGET_SWITCHES): Add -m{,no-}impure-text.
+ (MASK_IMPURE_TEXT, TARGET_IMPURE_TEXT): Define.
+ (LINK_SPEC): Only add `-assert pure-text' if -mimpure-text wasn't used.
+
+Mon Feb 19 19:20:15 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * configure (sparc-aout): sparc-aout.h renamed to aout.h.
+ (sparclet-aout): Likewise.
+ (sparclite-*-aout*): Renamed from sparclite-*-*.
+ Don't set use_collect2.
+ (target_cpu_default): Set to TARGET_CPU_<cpu> for sparc.
+
+ * sparc.h (TARGET_CPU_sparc{,let,lite,64}): Define.
+ ({CPP,ASM}_DEFAULT_SPEC): Set from TARGET_CPU_foo.
+ (SPARC_ARCH64 CPP_PREDEFINES): Define __arch64__.
+ (CPP_SPEC): Add %(cpp_cpu).
+ (CPP_CPU_SPEC): Define.
+ (CC1_SPEC): Convert -m<cpu> to -mcpu=<cpu>.
+ (ASM_SPEC): Add %(asm_cpu).
+ (ASM_CPU_SPEC): Define.
+ (EXTRA_SPECS,SUBTARGET_EXTRA_SPECS): Define.
+ (OVERRIDE_OPTIONS): Call SUBTARGET_OVERRIDE_OPTIONS after
+ sparc_override_options.
+ ({MASK,TARGET}_SUPERSPARC): Delete.
+ ({MASK,TARGET}_SPARCLET): Define.
+ (MASK_ISA): Renamed from MASK_CPUS.
+ (TARGET_SWITCHES): Delete no-{v8,sparclite}.
+ (sparc_cpu,sparc_cpu_string): Declare.
+ ({SUB,}TARGET_OPTIONS): Define.
+ (FIXED_REGISTERS): Add definitions for sparc64 in 32 bit mode.
+ (CONDITIONAL_REGISTER_USAGE): Don't set fixed_regs[234] if sparc64.
+ Don't set call_used_regs[48..80] for sparc64 in 32 bit mode.
+ Don't clobber fixed_regs[234] if -ffixed- was passed.
+ (ADJUST_COST): Change test for supersparc.
+ * sparc.c (sparc_cpu_string,sparc_cpu): New globals.
+ (sparc_override_options): Set ISA and CPU from sparc_cpu_string.
+ Delete tests for v9 only switches if not v9.
+ Error if -mcpu=v9 and v9 support not compiled in.
+ * sparc/sol2.h (CPP_SPEC): Use %(cpp_cpu).
+ (ASM_SPEC): Likewise.
+ (ASM_{DEFAULT,CPU}_SPEC): Use Solaris syntax for sparc64.
+ * sparc/sysv4.h (ASM_SPEC): Add %(asm_cpu).
+ * sparc/t-sparcbare (MULTILIB_*): -mv8 renamed to -mcpu=v8.
+ * sparc/t-sparclite (MULTILIB_*): Delete msoft-float and mno-flat,
+ they're the defaults. Add -mcpu=f934 as synonym for -mfpu.
+ * va-sparc.h (__arch64__): Renamed from __sparc_v9__.
+
+ * sparc/lite.h: #include aoutos.h.
+ (TARGET_DEFAULT): Use MASK_FOO values.
+ * sparc/sp64-aout.h: #include aoutos.h.
+ (TARGET_DEFAULT): Add MASK_APP_REGS.
+ (JUMP_TABLES_IN_TEXT_SECTION,READONLY_DATA_SECTION): Delete.
+ * sparc/sp64-elf.h (TARGET_DEFAULT): Add MASK_APP_REGS.
+ (CPP_PREDEFINES): Define __arch64__.
+ * sparc/sp64-sol2.h (TARGET_DEFAULT, SUBTARGET_SWITCHES): Delete.
+ (ASM_SPEC): Delete.
+
+ * sparc.h ({MASK,TARGET}_FRW): Delete.
+ (FRAME_POINTER_REQUIRED,INITIAL_FRAME_POINTER_OFFSET,
+ BASE_{INCOMING_ARG,OUTGOING_VALUE}_REG,INCOMING_REGNO,OUTGOING_REGNO,
+ FUNCTION_{PROLOGUE,EPILOGUE},DELAY_SLOTS_FOR_EPILOGUE): TARGET_FRW
+ renamed to TARGET_FLAT.
+
+ * sparc.md (cpu attr): Add all cpu variants.
+ (negtf2,negdf2,abstf2,absdf2): Use isa attr, not arch attr, in
+ determining insn lengths.
+
+ * sparc/aout.h: Renamed from sparc-aout.h.
+ (CPP_PREDEFINES): Delete __GCC_NEW_VARARGS__.
+ Add -Acpu(sparc) -Amachine(sparc).
+
+Mon Feb 19 17:49:08 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.md (movsf split): Use SUBREG, not operand_subword.
+ (movdf split): operand_subword TARGET_32BIT and new split using
+ SUBREG for TARGET_64BIT.
+ * rs6000.c (easy_fp_constant): Rewrite to not use operand_subword.
+ (input_operand): Remove final add_operand test made irrelevant by
+ Dec. 8 change.
+ (output_toc): Handle DImode values.
+
+Mon Feb 19 13:38:00 1996 Lee Iverson <leei@Canada.AI.SRI.COM>
+
+ * i386/sol2.h (SWITCH_TAKES_ARG): Restore -R.
+ * sparc/sol2.h (SWITCH_TAKES_ARG): Likewise.
+
+Mon Feb 19 08:19:00 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * hard-reg-set.h (HARD_REG macros): If more than
+ HOST_BITS_PER_WIDE_INT hard registers and less than or equal to
+ 4*HOST_BITS_PER_WIDE_INT hard registers, unroll loops by hand.
+
+Mon Feb 19 07:35:07 1996 Torbjorn Granlund <tege@tmg.se>
+
+ * rs6000.md (not:SI with assign and compare): Fix typo.
+ (not:DI with assign and compare): Likewise.
+
+Mon Feb 19 07:17:25 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * sparc.md (nonlocal_goto): No longer need USE of %o0.
+ (goto_handler_and_restore): Show uses %o0.
+
+ * combine.c (force_to_mode, case IOR): Fix typo in commuting
+ IOR and LSHIFTRT.
+
+ * alpha.c (call_operand): If in REG, only reg 27 valid.
+
+Mon Feb 19 06:57:34 1996 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * emit-rtl.c (operand_subword): For 32-bit targets, return
+ the appropriate subword of extended precision CONST_DOUBLEs.
+
+ * arm.c (offsettable_memory_operand): New function.
+ (alignable_memory_operand): New function.
+ (gen_rotated_half_load): New function.
+ (get_arm_condition_code): Extract the mode of the comparison and
+ use it to generate the correct return value.
+ * arm.h (EXTRA_CC_MODES, EXTRA_CC_NAMES): Add CC_Zmode.
+ (SELECT_CC_MODE): return CC_Zmode if the operand is QImode. Allow LT
+ and GE comparisons in CC_NOOVmode.
+ (PREDICATE_CODES): add offsettable_memory_operand and
+ alignable_memory_operand.
+ * arm.md (*zeroextract[qs]i_compare0_scratch): Use const_int_operand
+ for operands 1 and 2.
+ (split patterns for aligned memory half-word operations): New patterns.
+ (movhi): Handle memory accesses where the alignment is known in a more
+ efficient manner.
+ (*compareqi_eq0): Use CC_Zmode.
+
+Mon Feb 19 05:34:08 1996 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * toplev.c (lang_options): Add -W{no-,}sign-compare.
+
+ * c-tree.h: Declare warn_sign_compare.
+
+ * c-typeck.c (build_binary_op): Check warn_sign_compare rather
+ than extra_warnings to decide whether to warn about comparison of
+ signed and unsigned.
+
+ * c-decl.c (c_decode_option): Handle warn_sign_compare. -Wall
+ implies -Wsign-compare.
+
+Sun Feb 18 21:13:44 1996 Pat Rankin (rankin@eql.caltech.edu)
+
+ * c-lex.c (yylex, case '0'..'9','.'): For cases '0' and '1',
+ check for single digit constant before resorting to general
+ number processing.
+
+Sun Feb 18 19:29:44 1996 J.T. Conklin <jtc@netbsd.org>
+
+ * m68k.h (TARGET_68060): New macro.
+ (TARGET_SWITCHES): Add -m68060.
+ * m68k.md (const_umulsi3_highpart): Disable for TARGET_M68060.
+ (ftruncdf2, ftruncsf2, muldf3, mulsidi3): Likewise.
+ (smulsi3_highpart, umulsi3_highpart, umulsidi3): Likewise.
+
+ * {m68k,ns32k,sparc}/netbsd.h (DBX_NO_XREFS): Removed.
+
+Sun Feb 18 13:29:56 1996 Charles M. Hannum (mycroft@netbsd.org)
+
+ * c-common.c (check_format_info): Warn about `L' if -pedantic.
+
+Fri Feb 16 20:13:23 1996 Paul Eggert <eggert@twinsun.com>
+
+ * c-typeck.c (convert_for_assignment):
+ Bring back conversion to union without a cast,
+ undoing the Jan 16 change, but with the following differences:
+ - The union must have the transparent_union attribute.
+ - The conversion must be for a function argument.
+ - Warn consistently about such conversions if pedantic.
+ - Do not warn about an assignment incompatibility for one union member
+ if another union member is compatible with no warning.
+
+Fri Feb 16 12:06:21 1996 Stan Cox <coxs@spiff.gnu.ai.mit.edu>
+
+ * i386.c (ix86_*_binary_operator*): Allow CONST_INT as operand1
+ of MINUS.
+ * i386/dgux.h (OPTIMIZATION_OPTIONS): Call optimization_options.
+
+Fri Feb 16 08:39:47 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * configure: Change stdout report when have multiple files in
+ tm_file, host_xm_file, or build_xm_file.
+ (a29k-*-bsd): Use both a29k.h and unix.h.
+ (a29k-*-udi): Rename a29k-udi.h to udi.h;
+ use a29k.h, dbxcoff.h, and it.
+ (a29k-*-vxworks): Use a29k.h, dbxcoff.h, a29k/udi.h, and a29k/vx29k.h.
+ (alpha-dec-osf[23456789]*): Use alpha.h, not osf2.h.
+ (alpha-dec-osf1.2): Use alpha.h and alpha/osf12.h.
+ (alpha-*-osf*): Add explicit assignment of tm_file.
+ * a29k/udi.h: Renamed from a29k-udi.h.
+ Don't include a29k.h or dbxcoff.h.
+ * a29k/unix.h: Don't include a29k.h.
+ * a29k/vx29k.h: Don't include a29k-udi.h.
+ * alpha.h (WCHAR_TYPE, WCHAR_TYPE_SIZE): Use unsigned int.
+ * alpha/osf2.h: Deleted.
+ * alpha/osf12.h: Don't include alpha.h.
+ (WCHAR_TYPE, WCHAR_TYPE_SIZE): Use short unsigned int.
+ * alpha/win-nt.h (WCHAR_TYPE, WCHAR_TYPE_SIZE): Use short unsigned int.
+
+Thu Feb 15 18:26:04 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/ntstack.asm (__allocate_stack): Round up length to 16
+ byte boundary.
+
+ * rs6000.md (allocate_stack): On Windows NT, call set_sp to
+ indicate to CSE stack pointer changes with call to __allocate_stack.
+ (set_sp): New pattern.
+
+Thu Feb 15 16:49:15 1996 Jim Wilson <wilson@cygnus.com>
+
+ * integrate.c (save_for_inline_copying): Allocate reg_map with size
+ based on regno_pointer_flag_length instead of max_reg+1.
+
+Thu Feb 15 07:48:34 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * fixincludes (rpc/types.h): Remove spurious "ls" command.
+
+ * reload1.c (eliminate_regs, case USE): If using a register that
+ is source of elimination, show can't be eliminated.
+
+ * expr.c (expand_builtin, case BUILT_IN_SETJMP): Shows clobbers FP
+ and all caller-save registers.
+ Set current_function_has_nonlocal_goto.
+
+Wed Feb 14 13:51:55 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.md (fix_truncdfsi2): Use SUBREG not operand_subword.
+ (movdi): Test HOST_BITS_PER_WIDE_INT at build time.
+ * collect2.c (scan_libraries): Append '/' to import path if missing.
+
+Wed Feb 14 09:01:55 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (movdi): Use HOST_WIDE_INT, not long long.
+
+Tue Feb 13 19:36:21 1996 Per Bothner <bothner@cygnus.com>
+
+ * expr.c (store_constructor): Fix flow control thinko (merge error).
+ * expr.c (store_constructor): Pass correct value to recursive call.
+
+Wed Jan 31 11:34:45 1996 Mike Stump <mrs@cygnus.com>
+
+ * expr.c (expand_expr, case TARGET_EXPR): We must always store
+ into the allocated slot for TAREGT_EXPRs.
+
+Tue Feb 13 18:27:05 1996 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * configure (powerpc-ibm-aix3): Look for 3.2.x, not 3.2x.
+
+ * fixincludes (memory.h): Fix it also on sysV68.
+
+Tue Feb 13 17:59:03 1996 Lee Iverson <leei@Canada.AI.SRI.COM>
+
+ * gcc.c (DEFAULT_SWITCH_TAKES_ARG): New macro, from SWITCH_TAKES_ARG.
+ (SWITCH_TAKES_ARG): Use it.
+ * i386/{osfrose,sol2}.h (SWITCH_TAKES_ARG): Likewise.
+ * mips/{gnu,mips}.h (SWITCH_TAKES_ARG): Likewise.
+ * sparc/sol2.h (SWITCH_TAKES_ARG): Likewise.
+ * config/svr4.h (SWITCH_TAKES_ARG): Likewise.
+
+Tue Feb 13 17:43:46 1996 Jim Wilson <wilson@cygnus.com>
+
+ * integrate.c (save_constants_in_decl_trees): New function.
+ (save_for_inline_copying, save_for_inline_nocopy): Call it.
+
+Tue Feb 13 17:40:27 1996 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expr.c (convert_move): Fix typo in extendqfh2 case.
+
+ * reload1.c (reload): Make some non-group code no longer
+ conditional on SMALL_REGISTER_CLASSES.
+
+Tue Feb 13 17:30:45 1996 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * pdp11.c: #include flags.h
+ (output_function_prologue, function_epilogue): Remove declarations
+ of call_used_regs and frame_pointer_needed.
+
+ * c-common.c (overflow_warning): Fix typo in warning message.
+
+ * c-decl.c (finish_decl): TREE_ASM_WRITTEN says if duplicate_decls
+ modified declaration to match an outside file scope declaration.
+
+ * stmt.c (expand_end_case): Don't use ADDR_DIFF_VEC for PIC if
+ ASM_OUTPUT_ADDR_DIFF_ELT is not defined.
+ * a29k.h, romp.h (ASM_OUTPUT_ADDR_DIFF_ELT): Remove.
+
+Tue Feb 13 13:36:36 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/cygwin32.h (CPP_PREDEFINES): Do not define PPC, just
+ define __PPC__. Also define _ARCH_PPC to be compatible with the
+ other rs6000/powerpc ports.
+ * rs6000/win-nt.h (CPP_PREDEFINES): Ditto.
+
+ * rs6000/cygwin32.h (LIBGCC_SPEC): Don't define, always link in.
+ (SDB_DEBUGGING_INFO): Undef.
+ (DBX_DEBUGGING_INFO): Define.
+ (PREFERRED_DEBUGGING_TYPE): Define as DBX_DEBUG.
+
+ * rs6000/t-{cygwin32,winnt} (MULTILIB*): Remove multilib support.
+
+ * rs6000/x-cygwin32 (LANGUAGES): Delete, don't override.
+
+ * rs6000/ntstack.asm: New file to provide __allocate_stack, which
+ guarantees all pages in a dynamically allocated stack frame are
+ touched in order, so that the stack is properly grown.
+
+ * rs6000/cgywin32.asm: Delete unused file.
+
+ * rs6000/t-{cygwin32,winnt} (LIB2FUNCS_EXTRA): Add ntstack.S
+ to libgcc2 build.
+
+ * rs6000.md (allocate_stack): For NT, call __allocate_stack to
+ bump the stack if the size is large or variable.
+
+ * libgcc1-test.c (mainCRTStartup,__start): New startup functions
+ to silence more linkers.
+
+Tue Feb 13 13:30:53 1996 Jim Wilson <wilson@cygnus.com>
+
+ * expr.c (store_constructor_field): Only call change_address if
+ bitpos is nonzero.
+
+Tue Feb 13 08:21:01 1996 Fila Kolodny <fila@ibi.com>
+
+ * i370/mvs.h (CPP_SPEC): Add '-trigraphs' because IBM's h files
+ contain them.
+
+Tue Feb 13 08:17:52 1996 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
+
+ * c-typeck.c (quality_type prototype): Typo, rename as
+ qualify_type.
+ (build_binary_op): Fix precedence errors.
+ * combine.c (force_to_mode, num_sign_bit_copies, simplify_comparison):
+ Fix precedence errors.
+ * emit-rtl.c (gen_lowpart): Could return without a value.
+ * jump.c (jump_optimize): Fix potential infinite loop.
+ * reg-stack.c (record_reg_life_pat): Fix precedence error.
+ * reload1.c (emit_reload_insns): Fix precedence errors.
+ * stmt.c (bc_pushcase): Fix precedence error.
+
+Mon Feb 12 23:14:02 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * toplev.c (rest_of_compilation): Also set RTX_INTEGRATED_P when
+ we aren't going to emit the inline just yet.
+
+Mon Feb 12 21:31:02 1996 Jim Wilson <wilson@cygnus.com>
+
+ * rtl.h (INLINE_REGNO_POINTER_FLAG, INLINE_REGNO_POINTER_ALIGN):
+ Add one to array index.
+
+Mon Feb 12 20:55:39 1996 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * configure (i[345]86-*-linux*): Set tmake_file t-linux.
+ Add crtbeginS.o and crtendS.o to extra_parts.
+ * i386/linux.h (CC1, LIB_SPEC): Deleted.
+ * config/linux.h (STARTFILE_SPEC): Add crtbeginS.o if -shared.
+ (CC1_SPEC): New.
+ (LIB_SPEC): Remove %{mieee-fp:-lieee}; use -lc_p for -profile.
+ * config/t-linux: New file.
+
+Mon Feb 12 20:42:11 1996 Randy Smith <randys@camaro.osf.org>
+
+ * i386/x-osfrose (XCFLAGS{,_NODEBUG}): Remove $(SHLIB).
+ (XCFLAGS): New variable.
+ (libdir, mandir, bindir): Delete.
+ * i386/t-osf: New file.
+ * i860/paragon.h (STARTFILE_SPEC): Make gcc find crt0.o, not loader.
+ (LIB_SPEC): Remove /usr/lib.
+ * Makefile.in (TCFLAGS): New variable.
+ (GCC_CFLAGS): Add $(TCFLAGS).
+ (LIBGCC2_CFLAGS): Add -D for __GCC_FLOAT_NOT_NEEDED.
+ (libgcc1-test): Remove -nostdlib.
+ (float.h-cross): Don't give error #ifdef __GCC_FLOAT_NOT_NEEDED.
+ * enquire.c: Define __GCC_FLOAT_NOT_NEEEDED.
+ * configure (i[3456]86-*-osfrose): Add t-osf as tmake_file.
+
+Mon Feb 12 18:43:54 1996 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de)
+
+ * 1750a.c (add_1_to_mem): Corrected.
+
+Mon Feb 12 18:23:35 1996 Doug Evans <dje@cygnus.com>
+
+ * configure (sparclet-*-aout*): New configuration.
+
+Mon Feb 12 14:43:50 1996 Per Bothner <bothner@cygnus.com>
+
+ Changes to distinguish typedef from original type in debug output.
+ * tree.h (DECL_ORIGINAL_TYPE): New macro.
+ * tree.c (copy_node): Zero out type.symtab union.
+ * c-decl.c (pushdecl): Set DECL_ORIGINAL_TYPE for typedef origin.
+ * dbxout,c (dbxout_type): Don't canonicalize typedef type to base.
+
+Mon Feb 12 12:01:16 1996 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * arm.h: (CPP_SPEC): Define __ARMEB__, __ARMEL__, and
+ __ARMWEL__ depending on the endian flags passed to the compiler.
+ (ARM_FLAG_LITTLE_WORDS): Define.
+ (TARGET_SWITCHES): Add option -mwords-little-endian.
+ (TARGET_LITTLE_WORDS): Define.
+ (WORDS_BIG_ENDIAN): Select based on the endian switches.
+ (LIBGCC2_WORDS_BIG_ENDIAN): Define based on run-time endian
+ defines.
+ * arm.c (output_move_double): Cope with both word-endian
+ alternatives. Remove extraneous parameters from calls to
+ output_mov_immediate.
+ (arm_print_operand): New print code 'Q' for the least significant
+ register of a DImode operand. Make code 'R' always print the
+ most significant register, rather than the highest numbered.
+ * arm.md (all DImode output patterns): Use print code
+ 'Q' to access the least significant word. Make sure the
+ patterns are fully aware of the word endianness.
+
+ * arm/semi.h (CPP_SPEC): Define __ARMEB__, __ARMEL__, and
+ __ARMWEL__ depending on the endian flags passed to the compiler.
+ (LINK_SPEC): Pass -EB to the linker if compiling for big-endian
+ mode.
+ (ASM_SPEC): Likewise for the assembler.
+ * arm/semiaof.h (CPP_SPEC): Define __ARMEB__, __ARMEL__, and
+ __ARMWEL__ depending on the endian flags passed to the compiler.
+
+Mon Feb 12 10:15:29 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * configure: Permit tm_file and xm_file to be a list of header
+ file names, rather than just a single file. For many targets,
+ handle --with-stabs by adding dbx.h to tm_file, rather than using
+ a different tm_file.
+ * dbx.h: New file.
+ * alpha/gdb-osf2.h, alpha/gdb-osf12.h, alpha/gdb.h: Deleted.
+ * i386/sysv4gdb.h, mips/iris{5gdb,4gl,4gdb,3gdb}.h: Likewise.
+ * mips/dec-gosf1.h, mips/news{4,5}-gdb.h, mips/svr4-t-gdb.h: Likewise.
+ * mips/ultrix-gdb.h, mips/bsd-{4,5}-gdb.h: Likewise.
+ * mips/svr{4-5,4-4,3-5,3-4}-gdb.h, mips/mips-5-gdb.h: Likewise.
+ * mips/ecoff{,l}-gdb.h, mips/mips-4-gdb.h: Likewise.
+
+Mon Feb 12 07:22:20 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * integrate.c (save_for_inline_copying): Put virtual regs into
+ new regno_reg_rtx copy.
+
+Sun Feb 11 18:53:12 1996 Torbjorn Granlund <tege@noisy.tmg.se>
+
+ * i386.md: Delete spurious integer subtract patterns.
+ Delete % from subtract operand constraints.
+
+Sun Feb 11 19:17:24 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * m68k.md (movqi): Call CC_STATUS_INIT when loading to/from
+ an address register via a data register.
+
+Sun Feb 11 08:44:49 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-common.c (check_format_info): Handle missing type in format
+ when terminated by a new `%'.
+
+Sat Feb 10 15:14:22 1996 J.T. Conklin <jtc@rtl.cygnus.com>
+
+ * cross-make (STMP_FIXPROTO): Moved from here to build-make.
+ * build-make (STMP_FIXPROTO): Moved here from cross-make.
+
+Sat Feb 10 08:39:05 1996 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de)
+
+ * 1750a.md (movstrqi): Corrected.
+ (zero_extendqihi2): Taken out, let GCC synthesize.
+ (movhi-1): Added insn to move HImode small constant to memory.
+ (movhf-1): Added insn to move HFmode zero to memory.
+ (movtqf-1): Added insn to move TQFmode zero to memory.
+ (numerous insns): Taken out B (Base Reg with Index) mode.
+
+ * 1750a.c (movcnt_regno_adjust): Corrected.
+ (mov_memory_operand, zero_operand): Added.
+ (b_mode_operand): Corrected.
+ (simple_memory_operand, add_1_to_mem): Added.
+ (print_operand_address): Corrected case of 'Q' output modifier.
+
+ * 1750a.h (REG_ALLOC_ORDER): Changed back to natural order.
+ (CONST_DOUBLE_OK_FOR_LETTER_P): Added letter 'G'.
+ (EXIT_IGNORE_STACK): Set to 0.
+ (REG_OK_FOR_BASE_P, REG_OK_FOR_INDEX_P): Use corresponding REGNO_OK.
+ (MOVE_MAX, MOVE_RATIO): Defined.
+
+Sat Feb 10 08:28:12 1996 Martin Anantharaman <martin@goofy.imech.uni-duisburg.de>
+
+ * configure (m68k-*-psos*): New configuration.
+ * psos.h: New file.
+ * m68k/m68k-psos.h: New file.
+
+Sat Feb 10 08:07:52 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * sched.c (flush_pending_lists): Add new arg, ONLY_WRITE.
+ (sched_analyze_{1,2,insn}): Add new arg to flush_pending_lists.
+ (sched_analyze): Always flush pending write list for call, even const.
+
+ * integrate.c (save_for_inline_copying): Put reg_map in function's
+ maybepermanent obstack instead of using alloca; set regno_reg_rtx
+ to it; delete recently-added copying of this later.
+
+Sat Feb 10 00:49:58 1996 Doug Evans <dje@cygnus.com>
+
+ * sched.c (add_dependence): Add test for next != CODE_LABEL.
+
+Fri Feb 9 16:10:04 1996 Stan Cox (coxs@dg-rtp.dg.com)
+
+ * i386.md (fp, integer): Added function units for pentium.
+ (cmp*,mov*,add*,sub*,mul*,div*,extend*,trunc*,and*,ior*,xor*,neg*,
+ abs*,sqrt*,sin*,cos*,not*,ash*,lsh*,rot*,sub): Tightened constraints,
+ added attribute support, and made changes for new `binary' and
+ `unary' functions.
+
+ * i386.c (processor_costs): New variable.
+ (optimization_options, ix86_expand_binary_operator,
+ ix86_binary_operator_ok, ix86_expand_unary_operator,
+ ix86_unary_operator_ok, is_mul, is_div, copy_all_rtx, rewrite_address,
+ last_to_set_cc, doesnt_st_condition_code, sets_condition_code,
+ str_immediate_operand, is_fp_insn, is_fp_dest, is_fp_store,
+ agi_dependent, reg_mentioned_in_mem): New functions.
+
+ * i386.h (OPTIMIZATION_OPTIONS, ALIGN_DFmode, IS_STACK_MODE,
+ IX86_EXPAND_BINARY_OPERATOR): New macros.
+ (RTX_COSTS, REGISTER_MOVE_COST, ADJUST_BLOCKAGE) Changed for pentium.
+
+Fri Feb 9 14:47:27 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc.c (sp64_medium_pic_operand): New function.
+ (move_pic_label): Delete.
+ (legitimize_pic_address): Simplify using some named patterns.
+ (finalize_pic): Add preliminary sparc64 support.
+ (emit_move_sequence): Reorganize.
+ * sparc.md (pic_lo_sum_si,pic_sethi_si,get_pc_sp32,get_pc_sp64,
+ move_pic_label_si,move_label_di,sethi_di_sp64): Make named patterns.
+ (sethi_di_sp64_const,sethi_di_medium_pic): New anonymous patterns.
+ (move_pic_label_si,move_label_di): Optimize for near labels.
+ (tablejump): Use for TARGET_MEDANY.
+ (casesi): Delete.
+
+Fri Feb 9 13:48:45 1996 Jim Wilson <wilson@cygnus.com>
+
+ * mips.md (probe+2, probe+4): New conditional move patterns.
+ (movsicc): Don't truncate comparison if it is DImode.
+
+ * sh.h (CPP_SPEC): Add defines for -m1, -m2, and -m3.
+
+Fri Feb 9 09:11:28 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * toplev.c (rest_of_compilation): Set RTX_INTEGRATED_P in
+ INLINE_HEADER iff function is inlineable.
+ * calls.c (expand_call): Test RTX_INTEGRATED_P in DECL_SAVED_INSNS.
+
+Thu Feb 8 01:11:15 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.md (floatunssisf2 expander): Don't use "general_operand".
+ (floatunssidf2 expander): Likewise.
+
+Wed Feb 7 16:59:31 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/{sysv4,win-nt,netware,cygwin32}.h ({ASM,LINK}_SPEC):
+ Don't use %{V} for either linker or assembler.
+
+Tue Feb 6 17:22:29 1996 Per Bothner <bothner@cygnus.com>
+
+ * dbxout.c (dbxout_range_type): Emit non-range INTEGER_TYPE
+ as a sub-range of itself (so gdb can tell the difference).
+
+Tue Feb 6 17:01:44 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.md (addsi3 and adddi3 split): Use cleaner computation
+ and portable HOST_WIDE_INT.
+ (iordi3 split): Use HOST_WIDE_INT.
+ (movdi): Add TARGET_64BIT support and generate 64 bit constants.
+ (movdi matcher, TARGET_POWERPC64): Add immediate constraint handled
+ by new define_split.
+ (allocate_stack): Use TARGET_32BIT.
+ (tablejump): Add TARGET_64BIT support using ...
+ (tablejumpsi): Rename original tablejump pattern.
+ (tablejumpdi): New pattern.
+
+Tue Feb 6 15:29:22 1996 Per Bothner <bothner@cygnus.com>
+
+ * stor-layout.c (layout_type): Use same code to layout CHAR_TYPE
+ as for INTEGER_TYPE (instead of hard-wiring in QImode).
+
+Tue Feb 6 15:13:38 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.md (various patterns): Avoid using "general operand" in
+ define_insn patterns.
+
+Sun Feb 4 21:37:05 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/eabi{,sim}.h (LINK_START_SPEC): Bump the default start address
+ for the simulator to 0x10000074 so that we don't waste a page in the
+ linked file.
+
+Fri Feb 2 19:44:10 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/eabi-c{i,n}.asm (.sdata2, .sbss2): Put these in the
+ read-only section, not read-write.
+
+ * libgcc2.c (__unwind_function, rs6000/powerpc): Use _ARCH_PPC
+ being defined to indicate to use PowerPC mnemonics.
+
+ * config/rs6000/t-cygwin32 (MULTILIB*): Add software floating
+ point support.
+
+Thu Feb 1 09:10:02 1996 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * {i386,rs6000}/cygwin32.{asm,h}: New templates.
+ * {i386,rs6000}/{t,x}-cygwin32: Ditto.
+ * {i386,rs6000}/xm-cygwin32.h: Ditto.
+ * configure (powerpcle-*-cygwin32, i[3456]86-*-cygwin32): New.
+
+Fri Feb 2 17:42:40 1996 Paul Eggert <eggert@twinsun.com>
+
+ * c-decl.c (finish_struct):
+ Fix typo in transparent union warning that led to core dump.
+
+ * c-parse.in (stmt): Warn about `goto *expr;' if pedantic.
+ (label): Warn about `case expr ... expr:' if pedantic.
+
+Fri Feb 2 11:05:27 1996 Doug Evans <dje@cygnus.com>
+
+ * h8300.h (TARGET_ALIGN_300): Renamed from TARGET_ALIGN_STRUCT_300.
+ (TARGET_SWITCHES): Rename -malign-struct-300 to -malign-300.
+ (BIGGEST_ALIGNMENT): Use TARGET_ALIGN_300.
+
+Fri Feb 2 08:25:49 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * flow.c (jmp_uses_reg_or_mem): Renamed from uses_reg_or_mem.
+ Don't look into condition of an IF_THEN_ELSE; also make faster.
+ (find_basic_blocks): Use new name.
+
+Fri Feb 2 06:49:56 1996 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * reload.c (debug_reload): Fix typo for reload_noncombine.
+
+Thu Feb 1 21:49:02 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa-pro.h (TARGET_DEFAULT): Turn on TARGET_SOFT_FLOAT by
+ default for all pro targets.
+ * t-pro: Delete all multilib references.
+
+Thu Feb 1 17:50:02 1996 Doug Evans <dje@cygnus.com>
+
+ * c-lex.c (check_newline): Return result of HANDLE_PRAGMA.
+ * h8300.h (HANDLE_PRAGMA): Pass result back to caller.
+ * i960/i960.h (HANDLE_PRAGMA): Likewise.
+ * sh.h (HANDLE_PRAGMA): Likewise.
+ * nextstep.h (HANDLE_PRAGMA): Likewise.
+
+Wed Jan 31 19:26:03 1996 Doug Evans <dje@cygnus.com>
+
+ * m68k/m68k-none.h: Rewrite to use EXTRA_SPECS.
+ * m68k/vxm68k.h (CPP_SPEC): Delete.
+ (SUBTARGET_EXTRA_SPECS): Define.
+
+Wed Jan 31 15:10:59 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.c (output_epilog): Fix PPC64 typos and use TARGET_32BIT.
+ (output_prolog): Same.
+ (rs6000_trampoline_template, rs6000_trampoline_size): Use TARGET_32BIT.
+ * rs6000.md (movdf TARGET_POWERPC64 matcher): Fix std typo.
+ (movdi TARGET_POWERPC64 matcher): Same.
+
+Wed Jan 31 09:46:11 1996 Richard Earnshaw (rearnshaw@armltd.co.uk)
+
+ * regs.h (regno_pointer_align, REGNO_POINTER_ALIGN): Delete from here.
+ * rtl.h (regno_pointer_align, REGNO_POINTER_ALIGN): Put them here.
+
+Wed Jan 31 08:26:12 1996 Andreas Schwab (schwab@issan.informatik.uni-dortmund.de)
+
+ * m68k/linux.h (STRICT_ALIGNMENT): Define to zero.
+ (LEGITIMATE_PIC_OPERAND_P): Match definition from m68kv4.h.
+
+ * m68k.h (TRAMPOLINE_{TEMPLATE,SIZE}): Avoid need for helper function.
+ (INITIALIZE_TRAMPOLINE): Likewise.
+ (TRAMPOLINE_ALIGNMENT): Renamed from TRAMPOLINE_ALIGN.
+ * m68k/next.h (INITIALIZE_TRAMPOLINE): Adjusted accordingly.
+
+ * m68kv4.h (STATIC_CHAIN_REGNUM): Redefine to use register a1.
+ (TRAMPOLINE_TEMPLATE): Likewise.
+
+ * m68k/linux.h, m68kv4.h (LIBCALL_VALUE): Return XFmode value in fp0.
+ * m68k.c (init_68881_table): Use SFmode for the first six
+ constants and DFmode for the seventh.
+
+ * m68k.md (movqi): Use moveq if possible.
+
+Wed Jan 31 08:18:15 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (expand_builtin, case BUILT_IN_NEXT_ARG): Strip off
+ INDIRECT_REF when checking second arg.
+
+ * calls.c (struct arg_data, expand_call): Test STRICT_ALIGN with #if.
+
+Wed Jan 31 07:47:56 1996 Tim Wright (timw@sequent.com)
+
+ * configure (i[345]-sequent-sysv*): Change to sysv3*; add i686.
+ (i[3456]86-sequent-ptx4*, i[3456]86-sequent-sysv4*): New cases.
+ * fixinc.ptx (sys/mc_param.h): Remove embedded asm.
+ * fixinc.svr4 (__STDC__): Add one more case.
+ * i386/ptx4-i.h, ptx4.h: New files.
+
+Wed Jan 31 07:15:23 1996 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k.h (MACHINE_STATE_{SAVE,RESTORE}): Allow MOTOROLA syntax.
+
+ * m68k.md ({adddi,subdi}_sexthishl32): 'a' and 'd' versions merged
+ and fixed; do not generate 'add/sub a,m'.
+
+ * gcc.c (warn_std_ptr): Initialize with 0 instead of NULL_PTR.
+
+Tue Jan 30 13:29:05 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * dbxout.c: Don't include <string.h>.
+ Don't compare strchr result to NULL.
+
+ * config/svr4.h (ASM_FINAL_SPEC): Use %|, not ${pipe:-}.
+
+Tue Jan 30 06:48:43 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * combine.c (nonzero_bits, case REG): Ignore REG_POINTER_ALIGNMENT.
+ Restore old code for SP, but use it for all pointers to
+ defined locations in the frame.
+
+Mon Jan 29 11:25:28 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * dbxout.c (dbxout_type_methods): Don't use #ifndef inside call to
+ strchr.
+
+Sun Jan 28 14:44:09 1996 Doug Evans <dje@cygnus.com>
+
+ * config/dbxcoff.h (*): #undef first.
+
+Sat Jan 27 21:46:16 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.c (rs6000_sync_trampoline): Add cmpdi to 64bit case.
+ (rs6000_initialize_trampoline): CSE of Pmode to pmode.
+ * rs6000.md (movdf): Handle move between FPR and 64 bit GPR.
+ (movdi matcher): Handle SPR move to itself and add "mr." combiner.
+
+Sat Jan 27 10:06:31 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sysv4.h (ASM_OUTPUT_ALIGNED_LOCAL): Redefine, put small
+ data items in .sbss if -msdata.
+ (SWITCH_TAKES_ARG): Add 'B', 'b', and 'V'.
+
+Sat Jan 27 07:59:25 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * tree.h (enum built_in_function): Add BUILT_IN_{SET,LONG}JMP.
+ * expr.c: Include hard-reg-set.h.
+ (arg_pointer_save_area): New declaration.
+ (expand_builtin, case BUILT_IN_{SET,LONG}JMP): New cases.
+ * Makefile.in (expr.o): Includes hard-reg-set.h.
+ * c-decl.c (init_decl_processing): Add definitions for
+ __builtin_setjmp and __builtin_longjmp.
+ * cccp.c (initialize_builtins): Add def of __HAVE_BUILTIN_SETJMP__.
+
+ * expr.c (expand_expr, case COMPONENT_REF): Pass EXPAND_INITIALIZER
+ to recursive call.
+
+Fri Jan 26 17:24:07 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc.h (sparc_arch_type): Delete.
+ ({,TARGET_}MASK_DEPRECATED_V8_INSNS): Define.
+ (ARCH64_SWITCHES): Renamed from V9_SWITCHES.
+ * sparc.c (sparc_arch_type): Delete.
+ (sparc_init_modes): Likewise.
+ (output_move_quad): Don't use ldq/stq unless TARGET_HARD_QUAD.
+ * sparc/sp64-sol2.h (TARGET_DEFAULT): Add MASK_DEPRECATED_V8_INSNS.
+ (SUBTARGET_SWITCHES): Add -m{no-,}deprecated-v8-insns.
+ * sparc.md (arch attribute): Rewrite.
+ (isa): New attribute.
+ (32 bit multiply/divide patterns): Use if TARGET_DEPRECATED_V8_INSNS.
+ (32 bit divide patterns): V9 doesn't require delay after y reg write.
+
+Fri Jan 26 12:08:43 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.h (TARGET_32BIT): Define.
+ (BITS_PER_WORD, UNITS_PER_WORD): Invert so 32bit expected case.
+ (LONG_TYPE_SIZE, POINTER_BOUNDARY, PARM_BOUNDARY): Likewise.
+ (RS6000_REG_SAVE, RS6000_SAVE_AREA, RS6000_VARARGS_SIZE): Likewise.
+ (RETURN_ADDRESS_OFFSET, CASE_VECTOR_MODE, MOVE_MAX): Likewise.
+ (Pmode, FUNCTION_MODE): Likewise.
+ (LEGITIMATE_OFFSET_ADDRESS_P): Handle TARGET_64BIT.
+ (GO_IF_LEGITIMATE_ADDRESS, LEGITIMIZE_ADDRESS): Likewise.
+ (GO_IF_MODE_DEPENDENT_ADDRESS): Same.
+
+Fri Jan 26 10:37:52 1996 Stan Coxs <coxs@dg-rtp.dg.com>
+
+ * m88k.md (umulsidi3): Added for the 88110
+
+Fri Jan 26 09:35:42 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sysv4.h (STRIP_NAME_ENCODING): Deal with names that have
+ both @ and * prefix characters.
+ (ASM_OUTPUT_LABELREF): Ditto.
+
+Thu Jan 25 10:03:34 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.h (LEGITIMIZE_ADDRESS): Rewrite to use HOST_WIDE_INT, not
+ plain int.
+ (optimize,flag_expensive_optimizations): Provide declaration for
+ expander functions.
+
+ * rs6000.md (movsi): Correct code in splitting an address into
+ load from the TOC, and add low/high integer parts. If expensive
+ optimizations, and reload hasn't started, use separate pseudo regs
+ for each step.
+
+ * rs6000.c (small_data_operand): Don't use the function
+ eliminate_constant_term, unwind code directly.
+ (input_operand): SYMBOL_REF/CONST of small data operand is valid.
+ (print_{,address_}operand): Add @sda21(0) in appropriate cases for
+ small data.
+ %L, etc. so that if the item is in small memory, the appropriate
+ relocation is used.
+ (rs6000_select{,_rtx}_section): Don't put floating point constants
+ or small strings in .sdata2 since we can't tell from the pointer
+ whether it is in the small data area or not.
+
+ * rs6000.h (EXTRA_CONSTRAINT): Add 'U' for small data references.
+ (LEGITIMATE_SMALL_DATA_P): Test explicitly for SYMBOL_REF or CONST
+ before calling small_data_operand.
+
+ * rs6000.md (movsi): Handle the addresses of small data items.
+
+ * rs6000/sysv4.h (g_switch_{value,set}): Add declarations.
+ (SDATA_DEFAULT_SIZE): Default to 8.
+ (SUBTARGET_OVERRIDE_OPTIONS): If -G was not set, set it to
+ SDATA_DEFAULT_SIZE.
+ (CC1_SPEC): Pass -G nn to the compilers.
+ (SWITCH_TAKES_ARG): Add -G nn support.
+ (LINK_SPEC): Pass -G nn to the linker.
+
+Thu Jan 25 09:16:34 1996 Doug Evans <dje@cygnus.com>
+
+ * configure (sparc64-*-solaris2*): New target.
+ * sparc.h (SPARC_{V9,ARCH64}): Default value is 0.
+ (*): Replace SPARCV9 with SPARC_{V9,ARCH64}.
+ (MASK_CPUS): Define.
+ ({MASK,TARGET}_ENV32): Delete.
+ ({MASK,TARGET}_ARCH64,TARGET_ARCH32): Define.
+ (TARGET_SWITCHES): Reset cpu flags first for each variant.
+ (CONDITIONAL_REGISTER_USAGE): If 32 bit v9 system, unfix g1-g4,
+ fix g5, and make %f48-%f80 call used.
+ * sparc/sp64-aout.h (SPARC_{V9,ARCH64}): Define.
+ (TARGET_VERSION): Define.
+ (TARGET_DEFAULT): Add MASK_ARCH64, delete MASK_ENV32.
+ (JUMP_TABLES_IN_TEXT_SECTION): Define.
+ (READONLY_DATA_SECTION): Make text_section.
+ * sparc/sp64-elf.h (SPARC_{V9,ARCH64}): Define.
+ (TARGET_DEFAULT): Add MASK_ARCH64.
+ (ENDFILE_SPEC): No longer need to check for -nostartfiles.
+ (ASM_IDENTIFY_GCC): Define as empty.
+ * sparc/sp64-sol2.h: New file.
+ * sparc.c (*): Replace TARGET_V9 with TARGET_ARCH64.
+ (hard_32bit_mode_classes): Add v9 regs.
+ (gen_v9_scc): Handle 32 bit v9 case. Call v9_regcmp_p.
+ * sparc.md (*): Replace TARGET_V9 with TARGET_ARCH64 in places
+ requiring 64 bit environment.
+ (multf3_extend): Require TARGET_HARD_QUAD.
+
+Thu Jan 25 00:33:25 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * dbxcoff.h (DBX_USE_BINCL): Define.
+ (DBX_CONTIN_LENGTH): Define if not defined.
+
+Wed Jan 24 18:00:12 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * alpha.c (alpha_write_verstamp): Only emit MS_STAMP and LS_STAMP,
+ not the extra numbers.
+
+Wed Jan 24 15:18:15 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.c (init_cumulative_args): Rewrite to use DEFAULT_ABI
+ runtime tests, instead of V.4 #ifdefs.
+ (function_arg{,_advance,_partial_nregs,_pass_by_reference}): Ditto.
+ (setup_incoming_varargs): Ditto.
+ (init_cumulative_args): Set call_cookie field to CALL_NORMAL or
+ CALL_NT_DLLIMPORT.
+ (function_arg): Add support for DLL imports.
+ (rs6000_valid_{decl,type}_attribute_p): New functions for NT
+ attributes cdecl, stdcall, dllimport, and dllexport.
+ (rs6000_comp_type_attributes): New attribute support.
+ (rs6000_set_default_type_attributes): Ditto.
+ (rs6000_dll_import_ref): Ditto.
+
+ * rs6000.h (FP_ARG_{AIX,SYSV}_MAX_REG): Move here from sysv4.h.
+ * sysv4.h (FP_ARG_{AIX,SYSV}_MAX_REG): Move to rs6000.h.
+
+ * rs6000.h (rs6000_call_cookie): New enum to describe the integer
+ that is the 2nd argument to call insns and 3rd argument to
+ call_value insns. Add support for NT DLL imports.
+ (rs6000_args): Add call_cookie field.
+ (VALID_MACHINE_{DECL,TYPE}_ATTRIBUTE): Define to call C functions.
+ ({COMP_TYPE,SET_DEFAULT_TYPE}_ATTRIBUTES): Ditto.
+ (rs6000_valid_{decl,type}_attribute_p): Add declarations.
+ (rs6000_comp_type_attributes): Ditto.
+ (rs6000_set_default_type_attributes): Ditto.
+ (rs6000_dll_import_ref): Ditto.
+
+ * win-nt.h (ASM_DECLARE_FUNCTION_NAME): Add support for dllexport
+ attribute.
+
+ * rs6000.md (call insns): Add support for NT dllimport functions,
+ and fix up NT indirect calls. Also correctly set the flag
+ rs6000_save_toc_p on NT indirect calls.
+
+ * aix41.h (LINK_SPEC): Use new extra specs to avoid separate
+ versions for native and cross compilation.
+ * rs6000.h (LINK_SPEC): Ditto.
+ * sysv4.h (LINK_SPEC): Ditto.
+
+ * rs6000.h (EXTRA_SPECS): Add link_syscalls, link_libg, link_path,
+ link_specs, and also allow target to define more with the macro
+ SUBTARGET_EXTRA_SPECS.
+ (LINK_{LIBG,SYSCALLS}_SPEC): Define as fixed pathnames if native
+ compilation, and currently nothing if cross compiling.
+ (LINK_START_SPEC): If not defined, define as empty.
+ * eabi{,sim}.h (LINK_START_SPEC): Add default -Ttext for
+ simulator.
+
+ * eabi{aix,le}.h (MULTILIB_DEFAULTS): Add -mno-sdata default.
+ * sysv4{,le}.h (MULTILIB_DEFAULTS): Ditto.
+
+ * rs6000.c (small_data_operand): New function to return true if
+ the operand lives in small data under eabi.
+ (rs6000_select{,_rtx}_section): New functions to determine whether
+ to put global and static items in the V.4/eabi small data areas if
+ -msdata.
+
+ * rs6000.h (LEGITIMATE_SMALL_DATA_P): Call small_data_operand it
+ if V.4.
+ (GO_IF_LEGITIMATE_ADDRESS): If LEGITIMATE_SMALL_DATA_P, the item
+ is a valid address.
+ (ASM_OUTPUT_LABELREF): Use fputs, not fprintf.
+ (small_data_operand): Declare function.
+
+ * sysv4.h (TARGET_SWITCHES): New switch -msdata to use V.4 and
+ eabi defined small data sections.
+ (SUBTARGET_OVERRIDE_OPTIONS): Don't allow -msdata and
+ -mrelocatable or -mcall-aix options.
+ (EXTRA_SECTION{S,_FUNCTIONS}): Add .sdata, .sdata2, and .sbss
+ sections.
+ (SELECT{,_RTX}_SECTION): Call (rs6000_select{,_rtx}_section).
+ (ASM_SPEC): The -msdata switch passes -memb to the assembler.
+ (ENCODE_SECTION_INFO): Prepend a '@' to the name, if the item
+ lives in a small data region.
+ (STRIP_NAME_ENCODING): Strip '@' in addition to '*'.
+ (ASM_OUTPUT_LABELREF): Strip a leading '@'.
+
+ * t-{ppc,eabi}gas (MULTILIB*): Add support for libraries built
+ with/without -msdata. Drop support for -mcall-aixdesc libraries.
+
+Wed Jan 24 15:18:15 1996 Kim Knuttila <krk@cygnus.com>
+
+ * rs6000/win-nt.h (LIB_SPEC): Change options to GNU ld style.
+ (From Jason Molenda)
+
+Wed Jan 24 14:32:48 1996 Jim Wilson <wilson@cygnus.com>
+
+ * reload1.c (used_spill_regs): New variable.
+ (reload): Set it.
+ * reorg.c (find_dead_or_set_registers): New function.
+ (mark_target_live_regs): Delete loop looking forward from target
+ and instead call find_dead_or_set_registers.
+ (fix_reg_dead_note): New function.
+ (fill_slots_from_thread): Call it.
+
+ * loop.c (scan_loop): Correct comment.
+ (strength_reduce): Correct comments. Don't set maybe_multiple when
+ pass branch to scan_start. Don't set not_every_iteration after
+ passing a CODE_LABEL, or after passing a branch out of the loop.
+ When outputting DEST_ADDR giv increments, put them next to the memory
+ address on machines with auto-increment addresses.
+ (record_biv): Set new field always_executed.
+ (record_giv): Set new fields always_executed and auto_inc_opt.
+ (maybe_eliminate_biv_1): Reject biv with auto_inc_opt optimization
+ in some cases.
+ * loop.h (struct induction): New fields always_executed and
+ auto_inc_opt.
+
+ * c-typeck.c (pointer_int_sum): Use TYPE_PRECISION (sizetype) not
+ POINTER_SIZE to agree with expr.c.
+
+Tue Jan 23 15:17:30 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc/sol2.h (ASM_OUTPUT_ALIGNED_LOCAL): Delete, use svr4.h's.
+
+Tue Jan 23 03:28:01 1996 Paul Eggert <eggert@twinsun.com>
+
+ * cexp.y: Use preprocessor arithmetic instead of C arithmetic
+ to avoid warnings on some compilers.
+ (HOST_WIDE_INT_MASK): Remove.
+ (MAX_CHAR_TYPE_MASK, MAX_WCHAR_TYPE_MASK): New macros.
+ (yylex): Use them.
+
+Mon Jan 22 18:39:21 1996 Per Bothner <bothner@cygnus.com>
+
+ * cppexp.c (cpp_parse_expr): Set HAVE_VALUE flag for unary
+ minus, even if skip_evaluation is true.
+
+Mon Jan 22 16:53:48 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.h (BIGGEST_ALIGNMENT): Increase to 64 always.
+ (BIGGEST_FIELD_ALIGNMENT): Define.
+ (GO_IF_LEGITIMATE_ADDRESS): Merge PRE_INC and PRE_DEC cases.
+ (LEGITIMIZE_ADDRESS): Use Pmode not SImode.
+ (CASE_VECTOR_MODE): Depend on TARGET_64BIT.
+ (ASM_OUTPUT_COMMON): Delete.
+ (ASM_OUTPUT_ALIGNED_COMMON): Define.
+ * rs6000/sysv4.h (BIGGEST_FIELD_ALIGNMENT): Undefine.
+ * rs6000.md (adddi3, subdi3, negsi2): New PowerPC64 patterns.
+ (ashldi3, lshrdi3, ashrdi3, anddi3, iordi3, xordi3): Same.
+ (moddi3, cmpdi, tablejump matchers): Same.
+ (divdi3): Update PowerPC64 patterns.
+ * rs6000.c (rs6000_initialize_trampoline, case ABI_AIX): Use Pmode
+ not SImode.
+
+Sun Jan 21 23:33:24 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * dbxout.c: Include <string.h>
+
+Fri Jan 19 17:17:00 1996 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * tree.h (CONSTRUCTOR_TARGET_CLEARED_P): Removed.
+ * expr.c (is_zeros_p, mostly_zeros_p): Handle SET_TYPE CONSTRUCTORs.
+ (store_constructor_field): New helper function.
+ (store_constructor): Take 'cleared' parameter.
+ (expand_expr): Fix store_constructor_call to pass 'cleared' of 0.
+
+ * expr.c (store_constructor, SET_TYPE): Fix off-by-one-error.
+ Also, devide start byte by BITS_PER_UNIT before passing to memset.
+ (store_constructor): `continue' in wrong place.
+
+ * expr.c (store_constructor): If storing into a range of array
+ elements, and the range is small, or the target it not memory,
+ unroll the loop (and use store_field, which handles REGs).
+ (store_constructor): Handle RANGE_EXPR in array index.
+
+Fri Jan 19 16:52:25 1996 Doug Evans <dje@charmed.cygnus.com>
+
+ * svr4.h (SWITCH_TAKES_ARG): Add 'x'.
+ * sparc/sol2.h (SWITCH_TAKES_ARG): Likewise.
+
+Fri Jan 19 15:18:38 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * dbxout.c (flag_minimal_debug): Initialize to 0 if both
+ NO_DOLLAR_IN_LABEL and NO_DOT_IN_LABEL are defined.
+ (dbxout_type_methods): If the mangled method name uses the special
+ C++ marker character, pass show_arg_types as 1 when calling
+ dbxout_type.
+
+Fri Jan 19 11:48:28 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/eabi-ci.asm (_SDA_BASE_): Move the default definition
+ from the .got section to the .sdata section. Do not add 32768.
+ (_SDA2_BASE_): Provide a default definition.
+
+ * rs6000/eabi-cn.asm (.got.blrl): Don't define this section any
+ more, linker now directly creates the blrl instruction at
+ _GLOBAL_OFFSET_TABLE_-4.
+
+Fri Jan 19 05:12:31 1996 Richard Earnshaw <rearnsha@armltd.co.uk>
+
+ * arm/lib1funcs.asm (__divsi3, __modsi3, __udivsi3, __umodsi3):
+ Replace with smaller, faster versions.
+
+Thu Jan 18 17:41:46 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sh.c (ctype.h): Delete.
+ (regno_reg_class, reg_class_from_letter): Add SH3e support.
+ (prepare_scc_operands, broken_move, push, pop, push_regs): Likewise.
+ (calc_live_regs, sh_expand_prologue, sh_expand_epilogue): Likewsie.
+ (initial_elimination_offset, arith_reg_operand): Likewise.
+ (sh_builtin_saveregs, fp_zero_operand, fp_one_operand): New functions.
+ (sh_function_arg, sh_function_arg_partial_nregs): Delete.
+ * sh.h (CPP_SPEC, CONDITIONAL_REGISTER_USAGE): Add SH3E support.
+ (TARGET_SWITCHES, OVERRIDE_OPTIONS, FIRST_PSEUDO_REGISTER): Likewise.
+ (FIXED_REGISTERS, CALL_USED_REGISTERS, HARD_REGNO_MODE_OK): Likweise.
+ (enum reg_class, REG_CLASS_NAMES, REG_CLASS_CONTENTS): Likewise.
+ (REG_ALLOC_ORDER, CONST_DOUBLE_OK_FOR_LETTER_P, NPARM_REGS): Likewise.
+ (FUNCTION_VALUE, LIBCALL_VALUE, FUNCTION_VALUE_REGNO_P): Likewise.
+ (FUNCTION_ARG_REGNO_P, CUMULATIVE_ARGS, ROUND_REG): Likewise.
+ (INIT_CUMULATIVE_ARGS, FUNCTION_ARG_ADVANCE, FUNCTION_ARG): Likewise.
+ (FUNCTION_ARG_PARTIAL_NREGS, LEGITIMATE_CONSTANT_P): Likewise.
+ (MODE_DISP_OK_4, REGISTER_MOVE_COST, REGISTER_NAMES): Likewise.
+ (DBX_REGISTER_NUMBER, enum processor_type): Likewise.
+ (SH3E_BIT, TARGET_SH3E, FPUL_REG, FIRST_FP_REG, LAST_FP_REG): New.
+ (FIRST_FP_PARM_REG, FIRST_FP_RET_REG, BASE_RETURN_VALUE_REG): New.
+ (BASE_ARG_REG, enum sh_arg_class, struct sh_args): New.
+ (GET_SH_ARG_CLASS, PASS_IN_REG_P, sh_builtin_saveregs): New.
+ (EXPAND_BUILTIN_SAVEREGS, DOUBLE_TYPE_SIZE): New.
+ (TARGET_SWITCHES): Delete broken -m3l option.
+ * sh.md (cpu, movsi_i, movsf_i, blt, bge, sle, sge): Add SH3E support.
+ (push_e, pop_e, movsi_ie, movsf_ie, addsf3, subsf3): New patterns.
+ (mulsf3, macsf3, divsf3, floatsisf2, fix_truncsfsi2): New patterns.
+ (cmpgtsf_t, cmpqesf_t, cmpsf, negsf2, sqrtsf2, abssf2): New patterns.
+ (abssf2+9, abssf2+10): Add SH3e support to peepholes
+ (abssf2+11, abssf2+12): New peepholes for SH3e.
+ * t-sh (MULTILIB_OPTIONS): Add SH3E support.
+ (MULTILIB_DIRNAMES): Define to empty.
+
+Thu Jan 18 11:29:11 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * cplus-dem.c (cplus_demangle_opname): Change type of opname
+ parameter to const char *.
+ (cplus_mangle_opname): Change return type and type of opname
+ parameter to const char *. Don't cast return value.
+ * demangle.h (cplus_demangle_opname): Update declaration.
+ (cplus_mangle_opname): Likewise.
+
+Thu Jan 18 10:07:33 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * gcc.c (extra_specs): If EXTRA_SPECS is defined, define
+ extra_specs array to hold the extra specs the machine description
+ defines.
+ (set_spec): If EXTRA_SPECS is defined, handle the extra
+ specifications.
+ (process_command, main, validate_all_switches): Likewise.
+
+ * rs6000/{rs6000.h,powerpc.h,aix41.h} ({CPP,ASM}_SPEC): Use common
+ specs with EXTRA_SPECS, only modifying things in the target that
+ needs to be modified, rather than having tons of mostly duplicate
+ definitions.
+ * rs6000/{sysv4{,le}.h,}netware.h,lynx.h,} ({CPP,ASM}_SPEC): Ditto.
+ * rs6000/eabi{le,aix}.h,aix3newas.h}} ({CPP,ASM}_SPEC): Ditto.
+
+Wed Jan 17 19:38:24 1996 Paul Eggert <eggert@twinsun.com>
+
+ * cexp.y (HOST_WIDE_INT_MASK): Renamed from LONG_MASK;
+ use HOST_WIDE_INT.
+ (HOST_WIDE_INT, HOST_BITS_PER_WIDE_INT): Put back.
+ (parse_c_expression, expression_value, parse_escape, left_shift,
+ right_shift, struct constant, exp, parse_number, yylex):
+ Replace `long' with `HOST_WIDE_INT'.
+ * cccp.c (PTR_INT_TYPE): Remove obsolete define to `long'.
+ (parse_escape, parse_c_expression, eval_if_expression, get_lintcmd,
+ do_line, do_if, do_elif): Replace `long' with `HOST_WIDE_INT'.
+ (trigraph_pcp): Don't assume a pointer difference fits in an int.
+
+Wed Jan 17 18:56:31 1996 Jim Wilson <wilson@cygnus.com>
+
+ * expmed.c (extract_bit_field): For multi-word bitfield, clobber
+ target before storing to it.
+
+Wed Jan 17 14:19:34 1996 J.T. Conklin <jtc@slave.cygnus.com>
+
+ * sparc/{t-sol2,t-sunos40,t-sunos41}: Define away LIBGCC1_TEST
+ so that cross compilers targeted at these systems will build.
+
+Wed Jan 17 09:51:58 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc.h (v9 INIT_CUMULATIVE_ARGS): Fix typos.
+
+ * gcc.c (process_command): New local lang_n_files, and use
+ it in test of -c with -o. Move test of -save-temps.
+ Test for trailing NUL in -c.
+
+ * i386/t-go32: New file.
+ * i386/xm-go32.h: New file.
+ * configure (i[345]86-*-go32*): Define xm_file and tmake_file.
+
+Wed Jan 17 07:47:43 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * cccp.c (HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT): Put back.
+ (pcfinclude): Use HOST_WIDE_INT for casting pointer to integer.
+
+Wed Jan 17 05:25:06 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * va-pa.h (__gnuc_va_list): Use a "void *".
+
+Tue Jan 16 18:45:23 1996 Per Bothner <bothner@cygnus.com>
+
+ * cppexp.c (cpp_lex): Do cpp_pop_buffer after CPP_POP so retried
+ cpp_skip_hspace will actually work.
+
+ * cppexp.c (SKIP_OPERAND): New macro.
+ (cpp_parse_expr): Suppress evaluation and diagnostics in
+ unevaluated subexpressions.
+ Corresponds to Eggert's Fri Jun 9 17:58:29 1995 change.
+
+Tue Jan 16 11:59:07 1996 Mike Stump <mrs@cygnus.com>
+
+ * expr.c (expand_expr, case COND_EXPR): Make sure cleanups live on
+ the function_obstack as they are used by the exception handling code.
+ (defer_cleanups_to): Ditto.
+ (TRUTH_ANDIF_EXPR): Ditto.
+ (TRUTH_ORIF_EXPR): Ditto.
+
+Tue Jan 16 13:57:13 1996 Jim Wilson <wilson@cygnus.com>
+
+ * cccp.c (new_include_prefix): Ignore ENOTDIR error from stat.
+
+Tue Jan 16 12:18:56 1996 Doug Evans <dje@cygnus.com>
+
+ * i386/t-sol2 (crt[1in].o): Add missing -c.
+ * sparc/t-sol2 (crt[1in].o,gcrt1.o): Likewise.
+ Source files are assembler.
+
+ * gcc.c (do_spec_1, case 'W'): Rename local `index' to `cur_index' to
+ avoid warning on solaris.
+
+Tue Jan 16 11:42:09 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * dbxcoff.h: New file for stabs in COFF support.
+ * a29k/a29k-udi.h: Use dbxcoff.h.
+ * h8300.h, i960/i960-coff.h, m68k/coff.h, m88k/m88k-coff.h: Likewise.
+ * sh.h, sparc/litecoff.h: Likewise.
+
+Tue Jan 16 08:21:45 1996 Hans-Peter Nilsson <Hans-Peter.Nilsson@axis.se>
+
+ * optabs.c (expand_fix): Don't copy TARGET to TO if same.
+
+ * expr.c (emit_move_insn_1): Don't emit clobber when moving
+ by parts and source equals destination.
+
+Tue Jan 16 08:08:29 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expmed.c (extract_bit_field): Don't abort if not MEM_IN_STRUCT_P.
+
+ * local-alloc.c (memref_referenced_p, case REG): Fix last change.
+
+ * fold-const.c (const_binop): Strip NOPS from both args.
+
+ * regclass.c (regclass): Remove useless cast.
+
+Tue Jan 16 07:06:03 1996 Paul Eggert <eggert@twinsun.com>
+
+ * cexp.y: General code cleanup in the style of 1995-04-01 change.
+ Add prototypes for static functions.
+ Add parentheses suggested by `gcc -Wparentheses'.
+ Use `long' uniformly, instead of long, int, HOST_WIDE_INT mess.
+ (struct constant): Use `signedp' flag (with sign bit) instead of
+ `unsignedp' flag; it's a little more convenient.
+
+ (HAVE_STDLIB_H, STDC_HEADERS, LONG_MASK, __attribute__, PROTO,
+ VA_START, PRINTF_ALIST, PRINTF_DCL, PRINTF_PROTO, PRINTF_PROTO_1,
+ vfprintf, SIGNED, UNSIGNED): New symbols.
+ <stdlib.h>: Include if HAVE_STDLIB_H.
+ <string.h>: New include.
+ (HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT): Remove.
+ (yylex, yyerror, expression_value, parse_number,
+ initialize_random_junk): Now static.
+
+ (overflow_sum_sign): Renamed from possible_sum_sign, with an
+ extra arg SIGNEDP.
+ (parse_number): Inline strcmp when checking for "0x".
+ (yylex): Keep track of mask needed when decoding wide characters.
+ (parse_escape): New arg RESULT_MASK; use it instead of
+ assuming char width.
+ (yylex, parse_escape, parse_c_expression): Store all host
+ integers as long, not int or HOST_WIDE_INT.
+ (left_shift): No need to do signed left shifts separately.
+
+ These changes are for the test program (if TEST_EXP_READER):
+ (pedantic, traditional): Allocate storage.
+ (main): Set pedantic, traditional, yydebug depending on args.
+ (is_hor_space, warning, lookup): Change types and implementation
+ to match rest of program.
+ (pedwarn, check_assertion, xmalloc): New functions.
+
+ * cccp.c (HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT): Remove.
+ (parse_escape, parse_c_expression, eval_if_expression):
+ Change return type to `long'; all callers changed.
+ (pcfinclude): Use `int', not HOST_WIDE_INT; any integral type will do.
+
+ * cccp.c (skip_quoted_string): If pedantic and not pedantic_errors,
+ skipped multiline strings elicit a warning, not an error.
+ (rescan): Minor code reorg to keep it parallel with skip_quoted_string.
+
+ * fold-const.c (left_shift_overflows): Remove; unused.
+
+ * c-typeck.c (convert_for_assignment): Don't automatically convert
+ from a union member to the union.
+
+Tue Jan 16 06:26:00 1996 Stefan Vogel (stefan@ssw.de)
+
+ * config/svr4.h (ASM_OUTPUT_SECTION_NAME): Define section attributes
+ only when a section is defined the first time.
+
+Tue Jan 16 06:03:27 1996 Thomas Graichen <graichen@omega.physik.fu-berlin.de>
+
+ * i386/freebsd.h (ASM_WEAKEN_LABEL): Deleted; not supported.
+
+Mon Jan 15 20:59:49 1996 J. Kean Johnston <hug@netcom.com>
+
+ * Makefile.in (LIBGCC2_CLFAGS): Add -DIN_LIBGCC2.
+ (libgcc1.a): Add -DIN_LIBGCC1.
+ (stamp-crtS): Remove -fpic, use CRTSTUFF_CFLAGS_S.
+ * config/t-libc-ok: Add CRTSTUFF_CFLAGS_S.
+
+ * configure (i[3456]86-*-sco3.2v5*): New case.
+ * i386/sco5.h, i386/t-sco5, i386/x-sco5, i386/xm-sco5.h: New files.
+ * ginclude/stdarg.h, ginclude/varags.h: Add test for SCO Open Server 5.
+
+Mon Jan 15 20:44:13 1996 J.T. Conklin <jtc@netbsd.org>
+
+ * m68k/netbsd.h (ASM_SPEC): New macro.
+
+Mon Jan 15 17:01:16 1996 Doug Evans <dje@cygnus.com>
+
+ * c-lex.c (check_newline): Pass character after `#pragma' to
+ HANDLE_PRAGMA. Don't call get_directive_line if at end of line.
+ * c-common.c (get_directive_line): Watch for EOF.
+ * h8300.h (HANDLE_PRAGMA): New argument `c'.
+ Must issue `return' now.
+ * i960.h (HANDLE_PRAGMA): Likewise.
+ * sh.h (HANDLE_PRAGMA): Likewise.
+ * nextstep.h (HANDLE_PRAGMA): Likewise.
+ * h8300.c (handle_pragma): New argument `ch'.
+ Simplify pragma processing. Delete support for `#pragma section'.
+ * i960.c (process_pragma): New argument `c'. Change result to
+ terminating character.
+ * nextstep.c (handle_pragma): Likewise.
+ * sh.c (handle_pragma): Likewise. Also simplified.
+
+ * sched.c (reemit_notes): Add prototype.
+ (sched_analyze_2): Reorganize comments. Call prev_nonnote_insn.
+ (sched_analyze): Add abort call.
+ (schedule_block): Call prev_nonnote_insn.
+ Move call of reemit_notes to after SCHED_GROUP_P scheduling.
+ Set `head' to `last'.
+
+Mon Jan 15 16:12:25 1996 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * configure (*-*-gnu*): Use tmake_file=t-gnu.
+ * config/t-gnu (CRTSTUFF_T_CFLAGS): New file.
+ * configure (*-*-gnu*): Remove crtbeginS.o and crtendS.o frmo
+ $extra_parts. Use xmake_file=x-linux.
+
+Mon Jan 15 15:30:49 1996 Gran Uddeborg <gvran@uddeborg.pp.se>
+
+ * i386/svr3{,z}.ifile: Allocate address areas for the "stab"
+ and "stabstr" sections.
+
+Mon Jan 15 14:39:14 1996 Paul Eggert <eggert@twinsun.com>
+
+ * c-decl.c (finish_incomplete_decl): Warn if completing an
+ array that wasn't declared extern. Simplify test for whether
+ completion is needed.
+
+ * cccp.c (do_xifdef): Warn about `#ifdef 0' if not traditional;
+ formerly the warning was issued if not pedantic.
+
+Mon Jan 15 13:24:12 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md ({add,sub}di3): Make it work on little endian PowerPC
+ systems.
+
+ * rs6000/eabi-c{i,n}.asm (.sbss2 section): Don't make .sbss2 a
+ .bss section just yet, because it confused the linker.
+
+Mon Jan 15 08:50:31 1996 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k.md (pushdi): Allow "i" for operand 1.
+ (extendqidi2): Improve 68000 code generation.
+ (adddi_lshrdi_63): New pattern.
+
+Mon Jan 15 08:38:40 1996 H.J. Lu {hjl@gnu.ai.mit.edu)
+
+ * configure (i[3456]86-*-linux*): Add extra_parts.
+ * i386/linux.h (LIB_SPEC): Remove %{mieee-fp:-lieee}.
+ Use -lc_p for -profile.
+ (CC1_SPEC): New macro.
+ * linux.h (STARTFILE_SPEC): Use crtbegin.o for both shared llibrary
+ and normal executable; use gcrt1.o for -profile.
+ (ENDFILE_SPEC): Use crtend.o for shared llibrary and normal executable.
+ * x-linux (INSTALL_ASSERT_H): Unset it.
+ * configure (i[3456]86-*-linux*oldld*): Set xmake_file to x-linux-aout.
+ (i[3456]86-*-linux*aout*): Likewise.
+ * x-linux-aout: New file, copied from config/x-linux.
+
+Mon Jan 15 07:41:05 1996 Dmitry K. Butskoy (buc@stu.spb.su)
+
+ * varasm.c (in_data_section): New function.
+
+Mon Jan 15 07:37:13 1996 Andreas Schwab (schwab@issan.informatik.uni-dortmund.de)
+
+ * c-typeck.c (build_c_cast): Don't warn about alignment when we
+ have an opaque type.
+
+Mon Jan 15 07:22:59 1996 Michel Delval (mfd@ccv.fr)
+
+ * reload.c (find_equiv_reg): Apply single_set, not PATTERN, to WHERE.
+
+Mon Jan 15 07:02:21 1996 John F. Carr <jfc@mit.edu>
+
+ * reorg.c (mark_referenced_resources, case TRAP_IF): Set volatil.
+
+Mon Jan 15 06:20:38 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * gcc.c (process_commands): Remove inadvertant fallthrough.
+
+ * function.c ({,round_}trampoline_address): TRAMPOLINE_ALIGNMENT is
+ in bits, not bytes.
+
+ * objc/archive.c (objc_{write,read}_type, case _C_STRUCT_B): Fix typo.
+
+ * expr.c (expand_expr, case COMPONENT_REF): Don't make recursive
+ call on object with EXPAND_SUM.
+
+ * stmt.c (save_expr_regs): Delete declaration; unused.
+
+Sun Jan 14 21:44:26 1996 Michael Meissner <meissner@wogglebug.tiac.net>
+
+ * rs6000/eabi-ci.asm (__EXCEPT_START__): Provide label for start
+ of g++ exception pointers.
+
+ * rs6000/eabi-cn.asm (__EXCEPT_END__): Provide label for end of
+ g++ exception pointers.
+
+ * rs6000/eabi.asm (__eabi): Relocate exception pointers unless
+ they are NULL.
+
+ * va-ppc.h (va_arg): Long longs are always passed in odd registers.
+
+ * rs6000.c (function_arg_boundary): On V.4, long longs are always
+ passed in odd registers.
+
+ * rs6000.md ({add,sub}di3): Remove restriction for POWER only,
+ since all of the instructions used are common to both
+ architectures.
+
+Sun Jan 14 20:34:03 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * expr.c (expand_assignment): Fix alignment parm in emit_block_move.
+
+Sun Jan 14 19:00:25 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sched.c (schedule_block): Copy RTX_INTEGRATE_P bit when create
+ a new note.
+
+ * integrate.c (save_for_inline_copying, case NOTE): Copy
+ RTX_INTEGRATED_P bit.
+
+Sun Jan 14 17:57:52 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * stupid.c (stupid_find_reg): Don't try to allocate reg if live
+ over more than 5,000 insns.
+
+Sat Jan 13 23:09:07 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.h (STACK_BOUNDARY): Bring back down to 64bits.
+
+ * pa.md (pre_ldwm): Fix bug exposed by recent changes.
+ Simplify.
+ (pre_stwm, post_ldwm, post_stwm): Likewise.
+ (HImode and QImode variants): Likewise.
+ * pa.c (hppa_expand_prologue): Corresponding changes.
+ (hppa_expand_epilogue): Likewise.
+
+ * pa.c (hppa_legitimize_address): Generate more indexing
+ address modes.
+
+Fri Jan 12 19:03:21 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc/sol2.h (COMMON_ASM_OP): Delete, use sysv4.h's.
+
+ * sched.c (schedule_block): Maintain a valid chain so
+ emit_note_before works.
+
+Fri Jan 12 13:20:01 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/eabi{,-ci,-cn}.asm: Add support for V.4 .sbss/.sdata, and
+ eabi .sbss2/.sdata2 sections, loading up r13 and r2 respectively
+ if the sections were used, and we don't need to relocate the
+ pointers.
+
+Thu Jan 11 19:41:07 1996 Per Bothner <bothner@cygnus.edu>
+
+ * sparc.h (FUNCTION_ARG_PASS_BY_REFERENCE): Use AGGREGATE_TYPE_P so
+ QUAL_UNION_TYPE and SET_TYPE are also passed by invisible reference.
+ * sparc.h (INIT_CUMULATIVE_ARGS for SPARCV9): Return types of
+ QUAL_UNION_TYPE and SET_TYPE also make invisible 1st argument.
+
+Thu Jan 11 18:33:50 1996 Doug Evans <dje@cygnus.com>
+
+ * h8300.h (TARGET_ALIGN_STRUCT_300): New macro.
+ (TARGET_SWITCHES): Add -malign-struct-300.
+ (BIGGEST_FIELD_ALIGNMENT): Update.
+
+Thu Jan 11 12:07:44 1996 J.T. Conklin <jtc@cygnus.com>
+
+ * h8300.h (CPP_PREDEFINES): Delete -D_DOUBLE_IS_32BITS.
+
+Thu Jan 11 11:09:33 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.md (mulsf3 !POWERPC): Use dmul attribute.
+ (divsf3 !POWERPC): Use ddiv attribute.
+
+Thu Jan 11 11:09:33 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/eabi-ctors.c (__do_global_ctors): If global variable
+ __atexit is non-NULL, call it with __do_global_dtors address to
+ register the function to run destructors.
+ (__do_global_{c,d}tors): Guard against NULL pointers.
+
+ * rs6000/eabi.asm (__eabi): If the __eabi function was already
+ called, do nothing.
+
+Thu Jan 11 11:29:09 1996 Doug Evans <dje@cygnus.com>
+
+ * fixincludes: Wrap rpc/types.h in extern "C", for osf2.0.
+
+Wed Jan 10 13:16:03 1996 Doug Evans <dje@cygnus.com>
+
+ * varasm.c (variable_section): New function.
+ (assemble_variable): Call it.
+
+Wed Jan 10 11:27:28 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/eabi-c{i,n}.asm (__DTOR_{LIST,END}__): Fix typo.
+ * rs6000/eabi{,sim}.h ({START,END}FILE_SPEC): Add %s to object
+ files.
+
+ * rs6000/t-{eabi,eabigas,ppc,ppcgas} (MULTILIB_MATCHES): Drop
+ support for obsolete -mcpu=mpc403.
+ Add -mcpu=821 and -mcpu=860 to soft-float defaults.
+
+ * rs6000/t-eabi{,gas} (LIBGCC): Add stmp-crt.
+ (INSTALL_LIBGCC): Add install-crt.
+ (EXTRA_PARTS): Delete.
+ (stmp-crt{,-sub}): New rules to build crti.o and crtn.o in a
+ multilib fashion.
+ (install-crt): Install the multilib crt values.
+
+Tue Jan 9 17:30:16 1996 Doug Evans <dje@cygnus.com>
+
+ * c-tree.h (merge_attributes): Moved from here.
+ * tree.h (merge_attributes): To here.
+ * c-typeck.c (merge_attributes): Moved from here.
+ * tree.c (merge_attributes): To here.
+
+Mon Jan 8 18:27:38 1996 Arne H. Juul <arnej@pvv.unit.no>
+
+ * mips/netbsd.h (LINK_SPEC): Change nostdlib to nostartfiles.
+ (LOCAL_LABEL_PREFIX): Delete.
+ (ASM_OUTPUT_SECTION_NAME): Define.
+
+Sun Jan 7 17:11:11 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * collect2.c (scan_libraries): Correct Import File ID interpretation.
+
+Sun Jan 7 16:56:56 1996 Michael Meissner <meissner@wombat.gnu.ai.mit.edu>
+
+ * {svr4,mips/elf{,64}}.h (MAX_OFILE_ALIGNMENT): Define as 32768*8.
+
+Sat Jan 6 15:52:36 1996 Doug Evans <dje@cygnus.com>
+
+ * a29k/vx29k.h (CPP_SPEC): Define.
+
+ * configure: Recognize any --with/--without option.
+
+ * Makefile.in (MAKEINFOFLAGS): New variable.
+ (cpp.info,gcc.info): Use it.
+
+ * sparc/t-sol2 (crt1.o,crti.o,crtn.o,gcrt1.o): Use $(GCC_FOR_TARGET).
+ * i386/t-sol2 (crt1.o,crti.o,crtn.o): Likewise.
+
+Fri Jan 5 10:44:25 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/aix{3newas,41}.h ({ASM,CPP}_SPEC): Update for new
+ processors.
+ * rs6000/eabi{aix,le}.h ({ASM,CPP}_SPEC): Ditto.
+ * rs6000/{lynx,netware,powerpc,sysv4}.h ({ASM,CPP}_SPEC): Ditto.
+
+ * rs6000.c (rs6000_override_options): Remove requirement that
+ -mcpu=common be big endian.
+ (rs6000_stack_info): If NAME__main is defined, mark this function
+ as doing a call, even if there are no arguments.
+
+ * rs6000.md (SI*SI->DI splitters): Add reload_completed
+ condition.
+ (mulsidi3): If big endian, do move directly, rather than moving by
+ pieces.
+
+ * rs6000/eabi{,sim}.h (STARTFILE_SPEC): Add crti.o before any
+ other objects.
+ (ENDFILE_SPEC): Add crtn.o after any objects.
+ * rs6000/t-eabi{,gas}: Build crt{i,n}.o from eabi-crt{i,n}.asm.
+ * rs6000/eabi-crt{i,n}.asm: New files to provide begin/end labels
+ for all special sections used by eabi as opposed to relying on GLD
+ to set all of these symbols.
+ * rs6000/eabi.asm (__eabi): Change to use the new labels provided
+ above. Don't assume that the .got2, .ctors, .dtors, and .fixup
+ sections are contiguous.
+
+Fri Jan 5 10:40:37 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.md (mulh_call): Remove r4 clobber.
+ (quoss_call): Remove cr0 and cr1 clobbers.
+
+ * rs6000.md (function units): Add MPC505/821/860 support.
+ (SF multiply add combiner patterns): Use dmul attribute when limited
+ to DFmode POWER instructions.
+ * rs6000.c (processor_target_table): Add MPC505/821/860 support.
+ Remove MASK_POWER and add MASK_PPC_GFXOPT for PPC602. Always use
+ new mnemonics for common mode.
+ (rs6000_override_options): Don't set SOFT_FLOAT based upon
+ PROCESSOR_DEFAULT.
+ * rs6000.h (processor_type): Add PROCESSOR_MPCCORE.
+ (RTX_COSTS): Add PROCESSOR_MPCCORE cases.
+ (CPP_SPEC): Add new processor support.
+
+Fri Jan 5 00:32:49 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc.h (MACHINE_STATE_RESTORE): Add missing .align.
+
+Wed Jan 3 18:29:32 1996 Doug Evans <dje@cygnus.com>
+
+ * arm/lib1funcs.asm (__USER_LABEL_PREFIX__): Define if not already.
+ (CONCAT1,CONCAT2,SYM): Define.
+ (__udivsi3,__divsi3,__umodsi3,__modsi3,__div0): Use SYM to define
+ global labels.
+
+Wed Jan 3 02:41:39 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.h (DBX_OUTPUT_MAIN_SOURCE_FILE_END): Call text_section.
+
+Tue Jan 2 16:12:13 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sh.c (gen_shifty_op): Output a NOP for a shift by 0.
+ (find_barrier): New variables si_limit, hi_limit. Set them depending
+ on whether we are optimizing. Set found_hi if the destination is
+ HImode.
+ (machine_dependent_reorg): If not optimizing, then change scan to a
+ note instead of calling delete_insn.
+ * sh.h (OVERRIDE_OPTIONS): Don't set optimize or flag_delayed_branch.
+
+ * dbxout.c (gstab.h): Include if cross compiling.
+
+Mon Jan 1 21:13:43 1996 Arkady Tunik <Arkady_Tunik@comverse.com>
+
+ * configure (i[3456]-*-solaris2*): Support stabs.
+ * i386/sol2dbg.h: New file.
+
+Mon Jan 1 09:08:01 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-typeck.c: Use DECL_C_BIT_FIELD, not DECL_BIT_FIELD in all tests.
+
+ * global.c (reg_allocno): No longer static.
+ * reload1.c (reg_allocno): Declare.
+ (order_regs_for_reload): New arg, GLOBAL.
+ Bias against regs allocated in local-alloc.
+ (reload): Pass new parm to order_regs_for_reload.
+
+ * local-alloc.c (reg_equiv_replacement): New variable.
+ (memref_referenced_p, case REG): Check for reg_equiv_replacement.
+ (update_equiv_regs): reg_equiv_replacement now file-scope.
+
+ * c-decl.c (finish_struct): Warn if field with enumeral type is
+ narrower than values of that type.
+
+ * combine.c (rtx_equal_for_field_assignment_p): New function.
+ (make_field_assignment): Use it.
+ Expand compound operations on both sides of an IOR.
+ Properly adjust constand in IOR when computing bit position.
+
+Sun Dec 31 18:47:22 1995 Doug Evans <dje@cygnus.com>
+
+ * m68k-none.h (MULTILIB_DEFAULTS): Define.
+
+Sun Dec 31 15:47:20 1995 Jeffrey A. Law <law@cygnus.com>
+
+ * hard-reg-set.h (losing_caller_save_reg_set): Declare.
+ * regclass.c (losing_caller_save_reg_set): Define.
+ (init_reg_sets_1): Initialize losing_caller_save_reg_set.
+ * global.c (find_reg): Avoid caller-saving registers in
+ losing_caller_save_reg_set.
+ * local-alloc.c (find_free_reg): Avoid caller-saving registers
+ in losing_caller_save_reg_set.
+ (CLASS_LIKELY_SPILLED_P): Delete definition. Moved into regs.h.
+ * regs.h (CLASS_LIKELY_SPILLED_P): Define if not already defined.
+
+ * reorg.c (fill_simple_delay_slots): Try to fill from the
+ target of an unconditional branch if necessary.
+
+ * pa.h (REG_ALLOC_ORDER): Allocate PA1.1 caller-saved FP regs
+ before PA1.0 caller-saved FP regs.
+
+ * sched.c (adjust_priority): Use ADJUST_PRIORITY if its defined.
+
+ * pa.h (ADJUST_PRIORITY): Define to keep lifetimes of registers
+ that will be allocated to %r1 shorter.
+
+Sun Dec 31 14:20:49 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * rtl.h (assign_temp): Add extra arg.
+ * function.c (assign_temp): Add extra arg, DONT_PROMOTE.
+ Don't return (const_int 0) for VOIDmode.
+ * stmt.c (expand_asm_operands): Call assign_temp with extra arg.
+ * expr.c (save_nocopied_parts, expand_expr): Likewise.
+ (expand_expr, case SAVE_EXPR): Set TEMP to (const_int 0)
+ if MODE is VOIDmode.
+ (expand_expr): Don't use assign_temp for pseudos when might
+ want to be TMODE.
+
+ * stmt.c (tail_recursion_args): Compare TYPE_MAIN_VARIANTs.
+
+ * calls.c (expand_call): Don't warn about not being able to
+ inline if -O0.
+ * expr.c (clear_pending_stack_adjust): Don't do optimization if -O0.
+ * function.c (instantiate_decls): Check DECL_SAVED_INSNS to see
+ if obstack change is needed.
+ * toplev.c (rest_of_compilation): Leave DECL_INLINE set even if
+ won't inline.
+
+ * tree.h: Add documentation on uses of common area flags.
+ (DECL_ERROR_ISSUED): New macro.
+ (DECL_NO_STATIC_CHAIN): New macro; currently unused.
+ * c-aux-info.c (gen_decl): DECL_REGISTER isn't defined
+ for FUNCTION_DECL.
+ * toplev.c (compile_file): Likewise.
+ * stmt.c (fixup_gotos): Use DECL_ERROR_ISSUED instead
+ of DECL_REGISTER.
+ * varasm.c ({bc_,}make_decl_rtl): Don't look at DECL_REGISTER
+ for functions.
+
+Sat Dec 30 07:57:11 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * sdbout.c (plain_type_1, case ARRAY_TYPE): Subtract lower bound
+ when writing dimension.
+
+Fri Dec 29 18:23:58 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (eval_if_expression): End expression with '\n', not '\0'
+ so '\0' can be diagnosed properly.
+ * cexp.y (yylex, parse_c_expression, main): Likewise.
+
+Thu Dec 28 18:24:54 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * tree.h (TYPE_ARRAY_MAX_SIZE): New macro (used by Chill).
+ * function.c (assign_temp): New function. Can handle Chill-style
+ variable-sized array with static maximum size.
+ * rtl.h (assign_temp): New declaration.
+ * stmt.c (expand_asm_operands): Use new assign_temp function.
+ * expr.c (save_noncopied_parts, expand_expr): Likewise.
+
+Thu Dec 28 15:28:47 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * function.c (assign_parms): Fix thinko for struct value arg.
+
+Fri Dec 29 12:41:47 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (movdf): Reinstate 12/24 change accidently dropped in
+ undoing 12/27 changes.
+
+Thu Dec 28 22:24:53 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.h: (reg_class): Undo 12/27 changes, except for formatting.
+ (REG_NAMES, REG_CLASS_CONTENTS, REGNO_REG_CLASS): Likewise.
+ (REG_CLASS_FROM_LETTER): Likewie.
+ (PREDICATE_CODES): Delete predicate functions.
+ (gpc_reg{0,3,4,34}_operand): Delete declaration.
+ (cc_reg{0,1}_operand): Likewise.
+ * rs6000.c (gpc_reg{0,3,4}_operand): Delete.
+ (cc_reg{0,1}_operand): Likewise.
+
+ * rs6000.md (common mode functions): Undo 12/27 changes,and add
+ appropriate clobbers for common mode calls. Keep define_splits for
+ powerpc SI*SI->DI.
+
+Thu Dec 28 11:08:11 1995 Mike Stump <mrs@cygnus.com>
+
+ * sparc.h (RETURN_ADDR_OFFSET): Rename from NORMAL_RETURN_ADDR_OFFSET;
+ returns offset for the current function specifically.
+
+Thu Dec 28 07:07:14 1995 Paul Eggert <eggert@twinsun.com>
+
+ * c-lex.c (yylex): Improve error message for bogus numbers.
+ Consolidate duplicated code.
+
+ * cexp.y (parse_number): Improve error message for bogus numbers.
+ (yylex): Consider `0xe-1' to be a (bogus) number if not traditional.
+
+ * cccp.c (do_include): In VMS, worry only about EACCES when open fails.
+ (new_include_prefix): Don't try to stat dir prefixes in VMS.
+
+Wed Dec 27 14:02:54 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * fix-header.c: Add EXIT_FAILURE and EXIT_SUCCESS to stdlib.h if
+ missing. Re-write how errno is added to be done similarly.
+ (XOPEN_SYMBOL, XOPEN_EXTENDED_SYMBOL): New macros, to mark XPG4
+ functions.
+ (std_include_table): Add a number of functions (mostly XPG4).
+
+Tue Dec 26 23:18:34 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * sys-types.h: Add dummy definition for ssize_t.
+ * sys-protos.h (bcmp, bcopy, gethostname, lockf, read, readlink,
+ write): Fix prototypes to match Posix and XPG4.
+ (socket, strcasecmp, strncasecmp): New prototypes (from XPG4).
+
+Wed Dec 27 15:30:04 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * libgcc2.c (_bb_init_prg): Cast arg to bzero to (char *).
+
+ * regs.h (reg_rtx_no, regno_pointer_{flag_length,align): New decls.
+ (REGNO_POINTER_ALIGN): New macro.
+ * emit-rtl.c (regno_pointer_align): New variable.
+ (gen_reg_rtx): Extend regno_pointer_align table.
+ Allocate tables in saveable obstack.
+ (mark_reg_pointer): New arg, ALIGN.
+ (gen_inline_header): New args for reg info.
+ (set_new_first_and_last_insn): Set cur_insn_uid.
+ ({save,restore}_emit_status): Save and restore regno_pointer_align.
+ (restore_reg_data{,_1}): Deleted.
+ (init_emit): Allocate register tables in saveable obstack.
+ Set REGNO_POINTER_ALIGN for regs pointing into frame.
+ * function.c (assign_parms): Set REGNO_POINTER_ALIGN for
+ parms that are pointers.
+ * function.h (struct function): New field regno_pointer_align.
+ * expr.c (expand_expr, case VAR_DECL): Set REGNO_POINTER_ALIGN
+ when copying address into memory.
+ (expand_expr, case COMPONENT_REF, case ADDR_EXPR): Set alignment
+ of register when result or result's address.
+ (expand_expr, case CONVERT_EXPR): Don't handle -fforce-mem here.
+ * combine.c (set_nonzero_bits_and_sign_copies): Handle reg even
+ if only set once and in one basic block.
+ (nonzero_bits, case REG): Use REGNO_POINTER_ALIGN instead of
+ explicit alignment of registers pointing into frame.
+ * stmt.c (expand_decl): Set alignment of register for pointer
+ variable.
+ * optabs.c (emit_unop_insn): Don't do -fforce-mem for SIGN_EXTEND.
+ * cse.c (find_best_addr): Make sure folded address better before using.
+ * rtl.h (INLINE_REGNO_{RTX,POINTER_FLAG,POINTER_ALIGN}): New macros.
+ (gen_inline_header): Add three new parms.
+ * rtl.def (INLINE_HEADER): Add three new fields.
+ * integrate.c: Include regs.h.
+ (initialize_for_inline): Pass additional args to gen_inline_header.
+ (save_for_inline_copying): Make new regno_reg_rtx, regno_pointer_flag,
+ and regno_pointer_align arrays.
+ (expand_inline_function): Set alignment of reg for parm if passed
+ by hidden pointer.
+ Set regno_pointer_{flag,align} into remap table.
+ (copy_rtx_and_substitute): Set alignment of pointers into
+ stack frame.
+ Copy pointer flag and alignment to regs that are copies of
+ pointer registers from the original regs.
+ (output_inline_function): Don't call restore_reg_data.
+ Restore reg_rtx_no, regno_{reg_rtx,pointer_flag,pointer_align}.
+ * integrate.h (struct inline_remap): New fields regno_pointer_flag
+ and regno_pointer_align.
+ * unroll.c (unroll_loop): Set regno_pointer_{flag,align} in
+ remap table.
+ * explow.c (memory_address, allocate_dynamic_stack_space):
+ Pass additional arg to mark_reg_pointer.
+ * Makefile.in (integrate.o): Includes regs.h.
+
+ * alpha.c ({non,}aligned_memory_operand): Test REGNO_POINTER_ALIGN.
+ (reg_or_unaligned_mem_operand): New function.
+ (get_unaligned_address): Add new arg, EXTRA_OFFSET.
+ * alpha.h ({CONSTANT,DATA}_ALIGNMENT): Align to at least BITS_PER_WORD.
+ (PREDICATE_CODES): Add reg_or_unaligned_mem_operand.
+ * alpha.md (extend{qihi,qisi,hisi}2): Allow unaligned memory
+ as arg 1 and pass to extend_{q,h}idi2.
+ (unaligned_extend{q,h}idi): New patterns.
+ (extend{q,h}idi2): If unaligned memory, call above new patterns.
+ (ext{q,l,w}h recognizer): Update to proper RTL.
+ (ext define_split): Comment out for now; wrong and maybe useless.
+ (unaligned_{load,store}hi): Do similarly to QImode.
+ (movhi, reload_{in,out}hi): Call unaligned case differently.
+
+Wed Dec 27 11:38:20 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (mulsidi3{,_common}): Undo previous change using
+ register classes instead of fixed registers for SI*SI->DI common
+ mode multiplies.
+
+ * rs6000.c (gpc_reg34_operand): Delete unused function.
+ * rs6000.h (gpc_reg34_operand): Likewise.
+
+ * rs6000.c (gpc_reg{3,4}_operand): Reorganize code and don't allow
+ SUBREG's.
+
+ * rs6000.c (rs6000_override_options): Do not allow -mcpu=common on
+ little endian PowerPC's.
+ (gpc_reg{0,3,4,34}_operand): New functions to match a specific
+ register.
+ (cc_reg{0,1}_operand): Likewise.
+
+ * rs6000.h (reg_class): Add register classes for register 3 by
+ itself, register 4 by itself, registers 3&4, and CR1.
+ (REG_NAMES): Add support for new register classes.
+ (REG_CLASS_CONTENTS, REGNO_REG_CLASS, REG_CLASS_FROM_LETTER): Likewise.
+ (PREDICATE_CODES): Add new predicate functions.
+ (gpc_reg{0,3,4,34}_operand): Add declaration.
+ (cc_reg{0,1}_operand): Likewise.
+
+ * rs6000.md (common mode multiplication/division): Move/rename common
+ mode calls so they are closer to define_expands that call them.
+ Set attribute type to be jmpreg, rather than integer, so optimizer
+ knows branch processing unit is used; make SI*SI->DI multiplier use
+ register classes instead of hardwired registers.
+ Add appropriate clobbers of CR0/CR1 as mandated by PowerOpen spec.
+ (PowerPC SI*SI->DI multipliers): Add appropriate define_splits.
+
+ * rs6000/t-{,x}newas (MULTILIB*): Don't build power2 or 601
+ specific libraries.
+
+Tue Dec 26 21:52:18 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * fold-const.c (fold_convert): When converting a NaN to
+ another type, change the type of the node before returning it.
+
+Mon Dec 25 17:12:10 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * c-typeck.c (mark_addressable): Fix error in last change.
+
+Sun Dec 24 22:19:49 1995 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.c (output_function_epilogue): Use assemble_integer rather
+ than calling ASM_OUTPUT_INT directly.
+ * pa.h (ASM_OUTPUT_INT): Use labels for everything in the
+ exception table section.
+
+ * pa.c (print_operand): Don't call fprintf to output a register
+ name. Use fputs instead.
+
+ * pa.h (ASM_OUTPUT_FUNCTION_PREFIX): Strip any name encoding
+ on the section name.
+
+Sun Dec 24 17:46:03 1995 Markus Theissinger <Markus.Theissinger@gmd.de>
+
+ * toplev.c (main): Add -ax option.
+ * gcc.c (struct compilers): Likewise.
+ * final.c (end_final): Extended header increased to 11 words.
+ (profile_after_prologue): FUNCTION_BLOCK_PROFILER uses
+ count_basic_blocks instead of profile_label_no.
+
+ * libgcc2.c (struct bb): Add flags field.
+ (HAVE_POPEN): Test new define.
+ (struct __bb, struct bb_{edge,func}): New structs.
+ (__bb_init_{prg,file},__bb_{init,exit}_trace_func,__bb_trace_ret,
+ (__bb_trace_func{,_ret},gopen,gclose): New functions.
+
+ * sparc.h, i386.h, m68k.h (FUNCTION_BLOCK_PROFILER, BLOCK_PROFILER):
+ Extension for -ax option (profile_block_flag == 2).
+ (MACHINE_STATE_SAVE,MACHINE_STATE_RESTORE): New macros.
+ (FUNCTION_BLOCK_PROFILER_EXIT): New macro.
+ * sparc.c (output_function_epilogue), i386.c (function_epilogue):
+ Use FUNCTION_BLOCK_PROFILER_EXIT.
+ * m68k.c (output_function_epilogue): Likewise.
+ * xm-sparc.h: Define HAVE_POPEN.
+
+Sun Dec 24 06:50:30 1995 Barrett Richardson (barrett@iglou.com)
+
+ * floatlib.c (__divdf3): Rewrite to do software divide of two
+ doubles instead of using __divsf3.
+
+Sun Dec 24 06:38:15 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * rs6000.md (movdf): Don't copy a word at a time; nearly always loses.
+
+ * c-tree.h (DECL_C_BIT_FIELD): New macro.
+ * c-decl.c (finish_struct): Set it when set DECL_BIT_FIELD.
+ * c-typeck.c (mark_addressable, case COMPONENT_REF):
+ Give error if taking address of a bit field.
+
+ * gcc.c (unused_prefix_warning): Include machine_suffix if
+ require_machine_suffix.
+ (warn_B, warn_std, warn_std_ptr): New variables.
+ (process_commands): Use them and NULL_PTR as WARN arg to add_prefix.
+
+ * gcc.c (process_command): Give error for -c with -o and
+ multiple compilations.
+ (handle_braces): Rename variable "pipe" to "pipe_p".
+
+ * expr.h (clrstr_optab): New declaration.
+ (clear_storage): New parm, ALIGN.
+ * tree.h (CONSTRUCTOR_TARGET_CLEARED_P): New macro.
+ * genopinit.c (optabs): Add "clrstr%a%".
+ * optabs.c (init_optabs): Initialize clrstr_optab.
+ * expr.c (struct clear_by_pieces): New structure.
+ (clear_by_pieces{,_1}, {is,mostly}_zeros_p): New functions.
+ (clrstr_optab): New optab.
+ (clear_storage): Rework to try to use clear_by_pieces, then
+ new clrstr insn, then library call.
+ (store_constructor): Track if target is already cleared.
+ Clear target first if CONSTRUCTOR is mostly zeros.
+ Don't write zeros if target has been cleared.
+ Add new arg to clear_storage call.
+ (expand_expr, case CONSTRUCTOR): Don't put static constructor
+ in memory if mostly zero.
+ * i386.md (clrstrsi): New pattern and associate anonymous pattern.
+
+Sat Dec 23 12:21:53 1995 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.c (output_move_double): Correctly identify and handle
+ overlapping moves.
+ * pa.md (movdi patterns): Eliminate earlyclobbers in mem<->gr cases.
+ (movdf patterns): Likewise.
+
+Fri Dec 22 17:29:42 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (store_constructor): Don't call change_address on REG.
+ (expand_expr, case CONSTRUCTOR): Likewise.
+
+ * mips.c (expand_block_move): Preserve MEM flags in call to
+ movstrsi_internal.
+
+ * pa.c (emit_move_sequence): Don't try to set REGNO_POINTER_FLAG
+ for a SUBREG.
+
+ * reload.c (find_valid_class): New function.
+ (push_reload): Use it in cases where a SUBREG and its contents
+ both need to be reloaded.
+
+ * toplev.c (rest_of_compilation): Never defer functions that
+ contain nested functions.
+
+Fri Dec 22 15:55:00 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (function units): Add 403 support which deleted
+ by accident on Nov 21st. Mark all compares from 602, 603, 604,
+ 620, 403, like was done for rios{1,2} and 601 as needing the bpu,
+ so that compares are hoisted far enough branches for zero cycle
+ branch support.
+
+Fri Dec 22 15:13:47 1995 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.h (TARGET_UNROLL_STRLEN): New macro.
+ * i386.c (output_strlen_unroll): New function.
+ * i386.md (strlensi): New pattern.
+
+Thu Dec 21 18:53:31 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * /gnu.h (GNU_CPP_PREDEFINES): Add missing space after -Amachine(CPU).
+
+Thu Dec 21 12:23:42 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * configure ({powerpc,rs6000}*): Change --enable-cpu to --with-cpu.
+ * rs6000.c (rs6000_select): Likewise.
+
+ * rs6000/aix41.h (LINK_SPEC): Do not pass -bexport to the linker
+ if -g and -shared.
+
+Wed Dec 20 11:23:39 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * configure ({powerpc,rs6000}-ibm-aix*): Merge these two into the
+ same case statement. Aix 4 now generates -mcpu=common by default.
+ ({powerpc,rs6000}*): Add support for --enable-cpu=<value> to
+ select the default cpu to compile for.
+
+ * rs6000/aix41.h (TARGET_DEFAULT): Make -mcpu=common default behavior.
+ (PROCESSOR_DEFAULT): Likewise.
+ (MULTILIB_DEFAULTS): Set mcpu=common.
+
+ * rs6000.h (TARGET_CPU_DEFAULT): Define to be NULL if not defined.
+ (PROCESSOR_COMMON): Set this to PROCESSOR_601.
+ (PROCESSOR_POWERPC): Set this to PROCESSOR_604.
+ (TARGET_OPTIONS): Add -mtune= switch.
+ (rs6000_select): New structure to hold -mcpu=, -mtune= switches
+ and the result of configuring --enable-cpu=.
+ (OVERRIDE_OPTIONS): Pass TARGET_CPU_DEFAULT to
+ rs6000_override_options.
+
+ * rs6000.c (rs6000_cpu_string): Delete global variable.
+ (rs6000_select): Define new global variable.
+ (rs6000_override_options): Take default_cpu argument, and provide
+ support for it and -mtune= in addition to -mcpu=.
+
+ * rs6000/{aix{3newas,41},lynx,netware,powerpc}.h (ASM_SPEC): Add
+ support for -mcpu=power2.
+ * rs6000/{rs6000,sysv4}.h (ASM_SPEC): Likewise.
+
+ * rs6000/{aix41,eabiaix,eabile,lynx,powerpc}.h (CPP_SPEC): Make
+ sure all -mcpu=xxx targets are supports.
+ * rs6000/{rs6000,sysv4,sysv4le}.h (CPP_SPEC): Likewise.
+
+ * rs6000/t-x{newas,rs6000}: New files to be used when making a
+ cross compiler, to prevent libgcc1-test from being made.
+
+ * rs6000/t-{x,}newas (MULTILIB_*): Build multlilib libraries for
+ power, power2, 601, powerpc, and common mode processors.
+
+ * rs6000/aix41ppc.h: Delete, no longer used.
+
+Tue Dec 19 18:31:21 1995 Jim Wilson <wilson@cygnus.com>
+
+ * mips.c (mips_reg_names, mips_sw_reg_names, mips_regno_to_class):
+ Add entry for new RAP reg.
+ * mips.h (FIRST_PSEUDO_REGISTER): Increment.
+ (FIXED_REGISTERS, CALL_USED_REGISTERS, REGISTER_NAMES,
+ DEBUG_REGISTER_NAMES): Add entry for new RAP reg.
+ (RAP_REG_NUM, RETURN_ADDRESS_POINTER_REGNUM): New macros.
+ (RETURN_ADDR_RTX): Define.
+ (ELIMINABLE_REGS, CAN_ELIMINATE, INITIAL_ELIMINATION_OFFSET):
+ Add RETURN_ADDRESS_POINTER_REGNUM support.
+ * emit-rtl.c (return_address_pointer_rtx): New global variable.
+ (gen_rtx, init_emit_once): Add support for it.
+
+Tue Dec 19 15:08:31 1995 Jason Merrill <jason@yorick.cygnus.com>
+
+ * collect2.c: Remove auto_export functionality.
+
+Tue Dec 19 10:57:23 1995 Kim Knuttila <krk@cygnus.com>
+
+ * ppc-asm.h: Do not compile the register macros under winnt.
+
+Mon Dec 18 19:31:23 1995 Adam Fedor <fedor@wilma.Colorado.EDU>
+
+ * objc/encoding.c (objc_alignof_type): Handle _C_PTR case.
+
+Mon Dec 18 18:40:34 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * combine.c (simplify_rtx, case SUBREG): For SUBREG of a constant,
+ use <= instead of < when comparing mode sizes.
+ (force_to_mode, case NOT): Use full mask inside the NOT operation.
+
+ * expr.c (emit_block_move): When call emit_libary_call for bcopy,
+ pass arguments using correct types and modes.
+ (emit_push_insn, expand_assignment): Likewise.
+ (clear_storage, store_expr): Likewise for memset and bzero.
+ (store_constructor): Likewise for memset.
+ * optabs.c (emit_cmp_insn): Likewise for memcmp and bcmp.
+ * convex.c (expand_movstr_call): Likewise for memcpy.
+ * m88k.c (expand_block_move): Likewise for memcpy and bcopy.
+ * mips.c (block_move_call): Likewise for memcpy and bcopy.
+ * mips.h (INITIALIZE_TRAMPOLINE): Likewise for cacheflush.
+
+ * c-common.c (WCHAR_TYPE_SIZE): Add a default definition.
+
+ * sdbout.c (sdbout_symbol, case FUNCTION_DECL): Use DECL_INITIAL
+ instead of DECL_EXTERNAL to identify declarations.
+
+ * svr4.h (ASM_IDENTIFY_GCC): Don't output stab here.
+ (ASM_IDENTIFY_GCC_AFTER_SOURCE): Output stab here instead of above.
+
+ * stmt.c (expand_asm_operands): Handle numeric constraints in
+ with the default case.
+
+Mon Dec 18 16:49:43 1995 John F. Carr <jfc@mit.edu>
+
+ * expr.h (expand_mult_highpart_adjust): Declare.
+
+Mon Dec 18 16:39:41 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (store_constructor): Fix error in last change: just
+ copy MEM, but be sure to share address.
+ (expand_expr, case CONSTRUCTOR): Likewise.
+
+Mon Dec 18 16:22:46 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.h (ASM_GENERATE_INTERNAL_LABEL): Put leading '*' in label
+ string so as to not confuse dbxout.c.
+
+Mon Dec 18 09:44:56 1995 Mike Stump <mrs@cygnus.com>
+
+ * libgcc2.c (__empty): An empty function used by the C++ frontend for
+ defaulting cleanup actions.
+
+ * tree.c (save_tree_status, restore_tree_status): Save and restore
+ temporary_firstobj.
+
+Mon Dec 18 07:49:34 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * function.c (fixup_var_refs_1): Fix error in last change (when
+ mode of VAR is not the same as PROMOTED_MODE).
+
+Sun Dec 17 12:14:37 1995 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.h (ASM_OUTPUT_FUNCTION_PREFIX): Don't surround section names
+ with '$'; that confuses collect2.
+ (ASM_OUTPUT_SECTION_NAME): Likewise.
+
+ * sched.c (canon_rtx): Recursively look for equivalences;
+ look for expressions equivalent to MEMs.
+ (true_dependence): Canonicalize inputs before operating
+ on their values.
+ (anti_dependence, output_dependence): Likewise.
+
+ * jump.c (follow_jumps): Don't follow an unconditional jump
+ that is not a simple_jump.
+
+ * pa.c (override_options): Make 7100 scheduling the default.
+
+ * pa.md: Add 2nd reload peephole somehow omitted from Nov27 changes.
+
+ * regclass.c (regclass): Use SECONDARY_RELOAD_CLASS if it's
+ defined to avoid useless work.
+
+ * combine.c (find_split_point): Try to split SET_DEST
+ just like we do for SET_SRC.
+
+Sun Dec 17 11:37:25 1995 Torbjorn Granlund <tege@noisy.tmg.se>
+
+ * expmed.c (expand_mult_highpart): When doing widening multiply,
+ put constant in a register.
+ (expand_mult_highpart): When mode is word_mode use gen_highpart
+ instead of right shift by size.
+
+ * expr.c (expand_expr, case MULT_EXPR): Generalize code for widening
+ multiply to handle signed widening multiply when only unsigned optab
+ is defined, and vice versa.
+
+Sun Dec 17 07:35:50 1995 Pat Rankin <rankin@eql.caltech.edu>
+
+ * vax/vms.h (WCHAR_TYPE_SIZE): Define.
+
+Sun Dec 17 07:08:34 1995 Ronald F. Guilmette <rfg@monkeys.com>.
+
+ * fp-test.c: New file.
+
+Sun Dec 17 07:06:03 1995 Peter Flass <flass@lbdc.senate.state.ny.us>
+
+ * i370.md (cmpqi): Fix generation of literal operand of CLM instruction
+ to avoid double literals (=X'=F'...).
+
+Sun Dec 17 06:57:02 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c: Try harder not to open or stat the same include file twice.
+ Simplify include file names so that they are more likely to match.
+ E.g. simplify "./a//b" to "a/b". Represent directories with simplified
+ prefixes, e.g. replace "./a//b" with "a/b/", and "." with "".
+ (absolute_filename): New function.
+ (do_include): Use it.
+ (read_name_map): Likewise; this makes things more consistent for DOS.
+ (main, do_include, open_include_file): -M output now contains
+ operands of -imacros and -include.
+ (skip_to_end_of_comment): When copying a // comment, don't try to
+ change it to a /* comment.
+ (rescan, skip_if_group, skip_to_end_of_comment, macarg1): Tune.
+ (rescan, skip_if_group, skip_to_end_of_comment, macarg1):
+ If warn_comments is nonzero, warn if backslash-newline appears
+ in a // comment. Simplify method for finding /* /* */ comment.
+ (skip_if_group): Optionally warn if /* /* */ appears between # and
+ a directive inside a skipped if group.
+ (macarg): Optionally warn if /* /* */ appears in a macro argument.
+ (strncat, VMS_strncat, vms_ino_t, ino_t): Remove.
+ (INCLUDE_LEN_FUDGE): Add 2 if VMS, for trailing ".h".
+ (INO_T_EQ, INO_T_HASH): New macros.
+ (struct file_buf): New member `inc'.
+ (expand_to_temp_buffer): Initialize it.
+ (struct file_name_list): New member `inc'.
+ (struct file_name_list): New member `st'.
+ c_system_include_path is now 1 if not 0.
+ fname is now an array, not a pointer.
+ (struct include_file): New members `next_ino', `deps_output', `st'.
+ Remove members `inode' and `dev'; they are now in `st'.
+ (INCLUDE_HASHSIZE): Rename from INCLUDE_HASH_SIZE.
+ (include_hashtab): Rename from include_hash_table.
+ (include_ino_hashtab): New variable.
+ (main): Store file status in struct stat, not in long and int pieces.
+ Use base_name to strip prefixes from file names.
+ When printing directory prefixes, omit trailing / and print "" as ".".
+ Fatal error if the input file is a directory.
+ (main, path_include): Regularize operands of -include, -imacros,
+ -isystem, -iwithprefix, and -iwithprefixbefore.
+ Regularize default include directories.
+ (do_include):
+ Allocate dsp with alloca, since fname is now dynamically allocated.
+ Use -3 to represent a never-opened file descriptor.
+ Make copy of file name, and simplify the copy.
+ Use base_name to identify the end of fname's directory.
+ Do not prepend dir for "..." if it matches the search list's first dir.
+ open_include_file now subsumes redundant_include_p and lookup_import.
+ Use bypass_slot to remember when to skip directories when including
+ a file that has already been seen.
+ Instead of using 0 to represent the working directory, and ""
+ to represent a directory to be ignored, use "" for the former,
+ and assume the latter has been removed before we get here.
+ Assume the directory prefixes have already been simplified.
+ Report as errors all open failures other than ENOENT.
+ Fatal error if fstat fails.
+ Use new deps_output member to avoid printing dependencies twice.
+ (bypass_hashtab): New variable.
+ (do_include, open_control_file, record_control_macro): New convention:
+ control_macro is "" if the file was imported or had #pragma once.
+ (pragma_once_marker): Remove.
+ (redundant_include_p, include_hash, lookup_include, lookup_import,
+ add_import, file_size_and_mode): Remove; subsumed by open_include_file.
+ (skip_redundant_dir_prefix): Remove; subsumed by simplify_filename.
+ (is_system_include, read_name_map, remap_include_file):
+ Assume arg is a directory prefix.
+ (base_name, simplify_filename, remap_include_file,
+ lookup_ino_include, new_include_prefix): New functions.
+ (open_include_file): New arguments `importing' and `pinc'.
+ Move filename mapping into new remap_include_file function.
+ First try to find file by name in include_hashtab;
+ if that doesn't work, open and fstat it and try to find it
+ by inode and dev in include_ino_hashtab.
+ (finclude): Get file status from inc->st instead of invoking fstat.
+ Store inc into fp->inc so that record_control_macro doesn't
+ need to do a table lookup.
+ (finclude, record_control_macro): Accept struct include_file *
+ instead of char * to identify include file. All callers changed.
+ (check_precompiled): Get file status from new argument `st'.
+ (do_pragma): Output at most one warning about #pragma implementation.
+ Always return 0 instead of returning garbage sometimes.
+ (do_pragma, hack_vms_include_specification):
+ Use base_name for consistency, and remove redundant code.
+
+ From Per Bothner:
+ Unify the 3 separate mechanisms for avoiding processing
+ of redundant include files: #import, #pragma once, and
+ redundant_include_p to use a single more efficient data structure.
+ (struct file_name_list): Remove no-longer needed field control_macro.
+ (dont_repeat_files, all_include_files): Remove, no longer used.
+ (struct import_file): Renmed to struct include_file, moved earlier
+ in file, renamed field name to fname, and added control_macro field.
+ (pragma_once_marker): New constant.
+ (import_hash_table): Renamed to include_hash_table.
+ (import_hash): Renamed to include_hash.
+ (IMPORT_HASH_SIZE): Renamed to INCLUDE_HASH_SIZE.
+ (main, path_include): Don't clear removed control_macro field.
+ (lookup_include): New function - look up fname in include_hash_table.
+ (redundant_include_p): Re-write to use lookup_include.
+ (lookup_import, record_control_macro): Likewise.
+ (add_import): Defer fstat to caller. Combine two xmallocs into one.
+ (do_once): Use pragma_once_marker in include_hash_table.
+ (do_pragma): Re-implement to scan include_hash_table.
+ (do_include): Use new lookup_include and add_import.
+
+Sun Dec 17 06:45:43 1995 John F. Carr <jfc@mit.edu>
+
+ * configure (savesrcdir): Do not create paths with trailing "/.".
+
+ * combine.c (try_combine): When checking for two sets of the same
+ register in a split insn, also test for setting a ZERO_EXTRACT,
+ STRICT_LOW_PART, or SUBREG.
+
+Sun Dec 17 06:37:00 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * reload.c (push_secondary_reload): Don't strip paradoxical SUBREG
+ if reload_class is CLASS_CANNOT_CHANGE_SIZE.
+
+Sat Dec 16 18:24:20 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (expand_assignment): Fix alignment parm in emit_block_move.
+
+Sat Dec 16 18:16:08 1995 John Hassey (hassey@rtp.dg.com)
+
+ * local-alloc.c (optimize_reg_copy_2): Don't attempt
+ optimization if destination register dies.
+
+Sat Dec 16 08:31:16 1995 Paul Eggert <eggert@twinsun.com>
+
+ * fold-const.c (fold): Don't record overflow when negating
+ unsigned constants.
+
+Sat Dec 16 07:45:11 1995 Gran Uddeborg (uddeborg@carmen.se)
+
+ * configure (i[3456]-*-isc, gas, stabs): Remove crt* from extra_files
+
+Sat Dec 16 07:03:33 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * stor-layout.c (layout_record): When PCC_BITFIELD_TYPE_MATTERS,
+ compute bitpos using field_size % type_align instead of field_size.
+
+ * fixincludes (stdio.h): Fix return type of fread and fwrite
+ on sysV68.
+
+Sat Dec 16 06:57:14 1995 Thomas Lundqvist (d0thomas@dtek.chalmers.se)
+
+ * function.c (fixup_var_refs_1): Fix two incorrect calls to single_set.
+
+Fri Dec 15 22:30:27 1995 Torbjorn Granlund <tege@noisy.tmg.se>
+
+ * i386.h (REGISTER_MOVE_COST): Simplify.
+
+Fri Dec 15 22:30:27 1995 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.h (TARGET_CPU_DEFAULT*, PROCESSOR_*,
+ TARGET_{LEAVE,386_ALIGNMENT,PUSH_MEMORY,ZERO_EXTEND_WITH_AND,
+ DOUBLE_WITH_ADD,BIT_TEST}): New macros.
+ * i386.c (ix86_cpu*, ix86_isa*): New global variables.
+ (override_options): Add -mcpu and -misa support
+ * i386.md: Use TARGET* macros.
+ * i386/dgux.{c,h}: New files.
+ * m88k/t-dgux: (GCC_FOR_TARGET, T_CFLAGS): New macros.
+ * m88k/t-dguxbcs: New file.
+ * m88k/x-{dgux,dguxbcs}: (GCC_FOR_TARGET, X_CFLAGS): Removed.
+
+Fri Dec 15 18:41:50 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * fixincludes (sys/wait.h): Add forward declaration of struct rusage
+ on AIX 3.2.5.
+
+Fri Dec 15 18:39:36 1995 Marco S Hyman (marc@dumbcat.sf.ca.us)
+
+ * xm-bsd386.h (DONT_DECLARE_SYS_SIGLIST): Defined.
+
+Fri Dec 15 18:36:42 1995 Gran Uddeborg (uddeborg@carmen.se)
+
+ * i386/svr3dbx.h (DO_GLOBAL_DTORS_BODY): Delete; obsolete.
+
+Fri Dec 15 18:21:34 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * i386/i386iscgas.h, i386/t-iscscodbx: Deleted; long dead.
+
+Fri Dec 15 10:01:27 1995 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * configure (target_cpu_default) Set for 486/586/686
+ (m88k-dg-dgux) Use t-dguxbcs instead of x-dguxbcs
+ (i*86*) Change [345] to [3456]
+ (i[3456]86-dg-dgux) Added
+ * Makefile.in (out_object_file) Add MAYBE_TARGET_DEFAULT
+
+Fri Dec 15 08:05:49 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * function.c (init_temp_slots): New function.
+ (init_function_start): Code moved to new function and called here.
+ * toplev.c (rest_of_compilation): Call init_temp_slots.
+
+ * expmed.c (store_bit_field): Don't use insv for BLKmode value.
+ (store_split_bit_field): Set total_bits to BITS_PER_FOR for
+ BLKmode value.
+
+Fri Dec 15 06:35:36 1995 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * xcoffout.h (DBX_STATIC_BLOCK_END): Use macro arguments.
+ (xcoff_begin_function_line, xcoff_current_function_file): Remove
+ unused extern declarations.
+ (DBX_OUTPUT_MAIN_SOURCE_FILENAME): Use macro argument.
+ * xcoffout.c (xcoff_begin_function_line): Make static.
+ (xcoff_inlining): Likewise.
+ (xcoff_current_function_file): Likewise.
+ (xcoff_output_standard_types): Remove TARGET_64BIT dependencies from
+ int and unsigned int.
+
+Mon Oct 16 12:25:52 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * fix-header.c: Support different kinds of functions (ANSI and
+ Posix1). Enable ANSI proptotypes if __STRICT_ANSI__.
+ (namelist_end): Removed.
+ (std_include_table): Divide up functions into kinds.
+ (add_symbols): New function.
+ (read_scanfile, write_rbrac, main): Use new data structures.
+
+Thu Dec 14 19:17:12 1995 Torbjorn Granlund <tege@noisy.tmg.se>
+
+ * rs6000.md (umulsidi3): New pattern.
+
+Thu Dec 14 18:08:59 1995 Torbjorn Granlund <tege@noisy.tmg.se>
+
+ * expmed.c (expand_divmod, case TRUNC_DIV_EXPR): Only reject
+ larger-than-HOST_BITS_PER_WIDE_INT modes for general constants,
+ not for powers-of-2.
+
+ * i960.md (andsi3): Match op2 with logic_operand, change constraints
+ accordingly. Output andnot for negative op2.
+ (iorsi3, xorsi3): Analogous changes.
+ * i960.c (logic_operand): New function.
+ (i960_print_operand): Handle code `C'.
+ * i960.h (PREDICATE_CODES): Add logic_operand.
+ (CONST_OK_FOR_LETTER_P): Handle `M'.
+ * i960.md: Move all plain logical patterns together.
+ * i960.h (SHIFT_COUNT_TRUNCATED): Define as 0 as appropriate.
+
+ * clipper.md (untyped_call): New pattern.
+
+ * m68k.md (ashrsi_31): New pattern.
+
+Thu Dec 14 17:22:14 1995 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * arm.c (output_move_double): Extract DFmode constants using
+ REAL_VALUE_TO_TARGET_DOUBLE.
+
+Thu Dec 14 15:05:13 1995 Doug Evans <dje@cygnus.com>
+
+ * Makefile.in (distclean): Delete float.h.
+ * configure: Set CROSS_FLOAT_H from float_format.
+ * config/float-i64.h: New file.
+ * config/float-i32.h: New file.
+ * config/float-vax.h: New file.
+ * arm/cross-float.h: Delete.
+ * arm/t-semi (CROSS_FLOAT_H): Delete.
+
+Wed Dec 13 19:16:57 1995 Mike Stump <mrs@cygnus.com>
+
+ * expr.c (expand_expr, case ADDR_EXPR): Ensure op0 isn't QUEUED.
+
+Wed Dec 13 19:12:21 1995 Paul Eggert <eggert@twinsun.com>
+
+ * gcc.c (my_strerror): Return "cannot access" if errno is 0.
+ (perror_with_name, pfatal_with_name, perror_exec): Don't assume that
+ the returned value from my_strerror contains no '%'s.
+ (sys_nerr): Declare only if HAVE_STRERROR is not defined.
+
+Wed Dec 13 19:05:47 1995 Alan Modra (alan@spri.levels.unisa.edu.au)
+
+ * Makefile.in (c-parse.y, objc-parse.y): Add warning that file is
+ automatically generated.
+
+Wed Dec 13 15:40:30 1995 Mike Stump <mrs@cygnus.com>
+
+ * function.c (identify_blocks): Start with chain of BLOCKs to match
+ rest of backend (dbxout.c), instead of just one BLOCK.
+ (reorder_blocks, all_blocks): Likewise.
+
+ * stmt.c (find_loop_tree_blocks): Pass the toplevel list of
+ blocks, not just the first subblock.
+
+Wed Dec 13 16:11:18 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expmed.c (expand_divmod): Don't use TARGET if it's the wrong mode.
+
+Wed Dec 13 15:02:39 1995 Ian Lance Taylor <ian@cygnus.com>
+
+ * dbxout.c (struct typeinfo): Define.
+ (typevec): Change to be struct typeinfo *. Change other uses as
+ appropriate.
+ (struct dbx_file): Define if DBX_USE_BINCL.
+ (current_file): New static variable if DBX_USE_BINCL.
+ (next_file_number): Likewise.
+ (dbxout_init): If DBX_USE_BINCL, initialize new variables.
+ (dbxout_start_new_source_file): New function.
+ (dbxout_resume_previous_source_file): New function.
+ (dbxout_type_index): New function.
+ (dbxout_range_type): Use dbxout_type_index.
+ (dbxout_type): Likewise. If DBX_USE_BINCL, initialize new typevec
+ fields.
+ * c-lex.c (check_newline): If DBX_DEBUGGING_INFO and write_symbols
+ == DBX_DEBUG, call dbxout_start_new_source_file and
+ dbxout_resume_previous_source_file when appropriate.
+ * sparc/sunos4.h (DBX_USE_BINCL): Define.
+ * svr4.h (DBX_USE_BINCL): Define.
+
+Wed Dec 13 06:52:40 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/win-nt.h (ASM_OUTPUT_EXTERNAL): Do not emit .extern for
+ builtin functions.
+
+Tue Dec 12 15:37:48 1995 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.c: Replace many uses of fprintf with putc and fputs.
+ (output_function_profiler): Use more efficient mnemonics, target
+ dependent mnemonics, asm_fprintf, and reg_names array.
+
+ * rs6000.h: Replace many uses of fprintf with putc and fputs.
+
+ * rs6000.h (INT_TYPE_SIZE): Remove TARGET_64BIT dependency.
+ (MAX_INT_TYPE_SIZE): Delete.
+
+Tue Dec 12 13:58:57 1995 Doug Evans <dje@cygnus.com>
+
+ * t-h8300 (MULTILIB_{OPTIONS,DIRNAMES}): Add -mint32 support.
+
+Sun Dec 10 18:51:21 1995 Torbjorn Granlund <tege@noisy.tmg.se>
+
+ * rs6000.md (matcher for neg:SI (geu:SI ..)): Get ppc syntax right.
+
+Sun Dec 10 08:47:16 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * combine.c (simplify_if_then_else): Convert "a == b ? b : a" to "a".
+
+ * expr.c (expand_expr, case CONSTRUCTOR): If TREE_READONLY,
+ set RTX_UNCHANGING_P in TARGET.
+ (expand_expr, case COMPONENT_REF): If result is BLKmode,
+ use that to access object too.
+
+Sun Dec 10 01:06:57 1995 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.md (millicode delay slot description): Remove reference
+ to defunct TARGET_MILLICODE_LONG_CALLS.
+
+Sat Dec 9 18:05:03 1995 Jim Wilson <wilson@cygnus.com>
+
+ * expr.c (expand_expr, case INDIRECT_REF): Correct typo in May 8
+ change.
+
+ * sh.h (ADDRESS_COST): Define.
+ * sh.md (subsi3): Rename to subsi3_internal. Add new define_expand
+ to handle subtracting a register from a constant.
+
+Fri Dec 8 19:17:30 1995 Mike Meissner <meissner@beauty.cygnus.com>
+
+ * rs6000.c (input_operand): Allow any integer constant, not
+ just integers that fit in 1 instruction.
+
+Fri Dec 8 10:45:07 1995 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * arm/lib1funcs.asm (RET, RETCOND): Define according to whether we
+ are compiling for 32 or 26 bit mode.
+ (all return instructions): Use RET or RETCOND as appropriate.
+
+Wed Dec 6 06:58:23 1995 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * arm.c (arm_gen_constant): New function.
+ (arm_split_constant): Split most of the functionality into
+ arm_gen_constant. Try to decide which way of handling the constant
+ is optimal for the target processor.
+
+ * arm.c (arm_prgmode): New enum.
+ (target_{cpu,fpe}_name, arm_fast_multiply, arm_arch4): New variables.
+ (all_procs): New table describing processors and capabilities.
+ (arm_override_options): New function.
+ (arm_return_in_memory): New function.
+ (arm_rtx_costs): Adjust the multiply costs to cope with processors
+ with fast multiplication instructions.
+ (output_move_double): Use the ldm/stm variants more efficiently.
+ Delete cases that can no-longer occur.
+ (output_return_instruction, output_func_epilogue): Use TARGET_APCS_32,
+ not TARGET_6 for determining the type of return instruction to emit.
+ (final_prescan_insn case CALL_INSN): Use TARGET_APCS_32, not TARGET_6
+ to determine condition preservation.
+ * arm.h (CPP_SPEC): Add defines for the cpu type, hard or soft floating
+ point, and the APCS PC size.
+ (TARGET_*): Restructure.
+ (ARM_FLAG_*): Many new definitions for different target options, not
+ all of which are supported yet.
+ (TARGET_SWITCHES): Use the ARM_FLAG_* definitions instead of explicit
+ numbers.
+ (prog_mode_type): New enum.
+ (floating_point_type): Split emulated floating point into FP_SOFT[23].
+ (OVERRIDE_OPTIONS): Call arm_override_options.
+ (ARM_CPU_NAME): Default to NULL if not defined by a subtarget.
+ (BYTES_BIG_ENDIAN): Can now be set as a compilation option.
+ (RETURN_IN_MEMORY, DEFAULT_PCC_STRUCT_RETURN): New definitions.
+ (GO_IF_LEGITIMATE_OFFSET): Use different HImode offsets if compiling
+ for an architecture 4 target. The offsets for floating point
+ constants are the same as for integers if compiling TARGET_SOFT_FLOAT.
+ (GO_IF_LEGITIMATE_ADDRESS): Don't allow PRE_INC and POST_DEC if
+ the size is more than 4 bytes. Restrict the range offsets for DImode;
+ likewise for DFmode when TARGET_SOFT_FLOAT.
+ (LEGITIMIZE_ADDRESS): Use symbol_mentioned_p, not LEGITIMATE_CONSTANT_P
+ to determine if a constant address might be better in a register.
+ Handle DFmode addresses in the same way as DImode if TARGET_SOFT_FLOAT.
+ (LOAD_EXTEND_OP): If arm_arch4, then HImode also zero-extends.
+ * arm.md (attributes): Rearrange order, so that condition clobbering
+ can be automatically determined for call insns.
+ (attribute cpu): Add new cpu ARM7.
+ (attribute type): Add new type MULT.
+ (attribute prog_mode): New attribute.
+ (attribute conds): Clobbering of call insns can now be determined
+ using prog_mode attribute.
+ (function units "write_buf", "write_blockage"): Model the write buffer
+ as two function units, so that conflicts are avoided more often.
+ (function unit "core"): New function unit, so that elapsed cycles can
+ be more accurately determined.
+ (all anonymous patterns): Add names.
+ (mulsidi3, umulsidi3): New patterns available with fast multiply
+ variants.
+ (all call insns): The conds attribute is now determined automatically.
+ (zero_extendhisi): Expand for architecture 4 variants if appropriate.
+ (*zero_extendhisi_insn): New pattern.
+ (extendqi{hi,si}, extendhisi): Expand for architecture 4 variants if
+ appropriate.
+ (*extendhisi_insn, *extendqihi, *extendqisi): New patterns.
+ (storehi_single_op): New expand.
+ (movhi): Handle architecture 4 expansion.
+ (*movhi_insn_arch4): New pattern.
+ (*movhi_*): Adjust applicability conditions to handle architecture 4.
+ (reload_outdf): Handle pre/post inc/dec reloads.
+ (tablejump): Delete.
+ (matcher for optimized tablejump): delete.
+ (casesi): New expand.
+ (casesi_internal): New pattern.
+ * semi.h (EXIT_BODY): Delete.
+ (TARGET_DEFAULT): Set to ARM_FLAG_APCS_32.
+ (CPP_SPEC): Define.
+ arm/cross-float.h: New file, used when building a cross-compiler.
+ * t-semi: Don't define inhibit_libc when building libgcc2.a.
+ (CROSS_FLOAT_H): Define.
+
+ * arm.c ({symbol,label}_mentioned_p): New functions.
+ (add_constant, dump_table, fixit, find_barrier, broken_move): New
+ support functions for handling constant spilling.
+ (arm_reorg): New constant spilling pass, for putting unhandlable
+ constants into the rtl where we can load them efficiently.
+ (output_load_symbol): Delete.
+ * arm.h (SECONDARY_OUTPUT_RELOAD_CLASS): No need to handle floating
+ point constants any more, since arm_reorg will deal with them.
+ (LEGITIMATE_CONSTANT_P): Is now anything that doesn't contain a
+ LABEL.
+ (GO_IF_LEGITIMATE_ADDRESS): Recognize address expressions generated
+ by arm_reorg, but only after reload has completed.
+ (MACHINE_DEPENDENT_REORG): Define.
+ (ASM_OUTPUT_SPECIAL_POOL_ENTRY): There should be nothing left in
+ the pool, even if it might look like it.
+ * arm.md (*movsi_insn): Much simpified now that constants are handled
+ properly.
+ (movaddr): New expand.
+ (movsf, movdf): No need to force constants into the pool any more.
+ (*movdf_hard_insn): Much simplified.
+ (consttable_4, consttable_8, consttable_end, align_4): New patterns
+ for supporting embedded constants.
+
+ * configure: New target arm-semi-aof.
+ * arm.c (strings_fpa): Use a form which is common to both GAS and
+ ARMASM.
+ (output_return_instruction, output_func_epilogue): Call
+ assemble_external_libcall, before trying to generate an abort call
+ in the assembler.
+ (arm_asm_output_label): Call ARM_OUTPUT_LABEL, rather than assuming
+ that labels are followed by a colon.
+ (aof_text_section, aof_add_import, aof_delete_import,
+ aof_dump_imports): New functions to support ARMASM assembler
+ generation.
+ * arm/aout.h: New file.
+ * arm/aof.h: New file.
+ * arm.h (most assembler-specific defines): Move to arm/aout.h.
+ (CONSTANT_ADDRESS_P): Can't directly access constant strings when
+ generating assembler for ARMASM.
+ (ENCODE_SECTION_INFO): Don't define if generating ARMASM assembler.
+ (ASM_OUTPUT_INTERNAL_LABEL): Generalize, so that it can be used
+ with all targeted assemblers.
+ (ASM_OUTPUT_LABEL): Call arm_asm_output_label.
+ * riscix.h: Include arm/aout.h, not arm/arm.h.
+ * riscix1-1.h: Likewise.
+ * semi.h: Likewise.
+ * arm/semiaof.h: New file.
+ * arm/t-semiaof: New file.
+
+Mon Dec 4 22:17:37 1995 Jason Merrill <jason@yorick.cygnus.com>
+
+ * gcc.c (LIBGCC_SPEC): Do link with libgcc when -shared.
+ * alpha.h (LIBGCC_SPEC): Remove.
+ * linux.h (LIBGCC_SPEC): Remove.
+ * svr4.h (LIBGCC_SPEC): Remove.
+ * i386/t-crtpic (TARGET_LIBGCC2_CFLAGS): Use -fPIC.
+ * t-pa (TARGET_LIBGCC2_CFLAGS): Use -fPIC.
+ * sparc/t-sunos41 (TARGET_LIBGCC2_CFLAGS): Use -fPIC.
+ * sparc/t-sol2 (TARGET_LIBGCC2_CFLAGS): Use -fPIC.
+ * configure (i386-linux): Use i386/t-crtpic.
+
+ * i386/xm-sco.h: #define NO_SYS_SIGLIST.
+
+Mon Dec 4 21:30:37 1995 Jim Wilson <wilson@mole.gnu.ai.mit.edu>
+
+ * sh.c (shiftcosts): For SH3, max cost of arithmetic right shift is 3.
+ (expand_ashiftrt): For SH3, if shift cost is more than 3, then
+ call gen_ashrsi3_d to use shad instruction.
+
+Mon Dec 4 18:29:08 1995 Jason Merrill <jason@yorick.cygnus.com>
+
+ * c-decl.c (finish_struct): Don't mess with the type of bitfields.
+
+Mon Dec 4 15:28:02 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (store_constructor, record): If field is READONLY,
+ set RTX_UNCHANGING_P in TO_RTX.
+
+Mon Dec 4 12:59:33 1995 Ian Lance Taylor <ian@cygnus.com>
+
+ * sparc/t-sol2 (CRTSTUFF_T_CFLAGS): Use -fPIC unconditionally.
+
+Sun Dec 3 20:55:43 1995 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.h (ASM_OUTPUT_FUNCTION_PREFIX): Handle arbitrary sections.
+ (ASM_OUTPUT_SECTION_NAME): Define.
+
+Sat Dec 2 22:19:16 1995 Jeffrey A. Law (law@cygnus.com)
+
+ * pa.h: Replace many uses of fprintf with fputs.
+ * pa.c: Likewise.
+ * pa-pro.h: Likewise.
+
+ * pa.h (SECONDARY_RELOAD_CLASS): Don't call secondary_reload_class
+ to handle trivial cases.
+ * pa.c (secondary_reload_class): Rework to be more efficient.
+
+Sat Dec 2 07:52:46 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (movsi): Don't split large constants in the
+ movsi pattern, let the define_split split it later as needed.
+
+Fri Dec 1 16:00:42 1995 Brendan Kehoe <brendan@cygnus.com>
+
+ * sparc.c (output_double_int): Handle CODE_LABEL's if v9.
+
+Fri Dec 1 09:13:23 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * m68k.md (decrement_and_branch_until_zero): Split into a
+ define_expand and an anonymous define_insn.
+ * fx80.md (decrement_and_branch_until_zero): Ditto.
+ * m88k.md (decrement_and_branch_until_zero): Ditto.
+
+Thu Nov 30 15:02:16 1995 Jim Wilson <wilson@mole.gnu.ai.mit.edu>
+
+ * sh.c (noncall_uses_reg): New function.
+ (machine_dependent_reorg): Add support for TARGET_RELAX.
+ (final_prescan_insn): Likewise.
+ * sh.h (ASM_SPEC, LINK_SPEC): Pass on -mrelax.
+ (RELAX_BIT, TARGET_RELAX): New macros.
+ (TARGET_SWITCHES): Add -mrelax.
+
+ * sh.c (insn-attr.h): Include.
+ (pragma_nosave_low_regs): New global variable.
+ (calc_live_regs): If SH3 and pragma_nosave_low_regs, then don't
+ save registers r0 through r7 for interrupt functions.
+ (function_epilogue): Clear pragma_nosave_low_regs.
+ (handle_pragma): Set pragma_nosave_low_regs if see pragma for it.
+
+ * sh.h (FUNCTION_PROFILER): Use trap #33 instead of trap #5.
+ Put additional .align before trapa instruction.
+
+Thu Nov 30 14:45:13 1995 Doug Evans <dje@canuck.cygnus.com>
+
+ * sparc.md (seqdi_special_trunc, snedi_special_trunc,
+ seqsi_special_extend, snesi_special_extend): Delete uses of SUBREG.
+ Make compare modes match modes of operands.
+ (snesi_zero_extend, snedi_zero_trunc_sp32, snedi_zero_trunc_sp64,
+ seqsi_zero_extend, seqdi_zero_trunc_sp32, seqdi_zero_trunc_sp64):
+ New patterns.
+
+Thu Nov 30 12:27:22 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * genmultilib: Take a 4th argument that says are the exceptions to
+ the multilibs, so illegal combinations can be eliminated.
+
+ * Makefile.in (multilib.h): Pass $(MULILIB_EXCEPTIONS) as the 4th
+ argument to genmultilib.
+
+ * configure (powerpc*): Remove little endian and eabiaix versions
+ of the t-* files. Accept powerpc{,le}-*-sysv in addition to
+ *-sysv4.
+ (powerpc{,le}-*-eabisim): Use standard t-eabigas instead of
+ t-eabisim.
+ (powerpcle-*-{winnt3,pe}): Add support for Windows NT on PowerPC.
+ * rs6000/t-{eabiaix,eabisim,eabilegas,ppclegas}: Delete.
+
+ * rs6000/{t-winnt,win-nt.h}: New files for PowerPC Windows NT.
+
+ * ginclude/ppc-asm.h: New file to provide common macros for the
+ various PowerPC calling sequences.
+ * rs6000/eabi.asm: Use ppc-asm.h.
+
+ * rs6000/aix3newas.h (CPP_SPEC): Add support for -mcpu=603e, 602,
+ and 620.
+ * rs6000/{aix41,powerpc,rs6000,eabi{aix,le}}.h (CPP_SPEC): Ditto.
+ * rs6000/sysv4{,le}.h (CPP_SPEC): Ditto.
+
+ * rs6000/aix3newas.h (LINK_SPEC): If cross compiling, don't use
+ absolute paths.
+ * rs6000/{aix41,aixppc,rs6000}.h (LINK_SPEC): Ditto.
+
+ * rs6000/eabi.h (INVOKE__main): Don't define any more.
+ (ASM_OUTPUT_INT): Move to sysv4.h.
+ ({STARTFILE,LIB}_SPEC): If -msim or -mmvme add the appropriate
+ libraries.
+
+ * rs6000/{eabiaix,eabile,sysv4{,le}}.h (CPP_SPEC): Add support for
+ -mcall-{aixdesc,nt} directives.
+ (MULTILIB_DEFAULTS): Define.
+
+ * rs6000/eabi{,le}sim.h (TARGET_DEFAULT, CPP_SPEC): No longer
+ define, simulator supports floating point.
+ ({STARTFILE,LIB}_SPEC): If -mvme, use mvme libraries, not
+ simulator libraries.
+
+ * rs6000/{mach,netware}.h (TARGET_AIX): Define as 0.
+
+ * rs6000/netware.h (RS6000_OUTPUT_BASENAME): Don't redefine
+ anymore.
+ (STRIP_NAME_ENCODING): Undef.
+
+ * rs6000.c (rs6000_save_toc_p, rs6000_abi): New globals.
+ (rs6000_override_options): Add 602, 603e, and 620 support.
+ (count_register_operand): New function to return true if operand
+ is the count register.
+ (easy_fp_constant): All constants are easy if -msoft-float.
+ (volatile_mem_operand): New function to return true if operand is
+ in volatile memory.
+ ({fp_,}reg_or_mem_operand): Call volatile_mem_operand.
+ (input_operand): Allow support for Windows NT loading SYMBOL_REFs
+ and LABEL_REFs from the TOC.
+ (function_arg_boundary): On Windows NT, any argument >= 8 bytes
+ must be double word aligned.
+ (function_arg{_advance,}): Call function_arg_boundary to determine
+ if we need to align to an odd register for large arguments.
+ Changes to accomidate new method of determining which ABI we're
+ adhering to.
+ (expand_block_move_mem): Copy RTX_UNCHANGING_P, and if
+ MEM_UNALIGNED_P is defined, copy that too.
+ (expand_block_move): Copy dest/src to registers using
+ copy_addr_to_reg.
+ (print_operand): Changes to accomidate Windows NT.
+ (first_reg_to_save): Ditto.
+ (rs6000_stack_info): Ditto.
+ (debug_stack_info): Ditto.
+ (output_{prolog,epilog,toc,function_profiler}): Ditto.
+ (rs6000_stack_info): Save main's arguments around __eabi call.
+ (svr4_traceback): Delete, current V.4 ABI no longer wants
+ tracebacks in this format.
+ (output_prolog): Call __eabi here, saving and restoring main's
+ args if needed. Save the toc pointer if needed.
+ (get_issue_rate): New function to return # of instructions a
+ machine can issue at once.
+ (rs6000_sync_trampoline): Emit instructions to synchronize the
+ PowerPC caches after a trampoline.
+ (rs6000_trampoline_{template,size}): New functions to provide
+ common trampoline support for all ABI's.
+ (rs6000_initialize_trampoline): Ditto.
+
+ * rs6000.h (TARGET_{WINDOWS_NT,AIX,MACOS}): Define.
+ (processor_type): Add 602.
+ (PROCESSOR_COMMON): Assume current processor is a 604, not a 601.
+ (SUBTARGET_OPTIONS): Define if not defined.
+ (TARGET_OPTIONS): Include SUBTARGET_OPTIONS.
+ (COUNT_REGISTER_REGNUM): Define as 66.
+ (EXTRA_CONTRAINT): Add 'S' and 'T' for Windows NT.
+ (rs6000_abi): Add ABI_AIX_NODESC, ABI_NT.
+ (DEFAULT_ABI): Define if not defined.
+ (rs6000_stack): Add fields for Windows NT support.
+ (RS6000_SAVE_TOC): Add for Windows NT support.
+ (FUNCTION_ARG_BOUNDARY): Call function_arg_boundary.
+ (trampoline macros): Call trampoline functions in rs6000.c.
+ (RETURN_ADDRESS_OFFSET): Add Windows NT support.
+ (toc_section): Skip leading '*'.
+ (PREDICATE_CODES): Add volatile_mem_operand,
+ count_register_operand.
+ (MACHINE_issue_rate): Define.
+ (function decls): Add new function decls from rs6000.c.
+
+ * rs6000.md (cpu attribute): Add 602.
+ (function units): Update to match reality better.
+ (calls through pointer): Rework to support Windows NT.
+ (movsi): Add Windows NT support.
+ (movstrsi): Remove match_operand predicates, since
+ expand_block_move does the checking.
+ (sync_isync): Delete.
+ (icbi, dcbst, sync, isync): New insns to generate named instruction
+ for making trampolines on eabi/V.4 properly flush the caches.
+ (decrement_and_branch_on_count): Rename from
+ decrement_and_branchsi. Add update of count in insn pattern.
+
+ * rs6000/sysv4.h (TARGET_SWITCHES): Drop -mtraceback. Keep
+ -mno-traceback but don't do anything with it. Add
+ -mcalls-{nt,aixdesc}. Add -m{,no-}relocatable-lib. Add -msim,
+ -mmvme, and -memb.
+ (TARGET_TOC): Update for use with -mcalls-{nt,aixdesc}.
+ (SUBTARGET_OVERRIDE_OPTIONS): Update for new switches.
+ (RS6000_OUTPUT_BASENAME): Delete.
+ (toc_section): Add support for -mcall-{nt,aixdesc}.
+ (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Ditto.
+ (ASM_DECLARE_FUNCTION_NAME): Use STRIP_NAME_ENCODING instead of
+ RS6000_OUTPUT_BASENAME. For -mcall-{nt,aixdesc} emit the proper
+ function descriptor.
+ (ASM_SPEC): Pass appropriate -mxxx switches to the assembler based
+ on the -mcpu=xxx options.
+ (ASM_OUTPUT_INT): Move here from eabi.h.
+ (ENCODE_SECTION_INFO): If -mcall-{nt,aixdesc} add appropriate magic
+ so function name has two or one leading periods.
+ (ASM_OUTPUT_SOURCE_LINE): Delete, use version in svr4.h.
+ (trampoline macros): Call trampoline functions in rs6000.c.
+
+ * t-{eabi,ppc}{,gas} (EXTRA_HEADERS): Add ginclude/ppc-asm.h.
+ (LIB2FUNCS_EXTRA): Depend on eabi.S, not eabi.s.
+ (eabi.S): Rename from eabi.asm.
+
+ * t-{eabi,ppc}gas (MULTILIB_*): Add -mcall-aixdesc libraries, but
+ don't build either little endian or -mrelocatable versions of
+ those libraries.
+
+Tue Nov 28 00:10:27 1995 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.md (divsi3): Reorder so common mode does not negate
+ power-of-2 shift optimization.
+
+Wed Nov 29 22:06:11 1995 J.T. Conklin <jtc@rtl.cygnus.com>
+
+ * configure (sparc-*-solaris2*): Add gcrt1.o to extra_parts.
+ * sparc/sol2.h (STARTFILE_SPEC): Link with gcrt1.o with -pg.
+ * sparc/sol2-g1.asm: New file, startup code for profiled
+ executables.
+ * sparc/t-sol2: Add make rule for gcrt1.o.
+ * sparc/gmon-sol2.c (_mcleanup): Add support for PROFDIR
+ environment variable.
+
+Wed Nov 29 21:41:13 1995 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips/abi64.h (CPP_SPEC): If -msingle-float and not
+ -msoft-float, pass -D__mips_single_float. Likewise for -m4650 and
+ not -msoft-float.
+ * mips/dec-bsd.h (CPP_SPEC): Likewise.
+ * mips/dec-osf1.h (CPP_SPEC): Likewise.
+ * mips/elf64.h (CPP_SPEC): Likewise.
+ * mips/iris3.h (CPP_SPEC): Likewise.
+ * mips/iris5.h (CPP_SPEC): Likewise.
+ * mips/mips.h (CPP_SPEC): Likewise.
+ * mips/netbsd.h (CPP_SPEC): Likewise.
+ * mips/osfrose.h (CPP_SPEC): Likewise.
+ * mips/t-ecoff (MULTILIB_OPTIONS, MULTILIB_DIRNAMES,
+ MULTILIB_MATCHES): Add -msingle-float support.
+
+Wed Nov 29 17:57:48 1995 Doug Evans <dje@cygnus.com>
+
+ * toplev.c (main): Invoke OPTIMIZATION_OPTIONS after target_flags
+ has been initialized so sets of target_flags aren't clobbered.
+
+ * cccp.c (do_include): Recognize c:\foo as absolute path name in DOS.
+
+ * svr4.h (MD_EXEC_PREFIX): Don't use if cross compiling.
+ (MD_STARTFILE_PREFIX): Likewise.
+ (LINK_SPEC): Don't use absolute path names if cross compiling.
+ * svr3.h (LIB_SPEC): Likewise.
+
+ * gcc.c (do_spec_1): Fix typos in version calculation.
+
+Wed Nov 29 14:06:13 1995 Jim Wilson <wilson@cygnus.com>
+
+ * sh.md (ashrsi3_d): Use %0 not %1 in output pattern.
+
+ * svr4.h (MAX_OFILE_ALIGNMENT): Define.
+
+ * mips/iris5.h (WORD_SWITCH_TAKES_ARG): Define.
+ (LINK_SPEC): Add rpath.
+ * mips/iris6.h (LINK_SPEC): Likewise.
+
+ * stupid.c (stupid_mark_regs): For hard registers, use regno+j
+ instead of just regno in MARK_LIVE_AFTER and SET_HARD_REG_BIT calls.
+
+ * c-common.c (combine_strings): Add support for WCHAR_TYPE as short.
+
+Wed Nov 29 13:59:58 1995 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * c-decl.c (duplicate_decls): Add new parameter different_binding_level.
+ Lots of changes to use new new parameter.
+ (pushdecl): Delete variable declared_global. New variable
+ different_binding_level and code to set it. Move extern/static
+ warning before duplicate_decls call. Don't let global typedefs
+ conflict with nested extern declarations. Move oldglobal test
+ inside code for setting IDENTIFIER_LIMBO_VALUE.
+ (lookup_name_current_level_global): Delete.
+ * c-tree.h (merge_attributes): New declaration.
+ * c-typeck.c (merge_attributes): New function. Move code from
+ common_type to here.
+ (common_type): Call merge_attributes instead of having inline code.
+ * integrate.c (integrate_decl_tree): Delete variable newd.
+ Always set DECL_ABSTRACT_ORIGIN before calling pushdecl.
+
+Tue Nov 28 21:57:04 1995 Jim Wilson <wilson@cygnus.com>
+
+ * mips.c (mips_function_value): Add check for i > 0 when deciding
+ if structure should be return in FP registers.
+
+Tue Nov 28 12:47:52 1995 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.md (define split for (plus (reg) (large_constant)): Try
+ another way to handle this with only 2 insns. From Tege.
+
+Mon Nov 27 02:05:18 1995 Jeffrey A. Law <law@cygnus.com>
+
+ * lib1funcs.asm, pa-pro.h, t-pro.h, xm-papro.h: New PA
+ target files.
+ * configure (hppa*-*-pro*): Use new target files.
+
+ * toplev.c (rest_of_compilation): Always call jump_optimize
+ at least once.
+
+ * pa.h (ASM_OUTPUT_EXTERNAL): Don't let assemble_name clobber
+ the value of TREE_SYMBOL_REFERENCED.
+
+ * pa-ghpux9.h (LINK_SPEC): Pass "-z" to the linker to enable
+ trap on null pointer dereference for programs built on hpux9.
+ * pa-hpux9.h, pa1-ghpux9.h, pa1-hpux9.h: Likewise.
+
+ * pa.c (output_function_prologue): No longer need to keep
+ track of the total number code bytes when TARGET_GAS &&
+ not TARGET_PORTABLE_RUNTIME.
+ * pa.h (DBX_OUTPUT_MAIN_SOURCE_FILE_END): Use .NSUBSPA when
+ not TARGET_PORTABLE_RUNTIME.
+ (ASM_OUTPUT_FUNCTION_PREFIX): Define. Prefix functions with
+ .NSUBSPA when TARGET_GAS and not TARGET_PORTABLE_RUNTIME.
+
+ * pa.md (symbolic high patterns): Use 'H' to print the symbolic
+ address so that the constant part gets rounded.
+ * pa.c (print_operand): Handle 'H' operand for high part of a
+ symbolic address with a rounded constant.
+ (output_global_address): New argument "rounded_constant". All
+ callers changed appropriately.
+
+ * x-pa-hpux (FIXPROTO_DEFINES): Add -D_HPUX_SOURCE.
+
+ * pa.h (CPP_SPEC): Only pass -D_HPUX_SOURCE and -D_HIUX_SOURCE if
+ -ansi is not present.
+ (CPP_PREDEFINES): Remove -D_HPUX_SOURCE and/or -D_HIUX_SOURCE.
+ * pa-ghiux.h (CPP_PREDEFINES): Likewise.
+ * pa-gux7.h (CPP_PREDEFINES): Likewise.
+ * pa-hiux.h (CPP_PREDEFINES): Likewise.
+ * pa-hpux.h (CPP_PREDEFINES): Likewise.
+ * pa-hpux7.h (CPP_PREDEFINES): Likewise.
+ * pa1-ghiux.h (CPP_PREDEFINES): Likewise.
+ * pa1-hiux.h (CPP_PREDEFINES): Likewise.
+
+ * pa-hpux.h (LINK_SPEC): If -mlinker-opt, then pass -O to the
+ linker.
+ * pa-ghpux.h, pa-hpux9.h, pa-ghpux9.h: Likewise.
+ * pa1-ghpux9.h, pa1-hpux9.h: Likewise.
+ * pa.h (LINK_SPEC): Likewise.
+ (TARGET_SWITCHES): Add -mlinker-opt.
+
+ * pa.md (all peepholes): Disable if TARGET_SOFT_FLOAT.
+
+ * pa.c (pa_reorg): If TARGET_GAS, then emit insns to mark
+ the beginning and end of the branch table.
+ * pa.md (begin_brtab): New insn. Just a marker so GCC knows
+ where to put the .begin_brtab pseudo-op.
+ (end_brtab): Similarly.
+
+ * pa.h (EXTRA_SECTIONS): Add in_ctors and in_dtors if
+ CTORS_SECTION_FUNCTION is defined. Else define dummy
+ versions of CTORS_SECTION_FUNCTION and DTORS_SECTION_FUNCTION.
+ (EXTRA_SECTION_FUNCTIONS): Add CTORS_SECTION_FUNCTION and
+ DTORS_SECTION_FUNCTION.
+
+ * pa.md: Add peepholes to improve spill code generated
+ by reload when we run out of FP registers.
+
+ * xm-pa.h: Remove spurious double-quote.
+
+ * pa.md (call expanders): For indirect calls, load %r22 with the
+ function's address.
+ (indirect call patterns): No need to copy the call address into
+ %r22 anymore.
+
+ * pa.c (output_cbranch): Fix buglet in length handling of
+ backwards branches with unfilled delay slots.
+ (output_bb, output_bvb, output_dbra, output_movb): Likewise.
+
+ * pa.md: Fix off-by-one error in length computations for all
+ conditional branch patterns.
+
+ * pa.h (output_bvb): Declare.
+ * pa.c (output_bvb): New function to output branch on variable
+ bit insns.
+ * pa.md (branch-on-variable-bit): New patterns.
+
+ * pa.h (TARGET_MILLICODE_LONG_CALLS): Delete swtich and all
+ references.
+ (output_millicode_call): Declare new function
+ * pa.md (millicode calls): Update length computation to handle
+ variable length millicode calls.
+ (call pattners): Likewise.
+ (indirect call patterns): Update length compuations and output
+ templates to handle variable length millicode calls.
+ (plabel_dereference): Likewise.
+ * pa.c (override_options): Give warnings when incompatable
+ options are used.
+ (output_mul_insn): Call output_millicode_call instead of
+ output_call, eliminate last argument to output_millicode_call.
+ (output_div_insn): Likewise.
+ (output_mod_insn): Likewise.
+ (output_call): Rewrite long call code to handle variable length
+ millicode calls. Eliminate support for calling mul, div and mod
+ millicode routines.
+ (output_millicode_call): New function for calling mul, div and mod
+ millicode routines.
+
+ * pa.md (abssi2): New pattern.
+
+ * pa.c (secondary_reload_class): Loads from reg+d addresses into
+ FP registers don't need secondary reloads.
+ * pa.h: Delete soem #if 0 code. Update some comments.
+ (EXTRA_CONSTRAINT, case 'Q'): Only accept valid memory addresses.
+
+ * pa.h (RTX_COSTS): Tege's rewrite.
+
+ * pa.c (hppa_legitimize_address): Generate unscaled indexed
+ addressing for (plus (symbol_ref) (reg)).
+ (emit_move_sequence): Set REGNO_POINTER_FLAG appropriately
+ to encourage unscaled indexing modes.
+ (basereg_operand): New function for unscaled index address support.
+ * pa.md (unscaled indexing patterns): New patterns for unscaled
+ index address support.
+
+ * pa.h (MOVE_RATIO): Define.
+ * pa.md (movstrsi expander): Refine tests for when to use the
+ library routine instead of an inlined loop copy. Provide an
+ additional scratch register for use in the inlined loop copy.
+ (movstrsi_internal): Name the pattern for ease of use. Add
+ additional scratch register.
+ * pa.c (output_block_move): Greatly simplify. Use 2X unrolled
+ copy loops to improve performance.
+ (compute_movstrsi_length): Corresponding changes.
+
+ * pa.c (print_operand): Handle 'y' case for reversed FP
+ comparisons. Delete some #if 0 code. Fix various comment typos.
+ * pa.md (fcmp patterns): Try and reverse the comparison to avoid
+ useless add,tr insns.
+
+Sun Nov 26 14:47:42 1995 Richard Kenner <kenner@mole.gnu.ai.mit.edu>
+
+ * Version 2.7.2 released.
+
+ * function.c (fixup_var_refs_1): Make pseudo for DEST
+ in PROMOTED_MODE unless in a SUBREG.
+
+ * cse.c (insert): Don't put a REG into qty_const.
+
+ * msdos/top.sed: Change version to 2.7.2.
+ * winnt/config-nt.sed: Likewise.
+
+Sun Nov 26 14:41:49 1995 Douglas Rupp (drupp@cs.washington.edu)
+
+ * Makefile.in (stamp-objlist): Change .o to $objext.
+
+ * alpha/win-nt.h (CPP_PREDEFINES): Set __unaligned and __stdcall
+ to null.
+ (ASM_SPEC): Add a translation for -g to -Zi.
+ * winnt/ld.c (main): Don't pass -g to link.
+ * winnt/oldnames.c: Reformat and add some new functions for gnat1.
+ * winnt/win-nt.h (LINK_SPEC): Pass -g to ld.exe.
+ Increase default stack size.
+ * configure ({alpha-dec,i386-ibm}-winnt3.5): Add oldnames.o
+ to extra_objs.
+ * libgcc2.c (trampoline): Add getpagesize and mprotect for WINNT.
+
+Sun Nov 26 14:25:26 1995 Uwe Seimet (seimet@chemie.uni-kl.de)
+
+ * atari.h (FUNCTION_VALUE): Deleted; incorrect.
+
+Sun Nov 26 14:23:03 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * fixincludes (curses.h): Allow space or tab after bool keyword,
+ instead of tab or tab.
+
+Sun Nov 26 14:14:11 1995 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de)
+
+ * 1750a.md (pattern for HImode PSHM): Corrected.
+ (trunchiqi2, zero_extendqihi2, extendhftqf2): Corrected.
+ (pattern for movhi of CONST_INT to REG): Corrected.
+ (divmodqi pattern for DISN): Corrected.
+ (all shift patterns): Corrected.
+
+ * 1750a.h (REG_OK_FOR_INDEX_P, REG_OK_FOR_BASE_P): Corrected.
+ (ASM_OUTPUT_[datatype]): Corrected datalbl[].size computation
+ for output of arrays.
+
+Sun Nov 26 14:08:57 1995 Dave Love <d.love@dl.ac.uk>
+
+ * mips/iris5.h (NO_IMPLICIT_EXTERN_C): Define this again so
+ that unistd.h doesn't get badly `fixed' for C++. libg++ will now
+ build with this definition.
+
+Sun Nov 26 14:02:43 1995 Robert E. Brown (brown@grettir.bibliotech.com)
+
+ * configure: Better workaround for Nextstep bug.
+
+Sun Nov 26 13:55:07 1995 Torbjorn Granlund <tege@bozo.matematik.su.se>
+
+ * rs6000.md (load_multiple matcher): Fix typo in opcode.
+
+Sun Nov 26 13:51:08 1995 Lee Iverson <leei@Canada.AI.SRI.COM>
+
+ * final.c (final_start_function): Move call to sdbout_begin_function
+ back to final_scan_insn on MIPS systems so parameter descriptions are
+ recognized.
+
+Sun Nov 26 13:43:06 1995 DJ Delorie (dj@delorie.com)
+
+ * msdos/top.sed: Don't insert "go32".
+
+Sun Nov 26 12:08:23 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * combine.c (nonzero_bits, case REG): Put POINTERS_EXTEND_UNSIGNED
+ code before stack pointer code. Return nonzero at end of stack
+ pointer code.
+
+ * sparc.h (PRINT_OPERAND_ADDRESS): Handle CONST inside PLUS.
+
+ * Makefile.in (cppalloc.o): Add a rule to build it.
+
+ * alpha.c (alpha_emit_set_const): Don't output SImode sequences
+ that rely on invisible overflow. Sign extend new when SImode.
+ Don't recur if new == c. Don't allow shift outside mode. Make
+ logical right shift be unsigned.
+
+Sun Nov 26 11:37:50 1995 Arne H. Juul (arnej@idt.unit.no)
+
+ * Makefile.in (compare*): Add "|| true" to avoid spurious
+ failure messages from some versions of make.
+
+Sun Nov 26 11:20:09 1995 Dmitry K. Butskoy (buc@stu.spb.su)
+
+ * expr.c (truthvalue_conversion): Add declaration.
+
+Sun Nov 12 18:09:35 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * Version 2.7.1 released.
+
+ * function.c (put_reg_into_stack): New arg volatile_p.
+ (put_var_into_stack): Call with new arg.
+
+Sat Nov 11 08:25:34 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * reload.c (output.h): Include it.
+ * Makefile.in (reload.o): Add dependence on output.h.
+
+Thu Nov 9 11:24:20 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * mips.h (HARD_REGNO_NREGS): If FP_REG_P, always use UNITS_PER_FPREG
+ to calculate number of words needed.
+
+Thu Nov 9 11:04:50 1995 Oliver Kellogg (Oliver.Kellogg@space.otn.dasa.de)
+
+ * 1750a.md (cmphf): Addd Base Reg with Offset address mode (LB,STB,..)
+ (movqi,movhi,movhf,addqi3,addhf3,subqi3,subhf3,mulqihi3): Likewise.
+ (mulhf3,divhf3,andqi3,iorqi3): Likewise.
+ (define_peephole): Remove the Base mode peepholes. Replace the
+ special addqi define_insn for "LIM Ra,sym,Rb" by a define_peephole.
+ (ashlqi3): Took out futile 0th alternative.
+ (lshrqi3, lshrhi3, ashrqi3, ahsrhi3): Correct case of non-constant
+ shift count.
+
+ * 1750a.h (REG_ALLOC_ORDER): Define.
+ (REGNO_OK_FOR_BASE_P): Include stack pointer in test against
+ reg_renumber[REGNO].
+ (ASM_OUTPUT_DESTRUCTOR): Remove bogus assembler comment.
+
+Thu Nov 9 11:01:33 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (expand_expr, case ARRAY_REF): Properly convert types
+ of index, size, and multiplication.
+
+Wed Nov 8 09:00:22 1995 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * arm.md (mov*cc_{,soft_}insn): Use match_operator to test the
+ comparison and check that the condition code register is used.
+
+Wed Nov 8 08:49:35 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sysv4.h (ASM_OUTPUT_{CONSTRUCTOR,DESTRUCTOR}): Undef before
+ including svr4.h.
+
+Tue Nov 7 10:58:12 1995 Torbjorn Granlund <tege@bozo.matematik.su.se>
+
+ * m68k.md (subxf3): Properly name pattern.
+
+Tue Nov 7 10:53:09 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * libgcc2.c (__{C,D}TOR_LIST): For AIX, initialize these arrays to
+ 0,0, just like NeXT to avoid a warning message from the AIX 4.1
+ linker.
+
+Tue Nov 7 09:58:34 1995 John F. Carr <jfc@mit.edu>
+
+ * cppexp.c (cpp_lex): Correctly parse character constants.
+
+Tue Nov 7 09:52:15 1995 Jason Merrill <jason@yorick.cygnus.com>
+
+ * rs6000.h (ASM_OUTPUT_{DES,CONS}TRUCTOR): Define.
+
+Mon Nov 6 10:27:15 1995 Doug Evans <dje@cygnus.com>
+
+ * combine.c (force_to_mode): Fix typo.
+
+Sun Nov 5 18:37:02 1995 Torbjorn Granlund <tege@bozo.matematik.su.se>
+
+ * m68k.md (cmpxf): Don't call force_const_mem, it looses for PIC;
+ get predicates right instead. Get rid of separate DEFINE_EXPAND.
+ (addxf3, subxf3, mulxf3, divxf3): Likewise.
+ (All XFmode patterns): Delete `F' and `G' constraints.
+ (absxf2, negxf2): Delete spurious condition on TARGET_FPA.
+
+Sun Nov 5 11:05:44 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * fixincludes (malloc.h): Fix return type of {m,re}alloc.
+
+Sun Nov 5 11:02:26 1995 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * cse.c (invalidate): For a pseudo register, do a loop to
+ invalidate all table entries, irrespective of mode.
+
+Sun Nov 5 10:57:43 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * combine.c (force_to_mode): Put in last change properly.
+
+Sun Nov 5 10:53:49 1995 Jeffrey A Law (law@cygnus.com)
+
+ * pa.h (CONDITIONAL_REGISTER_USAGE): Make sure FP regs
+ get disabled regardless of PA1.0 vs PA1.1 code generation
+ when TARGET_SOFT_FLOAT or TARGET_DISABLE_FPREGS is on.
+
+Sun Nov 5 10:49:43 1995 Doug Evans <dje@lisa.cygnus.com>
+
+ * i960.c (emit_move_sequence): Add a scratch register to
+ multi-reg stores.
+ (i960_output_move_{double,quad}): New functions.
+ (i960_print_operand): Handle new operand types E, F.
+ * i960.md (movdi matchers): Rewrite.
+ (store_unaligned_di_reg): New pattern.
+ (movti matchers): Rewrite.
+ (store_unaligned_ti_reg): New pattern.
+
+Sun Nov 5 10:45:24 1995 Ian Lance Taylor (ian@cygnus.com)
+
+ * mips.h (MULTILIB_DEFAULTS): Define.
+ * mips/elf64.h, mips/iris6.h (MULTILIB_DEFAULTS): Define.
+
+Sun Nov 5 10:41:48 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * reload.c (push_reload): Delete abort for RELOAD_OTHER case added
+ in last change.
+ * reload1.c (emit_reload_insns): For RELOAD_OTHER output reloads,
+ output the reload insns in descending order of reloads.
+
+ * sh.md (mulsidi3-1, mulsidi3, umulsidi3-1, umulsidi3): Enable.
+ (smulsi3_highpart-1, smulsi3_highpart): New patterns.
+ (umulsi3_highpart-1, umulsi3_highpart): Likewise.
+ (movdi-1): Add r/x constraint.
+ * t-sh (MULTILIB_OPTIONS): Add m2.
+ (MULTILIB_DIRNAMES): Add m2.
+ (MULTILIB_MATCHES): Define.
+
+ * sparc.h (RTX_COSTS, case MULT): Check for TARGET_SPARCLITE.
+
+ * abi64.h, elf64.h (CPP_SPEC): Add -EB and -EL support.
+
+Sat Nov 4 10:36:26 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * sh.md (casesi_worker): Change constraint from = to +.
+
+ * svr4.h (ASM_IDENTIFY_GCC_AFTER_SOURCE): Delete.
+ (ASM_IDENTIFY_GCC): Output stab here.
+
+Sat Nov 4 10:32:37 1995 John Carr <jfc@mit.edu>
+
+ * cpplib.c (finclude): Set current input pointer when input
+ is not a regular file.
+
+ * cppmain.c: Define progname, required by cpplib.
+
+Sun Oct 29 07:48:36 1995 Michael Meissner <meissner@cygnus.com>
+
+ * xcoffout.h (DBX_FINISH_SYMBOL): Deal with names created via
+ the __asm__ construct that start with a leading '*'.
+ * xcoffout.c (xcoff_declare_function): Likewise.
+
+Sun Oct 29 07:45:41 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * stupid.c (stupid_mark_refs): Handle SUBREG of pseudo-reg in a
+ SET_DEST same as we handle a pseudo-reg in a SET_DEST.
+
+Sun Oct 29 07:43:15 1995 Pat Rankin <rankin@eql.caltech.edu>
+
+ * libgcc2.c (L_eh: __unwind_function): Implement for VAX.
+ * vax.h (RETURN_ADDRESS_OFFSET, RETURN_ADDR_RTX): Define.
+
+Sun Oct 29 12:39:08 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>a
+
+ * i386/sol2.h (CPP_PREDEFINES): Add -D__SVR4.
+
+Sun Oct 29 07:14:36 1995 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * reload.c (find_equiv_reg): Check for nonsaving setjmp.
+
+Fri Oct 27 15:15:56 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * Makefile.in (out_object_file): Depend on TREE_H.
+
+Fri Oct 27 06:42:36 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * alpha.c (call_operand): Only allow reg 27 on NT too.
+ * alpha.md (call_value_nt, call_nt): Force non-SYMBOL_REF
+ into reg 27, just like for OSF.
+
+ * rs6000.c (struct asm_option): Changed from struct option.
+ (expand_block_move_mem): Remove erroneously-added line.
+
+ * expr.c (clear_storage): SIZE is now rtx, not int.
+ (store_constructor): Call clear_storage with rtx.
+ (get_inner_reference): Convert index to precision of
+ sizetype, not POINTER_SIZE.
+ (expand_expr, case ARRAY_REF): Likewise.
+ * expr.h (clear_storage): Second arg is rtx, not int.
+
+Fri Oct 27 05:45:58 1995 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * combine.c (force_to_mode, case ASHIFTRT): Properly handle
+ mask wider than HOST_WIDE_INT.
+
+ * c-decl.c (pushdecl): Don't test TREE_PUBLIC when deciding whether
+ to register a duplicate decl in the current block.
+
+Thu Oct 26 21:55:39 1995 Jason Merrill <jason@sethra.cygnus.com>
+
+ * calls.c (expand_call): Don't trust the callee to copy a
+ TREE_ADDRESSABLE type.
+ * function.c (assign_parms): Likewise.
+
+Thu Oct 26 19:25:05 1995 Mike Stump <mrs@cygnus.com>
+
+ * libgcc2.c (__unwind_function): Provide a default definition for
+ implementations that don't yet have a function unwinder.
+
+Thu Oct 26 18:08:19 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (handle_directive): Don't treat newline as white
+ space when coalescing white space around a backslash-newline.
+
+Thu Oct 26 17:57:34 1995 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips-tdump.c (enum st): Define st_Struct, st_Union, and st_Enum.
+ (st_to_string): Handle them.
+ (type_to_string): Add fdp argument; pass it to emit_aggregate.
+ (print_symbol): Add fdp argument; pass it to type_to_string.
+ Handle st_Struct, st_Union, and st_Enum.
+ (emit_aggregate): Add fdp argument. Handle opaque types. Map
+ through RFD entries.
+ (print_file_desc): Pass FDR to print_symbol.
+ (main): Pass null FDR to type_to_string.
+
+Thu Oct 26 08:07:10 1995 Michael Meissner <meissner@cygnus.com>
+
+ * configure (powerpc-ibm-aix[456789]*): Use rs6000/t-newas,
+ not rs6000/t-rs6000.
+ (rs6000-ibm-aix3.2.[456789]*): Likewise.
+ (rs6000-ibm-aix[456789]*): Likewise.
+
+ * rs6000/t-newas: Copy from t-rs6000.
+ * t-rs6000: Don't build -mcpu=common multilib variants of libgcc.a.
+
+ * rs6000.md (load_multiple insn): If address register is among regs,
+ don't load it with a lwsi instruction, which is undefined on PowerPC.
+
+Thu Oct 26 08:01:32 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * dwarfout.c (output_compile_unit_die): Handle language_string
+ of "GNU F77".
+
+ * reload.c (find_reloads_address): When check for out of range constant
+ plus register, accept any hard register instead of just fp, ap, sp.
+
+ * combine.c (distribute_notes): For Oct 19 change, add additional
+ check to verify that place has a valid INSN_CUID.
+
+ * sparc/t-vxsparc (LIBGCC1_TEST): Define.
+
+ * sh.md (negdi2): Use TARGET_LITTLE_ENDIAN.
+
+ * combine.c (force_to_mode, case ASHIFTRT): Verify mode bitsize is
+ within HOST_BITS_PER_WIDE_INT before shifting by it.
+
+ * final.c (final_scan_insn): When recur for instruction in delay slot,
+ add loop around recursive call in case the instruction gets split.
+
+Thu Oct 26 07:28:45 1995 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * genrecog.c (write_tree_1): Avoid emitting '-2147483648'.
+
+ * jump.c (duplicate_loop_exit_test): Return 0 if found
+ a NOTE_INSN_LOOP_CONT.
+
+Tue Oct 24 15:30:14 1995 Jeffrey A Law <law@cygnus.com>
+
+ * calls.c (expand_call): Make sure valreg is at least
+ a full word.
+
+Sun Oct 22 19:35:41 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * sh.h (INIT_SECTION_ASM_OP): Delete.
+ (HAVE_ATEXIT): Define.
+
+Sun Oct 22 07:46:04 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * libgcc2.c (__fixuns[xds]fsi): #undef MIN and MAX before #include
+ of limits.h.
+
+ * pa.c (pa_adjust_cost): Use pa_cpu, not pa_cpu_attr.
+
+Sun Oct 22 07:38:58 1995 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * alpha.h (CONST_OK_FOR_LETTER_P): Use 'U' for unsigned constants.
+ * alpha.c (alpha_emit_set_const): Likewise.
+ * mips.c (gen_int_relational): Likewise.
+
+Sun Oct 22 07:14:35 1995 Douglas Rupp (drupp@cs.washington.edu)
+
+ * i386.c (i386_return_pops_args): Don't need a FUNDECL to
+ check for type attributes in FUNTYPE.
+
+Sat Oct 21 18:17:42 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * sh.md (define_delay): Don't accept any instruction for an annulled
+ slot, only accept those for which in_delay_slot is yes.
+ * sh.c (find_barrier): When hi_const returns true, increment count_si
+ by two if found_si is true.
+ Always use get_attr_length to compute length of instructions.
+ If count_hi or count_si out of range at end, need two PREV_INSN calls
+ not one.
+ When create new label, set LABEL_NUSES to 1.
+ (reg_unused_after): Ifdef out code for handling labels.
+ (prepare_scc_operands): New local variable mode. Set it from
+ sh_compare_op0 or sh_compare_op1. Use it instead of SImode in
+ force_reg calls.
+
+ * optabs.c (expand_float): Emit missing barrier after unconditional
+ jump.
+
+Sat Oct 21 14:16:46 1995 Torbjorn Granlund <tege@bozo.matematik.su.se>
+
+ * alpha.md (cmpdf): Make conditional on TARGET_FP.
+
+Fri Oct 20 19:11:12 1995 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * combine.c (distribute_notes): Delete instructions without
+ side effect that set a subreg of an unused register.
+
+ * m68k.h (PREFERRED_RELOAD_CLASS): Check for !G constants
+ for DATA_OR_FP_REGS also.
+
+Fri Oct 20 18:57:10 1995 Ian Lance Taylor <ian@cygnus.com>
+
+ * genmultilib: Output negations of unused alternatives, even if
+ one of the alternatives is selected.
+
+Fri Oct 20 18:48:50 1995 Jeff Law (law@hurl.cygnus.com)
+
+ * integrate.c (output_inline_function): Turn on flag_no_inline
+ to avoid function integration once we begin writing deferred
+ output functions.
+
+Fri Oct 20 18:46:33 1995 Michael Meissner <meissner@wogglebug.tiac.net>
+
+ * rs6000.c (float_conv_temp): Delete global variable.
+ (stack_temps): New static array to hold stack temps.
+ (offsettable_mem_operand): Delete function.
+ (offsettable_addr_operand, rs6000_stack_temp): New functions.
+ (output_epilog): Zero stack_temps.
+
+ * rs6000.h (offsettable_addr_operand): Declare instead of
+ offsettable_mem_operand.
+ (PREDICATE_CODES): Use offsettable_addr_operand.
+ (float_conv_temp): Delete variable.
+
+ * rs6000.md (move_to_float insns): Change move_to_float so
+ that it doesn't have a clobber of the memory address, and instead
+ passes the stack temp's memory address as one of the unspec args.
+ (fix_truncdfsi2): Use rs6000_stack_temp to allocate the temp.
+ (multiply, shift insns): Fix all cases of multiply and shift insns so
+ that the right mnemonics are used for -mcpu=common with both
+ -m{old,new}-mnemonics.
+
+Fri Oct 20 17:58:19 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * expr.c (safe_from_p, case RTL_EXPR): Return 0 if RTL_EXPR_SEQUENCE
+ exists. Delete code to return 0 if exp_rtl is zero.
+
+ * function.c (init_function_start): Don't call init_insn_lengths here.
+ * toplev.c (rest_of_compilation): Call it here.
+
+Thu Oct 19 19:19:06 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-common.c (check_format_info): Make test for null pointer
+ more general.
+
+Thu Oct 19 18:56:16 1995 Satoshi Adachi (adachi@wisdom.aa.ap.titech.ac.jp)
+
+ * fixincludes (stdlib.h): Be more general in edit to change
+ declaration of {c,m,re}alloc.
+
+Thu Oct 19 18:48:53 1995 Torbjorn Granlund <tege@bozo.matematik.su.se>
+
+ * libgcc2.c (__udiv_w_sdiv): If we don't have sdiv_qrnnd, define
+ dummy variant of __udiv_w_sdiv.
+
+Thu Oct 19 18:45:21 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * alpha.h (ASM_SPEC): If GNU as is the default, then pass -g to
+ the assembler if -malpha-as. If GNU as is not the default, then pass
+ -g to the assembler is not -mgas.
+
+ * combine.c (distribute_notes): When search for new place to put
+ REG_DEAD note, call distribute_links if this new place is between
+ i2 and i3, and i2 uses the register.
+
+Thu Oct 19 18:41:36 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.md (float{,uns}sidf2): Rewrite to break the conversion
+ process into several general insns.
+ (move_to_float): New insns to move 2 integer regs into a float register
+ through memory, taking endianess into account. Make sure that the
+ floating temporary is a valid address. Use one temporary for all
+ floats converted.
+ (fix_truncdfsi2): Take endianess into account.
+
+ * rs6000.c ({low_32_bit,offsettable_mem}_operand): The function
+ low_32_bit_operand is now unused, delete it. New function
+ offsettable_mem_operand to determine if a memory address is
+ offsettable.
+ * rs6000.h ({low_32_bit,offsettable_mem}_operand): Ditto.
+ (PREDICATE_CODES): Ditto.
+
+ * rs6000.{c,h} (float_conv_temp): New global.
+ * rs6000.c (output_epilog): Zero out float_conv_temp.
+
+ * Makefile.in (libgcc{1,2}.a): Allow LIB{1,2}FUNCS_EXTRA files to
+ end in .S as well as .c and .asm.
+
+Wed Oct 18 17:56:45 1995 Jose Alonso (sidinf@fpsp.fapesp.br)
+
+ * c-typeck.c (parser_build_binary_op): Warn about x^y==z, etc.
+
+Mon Oct 9 12:38:06 1995 Michael Meissner <meissner@cygnus.com>
+
+ * protoize.c (reverse_def_dec_list): Silence compiler warnings.
+
+Mon Oct 9 12:35:54 1995 Andrew Cagney <cagney@highland.com.au>
+
+ * ginclude/va-ppc.h (va_arg): Deal with long longs that would be
+ passed in the 7th register, and are passed in the stack instead.
+
+Fri Oct 6 13:47:10 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * alpha.h (ASM_SPEC): Add -g.
+
+Fri Oct 6 13:42:50 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alpha.h (alpha_{arg,auto}_offset): Make extern.
+
+Fri Oct 6 13:24:43 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.h (RETURN_ADDRESS_OFFSET): Correct previous change.
+
+Fri Oct 6 13:14:43 1995 Doug Evans <dje@canuck.cygnus.com>
+
+ * rtlanal.c (reg_set_last): Fix call to reg_set_between_p.
+
+Tue Oct 3 12:31:38 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * stor-layout.c (layout_type, case ARRAY_TYPE): Strip MAX_EXPR
+ from upper bound when computing length if it just protects against
+ negative length.
+
+ * expr.c (emit_move_insn_1): When doing multi-word move, show
+ output is clobbered.
+
+Tue Oct 3 12:26:07 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * cse.c (set_nonvarying_address_components, case AND): Add *pend to
+ end. Add constant to start instead of subtracting it.
+
+Tue Oct 3 12:23:28 1995 Torbjorn Granlund <tege@bozo.matematik.su.se>
+
+ * combine.c (simplify_rtx): In code that attempts to simplify
+ conditional expressions, if the result is an NE around another
+ comparison, return the original expression.
+
+ * longlong.h (mips umul_ppmm): Use `l' and `h' constraints;
+ remove mflo and mfhi instructions.
+
+Tue Oct 3 12:21:29 1995 Michael Meissner <meissner@cygnus.com>
+
+ * ginclude/va-ppc.h (va_start, stdarg case): Call
+ __builtin_next_arg, and ignore the result, so that the compiler
+ can report the proper error, if the second argument is not the
+ last argument.
+
+Tue Oct 3 12:02:51 1995 Kohtala Marko <Marko.Kohtala@ntc.nokia.com>
+
+ * function.c (assign_stack_temp): Adjust full_size field of
+ temp_slot when splitting an unused slot.
+
+Tue Oct 3 11:51:59 1995 Mike Stump <mrs@cygnus.com>
+
+ * expr.c (expand_builtin_return_addr): Break out functionality
+ from expand_builtin.
+ (expand_builtin): Call expand_builtin_return_addr.
+ * rs6000.h (RETURN_ADDR_RTX): Remove call to copy_to_reg.
+ Offset to return address is 4 when !TARGET_64BIT and v4_call_p,
+ 8 otherwise.
+ * sparc.h (RETURN_ADDR_RTX): Remove call to copy_to_reg.
+ * alpha.h (RETURN_ADDR_RTX): New definition.
+
+Sun Oct 1 21:23:30 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * tree.c (staticp, case INDIRECT_EXPR): Disable case.
+
+ * expr.c (expand_expr, case COMPONENT_REF): If getting component
+ of union of variable size, propagate TARGET.
+
+Fri Sep 29 07:48:09 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (store_expr): When storing promoted value, don't return
+ MEM if address contains target.
+
+Thu Sep 28 14:30:03 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (rescan): Expand `#if foo && #bar' without a bogus
+ complaint about preprocessor directives within macro args.
+ Expand `foo' in `foo#bar' without requiring a space before `#'.
+
+Thu Sep 28 14:24:26 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k.md (anonymous DImode shift patterns setting cc0): Turned
+ off due to reload problems.
+
+Thu Sep 28 14:05:22 1995 Niklas Hallqvist (niklas@appli.se)
+
+ * Makefile.in (USER_H): Move up so can override.
+ (INSTALL_ASSERT_H): New definition.
+ (install-headers): Use it.
+ (stmp-int-hdrs): Handle USER_H being empty.
+ * config/x-netbsd (INSTALL_ASSERT_H): Define as empty.
+
+ * i386/netbsd.h (WCHAR_{TYPE,UNSIGNED,TYPE_SIZE}): Now int.
+ * m68k/netbsd.h, ns32k/netbsd.h, sparc/netbsd.h: Likewise.
+ * vax/netbsd.h: Likewise.
+ (SIZE_TYPE): Use unsigned int.
+
+ * m68k.c (output_scc_di): Swap operands when needed.
+ * m68k.h (LEGITIMATE_PIC_OPERAND): Allow SYMBOL_REF_FLAG symref.
+ * m68k.md: Make both assembler syntaxes do the same for PIC calls.
+
+Tue Sep 26 16:51:44 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * mips.c (override_options): Don't allow anything but integers to
+ go in the HI/LO registers.
+
+Tue Sep 26 16:36:18 1995 John F. Carr <jfc@mit.edu>
+
+ * c-common.c (check_format_info): Don't warn about format type
+ mismatch if the argument is an ERROR_MARK.
+
+Mon Sep 25 17:50:50 1995 Craig Burley (burley@gnu.ai.mit.edu)
+
+ * stor-layout.c (put_pending_sizes): New function.
+ * tree.h (put_pending_sizes): Add declaration.
+ * tree.c (save_expr): Return original for ERROR_MARK.
+
+Fri Sep 22 19:20:01 1995 Jeff Law (law@hurl.cygnus.com)
+
+ * expr.c (expand_builtin, case BUILT_IN_MEMCPY): Strip off
+ all NOP exprs from the source and destination nodes, then
+ set MEM_IN_STRUCT_P.
+
+Fri Sep 22 18:50:31 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/eabi.h (ASM_OUTPUT_INT): Test for whether the integer
+ being output is also a constant so &sym - &sym2 is not fixed up.
+
+Fri Sep 22 18:49:07 1995 Peter Flass (FLASS@LBDRSCS.BITNET)
+
+ * i370.md (cmpsi): Add missing constraints to operand 1.
+
+Fri Sep 22 18:27:33 1995 Torbjorn Granlund <tege@matematik.su.se>
+
+ * i386.h (CONST_OK_FOR_LETTER_P): Make `N' match range 0..255
+ for `outb' instruction.
+
+ * pyr.h (PRINT_OPERAND): Handle code `R' for REG.
+ * longlong.h (pyr umul_ppmm): Use it.
+
+Fri Sep 22 18:24:38 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-parse.in (enumlist): Propagate error_mark_node.
+
+ * c-aux-info.c (gen_type): Handle ERROR_MARK.
+
+ * alpha.md (movdi): Avoid memory sharing problem when in reload.
+
+Wed Sep 20 14:27:09 1995 Peter Flass <flass@lbdrscs.bitnet>
+
+ * mvs.h (FUNCTION_PROLOGUE): Maintain savearea forward chain
+ per MVS standards.
+
+Wed Sep 20 14:20:52 1995 Torbjorn Granlund <tege@matematik.su.se>
+
+ * pyr.md (cmphi recognizer): Make condition match constraints.
+ (cmpqi recognizer): Likewise.
+
+Wed Sep 20 12:42:59 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * integrate.c (expand_inline_function): Do copy something setting
+ the result register if it is setting it to itself and has a REG_NOTE.
+
+ * integrate.c (set_decl_{origin_self,abstract_flags}): Treat
+ a DECL_INITIAL of error_mark_node the same as one of NULL_TREE.
+
+Tue Sep 19 19:30:18 1995 Dave Pitts (dpitts@nyx.cs.du.edu)
+
+ * i370.md (cmphi, movhi, movstricthi, extendhisi2): Correct generation
+ of short integer (Halfword)
+ ({add,sub,mul,and,ior,xor}hi3): Likewise.
+ * i370/mvs.h (MACROPROLOGUE): New macro.
+ (FUNCTION_{PRO,EPI}LOGUE): Added ability to use IBM supplied function
+ prologue macros.
+ (FUNCTION_PROLOGUE): Corrected function "in-line" prologue alignment
+ problems.
+ (ASM_DECLARE_FUNCTION_NAME): Changed alignment to FullWord.
+ (ASM_OUTPUT_{SHORT,ASCII}): Reworked.
+
+Tue Sep 19 19:22:15 1995 Douglas Rupp (drupp@cs.washington.edu)
+
+ * winnt/win-nt.h: Renamed from winnt/win-nt.h.
+ (LINK_SPEC): Add -noinhibit-exec.
+ * {alpha,i386}/win-nt.h: Renamed from {alpha,i386}/winnt.h.
+ Include winnt/win-nt.h, not winnt/winnt.h.
+ * winnt/oldnames.c: New file.
+ * winnt/headers.mak (fixinc-nt.obj): Fix typo.
+ * winnt/config-nt.bat: Change winnt.h to win-nt.h.
+ * i386/config-nt.sed: Likewise.
+ * configure ({alpha,i386}-*-winnt3*): Likewise.
+
+Mon Sep 18 14:00:45 1995 Oliver Kellogg (Oliver.Kellogg@space.otn.dasa.de)
+
+ * 1750a.h (enum reg_class, REG_CLASS_NAMES, REG_CLASS_CONTENTS):
+ Added R2 and R0_1.
+ (REG_CLASS_FROM_LETTER): New letters 't' and 'z'.
+ (EXTRA_CONSTRAINT): New letter 'Q'.
+
+Sun Sep 17 12:39:22 1995 Jeff Law (law@snake.cs.utah.edu)
+
+ * pa.h (ASM_DECLARE_FUNCTION_NAME): If a parameter's type
+ has TYPE_NEEDS_CONSTRUCTING on, then it's passed by invisible
+ reference.
+
+Sat Sep 16 17:42:33 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * loop.c (find_and_verify_loops): Fix error in last change.
+
+Sat Sep 16 08:38:22 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * alpha.h (GO_IF_LEGITIMATE_ADDRESS): Disallow SYMBOL_REF for
+ current function.
+
+ * cse.c (recorded_label_ref): New variable.
+ (insert): Set instead of cse_jumps_altered.
+ (cse_main): Initialize it and return 1 if nonzero at end.
+
+Fri Sep 15 18:26:49 1995 Torbjorn Granlund (tege@matematik.su.se)
+
+ * fold-const (div_and_round_double): Change `carry', `quo_est',
+ and `scale' from plain int to `unsigned HOST_WIDE_INT'.
+
+Fri Sep 15 18:24:24 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * cse.c (insert): Set cse_jumps_altered when inserting a LABEL_REF.
+
+Fri Sep 15 17:29:41 1995 Oliver Kellogg (Oliver.Kellogg@space.otn.dasa.de)
+
+ * 1750a.c (b_mode_operand): New function.
+ (print_operand): Added code 'Q'.
+
+Fri Sep 15 17:27:23 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * loop.c (find_and_verify_loops): When moving exit blocks out of
+ the loop, verify that the target of P is within the current loop.
+
+ * reorg.c (fill_slots_from_thread): Update thread if it is split.
+
+Fri Sep 15 17:06:51 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.md (decrement_and_branchsi and related insns): Don't use
+ a "2" to select a register preference for operand 1 if operand 2
+ hasn't been seen yet.
+ Add appropriate clobbers in decrement_and_branchsi.
+ Add patterns where the pc/label_ref are interchanged.
+
+ * Makefile.in (gnucompare, stmp-multilib-sub): Remove extra . in
+ front of $(objext).
+
+ * rs6000.c (output_toc): Align DF constants if STRICT_ALIGNMENT.
+
+ * config/fp-bit.c (FLO_union_type): Add words field if double
+ precision to get at the separate words.
+ (FLO_union_type, pack_d, unpack_d): Use FLOAT_BIT_ORDER_MISMATCH
+ to determine when the bitfields need to be reversed, and
+ FLOAT_WORD_ORDER_MISMATCH when the words need to be reversed.
+
+Fri Sep 15 16:41:43 1995 Jeff Law (law@snake.cs.utah.edu)
+
+ * reorg.c (fill_simple_delay_slots): When filling insn's delay slot
+ with JUMP_INSN, don't assume it immediately follows insn on
+ unfilled slots obstack.
+
+ * Makefile.in (caller-save.o): Depend on insn-codes.h.
+
+Thu Sep 14 17:41:49 1995 Jim Meyering (meyering@comco.com)
+
+ * protoize.c (do_cleaning): Don't blank out backslash-escaped
+ newlines in double quoted strings.
+
+Thu Sep 14 16:20:35 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * emit-rtl.c (gen_lowpart): If gen_lowpart_common fails
+ for a REG, load it into a pseudo and try again.
+
+Thu Sep 14 14:15:16 1995 Stan Cox (coxs@dg-rtp.dg.com)
+
+ * m88k.h (VERSION_INFO1): Removed BCS reference.
+ * m88k/dgux.h (ASM_SPEC, *_LEGEND):
+ Added -mno-legend option. -mstandard no longer implies that legend
+ legend information not be produced.
+ (LINK_SPEC): Removed -z text
+
+Tue Sep 12 19:05:39 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * cccp.c (is_system_include): Call skip_redundant_dir_prefix.
+
+Tue Sep 12 18:58:21 1995 John Carr <jfc@mit.edu>
+
+ * sparc.md: Change `*return "string"' to "string" in patterns.
+
+Tue Sep 12 18:48:47 1995 Craig Burley (burley@gnu.ai.mit.edu)
+
+ * function.c (put_var_into_stack): For CONCAT case, order of
+ placement depends on FRAME_GROWS_DOWNWARD, not STACK_GROWS_DOWNWARD.
+
+Tue Sep 12 18:34:10 1995 Doug Evans <dje@canuck.cygnus.com>
+
+ * va-sparc.h (v9 varargs va_start): Handle __builtin_va_alist
+ being stack argument.
+
+ * sparc.h (STATIC_CHAIN_REGNUM): Use %g5 for sparc64.
+ (TRAMPOLINE_TEMPLATE): Rewrite for sparc64.
+ (TRAMPOLINE_SIZE): Is 40 for sparc64.
+ * sparc.c (sparc64_initialize_trampoline): Rewrite.
+
+Tue Sep 12 18:30:22 1995 Douglas Rupp (drupp@cs.washington.edu)
+
+ * cp/Make-lang.in (cc1plus) : Removed unnecessary $(exeext).
+
+ * configure: Added code to handle gcc_extra_objs.
+ (alpha-winnt): Changed xmake_file to winnt/x-winnt.
+ Added extra_gcc_objs=spawnv.o; changed extra_programs to ld.exe.
+ (i386-winnt): Changed xmake_file to winnt/x-winnt.
+ Added extra_gcc_objs=spawnv.o; changed extra_programs to ld.exe.
+ * configure.bat: Changed to used common winnt/config-nt.bat.
+ * Makefile.in: Changed various .o's to .$(objext)'s
+ (specs): Removed unnecessary $(exeext).
+ (EXTRA_GCC_OBJS): New variable.
+ (clean): Removed $(LIB2FUNCS_EXTRA)
+ * objc/Makefile: Changed archive command for libobjc.a to use $?
+ for objects.
+
+ * alpha/x-winnt, i386/x-winnt: Deleted.
+ * alpha/config-nt.bat, i386/config-nt.bat: Deleted.
+ * alpha/config-nt.sed, i386/config-nt.sed: Moved architecture
+ independent commands to config/winnt/config-nt.sed.
+ * alpha/winnt.h: Added -D_M_ALPHA to CPP_PREDEFINES.
+ Changed LIB_SPEC to be compatible with Gnu ld for NT.
+ * i386/winnt.h: Added -D_cdecl=__attribute__((__cdecl__)).
+ Change LIB_SPEC to be compatible with Gnu ld for NT.
+ * winnt/config-nt.bat, winnt/config-nt.sed: New files.
+ * winnt/dirent.{c,h}, winnt/fixinc-nt.c, winnt/headers.mak: New files.
+ * winnt/ld.c: Changed precedence of libraries to look for
+ libfoo.lib before libfoo.a
+ Changed to work like Gnu ld for NT.
+ * winnt/libgcc.mak, winnt/mklibgcc.c: New files.
+ * winnt/spawnv.c: Changed spawn function entry points to __spawn*
+ instead of spawn*.
+ * winnt/x-winnt: New file.
+ * fixinc-nt.sed: New file.
+ * fixinc.winnt: Rewritten to use fixinc-nt.sed.
+
+ * gcc.c: Remove fix_argv kludge.
+
+Tue Sep 12 13:24:17 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (power subdi3 pattern): Fix pattern to have 5
+ alternatives, and correct 4th alternative to match reality.
+
+ * rs6000.md (adddi3, subdi3, negdi2): Add constraints so output reg
+ does not overlap one reg with one of the inputs.
+
+Tue Sep 12 13:09:48 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k.c (output_scc_di): Fixed for non-SGS_CMP_ORDER syntax.
+
+ * collect2.c (scan_libraries): Cast lsyms' alloca to LDSYM*.
+
+Tue Sep 12 13:04:12 1995 Niklas Hallqvist (niklas@appli.se)
+
+ * stmt.c (expand_start_stmt_expr): Do stack adjust in right place.
+
+ * stdarg.h (__gnuc_va_list): Make char * for NetBSD.
+
+Tue Sep 12 12:44:46 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * ginclude/va-ppc.h (va_arg): Reorganize to avoid BIND_EXPRs of
+ aggregate or array type.
+
+Tue Sep 12 12:42:27 1995 Ian Lance Taylor <ian@cygnus.com>
+
+ * fixincludes: Fix HP/UX <sys/file.h> for g++ -pedantic-errors.
+
+ * fixincludes (curses.h): typedef bool need not take up entire line.
+
+Mon Sep 11 19:05:42 1995 Stan Cox (coxs@dg-rtp.dg.com)
+
+ * c-typeck.c (digest_init): Don't recursively call digest_init
+ when in traditional mode if the type is invalid.
+
+Mon Sep 11 18:58:26 1995 Oliver Kellogg (Oliver.Kellogg@space.otn.dasa.de)
+
+ * 1750a.md: Added DLB/DSTB peepholes for HFmode.
+ Corrected mnemonics for HImode DSTB peephole.
+
+Mon Sep 11 18:48:06 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * config/fp-bit.c (FLO_union_type): Remove bitfields to set sign,
+ exponent, and mantissa, and add value_raw field, which is an
+ integer of the appropriate type. If _DEBUG_BITFLOAT is defined,
+ provide little and big endian bitfields. If the macro
+ FLOAT_BIT_ORDER_MISMATCH is defined, use explicit bitfields.
+ (pack_d, unpack_d): Switch to use value_raw and explicit shifts
+ and masks so that we don't have to worry about whether the target
+ is big or little endian unless FLOAT_BIT_ORDER_MISMATCH is
+ defined. If single precision floating point, rename to pack_f and
+ unpack_f, so there is no confusion in the debugger.
+
+ * rs6000.h (rs6000_abi): New enumeration to describe which
+ ABI we're conforming to.
+ (rs6000_stack): Use abi enum, not AIX vs. V.4 boolean.
+ (ASM_OUTPUT_OPTIONS): New macro to print output options in .s file.
+ (ASM_FILE_START): Use it.
+ (output_options,rs6000_float_const): Declare new functions.
+
+ * rs6000.c (output_option{,s}): New functions to write -f, -m,
+ and -W options to the asm file.
+ (rs6000_float_const): New function to generate floating point
+ constants portably used in signed,unsigned -> double conversions.
+ (rs6000_stack_info,debug_stack_info): Use ABI enumeration instead
+ of AIX vs. V.4 boolean.
+
+ * rs6000.md (float{,uns}sidf2): Call rs6000_float_const to
+ portably build the proper floating point constant for conversions.
+ (movdi): Properly handle movdi of CONST_{INT,DOUBLE} on little
+ endian systems.
+
+ * rs6000/sysv4.h (LIBGCC2_WORDS_BIG_ENDIAN): Define to be 0/1
+ depending on the target endianess.
+ (ASM_FILE_START): Define, to call output_options in addition to
+ output_file_directive.
+ (TRAMPOLINE_SIZE): Correct size to match code.
+
+ * rs6000/eabi{,le}sim.h (CPP_SPEC): Define the correct endian
+ macro for varargs/stdargs use.
+
+Mon Sep 11 18:41:58 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * c-decl.c (redeclaration_error_message): For TYPE_DECLs, return 0
+ if TYPE_MAIN_VARIANT of old type is same as new type.
+
+Mon Sep 11 17:39:35 1995 Rob Ryan (robr@cmu.edu)
+
+ * xcoffout.c (xcoff_inlining): New variable, used in place of
+ xcoff_current_include_file when determining whether to use
+ absolute line numbers.
+ (xcoffout_source_file): Switched to using xcoff_inlining to
+ determine when to emit .bi/.ei directives.
+
+Mon Sep 11 16:55:06 1995 Torbjorn Granlund <tege@matematik.su.se>
+
+ * m68k.md (cmpdi): Change patterns to allocate scratch register at
+ RTL generation time.
+ (tstdi): Likewise.
+
+Sun Sep 3 09:03:50 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * fold-const.c (size_binop): Don't pass 1 to NOTRUNC.
+
+Thu Aug 31 19:27:00 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * libgcc2.c: Include longlong.h.
+ [L_udivdi3 || L_divdi3 || L_umoddi3 || L_moddi3] (__udivmoddi4):
+ Define this `static inline' when defining these, so they all
+ remain leaf functions.
+
+Thu Aug 31 18:38:21 1995 Paul Eggert <eggert@twinsun.com>
+
+ * c-parse.in (ends_in_label): New %union member.
+ (stmts, stmt_or_label): Use new member to avoid lexical lookahead hack.
+ (lineno_stmt_or_labels): New rule.
+ (lineno_stmt_or_label, stmt_or_label): Yield nonzero if it ends
+ in a label.
+
+Thu Aug 31 08:31:40 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * cse.c (canon_hash, CONST_DOUBLE): Hash integer and real
+ differently.
+ * varasm.c (struct rtx_const): Add new field DI to union.
+ (decode_rtx_const, case CONST_DOUBLE): Use to hash CONST_DOUBLE
+ representing an integer.
+
+ * va-alpha.h (__gnuc_va_list): Make __offset an int.
+ * alpha.c (alpha_builtin_saveregs): Properly compute address
+ of __offset both both OSF and WINNT.
+
+ * xm-alpha.h (sbrk): Don't define here.
+ * gmon.c (sbrk): Define here for __alpha.
+ * toplev.c (sbrk): Likewise.
+ * mips-tfile.c (malloc, calloc, realloc): Don't define for anybody.
+
+ * reload.c (push_reload): Add case for output reload of a SUBREG
+ of a hard reg when output mode is invalid for that mode.
+ In both that case and existing case for in, don't remove SUBREG.
+ * reload1.c (emit_reload_insns): Emit RELOAD_OTHER output reloads last.
+
+Tue Aug 29 19:16:06 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-common.c (decl_attribute, case A_PACKED): Check is_type first.
+ (decl_attribute, case A_T_UNION): Likewise.
+ Don't access TYPE_FIELDS if DECL is zero.
+ * c-decl.c (finish_struct): If transparent_union attribute
+ specified, validate it once we finish laying the union out.
+
+Mon Aug 28 05:58:03 1995 Paul Eggert <eggert@twinsun.com>
+
+ * arm.c (arm_gen_movstrqi): Remove unused variable const_sxteen.
+
+ * bi-lexer.c (buffer, inpoint): Remove unused variables.
+
+ * i370/mvs.h, i370/mvs370.c (mvs_label_emitted): Renamed
+ from mvs_label_emited.
+
+ * msdos/configur.bat: Fix misspelling of `maintainer-clean'.
+
+Sat Aug 26 06:57:17 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * reload.c (push_secondary_reload): If X is a paradoxical SUBREG,
+ get mode and thing to reload from inside.
+ * reload1.c (emit_reload_insns): Do nothing for SUBREG whose
+ operand is unused subsequently.
+ In secondary reload case, if paradoxical SUBREG for output, reload
+ thing inside SUBREG, just like gen_reload.
+
+Fri Aug 25 19:26:53 1995 Paul Eggert <eggert@twinsun.com>
+
+ * c-typeck.c (set_init_label): Don't die if an entire
+ brace-pair level is superfluous in the containing level.
+
+Fri Aug 25 19:22:46 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * configure (powerpc{,le}-eabisim): Add support for a new target
+ that works under the PSIM simulator.
+ * rs6000/eabisim.h, rs6000/eabilesim.h, rs6000/t-eabisim: New files.
+
+ * rs6000/eabi.h (STRICT_ALIGNMENT): If little endian, always set
+ strict alignment to 1.
+
+Fri Aug 25 19:22:23 1995 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.md ({add,sub,mulsi}di3): Support both endian possibilities.
+ (negdi2): Likewise.
+
+Fri Aug 25 19:10:41 1995 Oliver Kellogg (Oliver.Kellogg@space.otn.dasa.de)
+
+ * 1750a.md: Added peephole definitions for Load/Store Base insns
+ and eliminating redundant load in an equivalent store/load sequence.
+
+Fri Aug 25 18:33:27 1995 Craig Burley (burley@gnu.ai.mit.edu)
+
+ * toplev.c (report_error_function): Don't attempt to use input
+ file stack to identify nesting of #include's if file name oflocation
+ diagnosed is not same as input_filename.
+
+Fri Aug 25 07:31:47 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * integrate.c (output_inline_function): Switch to function obstack.
+
+Mon Aug 21 13:29:54 1995 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * i386.c (arithmetic_comparison_operator): New function.
+ (print_operand): Take into account that overflow flag is not
+ set the same as after a compare instruction.
+ * i386.md (decrement_and_branch_until_zero): Use
+ arithmetic_comparison_operator to decide if there is comparison
+ suitable to be expressed by condition code from an arithmetic op.
+
+Mon Aug 21 13:26:13 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k.md (adddi3, subdi3): "&" added to clobber's constraints.
+
+Mon Aug 21 12:11:14 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * t-sparclite (MULTILIB_*, LIBGCC, INSTALL_LIBGCC): Define.
+
+ * sh.md (movdi-1, movdf-1): Make conditional on reload_completed,
+ delete conditions checking for pseudo registers and Q addresses.
+ Add code to handle SUBREG.
+
+ * local-alloc.c (wipe_dead_reg): Make a register mentioned in a
+ REG_INC note die after the instruction.
+
+ * m68k.md: For all dbra pattern, change constraint from 'g' to 'd*g'.
+
+ * Makefile.in: (underscore.c): Rename rule to stamp-under, and
+ touch stamp-under at the end. Add new rule for underscore.c that
+ depends on stamp-under.
+
+ * sh.c (reg_unused_after): For a SEQUENCE, make sure all insns are
+ safe before returning 1.
+
+ * sh.h (PROMOTE_FUNCTION_ARGS, PROMOTE_FUNCTION_RETURN): Define.
+
+ * sh.c (output_stack_adjust): Add new argument reg. Use it instead
+ of stack_pointer_rtx.
+ (sh_expand_prologue, sh_expand_epilogue): Pass new argument to
+ output_stack_adjust.
+
+Sat Aug 19 17:34:15 1995 Jim Wilson <wilson@phydeaux.cygnus.com>
+
+ * sparc/gmon-sol2.c (_mcount): Define.
+ * sparc/sol2.h (STARTFILE_SPEC, ENDFILE_SPEC): Delete superfluous
+ -pg tests.
+ (LINK_SPEC): Add libp directories to -Y when -pg.
+
+ * unroll.c (calculate_giv_inc): Handle increment computed by ASHIFT.
+
+Sat Aug 19 17:28:56 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k.md (subdi3): Should not be commutative.
+ (one_cmpldi2): Fixed typo with register operand.
+
+Sat Aug 19 17:20:43 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.c (output_prolog): Fixup code to set stack pointer
+ if stack size > 32k.
+ * rs6000.md (sync_isync): Renamed from sync; added an isync insn
+ after the sync to properly deal with PowerPC's with split I/D caches.
+ * sysv4.h (INITIALIZE_TRAMPOLINE): Sync function now named sync_isync.
+
+Sat Aug 19 17:07:09 1995 Doug Evans <dje@canuck.cygnus.com>
+
+ * h8300.h (STATIC_CHAIN_REGNUM): Use r3.
+ (REGISTER_NAMES): Print r7 as sp.
+ (ADDITIONAL_REGISTER_NAMES): Recognize r7.
+ (ASM_OUTPUT_ALIGN): Alignment is power of 2.
+ * h8300.md (fancy_btst,fancy_btst1): Branch target must be
+ operand 0 for length attribute to work.
+
+Sat Aug 19 16:43:11 1995 Paul Franklin <paul@cs.washington.edu>
+
+ * assert.h: Declare __eprintf with attribute noreturn.
+
+Sat Aug 19 16:40:12 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * stddef.h: Don't define wchar_t if __cplusplus is defined.
+
+Tue Aug 15 18:01:01 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (warning_with_line): Fix typo in declaration when
+ !HAVE_VPRINTF and defined (__STDC__).
+
+Tue Aug 15 17:57:54 1995 Stephen L Moshier <moshier@world.std.com>
+
+ * real.c (ediv, emul): Set sign bit of IEEE -0.0 result.
+
+Tue Aug 15 17:49:47 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (safe_from_p): Only safe if EXP is variable-size and X
+ is BLKmode.
+
+ * stmt.c (fixup_gotos): When some fixups done, reset to point
+ to next instead of zeroing TREE_VALUE, which may be shared.
+
+Mon Aug 14 09:15:45 1995 Doug Evans <dje@canuck.cygnus.com>
+
+ * m68k/m68kemb.h (STARTFILE_SPEC): Define as empty.
+
+Mon Aug 14 09:08:57 1995 Pat Rankin <rankin@eql.caltech.edu>
+
+ * vax.c (vms_check_external): Update `pending_head' properly
+ when the first list element is removed.
+
+Mon Aug 14 09:01:32 1995 Jeffrey A. Law <law@adder.cygnus.com>
+
+ * pa.md (call expanders): Emit a blockage insn after restoring
+ %r19 when generating PIC.
+
+Sun Aug 13 21:58:49 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * toplev.c (main): Change text of unsupported -g option warning.
+
+Sun Aug 13 21:47:57 1995 Andrew McCallum <mccallum@graphite.cs.rochester.edu>
+
+ * objc/selector.c (sel_get_any_typed_uid): New function.
+ * objc/objc-api.h (sel_get_any_typed_uid): Declare new function.
+
+Sun Aug 13 21:43:17 1995 John Carr <jfc@mit.edu>
+
+ * c-typeck.c (c_expand_asm_operands): Check for read-only output
+ operand where the variable is read-only but the type is not.
+
+Sun Aug 13 21:16:12 1995 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.c (direct_return): Epilogue required if CR saved.
+
+Sun Aug 13 19:09:25 1995 Jeff Law (law@snake.cs.utah.edu)
+
+ * configure (hppa1.?-hp-hpux10): Recognize and treat just like hpux9.
+
+Sun Aug 13 19:07:23 1995 Doug Evans <dje@canuck.cygnus.com>
+
+ * i960.md (movdi matchers): Fix src/dest order in unaligned
+ reg->reg case.
+
+Sun Aug 13 18:49:01 1995 DJ Delorie <dj@delorie.com>
+
+ * i386/xm-dos.h (HAVE_STRERROR): New definition.
+
+ * msdos/configur.bat: Add missing carriage return.
+
+Sun Aug 13 18:40:55 1995 Andrew Cagney <cagney@highland.com.au>
+
+ * Makefile.in (USER_H): Add va-ppc.h.
+
+Sun Aug 13 18:36:17 1995 M. Warner Losh <imp@village.org>
+
+ * stmt.c (expand_asm_operands): Type '0'..'4' operands may
+ allow regs, so move them to the default case.
+
+Sun Aug 13 18:32:35 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (warning_with_line): New function.
+ (trigraph_pcp): Use it, to avoid reporting line number.
+ (vwarning_with_line): Don't report line number if zero.
+
+Sun Aug 13 18:23:08 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * toplev.c (vmessage): Support four arguments.
+
+Sun Aug 13 18:19:51 1995 Michael Meissner <meissner@cygnus.com>
+
+ * ginclude/stdarg.h: Add ppc svr4 calling sequence support.
+ * ginclude/varargs.h: Likewise.
+ * ginclude/va-ppc.h: New file.
+
+Sun Aug 13 18:05:20 1995 Michael Gschwind <mike@donoussa.vlsivie.tuwien.ac.at>
+
+ * configure (pdp-*-*): Add support for t-pdp11.
+ * t-pdp11: New file.
+ * Makefile.in (LIBGCC2_CFLAGS): Add TARGET_LIBGCC2_CFLAGS.
+
+Sun Aug 13 14:50:58 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * final.c (final_start_function): Always call sdbout_begin_function
+ and xcoffout_begin_function, even if no line number info.
+
+ * mips/abi64.h (SETUP_INCOMING_VARARGS): In if statement, only
+ subtract one for stdarg. Don't subtract PRETEND_SIZE from
+ argument pointer when calculating stack address.
+ * mips.h (INITIAL_ELIMINATION_OFFSET): For 64 bit ABI, subtract
+ current_function_pretend_args_size when converting from argument
+ pointer.
+ * va-mips.h (va_start): For stdarg, delete separate define for
+ 64 bit ABI. For varargs, don't subtract 64, and only add -8 when
+ all argument registers are used.
+
+ * gcc.c (main): When concat gcc_exec_prefix and
+ standard_startfile_prefix, put machine_suffix in the middle.
+
+ * iris6.h (INIT_SECTION_ASM_OP): Don't define.
+ (LD_INIT_SWITCH, LD_FINI_SWITCH, HAS_INIT_SECTION): Don't undef.
+ (ASM_OUTPUT_CONSTRUCTOR, ASM_OUTPUT_DESTRUCTOR): Ifdef out.
+ * configure (mips-sgi-irix6, mips-sgi-irix5cross64): Define
+ use_collect2 to yes.
+
+ * combine.c (move_deaths): When have a multi-reg hard register,
+ if don't find a note, then recur for each individual hard register.
+
+ * cse.c (set_nonvarying_address_components): Handle addresses
+ which are the sum of two constant pseudo regs.
+ (cse_rtx_addr_varies_p): Likewise.
+
+ * Makefile.in (gfloat.h): Add a - before the rm command.
+
+ * loop.c (find_and_verify_loops): Set dest_loop only if
+ JUMP_LABEL (insn) is non-zero.
+
+Mon Jul 31 14:31:53 1995 Ian Lance Taylor <ian@cygnus.com>
+
+ * fixincludes: Avoid clobbering VxWorks drv/netif/if_med.h file.
+
+Sat Jul 29 16:21:42 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * collect2.c: (XCOFF_SCAN_LIBS): Define if OBJECT_FORMAT_COFF and
+ XCOFF_DEBUGGING_FORMAT.
+ (SCAN_LIBRARIES): Also define if XCOFF_SCAN_LIBS.
+
+Sat Jul 29 16:19:42 1995 Stuart D. Gathman <stuart@bmsi.com>
+
+ * collect2.c (scan_libraries): Implement for AIX.
+
+Sat Jul 29 09:59:33 1995 Michael Gschwind <mike@lanai.vlsivie.tuwien.ac.at>
+
+ * configure: (pdp11-*-bsd) New target.
+ * 2bsd.h: New file.
+
+ * pdp11.c (output_move_double): Handle CONST_INT parameters properly.
+ * pdp11.h (RTX_COSTS): Fill in missing default values.
+ * pdp11.md (truncdfsf2, extendsfdf2, floatsidf2, fix_truncdfsi2):
+ Allow register parameters, required by gcc to generate correct code.
+ * xm-pdp11.h: Include tm.h.
+
+Sat Jul 29 09:55:17 1995 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * configure (m68k-*-linux*aout*, m68k-*-linux*): New targets.
+ * m68k/linux-aout.h, m68k/linux.h, m68k/t-linux, m68k/xm-linux.h: New.
+ * m68k.md [USE_GAS]: Output `jbsr' instead of `jsr' for normal
+ function calls and `bsr.l' instead of `bsr' for pic function calls.
+
+Sat Jul 29 09:44:13 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * sh.h (CAN_DEBUG_WITHOUT_FP): Comment out.
+
+ * reload.c (find_reloads_address_1, case PLUS): When handle SUBREG,
+ add SUBREG_WORD offset to SUBREG_REG register number.
+ (find_reloads_address_1, case SUBREG): If a pseudo register inside
+ a SUBREG is larger than the class, then reload the entire SUBREG.
+ * sh.h (SUBREG_OK_FOR_INDEX_P): New macro.
+ (INDEX_REGISTER_RTX_P): Use it.
+
+Sat Jul 29 09:33:19 1995 Doug Evans <dje@canuck.cygnus.com>
+
+ * mips/netbsd.h (CPP_SPEC): Fix typo.
+
+ * configure (a29k-*-vxworks*): Define extra_parts for crt{begin,end}.o.
+ * t-a29k, t-a29kbase, t-vx29k ({,CROSS_}LIBGCC1): Define as empty.
+
+Sat Jul 29 09:15:17 1995 Jeffrey A. Law <law@rtl.cygnus.com>
+
+ * pa/lib2funcs.asm (gcc_plt_call): Rewrite to avoid the need
+ for being called by _sr4export. Inline expand $$dyncall to
+ avoid the need for long-call and PIC support.
+
+Sat Jul 29 07:30:04 1995 Oliver Kellogg (Oliver.Kellogg@space.otn.dasa.de)
+
+ * ms1750.inc (ucim.m, ucr.m, uc.m): New.
+ * 1750a.md (cmpqi): Account for unsigned comparisons.
+ (rotrqi3, rotrhi3): Reworked.
+ * 1750a.c (notice_update_cc): INCM and DECM set condition codes.
+ (unsigned_comparison_operator, next_cc_user_is_unsigned): New fcns.
+ * 1750a.h (FUNCTION_EPILOGUE): Local variables freed from SP, not FP.
+ (ASM_OUTPUT_BYTE): Make distinct from ASM_OUTPUT_CHAR.
+ (ASM_OUTPUT_CONSTRUCTOR): Add FILE arg to assemble_name.
+
+Fri Jul 28 09:40:07 1995 Jeffrey A. Law <law@rtl.cygnus.com>
+
+ * pa.h (DO_GLOBAL_DTORS_BODY): Use an asm statement to keep optimizer
+ from deleting an assignment it believes dead.
+
+Fri Jul 28 08:47:51 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * unroll.c (unroll_loop): When preconditioning, output code to
+ execute loop once if initial value is greater than or equal to final
+ value.
+
+ * configure (lang_specs_files, lang_options_files): Add $srcdir to
+ file names when adding them to these variables.
+
+ * c-typeck.c (pointer_int_sum): Don't distribute if intop is unsigned
+ and not the same size as ptrop.
+
+ * function.c (assign_stack_temp): When split a slot, set base_offset
+ and full_size in the newly created slot.
+ (combine_temp_slots): Update full_size when slots are combined.
+
+ * sh.c (reg_unused_after): New function.
+ * sh.md (define_peephole): Add peepholes to use r0+rN addressing mode
+ for some address reloads.
+
+ * final.c (final_start_function): If SDB_DEBUG, call
+ sdbout_begin_function. If XCOFF_DEBUG, call xcoffout_begin_function
+ instead of xcoffout_output_first_source_line.
+ (final_scan_insn): Don't call sdbout_begin_function or
+ xcoffout_begin_function.
+ * xcoffout.c (xcoffout_output_first_source_line): Delete.
+ (xcoffout_begin_function): Call dbxout_parms and
+ ASM_OUTPUT_SOURCE_LINE.
+
+ * va-mips.h: Change every occurrence of #if __mips>=3 to
+ #ifdef __mips64.
+ * mips/abi64.h (CPP_SPEC): Output -D__mips64 when -mips3, or -mips4,
+ or -mgp64. Output -U__mips64 when -mgp32.
+ * mips/dec-bsd.h, mips/elf64.h, mips/iris3.h: Likewise.
+ * mips/iris5.h, mips/mips.h, mips/netbsd.h, mips/osfrose.h: Likewise.
+
+ * i960.c (i960_function_epilogue): Don't clear g14 for functions with
+ an argument block.
+ (i960_output_reg_insn): Likewise.
+ (i960_output_call_insn): Clear g14 for functions wtih an argument
+ block.
+
+Fri Jul 28 08:43:52 1995 Doug Evans <dje@canuck.cygnus.com>
+
+ * i960.c (i960_arg_size_and_align): Correct alignment of XFmode
+ values in library calls.
+ * i960.md (movdi matchers): Support odd numbered regs.
+
+Fri Jul 28 08:37:25 1995 Michael Gschwind <mike@lanai.vlsivie.tuwien.ac.at>
+
+ * pdp11.md (divhi3, modhi3, divmodhi4): Rewrite.
+
+Wed Jul 26 10:15:52 1995 Hallvard B Furuseth (h.b.furuseth@usit.uio.no)
+
+ * collect2.c (end_file): Fix typo in error message text.
+
+Wed Jul 26 09:22:22 1995 Jeff Law (law@snake.cs.utah.edu)
+
+ * xm-pa.h (USE_C_ALLOCA): Always define.
+ * xm-pahpux.h (USE_C_ALLOCA): Likewise.
+
+ * x-pa (CC): Remove useless definition.
+ * xm-pa.h (HAVE_STRERROR): Define.
+ (__BSD_NET2__): Define.
+
+Wed Jul 26 09:10:25 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * expr.c (preexpand_calls): Don't look past a CLEANUP_POINT_EXPR.
+
+Wed Jul 26 08:43:42 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * cse.c (cse_insn): When do special handling for (set REG0 REG1),
+ must delete REG_EQUAL note from insn if it mentions REG0.
+
+ * loop.c (find_and_verify_loops): When moving blocks of code, verify
+ that the just destination is not in an inner nested loop.
+ (mark_loop_jump): Don't mark label as loop exit if it jumps to
+ an inner nested loop.
+
+Wed Jul 26 08:40:31 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (do_include, read_name_map): Omit leading "./" and
+ trailing "/" when it makes sense.
+ (skip_redundant_dir_prefix): New function.
+
+Wed Jul 26 08:36:41 1995 Michael Meissner <meissner@cygnus.com>
+
+ * stmt.c (emit_nop): Do not emit a nop if there is a single
+ insn before a label or at the start of a function.
+
+Wed Jul 26 08:21:21 1995 Doug Evans <dje@cygnus.com>
+
+ * Makefile.in (gfloat.h): Delete previous copy before updating.
+
+Wed Jul 26 08:18:29 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * Makefile.in (STAGESTUFF): Add stamp-crtS.
+ (crtbeginS.o, crtendS.o, stamp-crtS): New rules; just like
+ crtbegin.o et al, but compiled using -fPIC.
+ * configure (*-*-gnu*): Add crtbeginS.o and crtendS.o to $extra_parts.
+
+Wed Jul 26 08:11:52 1995 Michael Gschwind <mike@java.vlsivie.tuwien.ac.at>
+
+ * pdp11.md: Fixed typos ('bhos' -> 'bhis').
+
+Wed Jul 26 08:05:41 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * hp320.h, m68k.h, m68kv4.h (LEGITIMATE_PIC_OPERAND_P): Reject
+ CONST_DOUBLE with MEM with invalid pic address.
+ * reload1.c (real.h): Include it.
+ * Makefile.in (reload1.o): Depends on real.h.
+
+Wed Jul 26 07:58:22 1995 Ian Lance Taylor <ian@cygnus.com>
+
+ * gcc.c (MULTILIB_DIRS): Provide default if not defined.
+ (multilib_defaults): New static variable.
+ (default_arg): New static function.
+ (set_multilib_dir): Ignore default arguments.
+ (print_multilib_info): Ignore entries which use default arguments.
+
+Tue Jul 25 10:06:09 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.md (allocate_stack): Don't copy the LR register to
+ the new stack end.
+ * rs6000.c (rs6000_stack_info): Correctly store the LR in
+ the caller's frame, not the current frame, for V.4 calls.
+ * rs6000/eabi.asm (_save*, _rest*): Provide all mandated V.4 save
+ and restore functions, except for the save*_g functions which
+ return the GOT address.
+
+Fri Jul 21 14:24:25 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/eabi.h (__eabi): Load up r13 to be the small data
+ pointer, unless -mrelocatable.
+
+ * rs6000/aix3newas.h (LINK_SPEC): Import machine independent
+ functions if -mcpu=common.
+ * rs6000/milli.exp: Import file referenced in aix3newas.h.
+
+ * rs6000/eabi.asm (__eabi): Support for fixing up user initialized
+ pointers when -mrelocatable is used.
+ * rs6000/eabi.h (ASM_OUTPUT_INT): Record any pointers initialized
+ by the user if -mrelocatable, to be fixed up by __eabi.
+ (CONST_SECTION_ASM_OP): If -mrelocatable, put read-only stuff in .data,
+ not .rodata, to allow user initialized pointers to be updated by __eabi.
+
+ * rs6000.h (TARGET_SWITCHES): Add -mdebug-{stack,arg}.
+ (TARGET_{ELF,NO_TOC,TOC}): Add defaults for non system V.
+ (rs6000_stack): New structure to describe stack layout.
+ (RS6000_{REG_SAVE,SAVE_AREA,VARARGS_*}): New macros used to
+ support both AIX and V.4 calling sequences.
+ (FP_ARG_*, GP_ARG_*): Ditto.
+ (FP_SAVE_INLINE): Ditto.
+ (STARTING_FRAME_OFFSET): Modify to support both AIX and V.4
+ calling sequences.
+ (FIRST_PARM_OFFSET): Ditto.
+ (REG_PARM_STACK_SPACE): Ditto.
+ (STACK_POINTER_OFFSET): Ditto.
+ (FUNCTION_ARG_REGNO_P): Ditto.
+ ({,INIT_}CUMULATIVE_ARGS): Ditto.
+ (LEGITIMATE_LO_SUM_ADDRESS_P): Ditto.
+ (FUNCTION_ARG{,_ADVANCE,PARTIAL_NREGS,PASS_BY_REFERENCE}): Ditto.
+ (SETUP_INCOMING_VARARGS): Ditto.
+ (EXPAND_BUILTIN_SAVEREGS): Ditto.
+ (CAN_ELIMINATE): Ditto.
+ (INITIAL_ELIMINATION_OFFSET): Ditto.
+ (LEGITIMATE_CONSTANT_POOL_{BASE,ADDRESS}_P): Ditto.
+ (GO_IF_{LEGITIMATE_ADDRESS,MODE_DEPENDENT_ADDRESS}): Ditto.
+ (LEGITIMIZE_ADDRESS): Ditto.
+ (CONST_COSTS): Ditto.
+ (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Ditto.
+ (ASM_OUTPUT_REG_{PUSH,POP}): Use reg_names to print registers.
+ (function declarations): Add new rs6000.c function declarations,
+ and delete decls of deleted functions.
+ (SHIFT_COUNT_TRUNCATED): Parenthesize the expression.
+
+ * rs6000.c (init_cumulative_args): New function to support AIX
+ and V.4 calling sequences.
+ (function_arg{,_advance,partial_nregs,pass_by_reference}): Ditto.
+ (setup_incoming_varargs): Ditto.
+ (expand_builtin_saveregs): Ditto.
+ (rs6000_stack_info): Ditto.
+ (debug_stack_info): Ditto.
+ (direct_return): Changes to support AIX and V.4 calling sequences.
+ (first_reg_to_save): Ditto.
+ (svr4_traceback): Ditto.
+ (output_{prolog,epilog}): Ditto.
+ (print_operand): Use reg_names to print registers. Add support
+ for V.4 HIGH/LO_SUM address modes.
+ (must_save_cr): Function deleted, in rewrite of AIX/V.4 calling
+ sequence support.
+ (rs6000_sa_size): Ditto.
+ (rs6000_pushes_stack): Ditto.
+ (output_toc): Add abort if no toc.
+
+ * rs6000.md (call insns): Add a new argument to flag a V.4
+ function needs to set bit 6 of the CR.
+ (elf_{low,high}): New V.4 functions to create addresses via HIGH
+ and LO_SUM patterns.
+ (movsi): Use elf_{low,high} if appropriate.
+ (mov{si,di}_update): Name these patterns for allocate_stack.
+ (allocate_stack): Support for V.4 stack layout.
+ (sync): New pattern for V.4 trampolines to issue the sync
+ instruction.
+
+ * rs6000/sysv4.h (TARGET_SWTICHES): Add -mcall-{aix,sysv}, and
+ -mprototype. Remove separate flag bit for -mno-toc.
+ (SUBTARGET_OVERRIDE_OPTIONS): Don't test for -mno-toc.
+ (FP_ARG_*): Adjust for V.4 calling sequences.
+ (RS6000_*): Ditto.
+ (FP_SAVE_INLINE): Ditto.
+ (toc_section): Eliminate use of AIX style full TOC.
+ (TRAMPOLINE_{TEMPLATE,SIZE}): Redefine for V.4 support.
+ (INITIALIZE_TRAMPOLINE): Ditto.
+
+ * rs6000/eabi.h (CPP_SPEC): Define _CALL_SYSV or _CALL_AIX,
+ depending on whether -mcall-sysv or -mcall-aix was used.
+ * rs6000/eabile.h (CPP_SPEC): Ditto.
+ * rs6000/sysv4le.h (CPP_SPEC): Ditto.
+
+ * rs6000/t-eabigas (MULTILIB_{OPTIONS,DIRNAMES}): Delete no-toc
+ libraries, explicit big endian libraries.
+ * rs6000/t-ppcgas (MULTILIB_{OPTIONS,DIRNAMES}): Ditto.
+
+ * rs6000/t-eabiaix: New file for eabi, using -mcall-aix as the
+ default.
+ * rs6000/eabiaix.h: Ditto.
+
+ * rs6000/t-eabilegas: New file for eabi on little endian systems.
+ * rs6000/t-ppclegas: New file for V.4 on little endian systems.
+
+ * rs6000/t-rs6000 (MULTILIB_{OPTIONS,DIRNAMES}): Build libgcc.a
+ for -mcpu=common.
+
+ * configure (powerpc-*-eabiaix): New configuration for defaulting
+ to old-style AIX calling sequence.
+ (powerpcle*): Use new t-{eabi,ppc}legas files, to avoid building
+ explicit little endian multilib libraries.
+
+Fri Jul 21 13:23:06 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * toplev.c (main): Don't define sbrk #ifdef __alpha__.
+
+Tue Jul 18 19:23:44 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (do_include): Prefix -H output lines with spaces, not dots.
+ (output_dots): Remove.
+
+ * cccp.c (main): cplusplus_comments now defaults to 1.
+ But clear it if -traditional or the new option -lang-c89 is given.
+ * gcc.c (default_compilers, cpp): Specify -lang-c89 if -ansi is given.
+ This turns off C++ comment recognition.
+
+Tue Jul 18 19:16:38 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * va-sparc.h (va_arg): Add support for 128 bit long double type.
+
+Tue Jul 18 19:11:18 1995 Jorn Rennecke (amylaar@meolyon.hanse.de)
+
+ * c-common.c (decl_attributes, case A_ALIGNED): Handle is_type
+ case properly.
+
+Tue Jul 18 19:03:02 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * fold-const.c (fold, case CONVERT_EXPR): Don't merge conversions
+ if outer is to handle a type with differing precision.
+
+Mon Jul 17 14:37:35 1995 Pat Rankin (rankin@eql.caltech.edu)
+
+ * vax/vms.h (HAVE_ATEXIT): Define.
+ (DO_GLOBAL_CTORS_BODY): Don't call atexit; let __do_global_ctors do it.
+ * vax/xm-vms.h (HAVE_VPRINTF): Define.
+
+Mon Jul 17 06:41:19 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-typeck.c ({unsigned,signed}_type): Handle intXX_type_node types.
+
+ * xm-alpha.h (sbrk): Add declaration.
+
+ * convert.c (convert_to_integer): If TYPE is a enumeral type or
+ if its precision is not the same as the size of its mode,
+ convert in two steps.
+
+ * m68k.md (tstdi, cmpdi): Use match_scratch, not match_operand.
+
+Fri Jul 14 19:23:42 1995 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * c-decl.c (field_decl_cmp): Rewritten to make sure that a null
+ name always sorts low against other names.
+ * c-typeck.c (lookup_field): Change name comparison to match what
+ field_decl_cmp does.
+
+Fri Jul 14 18:46:24 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.md (movsi): Convert a CONST_DOUBLE into a CONST_INT of
+ the low part.
+
+Fri Jul 14 18:30:52 1995 Doug Evans <dje@cygnus.com>
+
+ * toplev.c (main): Reword dwarf/c++/-g warning.
+
+Fri Jul 14 18:19:34 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.h (NO_DEFER_POP): Remove last change.
+ * expr.c (stor_expr): Force stack adjust before NO_DEFER_POP.
+ (expand_expr, case COND_EXPR): Likewise.
+ * stmt.c (expand_start_stmt_expr): Likewise.
+
+Fri Jul 14 07:58:35 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * function.c (struct temp_slot): New fields base_offset, full_size.
+ (assign_stack_temp): For !FRAME_GROWS_DOWNWARD, set p->size to size.
+ Set new fields base_offset and full_size.
+ (combine_temp_slots): Use new fields base_offset and full_size instead
+ of slot and size.
+
+ * loop.c (loop_number_exit_count): New global variable.
+ (loop_optimize): Allocate space for it.
+ (find_and_verify_loops, mark_loop_jump): Set it.
+ (strength_reduce, check_dbra_loop): Use loop_number_exit_count
+ instead of loop_number_exit_labels.
+ * loop.h (loop_number_exit_count): Declare it.
+ * unroll.c (find_splittable_{regs,givs}, final_[bg]iv_value): Use
+ loop_number_exit_count instead of loop_number_exit_labels.
+ (reg_dead_after_loop): Check loop_number_exit_count, and fail
+ if the count doesn't match loop_number_exit_labels.
+
+ * cse.c (cse_insn): Ifdef out code that pre-truncates src_folded.
+
+ * sparc.md (sethi_di_sp64): Return null string at end.
+
+ * function.h (struct function): Add stdarg field.
+ * function.c (current_function_stdarg): New global variable.
+ (push_function_context_to): Save it.
+ (pop_function_context_from): Restore it.
+ (assign_parms): Set it.
+ (init_function_start): Clear it.
+ * output.h (current_function_stdarg): Declare it.
+ * i960.md: Modify all patterns which handle stores to memory to also
+ check current_function_varargs and current_function_stdarg.
+
+ * reorg.c (fill_simple_delay_slots): When trying to take instruction
+ from after the branch, don't continue past target label. Local
+ variables passed_label and target_uses are no longer necessary.
+
+Thu Jul 13 19:30:04 1995 Jeff Law (law@snake.cs.utah.edu)
+
+ * pa.c (output_bb): Fix error in long backwards branch with
+ nullified delay slot.
+
+Thu Jul 13 19:26:13 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * expmed.c (SHIFT_COUNT_TRUNCATED): Use #ifdef not #if.
+
+Mon Jul 10 20:16:44 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (rescan): Don't address outside of array when
+ preprocessing C++ comments.
+
+Mon Jul 10 20:05:46 1995 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.c (expand_block_move): Remove #if 0 conditionals
+ against using larger block moves.
+
+ * t-rs6000 (EXTRA_PARTS): Copy milli.exp to release dir.
+ (milli.exp): Copy to build dir from machine dependend dir.
+
+Mon Jul 10 20:03:29 1995 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * arm.md (matcher for (shiftable_op (cond-exp) (reg))): If
+ shiftable_op is minus, then subtract from zero when cond fails.
+
+Mon Jul 10 19:58:26 1995 John F. Carr <jfc@mit.edu>
+
+ * sparc.h (SELECT_SECTION): Use TREE_CODE_CLASS instead of directly
+ referencing tree_code_type.
+
+Mon Jul 10 19:54:31 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * protoize.c (reverse_def_dec_list): Delete const qualifiers from
+ local variables, and delete casts which were casting away const.
+
+Mon Jul 10 19:14:39 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-lang.c (finish_file): Add missing parm to start_function call.
+
+ * jump.c (jump_optimize): Pass outer_code arg to rtx_cost.
+
+ * varasm.c (assemble_name, bc_assemble_integer): Call
+ bc_emit_labelref with proper args.
+
+ * function.c (setjmp_args_warning): Remove bogus arg.
+
+Mon Jul 10 18:20:54 1995 Fergus Henderson (fjh@cs.mu.oz.au)
+
+ * gcc.c (p{fatal,error}_with_name, perror_exec): Quote filename.
+
+Mon Jul 10 18:12:51 1995 Gran Uddeborg (uddeborg@carmen.se)
+
+ * i386/iscdbx.h (STARTFILE_SPEC): Handle -Xp.
+
+Wed Jul 5 02:42:17 1995 Per Bothner (bothner@spiff.gnu.ai.mit.edu)
+
+ * cpphash.h (enum node_type): Remove unneeded and non-standard
+ forward declaration.
+
+Sat Jul 1 20:15:39 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * mips/t-mips, mips/t-mips-gas (MULTILIB_*, LIBGCC, INSTALL_LIBGCC):
+ Delete.
+
+ * sparc/sol2.h (LINK_SPEC): Revert March 16 change. Do not add -R
+ for each -L.
+
+ * collect2.c (libcompare): Verify that file name extensions are valid.
+ Put files with invalid extensions last in the sort.
+
+ * integrate.c (integrate_decl_tree): Set DECL_ABTRACT_ORIGIN before
+ pushdecl call for local variables.
+
+Sat Jul 1 08:13:38 1995 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * cpplib.c (output_line_command): If not emitting #line directives
+ delay returning until after adjust_position has been called.
+
+ * arm.md (mov{si,sf,df}cc): Call gen_compare_reg to generate
+ the condition code register.
+
+Sat Jul 1 06:55:09 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * fold-const.c (decode_field_reference): New parm PAND_MASK.
+ (unextend): New parm MASK.
+ (fold_truthop): Pass new parms to decode_field_reference and unextend.
+
+ * va-alpha.h (__va_tsize): Use __extension__ to avoid warning
+ on use of `long long'.
+
+ * expr.h (NO_DEFER_POP): Do any pending stack adjusts.
+
+ * recog.c (register_operand): Disallow subreg of reg not allowed to
+ change size.
+
+Thu Jun 29 05:51:57 1995 Jeff Law (law@snake.cs.utah.edu)
+
+ * pa.md (reload addsi3): New pattern to avoid reload lossage
+ with register eliminations.
+
+ * pa.c (output_cbranch): When checking for a jump to the given
+ insn's delay slot, handle the case where JUMP_LABEL for the
+ given insn does not point to the first label in a series of
+ labels.
+ (output_bb, output_dbra, output_movb): Likewise.
+
+Wed Jun 28 18:04:56 1995 Jeff Law (law@snake.cs.utah.edu)
+
+ * pa.h (PIC_OFFEST_TABLE_REGNUM_SAVED): Define to %r4.
+ (CONDITIONAL_REGISTER_USAGE): Make it fixed when compiling
+ PIC code.
+ (INIT_EXPANDERS): Delete.
+ * pa.c (hppa_save_pic_table_rtx): Delete variable.
+ (hppa_expand_prologue): For PIC generation, copy the PIC
+ register into a fixed callee register at the end of the
+ prologue of non-leaf functions.
+ * pa.md (call expanders): Reload the PIC register from the
+ fixed callee saved register. Don't try to save the PIC
+ register before the call.
+
+Wed Jun 28 18:01:14 1995 Stan Cox (coxs@dg-rtp.dg.com)
+
+ * m88k/dguxbcs.h (ASM_SPEC): Removed -h flag.
+ * m88k/dgux.h (ASM_SPEC): Likewise.
+
+Wed Jun 28 17:01:58 1995 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.c (processor_target_table): Remove CPU name synonyms.
+ * rs6000.h (CPP_SPEC): Likewise.
+ * rs6000/sysv4.h (CPP_SPEC): Likewise.
+ (ASM_SPEC): Likewise.
+ * rs6000/sysv4le.h (CPP_SPEC): Likewise.
+ * rs6000/eabile.h (CPP_SPEC): Likewise.
+ * rs6000/powerpc.h (CPP_SPEC): Likewise.
+ (ASM_SPEC): Set assembler target according to compiler target.
+ * rs6000/aix3newas.h (CPP_SPEC): Likewise.
+ (ASM_SPEC): Likewise.
+ * rs6000/aix41.h (CPP_SPEC): Likewise.
+ (ASM_SPEC): Likewise.
+
+Wed Jun 28 16:25:53 1995 Gran Uddeborg (uddeborg@carmen.se)
+
+ * i386/x-isc3 (INSTALL_HEADERS_DIR): Delete; done by configure.
+
+Wed Jun 28 16:10:47 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * xm-rs6000.h (alloca): Extern decl added for non-GNU compiler.
+
+Wed Jun 28 11:31:30 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * cpplib.c (progname): Remove definition from here.
+
+ * final.c (final_scan_insn): Fix error in last change.
+
+ * rtlanal.c (reg_set_p_1): Now static; add extra parm.
+
+ * stmt.c: Delete redundant forward decls.
+ (expand_anon_union_decl): Correctly call expand_decl.
+
+ * toplev.c (strip_off_ending): Strip off any ending; don't
+ pretend we know what valid endings are.
+
+ * svr4.h (ASM_OUTPUT_SECTION_NAME): Don't crash if DECL is null.
+
+ * rs6000.md ({load,store}_multiple): Don't use indirect_operand
+ in define_insn; use explicit MEM of register_operand instead.
+
+Tue Jun 27 11:42:56 1995 Stephen L Moshier <moshier@world.std.com>
+
+ * i386/i386.c (print_operand, case `J'): Use jns for GE and js for
+ LT.
+
+Tue Jun 27 07:58:55 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * expr.c (expand_expr, TARGET_EXPR): Only use original_target
+ if !ignore.
+
+Tue Jun 27 07:27:26 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * fold-const.c (fold_truthop): Commute unextend and convert on
+ l_const and r_const.
+
+ * c-common.c (decl_attributes, case A_CONSTRUCTOR, A_DESTRUCTOR):
+ Set TREE_USED.
+
+ * final.c (final_scan_insn): Don't call alter_cond unless
+ condition is on cc0.
+
+ * stmt.c (expand_asm_operands): Handle input operands that may not
+ be in a register.
+
+Mon Jun 26 19:23:05 1995 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * arm/lib1funcs.asm (L_dvmd_tls): Renamed from L_divmodsi_tools.
+ * arm/t-semi (LIB1ASMFUNCS): Rename _dvmd_tls from _divmodsi_tools.
+
+Mon Jun 26 19:18:06 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * unroll.c (find_splittable_regs): When completely unrolling loop,
+ check for non-invariant initial biv values.
+
+Mon Jun 26 19:13:54 1995 Gran Uddeborg <uddeborg@carmen.se>
+
+ * configure (i[345]86-*-isc*): Fix misspelled "rfile" to "ifile".
+
+Mon Jun 26 18:58:22 1995 Mike Stump <mrs@cygnus.com>
+
+ * expr.c (expand_expr, case COND_EXPR): Protect the condition from
+ being evaluated more than once.
+ (do_jump, case TRUTH_ANDIF_EXPR, TRUTH_ORIF_EXPR): Likewise.
+
+Mon Jun 26 18:52:36 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * fixincludes (string.h): Fix return value for mem{ccpy,chr,cpy,set}
+ and str{len,spn,cspn} on sysV68.
+
+Mon Jun 26 06:54:50 1995 Michael Meissner (meissner@cygnus.com)
+
+ * i386/osfrose.h (LONG_DOUBLE_TYPE_SIZE): Go back to making long
+ double == double.
+
+Thu Jun 22 19:14:41 1995 Pat Rankin (rankin@eql.caltech.edu)
+
+ * make-cc1.com (if DO_LINK): Skip c-parse.* processing when
+ only relinking.
+ (gas_message): Update to reflect current version, and give
+ a different message if/when no version of gas is found.xo
+
+Thu Jun 22 18:52:37 1995 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * arm/lib1funcs.asm (___modsi3): Correctly set SIGN register for
+ modulo involving negative numbers.
+
+Thu Jun 22 18:32:27 1995 Uwe Seimet (seimet@chemie.uni-kl.de)
+
+ * xm-atari.h (HZ): Now 100 and don't define if already defined.
+
+Thu Jun 22 18:26:12 1995 Jeffrey A Law (law@snake.cs.utah.edu)
+
+ * calls.c (expand_call): Correctly handle returning BLKmode
+ structures in registers when the size of the structure is not
+ a multiple of word_size.
+ * stmt.c (expand_return): Likewise.
+
+ * pa-gux7.h (LIB_SPEC): Undefine before redefining.
+ * pa-hpux.h (LIB_SPEC): Likewise.
+ * pa-hpux7.h (LIB_SPEC): Likewise.
+
+ * genmultilib: Work around hpux8 /bin/sh case bug.
+
+ * pa.h (LIB_SPEC): Define to avoid -lg.
+
+Thu Jun 22 18:19:09 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * expr.c (expand_expr, TARGET_EXPR): Use original_target.
+
+ * collect2.c (locatelib): Fix parsing of LD_LIBRARY_PATH.
+
+Thu Jun 22 18:15:54 1995 Paul Eggert <eggert@twinsun.com>
+
+ * configure: Create an empty Makefile.sed first, to work
+ around a Nextstep 3.3 bug.
+
+Thu Jun 22 18:03:44 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * Makefile.in (STAGESTUFF): Add stamp-crt.
+ (crtbegin.o, crtend.o): Now depend on stamp-crt.
+ (stamp-crt): New rule, to actually build crt{begin,end}.o.
+
+ * collect2.c (main): Unlink export_file before we return.
+
+Thu Jun 22 14:25:56 1995 Michael Meissner (meissner@cygnus.com)
+
+ * rs6000.h (STRIP_NAME_ENCODING): Store NAME and strlen(NAME) into
+ local variables; cast result of alloca to avoid compiler warnings.
+
+Tue Jun 20 18:25:29 1995 Douglas Rupp (drupp@cs.washington.edu)
+
+ * alpha/config-nt.sed, i386/config-nt.sed: Edit to add
+ a missing $(exeext) for CCCP.
+
+Tue Jun 20 18:18:00 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * protoize.c (default_include): Use name and two ints to be
+ compatible with definition of INCLUDE_DEFAULTS.
+
+Mon Jun 19 19:24:29 1995 Ted Lemon <mellon@toccata.fugue.com>
+
+ * mips/netbsd.h (ASM_DECLARE_FUNCTION_NAME): Don't emit function label.
+
+Mon Jun 19 18:34:55 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * fixincludes: Don't define wchar_t under C++.
+
+Mon Jun 19 17:12:41 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (collect_expansion): Work around enum bug in vax
+ ultrix 4.3 pcc.
+ * tree.c (simple_cst_equal): Likewise.
+
+Mon Jun 19 16:53:00 1995 Douglas Rupp (drupp@cs.washington.edu)
+
+ * winnt/spawnv.c: New file.
+
+Mon Jun 19 16:30:29 1995 Glenn Brown <glenn@mars.myri.com>
+
+ * caller-save.c (save_call_clobbered_regs): If AUTO_INC_DEC, mark
+ register indicated by REG_INC notes as live so they will be saved.
+
+Mon Jun 19 16:21:12 1995 Jeffrey A Law (law@snake.cs.utah.edu)
+
+ * pa.h (PRINT_OPERAND_ADDRESS, case LOW_SUM): Fix logic bug
+ in last change.
+
+Mon Jun 19 14:11:49 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * integrate.c (integrate_decl_tree): Only set DECL_ABSTRACT_ORIGIN
+ if the decl returned by pushdecl is the one we started with.
+
+ * mips.h (current_function_name): Delete declaration.
+ (ASM_DECLARE_FUNCTION_NAME): Don't set current_function_name.
+ * gnu.h (ASM_DECLARE_FUNCTION_NAME): Likewise.
+ * mips.c (current_function_decl): Delete declaration.
+ (function_prologue): New variable fnname. Use it instead of
+ current_function_name.
+ (function_epilogue): Likewise.
+
+Mon Jun 19 13:13:15 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alpha.h (ASM_OUTPUT_ASCII): Always reset line count when
+ starting new line.
+
+ * scan-decls.c (scan_decls): Fix typo when resetting PREV_ID_START.
+
+ * i386/config-nt.sed, alpha/config-nt.sed: Change version to 2.7.1.
+
+Mon Jun 19 13:06:14 1995 DJ Delorie (dj@delorie.com)
+
+ * msdos/top.sed: Support new build variables.
+ * msdos/configur.bat: Make options.h and specs.h.
+ Change realclean to maintainer-clean.
+
+Fri Jun 16 06:54:03 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * Version 2.7.0 Released.
+
+ * obstack.c: Always enable this code for now.
+
+ * alpha.c (alpha_builtin_saveregs): Use ptr_mode and conversions
+ when need so works for both OSF and NT.
+ * va-alpha.h (__va_tsize): Round to long long not long.
+
+Thu Jun 15 17:54:52 1995 Bdale Garbee <bdale@gag.com>
+
+ * configure (a29k-*-coff): Synonym for a29k-*-udi.
+
+Thu Jun 15 17:51:21 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * function.c (assign_parms): Do all conversions in CONVERSION_INSNS.
+
+Thu Jun 15 17:36:49 1995 Michael Meissner <meissner@cygnus.com>
+
+ * reg-stack.c (record_reg_life): Call record_reg_life_pat with 0
+ for douse argument so that USE's created to mark variables within
+ blocks don't get marked as set.
+
+Thu Jun 15 06:28:15 1995 Dennis Glatting (dennisg@CyberSAFE.COM)
+
+ * configure: Change one sed command to work around m68k-next bug.
+
+Wed Jun 14 22:14:39 1995 Jason Merrill <jason@deneb.cygnus.com>
+
+ * collect2.c (main): Don't turn off auto_export because of -g.
+ (main): Ignore the argument to -o.
+
+ * alpha.h (LINK_SPEC): Don't pass -init __main anymore.
+ * alpha/osf12.h (LINK_SPEC): Ditto.
+ * mips/iris5.h (LINK_SPEC): Ditto.
+
+ * collect2.c (main): Place o_file after an initial .o (like crt0.o).
+ If we have LD_INIT_SWITCH, use init and fini functions for
+ executables, too. Specify the unique function names.
+ (write_c_file_stat): Fix the case of destructors but no constructors.
+ Don't include the generic-named functions for executables.
+ (write_c_file): If we have LD_INIT_SWITCH, always use
+ write_c_file_stat.
+
+ * collect2.c (main): Also add _GLOBAL__D? to export list.
+
+ * ginclude/iso646.h: Do nothing if compiled as C++.
+
+Wed Jun 14 17:39:10 1995 Roland McGrath (roland@gnu.ai.mit.edu)
+
+ * c-common.c (format_char_info, case 'm'): Set type to void.
+ (check_format_info): If type is void, ignore operand.
+
+Wed Jun 14 17:04:10 1995 Paul F. Kunz (Paul_Kunz@SLAC.Stanford.EDU)
+
+ * expr.c (expand_builtin_apply_args): Put back original
+ register save and restore order.
+
+Wed Jun 14 16:56:22 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/eabi.h (INVOKE__main): Define, so __eabi is called after
+ main's arguments are saved.
+
+ * rs6000.c (output_prolog): Don't call __eabi here, let
+ compiler call it after the arguments to main are saved.
+ (output_{prolog,epilog}): Don't use functions under V.4 to save
+ and restore floating point registers.
+
+Wed Jun 14 16:52:12 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k/mot3300.h (PCC_BITFIELD_TYPE_MATTERS): Defined.
+
+Wed Jun 14 16:48:53 1995 Jerry Frain (jerry@tivoli.com)
+
+ * Makefile.in (stage[1-4]): Correctly link `as', `ld', and `collect2'.
+
+Wed Jun 14 05:52:04 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * objc-act.c (hack_method_prototype): Set DECL_CONTEXT of parms.
+
+ * expmed.c (emit_store_flag): Always set LAST.
+
+ * c-decl.c (start_function): New parameter for attributes.
+ * c-tree.h (start_function): Likewise.
+ * c-lang.c (finish_file): Pass extra parm to start_function.
+ * objc-act.c (build_module_descriptor, really_start_method): Likewise.
+ * c-parse.in (fndef, nested_function, notype_nested_function):
+ Likewise.
+
+ * function.c (assign_parms): Use convert_to_mode instead of
+ gen_lowpart when converting incoming parm.
+
+Tue Jun 13 19:10:32 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * rs6000.md (decrement_and_branch): Finish last fix; update matching
+ constraint.
+
+Tue Jun 13 18:32:51 1995 Torbjorn Granlund <tege@bozo.matematik.su.se>
+
+ * fold-const.c (fold): When converting a COND_EXPR to an ABS_EXPR,
+ get the types right for ABS_EXPR to work.
+
+Mon Jun 12 17:09:55 1995 Michael Tiemann (tiemann@axon.cygnus.com)
+
+ * reorg.c (fill_simple_delay_slots): Set MAYBE_NEVER according to
+ code of TRIAL_DELAY, not TRIAL.
+
+Mon Jun 12 15:02:37 1995 Doug Evans <dje@cygnus.com>
+
+ * configure: Restore code to make ld symlink if ! use_collect2.
+
+ * gcc.c (link_command_spec): Undo patch of May 11.
+ -nostdlib implies -nostartfiles again.
+ * dsp16xx.h (CROSS_LINK_SPEC): Likewise.
+ * i386/freebsd.h (LINK_SPEC): Undo patch of May 24.
+ Don't pass "-e start" if nostdlib.
+ * i386/sun.h (LINK_SPEC): Likewise.
+ * m68k/sun2o4.h (LINK_SPEC): Likewise.
+ * m68k/sun3.h (LINK_SPEC): Likewise.
+ * m68k/vxm68k.h (LINK_SPEC): Likewise.
+ * mips/netbsd.h (LINK_SPEC): Likewise.
+ * config/netbsd.h (LINK_SPEC): Likewise.
+ * rs6000/mach.h (LINK_SPEC): Likewise.
+ * sparc.h (LINK_SPEC): Likewise.
+ * sparc/vxsparc.h (LINK_SPEC): Likewise.
+
+ * gcc.c (link_command_spec): New argument -nodefaultlibs.
+
+Sun Jun 11 20:47:53 1995 Stephen L Moshier (moshier@world.std.com)
+
+ * Makefile.in (fix-header.o): Depends on xsys-protos.h.
+
+Sun Jun 11 15:07:58 1995 Tim Carver (timc@ibeam.intel.com)
+
+ * reload1.c (emit_reload_insns): Don't call HARD_REGNO_NREGS
+ on psuedo when clearing reg_last_reload_reg.
+
+Sun Jun 11 14:07:05 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k.md ({add,sub}di{_mem,3}): Patterns merged.
+
+Sun Jun 11 13:43:26 1995 Torbjorn Granlund <tege@bozo.matematik.su.se>
+
+ * m68k.md (cmpdi matcher): Set cc_status before returning.
+
+ * config/xm-freebsd.h (DONT_DECLARE_SYS_SIGLIST): Define.
+
+Sun Jun 11 13:38:49 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * fixincludes (math.h): Keep declaration of abs on HPUX.
+
+Sun Jun 11 12:31:42 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * stor-layout.c (variable_size): Do nothing if SIZE is constant.
+
+ * stmt.c (expand_asm_operands): See if output operand permits
+ register. If not, mark output addressable, call expand_operand
+ on it, and give error if not MEM.
+
+ * function.c (assign_parms): Handle promotions of both
+ passed and nominal modes separately and insert needed conversions.
+ (promoted_input_arg): Return 0 if nominal and passed modes differ.
+
+ * stmt.c (all_cases_count, case INTEGER_TYPE): Fix typo in checking
+ for integer bounds.
+
+Sat Jun 10 08:55:25 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * libgcc2.c (_floatdidf): Correctly set float sizes.
+
+ * c-decl.c (c_decode_option, case "-Wall"): Don't set extra_warnings.
+
+ * Makefile.in (cpplib.o, fix-header.o): Update dependencies.
+ (cpperror.o, cppexp.o, cpphash.o): New rules, to show .h dependencies.
+
+Fri Jun 9 18:06:10 1995 Doug Evans <dje@canuck.cygnus.com>
+
+ * cse.c (cse_basic_block): Fix test for whether block ends with a
+ barrier. Return next insn, not 0, if block ends in a barrier.
+
+Fri Jun 9 17:58:29 1995 Paul Eggert <eggert@twinsun.com>
+
+ * fold-const.c (lshift_double): Replace `&' with `%' to fix typo.
+ ([lr]shift_double): Truncate shift count only if SHIFT_COUNT_TRUNCATED.
+ Remove unnecessary `count >= prec' test.
+
+ * cexp.y (left_shift): Ignore integer overflow.
+
+ * cexp.y (skip_evaluation): New variable.
+ (&&, ||, ?:): Increment it in unevaluated subexpressions.
+ (/, %, integer_overflow): Suppress diagnostics if skip_evaluation != 0.
+ (yyerror): Clear skip_evaluation.
+
+Fri Jun 9 17:49:05 1995 Torbjorn Granlund <tege@bozo.matematik.su.se>
+
+ * m68k.md (tstdi): Rewrite.
+
+Fri Jun 9 17:28:55 1995 Per Bothner <bothner@cygnus.com>
+
+ * scan-decls.c (scan_decls): Handle declarations with
+ multiple comma-separated declarators.
+
+Thu Jun 8 19:16:12 1995 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * arm.md (mov[sd]f expands): Don't allow fp constants in pseudos
+ when TARGET_SOFT_FLOAT.
+
+Thu Jun 8 19:11:43 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * expmed.c (store_split_bit_field): When adjust arg in
+ BYTES_BIT_ENDIAN case, use number of bits in arg for MEM operands
+ and BITS_PER_WORD for other operands.
+ (extract_fixed_bit_field): Undo last change.
+
+ * unroll.c (verify_addresses): New function.
+ (find_splittable_givs): Use it instead of memory_address_p.
+
+Thu Jun 8 18:58:18 1995 Torbjorn Granlund <tege@bozo.matematik.su.se>
+
+ * expmed.c (expand_divmod): Always check result of emit_store_flag.
+
+Thu Jun 8 12:02:34 1995 David D Zuhn (zoo@armadillo.com)
+
+ * cpplib.c (cpp_push_buffer): Include filename in error message.
+
+Thu Jun 8 11:53:45 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * function.c (assign_parms): Don't call promote_mode on arg
+ unless PROMOTE_FUNCTION_ARGS defined.
+
+ * rs6000.md (decrement_and_branch): Ensure label is operand 0.
+
+ * rs6000.md (aux_truncdfsf2): New pattern.
+ (movsf): Use it instead of invalid SUBREG and truncdfsf2.
+
+ * varasm.c (assemble_name): Disable warn_id_clash around
+ get_identifier call.
+
+Wed Jun 7 17:22:25 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * configure (gdb_needs_out_file_path): New variable.
+ (m68k-motorola-sysv): Set gdb_needs_out_file_path if not using gas.
+ (.gdbinit): If gdb_needs_out_file_path is set, add a 'dir' command
+ for $(out_file).
+
+Wed Jun 7 17:17:19 1995 Torbjorn Granlund <tege@bozo.matematik.su.se>
+
+ * fold-const.c (fold): When folding `<' type nodes, make true_value
+ and false_value have correct types.
+
+Wed Jun 7 05:06:42 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * collect2.c (COFF scan_prog_file): Use the AIX duplicate entry.
+
+Tue Jun 6 18:43:09 1995 Jeffrey A Law (law@snake.cs.utah.edu)
+
+ * pa.h (FUNCTION_ARG_CALLEE_COPIES): Define.
+
+Tue Jun 6 18:21:18 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (expand_expr, case PLACEHOLDER_EXPR): Consider two types
+ identical if their TYPE_MAIN_VARIANTs are the same.
+
+ * c-decl.c (start_decl): Set DECL_COMMON before calling
+ decl_attributes.
+
+ * a29k.c (print_operands): Cast args to bcopy to char *.
+
+ * c-decl.c (duplicate_decls): Don't clear DECL_CONTEXT of
+ new decl if it is a function.
+
+Tue Jun 6 17:57:44 1995 Eberhard Mattes (mattes@azu.informatik.uni-stuttgart.de)
+
+ * gcc.c (do_spec_1, case 'g'): Handle %O as suffix if MKTEMP_EACH_FILE.
+
+Tue Jun 6 17:53:05 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.c (expand_block_move): Update source and destination pointers
+ inside the loop moving the bytes, not outside.
+
+Tue Jun 6 14:58:37 1995 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m68k.h (CONDITIONAL_REGISTER_USAGE): Don't mark pic reg as fixed.
+ * m68k.c (finalize_pic): Emit USE insn at start and end of function.
+
+Tue Jun 6 13:46:57 1995 Jim Wilson <wilson@mole.gnu.ai.mit.edu>
+
+ * sh.c (print_operand): Check for annulled branches.
+ (output_movedouble): Handle SUBREG addresses.
+ (output_branch): Handle annulled branches.
+ (sh_expand_prologue): Correct number of saved registers for
+ varargs functions.
+ * sh.h: Add some comments.
+ * sh.md: Add some comments. Cleanup formatting.
+ (type attribute): Add pstore and call.
+ (return define_delay): Reorganize to make clearer.
+ (call/sfunc define_delay): Define.
+ (cbranch define_delay): Define to have annul-true delay slot.
+ (subsi3): Use arith_reg_operand for operand 2.
+ (shift patterns): Use const_int_operand instead of immediate_operand
+ for shift counts.
+ (push): Add pstore constraint case.
+ (movsi_i): Move t/z constraint pair to the front of the list.
+ (calli, call_valuei): Add "call" attribute.
+
+Mon Jun 5 19:23:13 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * sched.c (attach_deaths): In last change, use find_reg_note instead
+ of find_regno_note.
+
+Mon Jun 5 19:17:31 1995 Tom Quiggle (quiggle@lovelace.engr.sgi.com)
+
+ * mips/iris5.h (MACHINE_TYPE): Say "IRIX 5.x", not "5.0".
+ (NO_DOLLAR_IN_LABEL): Undefine.
+ * mips.h (sdb_begin_function_line): New declaration.
+ (PUT_SDB_FUNCTION_END): New definition.
+
+Mon Jun 5 18:56:10 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.c (expand_block_move): Don't do block moves where we clobber
+ fixed numbers of regs, instead move just 1-8 bytes at a time.
+
+ * Makefile.in (STAGESTUFF): Copy files produced by -da and
+ -save-temps to the stage subdirectories.
+
+Mon Jun 5 08:18:46 1995 Torbjorn Granlund <tege@bozo.matematik.su.se>
+
+ * combine.c (reg_dead_at_p): When scanning backwards, stop at BARRIER.
+
+ * m68k.c (print_operand): Handle 'R' for registers.
+ * m68k.md (cmpdi): Rewrite to avoid bogus matching constraints.
+
+ * optabs.c (expand_binop): In last change, don't defererence TARGET
+ if it is 0.
+
+ * pa.md (movsicc): Use MATCH_DUP for operand 4 and 5.
+
+Mon Jun 5 08:14:56 1995 Jeffrey A Law (law@cs.utah.edu)
+
+ * pa.c (hppa_encode_label): Allocate stuff on permanent_obstack
+ rather than via malloc.
+
+ * c-common.c (decl_attributes): Fix typo in size passed to alloca.
+
+Mon Jun 5 08:10:55 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * alpha.md: Use "some_operand" for patterns valid only during
+ reload and meant to handle adding more PLUS operators during
+ register elimination.
+
+Mon Jun 5 07:31:53 1995 Stephen L Moshier (moshier@world.std.com)
+
+ * cse.c (simplify_unary_operation, case FLOAT, UNSIGNED_FLOAT):
+ Truncate to requested mode.
+
+Sat Jun 3 22:08:51 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * sched.c (attach_deaths): Don't add a REG_DEAD note if a REG_UNUSED
+ note is already present.
+
+Sat Jun 3 18:36:57 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * pa.h (hppa_builtin_saveregs): Add declaration.
+
+Sat Jun 3 18:11:26 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * Makefile.in (scan-decls.o): Depends on cpplib.h.
+
+Fri Jun 2 19:23:47 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * optabs.c (expand_binop): Don't use non-REG TARGET in 2-word case.
+
+Thu Jun 1 19:30:30 1995 Tor Egge (tegge@flipper.pvv.unit.no)
+
+ * m88k.h (RETURN_POPS_ARGS): New argument.
+ * m88k/dolphin.ld: Added start of comment.
+
+Thu Jun 1 19:12:28 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * configure (a29k-*-bsd*): Fix typo in last change.
+
+Thu Jun 1 18:51:53 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * expmed.c (extract_fixed_bit_field): For REG case, compute total_bits
+ from mode instead of assuming BITS_PER_WORD.
+
+Thu Jun 1 18:34:31 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.h (FIXED_R13): Default to 0.
+ ({FIXED,CALL_USED}_REGISTERS): Use FIXED_R13 for register 13.
+ * sysv4.h (FIXED_R13): Define to be 1.
+
+Wed May 31 20:57:26 1995 Torbjorn Granlund <tege@matematik.su.se>
+
+ * m68k.md ([su]mulsi3_highpart): Pass correct number of arguments to
+ const_uint32_operand.
+ * m68k.c (const_uint32_operand): Reject negative numbers.
+
+ * expmed.c (expand_mult_highpart): Use wide_op1 for all multiplies.
+ (expand_divmod): Undo Nov 12 change. Instead, add special case
+ for division by MIN_INT in signed TRUNC_DIV_EXPR case.
+
+Wed May 31 20:44:21 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k.md (one_cmpldi2): New pattern.
+ ({a,l}shrdi{3,_const}): Allow 63 as shift count.
+
+Wed May 31 14:56:31 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * varasm.c (assemble_start_function, assemble_variable):
+ Make sure first_global_object_name is in permanent obstack.
+
+ * reload1.c (alter_reg): Clean up setting of RTX_UNCHANGING_P
+ when making a MEM.
+
+ * reorg.c (struct resources): New field unch_memory.
+ (CLEAR_RESOURCES, mark_target_live_regs, dbr_schedule): Clear it.
+ (mark_{referenced,set}_resources, redundant_insn): Set it.
+ (fill_simple_delay_slots): Likewise.
+ (resource_conflicts_p): Test it.
+
+ * unroll.c (copy_loop_body): Fix typo in call to sets_cc0_p.
+
+ * integrate.c (output_inline_function): Don't call expand_function_end.
+
+ * calls.c (prepare_call_address): Only call use_reg on
+ static_chain_rtx if it is a REG.
+
+ * configure (a29k-*-bsd*): Use t-a29k.
+ * t-a29k: New file.
+ * a29k/t-a29kbare (LIBGCC1_TEST): New null definition.
+ * a29k/t-vx29k (LIBGCC1_TEST): Likewise.
+
+Wed May 31 14:17:42 1995 Jeffrey A Law (law@snake.cs.utah.edu)
+
+ * configure (hppa*-*-bsd*): Do not run fixincludes.
+ (hppa*-*-osf*): Likewise.
+ (hppa*-*-lites*): Likewise.
+
+ * pa.h (PRINT_OPERAND_ADDRESS): Use "RR'" rather than "R'" for
+ symbolic addresses.
+ * pa.md (symbolic HIGH patterns): Likewise.
+ (symbolic LO_SUM pattern): Likewise.
+
+Wed May 31 14:11:53 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.md (all movstri recognizers): Eliminate updating the pointers.
+ * rs6000.c (expand_block_move): Don't pass argument of # bytes to
+ increment pointers by to movstrsi expanders.
+
+ * rs6000.c (rs6000_override_options): Fix typo with -mstring handling.
+
+ * rs6000.h (TARGET_SWITCHES): Set MASK_STRING_SET explicitly
+ if -mno-string, so that it can override the processor default.
+
+Wed May 31 07:31:53 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * c-common.c (truthvalue_conversion, BIT_AND_EXPR): Make sure that
+ the result has boolean_type_node.
+
+Tue May 30 19:03:21 1995 J.T. Conklin <jtc@cygnus.com>
+
+ * stddef.h: Undefine _BSD_XXX_T_ if _GCC_XXX_T is defined on BSD
+ Net/2 derived systems.
+
+Tue May 30 08:17:37 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k.md (decrement_and_branch_until_zero): Operand 0 constraint
+ changed from "+g" to "+d*am".
+ (similar anonymous HImode pattern): Likewise.
+
+ * m68k.md (tstdi): Use tst/subx #0 instead of neg/negx.
+ Allow "a" and ">" for operand 0.
+
+Mon May 29 19:24:43 1995 Niklas Hallqvist (niklas@appli.se)
+
+ * m68k.md (addsi_lshrsi_31): Use match_dup, not constraint "1",
+ for matching inputs.
+
+Mon May 29 12:39:58 1995 Allen Briggs <briggs@rrinc.com>
+
+ * i386/isc.h ({STARTFILE,LIB,CPP}_SPEC): Handle -Xp like -posix.
+ * i386/x-isc3 (X_CFLAGS): Add -Xp.
+
+Mon May 29 12:28:41 1995 J.T. Conklin (jtc@cygnus.com)
+
+ * configure (sparc-*-netbsd): Add missing asterisk at end.
+
+Mon May 29 08:55:48 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * combine.c (recog_for_combine): New parm PADDED_SCRATCHES; set it.
+ (try_combine): Accumulate number of scratches and update max_scratch.
+ (simplify_set): Add extra parm to recog_for_combine.
+
+ * romp.md (call): Put USE for r0 in CALL_INSN; call call_internal
+ to emit insn.
+ (call_internal): New name for anonymous call.
+ (call_value, call_value_internal): Likewise.
+
+ * winnt/xm-winnt.h: Protect most definitions with #ifndef.
+ * alpha/xm-winnt.h: Include alpha/xm-alpha.h, then winnt/xm-winnt.h.
+ (POSIX): Undefine.
+ * xm-alpha.h: Don't include alloca.h for winnt.
+
+Sun May 28 18:34:01 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * configure: Make sed commands more uniform.
+
+ * Makefile.in: Properly use $(srcdir) for files that have it
+ in their reference as a target of a rule.
+ (libgcc1.a): Add missing RANLIB_TEST use.
+
+ * stmt.c (expand_computed_goto): Call do_pending_stack_adjust.
+
+Sun May 28 18:08:41 1995 Torbjorn Granlund <tege@mole.gnu.ai.mit.edu>
+
+ * m68k.md (divmodhi4, udivmodhi4): Use "dmsK" for operand 2.
+
+Fri May 26 17:01:22 1995 Paul Eggert <eggert@twinsun.com>
+
+ * fixincludes: Fix bogus recursive <stdlib.h> in NEWS-OS 4.0C.
+
+Fri May 26 08:02:14 1995 Michael Meissner (meissner@cygnus.com)
+
+ * c-typeck.c (initializer_constant_valid_p): For the CONSTRUCTOR
+ case, if the type is a record, recurse, just like for unions.
+
+Thu May 25 07:56:14 1995 Paul Eggert <eggert@twinsun.com>
+
+ * fixincludes: Add `sel', `tahoe', `r3000', `r4000' to the
+ list of pre-ANSI symbols that need to be surrounded with __ __.
+ Allow white space between `#' and `if' when looking for lines to patch.
+
+ * objc/sarray.h (PRECOMPUTE_SELECTORS, struct soffset):
+ Use #ifdef __sparc__, not sparc.
+
+ * m68k.md (addsi_lshrsi_31, ashldi_const, ashrdi_const, lshrdi_const):
+ Replace `mov' with `move'.
+
+Thu May 25 07:35:37 1995 Allen Briggs <briggs@rrinc.com>
+
+ * libgcc2.c (L_eh, i386): Remove in-line comments in assembly
+ code--the '#' character is not valid for the SYSV as.
+
+Thu May 25 07:28:54 1995 Pat Rankin (rankin@eql.caltech.edu)
+
+ * Makefile.in (BC_ALL): Restore it from May 22 change; vms uses it.
+ (STAGESTUFF): Use it.
+
+Thu May 25 07:11:56 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * alpha.c (alpha_emit_set_const): Don't call expand_binop for
+ other than add if SImode and can't create pseudos.
+
+Wed May 24 21:38:24 1995 Jim Wilson <wilson@cygnus.com>
+
+ * sched.c (reemit_notes): New function.
+ (schedule_block): Call reemit_notes twice. Reorganize code for
+ handling SCHED_GROUP_P insns, so that reemit_notes works.
+
+ * sh/sh.c (shiftcosts, genshifty_op): Add SH3 support.
+ * sh/sh.md (ashlsi3, lshrsi3): Add SH3 support.
+ (ashlsi3_d, ashrsi3_d, lshrsi3_d): New patterns for SH3.
+ (ashrsi2_31): Remove r/!r constraint.
+
+Wed May 24 17:00:47 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * tree.c (type_list_equal): Call simple_cst_equal before checking
+ types.
+
+Wed May 24 16:49:49 1995 Douglas Rupp (drupp@cs.washington.edu)
+
+ * Makefile.in (libgcc2.a): Handle case of separate srcdir.
+
+Wed May 24 16:22:01 1995 Paul Eggert <eggert@twinsun.com>
+
+ * configure: Define $(MAKE) if `make' doesn't.
+
+Wed May 24 15:50:51 1995 Doug Evans <dje@cygnus.com>
+
+ * dsp16xx.h (CROSS_LINK_SPEC): ENDFILE_SPEC moved to -nostartfiles.
+ * i386/freebsd.h (LINK_SPEC): Don't pass "-e start" if nostartfiles
+ rather than nostdlib.
+ * i386/sun.h (LINK_SPEC): Likewise.
+ * m68k/sun2o4.h (LINK_SPEC): Likewise.
+ * m68k/sun3.h (LINK_SPEC): Likewise.
+ * m68k/vxm68k.h (LINK_SPEC): Likewise.
+ * mips/netbsd.h (LINK_SPEC): Likewise.
+ * config/netbsd.h (LINK_SPEC): Likewise.
+ * rs6000/mach.h (LINK_SPEC): Likewise.
+ * sparc.h (LINK_SPEC): Likewise.
+ * sparc/vxsparc.h (LINK_SPEC): Likewise.
+
+ * m88k/m88k.h (FUNCTION_ARG_BOUNDARY): Use GET_MODE_BITSIZE.
+
+Wed May 24 15:44:04 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * fold-const.c (fold): Make sure that a folded TRUTH_NOT_EXPR
+ retains the same type.
+
+ * c-common.c (truthvalue_conversion): Also accept TRUTH_NOT_EXPR.
+
+Wed May 24 15:41:51 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * cplus-dem.c (strstr, strncmp, strlen): Remove declarations.
+
+ * tree.c (type_list_equal, simple_cst_list_equal, index_type_equal):
+ Check for simple_cst_equal return value of -1.
+
+Wed May 24 10:05:24 1995 Michael Meissner <meissner@cygnus.com>
+
+ * libgcc1-test.c (start, _start): Provide declarations, so that
+ the GNU linker doesn't give a warning message about defaulting the
+ start address.
+
+ * rs6000/sysv4.h (STRIP_NAME_ENCODING): Redefine back to the
+ original defination, rather than the defination used in rs6000.h.
+ (ASM_OUTPUT_SOURCE_LINE): Use STRIP_NAME_ENCODING.
+ * rs6000.h (STRIP_NAME_ENCODING): Skip leading '*'.
+
+ * rs6000.h (MASK_STRING_SET, TARGET_STRING_SET): Add target
+ flags bit for whether -mstring was actually used.
+ (TARGET_SWITCHES): Add MASK_STRING to all power targets. Set
+ MASK_STRING_SET for -mstring and -mno-string.
+ (TARGET_DEFAULT): Add MASK_STRING.
+
+ * rs6000.c (rs6000_override_options): Add MASK_STRING to
+ all power targets. Make an explicit -mstring/-mno-string override
+ the -mcpu=processor default.
+
+ * rs6000/eabile.h (CPP_SPEC): Copy from sysvle.h to provide the
+ appropriate little endian defaults.
+
+ * rs6000/sysv4.h (ASM_OUTPUT_SOURCE_LINE): Use assemble_name to
+ output the canonical name.
+
+Wed May 24 01:21:15 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * rs6000.h (STRIP_NAME_ENCODING): Define.
+ (RS6000_OUTPUT_BASENAME): Use it.
+
+Tue May 23 19:54:21 1995 Doug Evans <dje@cygnus.com>
+
+ * gcc.c (link_command_spec): Move ENDFILE_SPEC from -nostdlib
+ to -nostartfiles.
+
+Tue May 23 17:01:50 1995 Jim Wilson <wilson@cygnus.com>
+
+ * alpha.md (negsi2-2): Change output pattern to #.
+
+ * mips.c (embedded_pic_offset): Output RTL to initialize
+ embedded_pic_fnaddr_rtx.
+ (mips_finalize_pic): Delete.
+ * mips.h (mips_finalize_pic): Delete declaration.
+ (FINALIZE_PIC): Delete.
+ (INIT_EXPANDERS): Clear embedded_pic_fnaddr_rtx.
+ * mips.md (get_fnaddr): Add = to output contraint.
+
+ * sh.c (shift_amounts): Correct entry for shifts by 29.
+ * sh.md (sett): New pattern.
+ (movsi_i): Change source constraint for move to T reg to be 'z'.
+
+ * mips/ecoff.h (STARTFILE_SPEC): Define to null string.
+ * mips/elfl.h, mips/elfl64.h: Correct typo in comment.
+
+ * mips/elflorion.h, mips/elforion.h (MIPS_CPU_DEFAULT): Delete.
+ * mips.c (override_options): Delete #ifdef MIPS_CPU_DEFAULT code.
+ Add #ifdef MIPS_CPU_DEFAULT_STRING code before the first
+ mips_cpu_string test.
+
+Tue May 23 07:22:36 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * romp.c (hash_rtx): Avoid warning on int-to-pointer conversion.
+ (output_fpops): Cast args to bcopy to char *.
+
+ * cpplib.c (initialize_builtins): Add missing parm to timestamp call.
+
+ * Makefile.in (install-libobjc): Don't depend on libobjc.a.
+
+ * c-parse.in: Objc shift/reduce conflicts now 48.
+ (parm): Use setspecs/restore here.
+ (parmlist_or_identifiers): Not here.
+
+Mon May 22 19:30:30 1995 Doug Evans <dje@cygnus.com>
+
+ * h8300.md (movsf_h8300h): Add missing post-inc case to constraints.
+
+Mon May 22 14:38:36 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.c (rs6000_override_options): Do SUBTARGET_OVERRIDE_OPTIONS
+ here.
+ * rs6000.h (OVERRIDE_OPTIONS): Not here.
+
+ * rs6000.c (expand_block_move): Handle moves without string
+ instructions by generating a series of loads and stores.
+ (output_prolog): Support -mno-toc on V.4 and eabi systems.
+
+ * rs6000/sysv4.h (TARGET_SWITCHES): Add -mtoc and -mno-toc.
+ (SUBTARGET_OVERRIDE_OPTIONS): Add some warnings for incompatible
+ switches.
+ (TOC_SECTION_FUNCTION): Make -mno-toc like -mrelocatable in that
+ we don't put the minimal toc pointer in the global toc section.
+ (LINK_SPEC): Use -oformat to set link output format, not -m.
+
+ * rs6000/t-eabigas (MULTILIB_OPTIONS, MULTILIB_DIRNAMES): Build
+ libgcc.a variants with -mno-toc support.
+ * rs6000/t-ppcgas (MULTILIB_OPTIONS, MULTILIB_DIRNAMES): Ditto.
+
+Mon May 22 07:10:52 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * cplus-dem.c (mystrstr): Replacement for strstr.
+
+ * configure: Split up long sed command.
+ * Makefile.in (SYMLINK): Deleted; unused.
+ (oldobjext): Deleted; no longer used.
+ (FLAGS_TO_PASS): Include objext and exeext.
+ (STAGESTUFF, protoize.o, unprotoize.o): Use $(objext), not .o.
+ (test_protoize_simple, compare{,3}, gnucompare{,3}): Likewise.
+ (STAGESTUFF, specs, gcc-cross, collect2): Add missing $(exeext).
+ (libgcc1.null, libgcc[12].a, stage[1-4]): Likewise.
+ (xgcc, cc1, cc1obj, enquire): Use $@ instead of filename for -o value.
+ (collect2, mips-tfile, mips-tdump, gen*): Likewise.
+ (bi-arity, bi-opcode, bi-opname, cccp, cppmain): Likewise.
+ (protoize, unprotoize, gen-protos, fix-header): Likewise.
+ (crtbegin.o, crtend.o): Don't use -o; move output to proper
+ filename (using objext) instead.
+ (BI_ALL, BC_ALL, bytecode): Deleted; unused.
+ (bi-*.o, cexp.o, stamp-{proto,fixinc}): Remove unneeded $(srcdir).
+ (getopt{,1}.o, SYSCALLS.c.X): Likewise.
+ (install-driver): New target.
+ (install-normal): Depend on it.
+ (install-common): Don't depend on xgcc.
+ (maketest): Deleted; no longer used.
+ (stage[1-4]): Use name collect-ld, not real-ld.
+ (risky-stage[1-4]): Use stage[1-4] as dependencies; don't copy.
+ * alpha/config-nt.bat, i386/config-nt.bat: Make {,h,t}config.h
+ and tm.h by writing a single #include line.
+ Update way specs.h and options.h are written.
+ * alpha/config-nt.sed, i386/config-nt.sed: Set new variables
+ into Makefile.
+ Build winnt.obj.
+ Edit CCCP definition.
+ * alpha/x-winnt, i386/x-winnt (oldobjext): Deleted.
+ Add rules for .c.obj, .adb.obj, and .ads.obj.
+ (LIB2FUNCS_EXTRA, spawnv.o): New rules.
+ * i386/x-winnt (objext): Now .obj, not .o.
+
+ * gcc.c (HAVE_OBJECT_SUFFIX): New macro.
+ (process_command): Convert x.o to x.foo for OBJECT_SUFFIX of ".foo".
+ (do_spec_1): Avoid shadow variable "i" and always use for loop var.
+
+ * c-decl.c (finish_decl_top_level): Removed; no longer used.
+ * objc-act.c: Numerous formatting changes.
+ (NULLT): Deleted; all uses changed to NULL_TREE.
+ (get_{static,object}_reference, objc_add_static_instance):
+ Use push_obstacks instead of saving obstacks manually.
+ (build_{selector,class}_reference_decl): Likewise.
+ (build_objc_string_decl, build_protocol_reference): Likewise.
+ (comp_{method,proto}_with_proto): Likewise.
+ (create_builtin_decl, synth_module_prologue): Set DECL_ARTIFICIAL
+ for internal objects.
+ (build_{selector,class}_reference_decl, add_objc_decls): Likewise.
+ (generate_objc_symtab_decl, build_module_descriptor): Likewise.
+ (build_protocol_reference): Likewise.
+ (build_objc_string_decl, synch_forward_declarations): Likewise.
+ Delete call to end_temporary_allocation.
+ (generate_static_references, generate_strings): Likewise.
+ (build_selector_translation_table, generate_category): Likewise.
+ (generate_{ivars,protocol}_list, build_protocol_reference): Likewise.
+ (build_objc_string_object): If next_runtime, put everything in
+ permanent obstack.
+ (objc_add_static_instance): Use build_decl instead of start_decl
+ and finish_decl_top_level.
+ (build_{class_reference,objc_string}_decl): Clear DECL_CONTEXT.
+ (start_class): Exit with FATAL_EXIT_CODE, not 1.
+ (add_objc_decls): Don't set DECL_IN_SYSTEM_HEADER.
+
+ * tree.c (valid_machine_attribute): Handle attribute on
+ pointer-to-function types.
+
+Sun May 21 17:16:37 1995 J. T. Conklin <jtc@cygnus.com>
+
+ * mips/netbsd.h (HAVE_STRERROR): Remove.
+ * mips/xm-netbsd.h: New file.
+ * mips/t-mips-netbsd: Deleted.
+ * configure (mips-dec-netbsd): Use xm-netbsd.h and t-libc-ok.
+
+Sun May 21 17:16:37 1995 Arne H. Juul (arnej@pvv.unit.no)
+
+ * mips/netbsd.h: Use __start as entry point. Ifdef some
+ paths on CROSS_COMPILE.
+
+Sun May 21 08:39:26 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-parse.in (datadef, fndef, ivar_decl, mydecls):
+ Restore declspec_stack since setspecs is used.
+ (parmlist_or_identifiers): Use setspecs before parsing parms
+ and restore after parsing parms.
+
+Sun May 21 01:04:52 1995 Jeffrey A. Law <law@snake.cs.utah.edu>
+
+ * pa.c (hppa_encode_label): New variable "permanent" to
+ where/how memory is allocated for the new label. All
+ callers changed.
+
+Sat May 20 16:53:30 1995 Mike Meissner <meissner@cygnus.com>
+
+ * rs6000.md (insv, extz): Fail if the structure is QI or HI reg to
+ avoid paradoxical subreg's being created in RTL phase, which uses
+ SImode to load from memory if structure is later moved to stack.
+
+Sat May 20 06:44:59 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k.md (udivmodhi4): Output "divu" instead of "divs".
+
+Sat May 20 06:11:32 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * reload.c (push_reload): Don't reload inside a SUBREG
+ when SUBREG_WORD is nonzero.
+
+ * c-decl.c (shadow_tag_warned): Don't warn about useless keyword
+ if in system header file.
+
+ * tree.c (simple_cst_equal): Don't look at language-specific
+ nodes since we don't know what's in them.
+
+ * cpperror.c: #include config.h before any other .h file.
+ * collect2.c: Likewise.
+
+ * i386/config-nt.bat: Add missing ^M on two lines.
+ Add case for Fortran; fix typo in Ada case.
+ * alpha/config-nt.bat: Add case for Fortran; fix typo in Ada case.
+
+ * m68k/t-next (LIBGCC1, CROSS_LIBGCC1): Make not, not "libgcc1.null".
+ (OTHER_FIXINCLUDES_DIRS, LIMITS_H_TEST): Delete from here.
+ * m68k/x-next (OTHER_FIXINCLUDES_DIR, LIMITS_H_TEST): Move to here.
+
+Fri May 19 19:30:20 1995 Stan Cox (gcc@dg-rtp.dg.com)
+
+ * crtstuff.c: Added reference to INIT_SECTION_PREAMBLE for systems that
+ do something which must be undone prior to __do_global_ctors.
+
+Fri May 19 19:27:08 1995 Alan Modra <alan@SPRI.Levels.UniSA.Edu.Au>
+
+ * i386/linux-aout.h (CPP_SPEC): Add defines for -fPIC.
+ * i386/linux-oldld.h (CPP_SPEC): Likewise.
+
+Fri May 19 17:46:28 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * collect2.c (strstr): Deleted.
+ * cplus-dem.c (strstr): Define ifndef POSIX.
+
+Fri May 19 11:16:51 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * cpplib.c (collect_expansion): Don't escape '@' inside string.
+
+Fri May 19 06:59:21 1995 Pat Rankin (rankin@eql.caltech.edu)
+
+ * vmsconfig.com (process_objc_lib, configure_makefile): New routines.
+ (bc_all.list, ./vax.md, objc-objs.opt, objc-hdrs.list): New files
+ created at config time.
+ (bc_all.opt, ./md.): No longer created.
+ * make-cc1.com: Handle revised filenames from vmsconfig.com;
+ (DO_OBJCLIB): New variable, plus code to compile objc/*.{c,m}.
+
+Wed May 17 16:15:31 1995 Torbjorn Granlund <tege@cygnus.com>
+
+ * i960.c (i960_output_ldconst): New code for XFmode.
+ Also, move SFmode code to immediately after DFmode code.
+ (S_MODES, D_MODES): Handle XFmode.
+ (XF_MODES): Was TF_MODES, handle XFmode instead of TFmode.
+ (hard_regno_mode_ok): Replace TFmode with XFmode.
+ (i960_output_long_double): New function.
+
+ * i960.h (DATA_ALIGNMENT): Define.
+ (ROUND_TYPE_ALIGN): Align XFmode scalars at 128 bit boundaries.
+ (ROUND_TYPE_SIZE): Round up the size of XFmode objects to 128 bits.
+ (CONST_DOUBLE_OK_FOR_LETTER_P): Use CONST0_RTX and CONST1_RTX
+ so that all FP modes are recognized.
+ (ASM_OUTPUT_LONG_DOUBLE): Define.
+
+ * i960.md: Change all TFmode patterns to have XFmode.
+ (movxf recognizer, frame version): Use movt, ldt, and stt.
+ (movxf recognizer, non-frame version): Delete.
+ (extenddfxf2): Delete * before f constraint.
+ (extendsfxf2): Likewise.
+
+Wed May 17 17:53:35 1995 Jim Wilson <wilson@mole.gnu.ai.mit.edu>
+
+ * unroll.c (unroll_loop): Increment copy_start_luid if copy_start
+ is loop_start.
+
+Wed May 17 17:44:57 1995 Lee Iverson <leei@Canada.AI.SRI.COM>
+
+ * fold-const.c (invert_truthvalue, case CLEANUP_POINT_EXPR): New case.
+
+Tue May 16 18:51:16 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/rs6000.h (TARGET_SWITCHES): Add -mstring to enable string
+ instructions, and -mno-string to disable them.
+ (MOVE_MAX): Don't test TARGET_MULTIPLE anymore.
+ (MAX_MOVE_MAX): Set to 8, not 16.
+ (expand_block_move): Add declaration.
+
+ * rs6000/rs6000.c (expand_block_move): New function to expand
+ block moves when -mstring is used.
+
+ * rs6000/rs6000.md (movti): Use TARGET_STRING, not TARGET_MULTIPLE.
+ (load_multiple, store_multiple): Ditto.
+ (string insns): Add 8, 6, 4, 2, and 1 register variants for using
+ the native string instructions if -mstring.
+
+ * rs6000/sysv4.h (CPP_SPEC): If little endian, define
+ _LITTLE_ENDIAN and set littleendian assertion. If big endian,
+ define _BIG_ENDIAN and set bigendian assertion.
+ * rs6000/sysv4le.h (CPP_SPEC): Copy from sysv4.h, and change
+ default to little endian.
+
+ * rs6000/rs6000.c (override_options): Check for -mmultiple and
+ -mstring on little endian systems here.
+ * rs6000/sysv4.h (SUBTARGET_OVERRIDE_OPTIONS): Don't do the check
+ here.
+
+Tue May 16 18:36:41 1995 Douglas Rupp (drupp@cs.washington.edu)
+
+ * alpha.c: Changed WINNT to _WIN32.
+ * alpha/config-nt.bat, i386/config-nt.bat: Added commands to
+ generate specs.h and options.h.
+ * i386/config-nt.sed: Changed link32 to link.
+ * winnt/ld.c (main): Removed call to free.
+ * configure.bat: Added line to echo usage on invalid input.
+ * gcc.c (fix_argv): Removed call to free.
+ * gcc.c, getpwd.c, protoize.c, sdbout.c: Changed WINNT to _WIN32.
+ * toplev.c: Likewise.
+
+Tue May 16 18:04:47 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * toplev.c (pfatal_with_name, fatal_io_error, vfatal):
+ Use FATAL_EXIT_CODE instead of magic number.
+ * cccp.c, cpplib.c, cpplib.h: Use FATAL_EXIT_CODE instead
+ of FAILURE_EXIT_CODE.
+ * fix-header.c, gen-protos.c: Likewise.
+ * cpperror.c, cppmain.c: Likewise.
+ Include config.h #ifndef EMACS.
+ * xm-alpha.h, xm-rs6000.h, xm-vms.h (FAILURE_EXIT_CODE): Remove.
+
+Tue May 16 17:46:57 1995 Adam Fedor <fedor@colorado.edu>
+
+ * objc/archive.c (__objc_write_class): Write class version.
+ (__objc_write_selector, objc_{write,read}_selector): Handle null
+ selector.
+
+ * objc/sarray.h (struct sarray): Make capacity size_t.
+ * objc/sarray.c (sarray_realloc): Make array index variables size_t.
+
+Tue May 16 06:59:08 1995 Paul Eggert <eggert@twinsun.com>
+
+ * dsp16xx.c (print_operand_address): Fix misspellings in messages.
+ * i370/mvs.h (FUNCTION_PROFILER): Likewise.
+ * mips-tdump.c (type_to_string): Likewise.
+ * print-tree.c (print_node): Likewise.
+
+ * protoize.c (edit_fn_definition): Fix mispelled local `have_flotsam'.
+
+ * objc/sendmsg.c (__objc_init_install_dtable): Fix misspelling
+ in name of local label `already_initialized'.
+
+ * winnt/winnt.h (STDC_VALUE): Was misspelled.
+
+ * m68k/ccur-GAS.h (FUNCTION_BOUNDARY): Was misspelled.
+
+ * 1750a.h (DEFAULT_PCC_STRUCT_RETURN): Was misspelled.
+
+Mon May 15 23:41:25 1995 Jeffrey A. Law <law@snake.cs.utah.edu>
+
+ * pa.h (ASM_OUTPUT_EXTERNAL_LIBCALL): Make sure to encode section
+ info for all libcalls.
+
+Mon May 15 20:58:00 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * collect2.c (strstr): Define ifndef POSIX.
+
+ * defaults.h (SUPPORTS_WEAK): Provide default.
+ * aoutos.h, sparc/sunos4.h: Don't support weak symbols.
+ * netbsd.h, svr4.h, i386/freebsd.h, i386/osfrose.h,
+ m88k/m88k.h: Define ASM_WEAKEN_LABEL instead of WEAK_ASM_OP.
+ * c-pragma.h: Check ASM_WEAKEN_LABEL instead of WEAK_ASM_OP.
+ HANDLE_PRAGMA_WEAK is never defined in a tm.h file.
+ * c-decl.c (duplicate_decls): Propagate DECL_WEAK.
+ * tree.h (DECL_WEAK): New macro.
+ (tree_decl): Add weak_flag.
+ * varasm.c (assemble_start_function): Declare the symbol weak if
+ appropriate.
+ (assemble_variable): Ditto.
+ (assemble_alias): Ditto. Mark the decl as written.
+ (declare_weak): Check for weak declaration after definition.
+ Set DECL_WEAK.
+ (weak_finish): Use ASM_WEAKEN_LABEL.
+ * libgcc2.c: The C++ free-store management functions are weak
+ aliases on targets that always support them.
+
+Mon May 15 19:01:43 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * configure (out_object_file): New variable; put value in Makefile.
+ * Makefile.in (out_object_file): Use in place of aux-output.o.
+
+ * fold-const.c (const_binop): Don't pass OVERFLOW to force_fit_type
+ if type is unsigned.
+
+Mon May 15 18:48:26 1995 Paul Eggert <eggert@twinsun.com>
+
+ * install.sh (transformbasename): Fix misspelling.
+
+ * tahoe.h (CHECK_FLOAT_VALUE): Fix misspelling of OVERFLOW parameter.
+
+ * i386.h (VALID_MACHINE_{DECL,TYPE_ATTRIBUTE): Fix typo.
+
+ * fx80.h (CHECK_FLOAT_VALUE): Fix misspelled use of parameter.
+
+ * a29k.c (spec_reg_operand): Fix misspelling of `default:'.
+
+Mon May 15 18:36:41 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k.md (b{eq,ne,ge,lt}0_di): Fixed for non-MOTOROLA syntax.
+ * m68k/xm-mot3300.h (alloca): Extern decl added for non-GNU compiler.
+
+Mon May 15 13:14:29 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * cppexp.c (cpp_reader): Test for '#' (start of assertion) *after*
+ skipping hspace, not before.
+
+Mon May 15 08:13:54 1995 Pat Rankin (rankin@eql.caltech.edu)
+
+ * vmsconfig.com: Construct options.h and specs.h to #include
+ all "*/lang-{options|specs}.h" files found.
+
+Sun May 14 21:32:49 1995 Doug Evans <dje@cygnus.com>
+
+ * alpha/alpha.md (movsicc, case NE): Don't generate unrecognizable
+ insn.
+ (movdicc, case NE): Likewise.
+
+Sun May 14 15:44:54 1995 Jim Wilson <wilson@mole.gnu.ai.mit.edu>
+
+ * unroll.c (unroll_loop): Make local_regno have size
+ max_reg_before_loop. Don't do local register optimization if
+ copy_end has no INSN_LUID.
+
+Sun May 14 10:38:23 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * objc-act.c (start_method_def): Mark _self as possibly unused.
+
+ * configure: Create specs.h and options.h from */lang-specs.h
+ and */lang-options.h.
+ Set lang_specs_files and lang_options_file variables in Makefile.
+ * Makefile.in (lang_{specs,options}_files): New variables.
+ (gcc.o): Depends on $(lang_specs_files).
+ (toplev.o): Depends on $(lang_options_file); merge two dep lists.
+ (distclean): Remove spes.h and options.
+ * gcc.c (default_compilers): Remove entries for Ada, C++, Chill,
+ and Fortran; #include specs.h instead.
+ * toplev.c (lang_options): Remove entries for Ada, C++, and Fortran;
+ include options.h instead.
+
+Sat May 13 23:11:21 1995 DJ Delorie <dj@delorie.com>
+
+ * configure (i[345]86-go32-msdos, i[345]86-*-go32): New targets.
+
+Sat May 13 10:58:38 1995 Jim Wilson <wilson@cygnus.com>
+
+ * loop.c (record_giv): When computing replaceable, use
+ back_branch_in_range_p instead of looking for branches to named
+ labels.
+ * loop.h (back_branch_in_range_p): Declare.
+ * unroll.c (back_branch_in_range_p): No longer static.
+
+Sat May 13 06:47:11 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * combine.c (simplify_shift_count, case LSHIFTRT): Don't merge
+ shifts of different modes if first is any right shift.
+
+Sat May 13 05:39:09 1995 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * configure (arm-semi-aout): New configuration.
+ * config.sub: Add support for semi-hosted ARM.
+ * arm/t-semi, arm/semi.h: New files.
+
+Fri May 12 21:51:22 1995 Doug Evans <dje@cygnus.com>
+
+ * flow.c (find_basic_blocks): Only perform n_basic_blocks sanity
+ check on first pass, and on second pass ensure it has the correct
+ value.
+
+Fri May 12 19:23:11 1995 Jim Wilson <wilson@cygnus.com>
+
+ * c-typeck.c (build_binary_op): Warn when ~unsigned is compared
+ against unsigned, and type promotions result in an unexpected
+ answer.
+
+Fri May 12 19:10:21 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * configure (*-*-gnu*): Always use ELF; set tm_file=${cpu_type}/gnu.h.
+ * config/i386/gnu.h: Contents replaced with old i386/gnuelf.h.
+ * config/i386/gnuelf.h: File removed.
+
+Fri May 12 17:29:57 1995 Ken Raeburn (raeburn@cygnus.com)
+
+ * m68k/lb1sf68.asm (__IMMEDIATE_PREFIX__): Default to #.
+ (IMM): New macro.
+ (all code): Use IMM macro instead of hardcoding # for immediate
+ operands.
+
+Fri May 12 16:52:10 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * m68k.c (output_scc_di): New function.
+ (extend_operator) : Allow DImode target.
+ * m68k.h (HARD_REGNO_MODE_OK): Don't allow d7/a0 as DImode reg pair.
+ * m68k.md (tstdi, cmpdi, addsi_lshrsi_31, ashldi_extsi): New patterns.
+ (extendqidi2, extendhidi2, extendsidi2): Allow "general_operand"
+ instead of "register_operand" 0.
+ (adddid_sexthishl32, subdid_sexthishl32, subdi_dishl32): Likewise.
+ (adddi_dilshr32): Operand 0 constraint changed from "ro" to "do";
+ Code generation fixed.
+ (adddi_mem, subdi_mem): Fixed for "<" and ">" operand 0.
+ (adddi3, subdi3): Operand 2 constraint changed from "ao" to "*ao"
+ (ashldi_sexthi, ashrdi_const32): Allow only "register_operand"
+ instead of "general_operand" 0.
+ (ash[lr]di_const, ash[lr]di3): Allow also 8 and 16 as shift count.
+ (subreg1ashrdi_const32): Pattern deleted.
+ (subreghi1ashrdi_const32, subregsi1ashrdi_const32): New pattern.
+ (lshrsi_31): New implementation.
+ (scc0_di, scc_di, beq0_di, bne0_di, bge0_di, blt0_di): New patterns.
+
+Fri May 12 16:50:49 1995 Jeffrey A. Law <law@mole.gnu.ai.mit.edu>
+
+ * pa.md (bb patterns): Fix bugs in length computation exposed by
+ recent branch shortening and genattrtab changes.
+
+Fri May 12 16:22:27 1995 Ken Raeburn <raeburn@cygnus.com>
+
+ * cccp.c (enum node_type): Add T_IMMEDIATE_PREFIX_TYPE.
+ (special_symbol): Handle it; emit value of IMMEDIATE_PREFIX.
+ (IMMEDIATE_PREFIX): Default to empty string.
+ (initialize_builtins): Install __IMMEDIATE_PREFIX__ builtin,
+ parallel to __REGISTER_PREFIX__.
+
+Fri May 12 14:40:03 1995 Pat Rankin (rankin@eql.caltech.edu)
+
+ * cccp.c: #if VMS, don't define `stat' macro to be VMS_stat.
+ Compare enums explicitly to 0 to work around VAX C bug.
+ (do_include): Cast alloca's value.
+
+ * make-cc1.com (bc_loop): Process comma-separated list rather
+ than space-separated one; restore .h suffix stripped by vmsconfig;
+ (loop1): More robust handling of directory prefix on file names.
+ * vmsconfig.com (TPU makefile.in): Reorganize and reformat code.
+ Make generated .opt files have more consistent format (all comma
+ separated, excess whitespace eliminated);
+ (additional_compiler): New routine.
+ (process_makefile): Use it to handle cc1plus via cp/Make-lang.in.
+
+Fri May 12 13:35:07 1995 Doug Evans <dje@cygnus.com>
+
+ * arm.h: Replace ARM_REG_PREFIX with REGISTER_PREFIX.
+ Replace ARM_COMMENT_CHAR with ASM_COMMENT_START.
+ (REGISTER_PREFIX): Define.
+ (USER_LABEL_PREFIX, LOCAL_LABEL_PREFIX): Define.
+ (SECONDARY_OUTPUT_RELOAD_CLASS): Handle DFmodes only if
+ TARGET_HARD_FLOAT.
+ (PREDICATE_CODES): Add soft_df_operand.
+ * arm.c: Replace ARM_REG_PREFIX with REGISTER_PREFIX.
+ Replace ARM_COMMENT_CHAR with ASM_COMMENT_START.
+ (arm_asm_output_label): Use USER_LABEL_PREFIX.
+ (soft_df_operand): New function.
+ * arm.md (movsicc): New pattern.
+ (movsfcc, movdfcc, *movsicc_insn, *movsfcc_hard_insn): Likewise.
+ (*movsfcc_soft_insn, *movdfcc_insn): Likewise.
+ (*movdf_soft_insn): Rewrite.
+ (movsi matcher): Fix typo in type attribute.
+
+Fri May 12 10:25:40 1995 Michael Meissner (meissner@cygnus.com)
+
+ * i386.h (TARGET_RTD): Use MASK_RTD, not MASK_REGPARM.
+ (TARGET_SWITCHES): Add -m{,no-}align-double switch.
+ (TARGET_OPTIONS): Add -mregparm= switch to set number of registers
+ to use for passing arguments. Add -malign-loops= switch to set
+ the alignment for loops. Add -malign-jumps= switch to set the
+ alignment for code that is jumped to. Add -malign-functions=
+ switch to set the initial alignment of functions.
+ (TARGET_REGPARM): Delete, in favor of -mregparm=
+ (TARGET_SWITCHES): Delete -mregparm, add -mdebug-arg switches.
+ (RETURN_POPS_ARGS): Call i386_return_pops_args to do the real work.
+ (VALID_MACHINE_DECL_ATTRIBUTE): Define as function call.
+ (VALID_MACHINE_TYPE_ATTRIBUTE): Define as function call.
+ (COMP_TYPE_ATTRIBUTES): Define as function call.
+ (REGPARM_MAX): Maximum number of regs to use for passing arguments.
+ (CUMULATIVE_ARGS): Make this a structure, not an int.
+ (INIT_CUMULATIVE_ARGS, FUNCTION_ARG{,_ADVANCE}): Call function.
+ (FUNCTION_ARG_PARTIAL_NREGS): Likewise.
+ (MAX_CODE_ALIGN): Maximum value to align loops/jumps to.
+ (BIGGEST_ALIGNMENT): Return 64 if -malign-double, 32 otherwise.
+ (ASM_OUTPUT_ALIGN_CODE): Use value of -malign-jumps= switch.
+ (ASM_OUTPUT_LOOP_ALIGN): Use value of -malign-loops= switch.
+ (toplevel): Declare all new functions and external variables added
+ in i386.c.
+
+ * i386.c (i386_regparm_string, i386_regparm): New variables
+ for -mregparm= switch to set the number of registers to use for
+ passing arguments.
+ (i386_align_loops_string, i386_align_loops): New variables for
+ -malign-loops= switch to set alignment to use for loops.
+ (i386_align_jumps_string, i386_align_jumps): New variables for
+ -malign-jumps= switch to set alignment to use for labels that are
+ jumped to.
+ (override_options): Support new switches.
+ (i386_valid_decl_attribute_p): New function to validate decl
+ specific attributes. Presently returns 0.
+ (i386_valid_type_attribute_p): New function to validate type
+ specific attributes. Recognize "stdcall", which says function
+ with fixed numbers of arguments is responsible for popping stack,
+ "cdecl", which says to use the normal C calling sequence, even if
+ -mrtd is used, and "regparm", which specifies the number of
+ registers to use for passing arguments.
+ (i386_comp_type_attributes): New function, to validate whether
+ attributes are compatible.
+ (i386_return_pops_args): New function, to return whether or not
+ the function pops its argument list or not, taking into account
+ -mrtd, and the stdcall/cdecl attributes.
+ (init_cumulative_args): Rewrite as a function, taking variable
+ argument functions, and regparm support into account.
+ (function_arg{,_advance,_partial_nreg}): Likewise.
+ (print_operand): Support %J, to print appropriate jump insn.
+
+ * i386.md (decrement_and_branch_until_zero): Define pattern,
+ so that loops that count down to zero, don't have an unneeded
+ compare after the decrement. Add a general insn recognizer for
+ add to a value and compare against zero.
+
+ * i386/go32.h, i386/winnt.h (VALID_MACHINE_DECL_ATTRIBUTE):
+ Delete, code folded into the mainline.
+ (RETURN_POPS_ARGS): Likewise.
+
+ * i386/winnt.h (ENCODE_SECTION_INFO): The stdcall attribute is now
+ stored on the type field, rather than the decl.
+
+ * i386/gas.h (ASM_OUTPUT_ALIGN_CODE, ASM_OUTPUT_LOOP_ALIGN): Use
+ i386_align_{loops,jumps} variables to do alignment.
+ * i386/osfrose.h, i386/svr3dbx.h: Likewise.
+
+Fri May 12 12:48:19 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * stor-layout.c (layout_type, case ARRAY_TYPE): Compute length using
+ MAX of length and zero if sizetype signed and neither bound constant.
+
+ * i386/gnuelf.h, i386/linux-oldld.h, i386/lynx-ng.h, i386/v3gas.h:
+ Use <...> in #include instead of "...".
+ * m68k/lynx-ng.h, sparc/lynx-ng.h: Likewise.
+
+ * c-parse.in (myparm): Handle attributes.
+ * objc-act.c (unused_list): New variable.
+ (build_tmp_function_decl): Call push_parm_decl with new format.
+ (start_class): Initialize unused_list.
+ (start_method_def): Call push_parm_decl with new format and
+ mark _cmp as possibly unused.
+
+ * combine.c (simplify_shift_const): Don't change SHIFT_MODE
+ for LSHIFTRT either.
+
+ * unroll.c (unroll_loop): Don't move reg if used in copy_end and
+ that is a JUMP_INSN.
+
+Fri May 12 12:31:37 1995 Doug Evans <dje@cygnus.com>
+
+ * arm/lib1funcs.asm: New file.
+
+Fri May 12 11:52:03 1995 Kung Hsu <kung@cygnus.com>
+
+ * configure (a29k-*-vxworks*): New target.
+ * config.sub (vxworks29k): New alias.
+ * a29k/t-vx29k: New file.
+ * a29k/vx29k.h: New file.
+
+Fri May 12 11:17:28 1995 Jim Wilson <wilson@mole.gnu.ai.mit.edu>
+
+ * loop.c (check_dbra_loop): When reversing loop when
+ no_use_except_counting is false, there must be only one biv.
+
+Fri May 12 07:10:00 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * unroll.c (unroll_loop): Only use local_regno for pseudos.
+
+ * genattrtab.c (write_test_expr, case MATCH_DUP): Use operands[N]
+ instead of JUMP_LABEL (which may not be set).
+ (walk_attr_value, case MATCH_DUP): Set must_extract.
+
+ * c-parse.in: Adjust number of shift/reduce conflicts.
+ (parm): Support attributes.
+ * c-decl.c (push_parm_decl): Pass any attributes to decl_attributes.
+
+Fri May 12 00:36:26 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * cpplib.c (skip_quoted_string): Removed - no longer needed.
+ (skip_if_group): Use cpp_get_token instead of skip_quoted_string.
+
+ * cpplib.h (struct cpp_reader): Remove start_line field.
+ Add multiline_string_line field.
+
+ * cpplib.c (cpp_error_with_line, cpp_warning_with_line,
+ cpp_pedwarn_with_line): Take extra column number parameter.
+ (macroexpand, cpp_get_token): Fix reporting of unterminated strings.
+ (line_for_error): Removed - no longer needed.
+
+Fri May 12 02:21:34 1995 Jim Wilson <wilson@cygnus.com>
+
+ * mips/svr4-t.h (MD_STARTFILE_PREFIX, MD_EXEC_PREFIX,
+ STARTFILE_SPEC, LINK_SPEC): Define.
+ * configure (mips-tandem-sysv4): Use t-mips not t-svr4.
+
+Thu May 11 19:18:54 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * cpplib.c (line_for_error): Make it work; add extra parameter.
+ (skip_quoted_string, cpp_get_token): Update calls to line_for_error.
+ (macroexpand): Remember initial line so we can report it if the
+ call is unterminated. Also, simplify error logic slightly.
+ (do_include): Cast alloca return value, to avoid pcc warning.
+
+ * cppexp.c (parse_number): Cleanup some Cygnus crud for MPW.
+
+Thu May 11 21:35:23 1995 Torbjorn Granlund <tege@cygnus.com>
+
+ From Moshier:
+ * i960.c (i960_output_ldconst): Let split_double handle DImode.
+ (i960_print_operand): Use REAL_VALUE_TO_DECIMAL for decimal strings.
+ (i960_output_double, i960_output_float): Likewise; also change arg
+ VALUE from `double' to `REAL_VALUE_TYPE'.
+
+Thu May 11 21:09:25 1995 Per Bothner (bothner@wombat.gnu.ai.mit.edu)
+
+ * cpperror.c (cpp_print_containing_files): Remove some
+ Cygnus-local stuff.
+
+Thu May 11 21:06:47 1995 Doug Evans <dje@canuck.cygnus.com>
+
+ * gcc.c (link_command_spec): Make -nostdlib no longer imply
+ -nostartfiles.
+
+Thu May 11 18:48:57 1995 Paul Eggert <eggert@twinsun.com>
+
+ * c-common.c (convert_and_check): Don't diagnose overflow in constant
+ expression merely because conversion overflowed.
+
+Thu May 11 18:43:59 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-decl.c (grokdeclarator): Use PARM_FLAG to see if should
+ make PARM_DECL.
+ * c-parse.in (nested_function, notype_nested_function):
+ Allow old-style arg definitions (use xdecls).
+
+ * c-decl.c (finish_struct): Properly update DECL_PACKED.
+
+Thu May 11 15:24:15 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * fold-const.c (fold): Also fold CLEANUP_POINT_EXPRs into
+ TRUTH_*_EXPRs and into the first operand.
+ (operand_equal_for_comparison_p): Also make sure the second operand
+ is integral.
+
+Thu May 11 14:22:03 1995 Ted Lemon <mellon@toccata.fugue.com>
+
+ * config/mips/netbsd.h: New file.
+ * config/mips/t-mips-netbsd: New file.
+ * config/mips/x-netbsd: New file.
+
+ * configure (mips-dec-netbsd*): Add entry.
+
+ * mips.h (LOCAL_LABEL_PREFIX, USER_LABEL_PREFIX): Define.
+ (PUT_SDB_BLOCK_START, PUT_SDB_BLOCK_END, ASM_OUTPUT_LABEL_REF,
+ ASM_OUTPUT_INTERNAL_LABEL, ASM_GENERATE_INTERNAL_LABEL,
+ ASM_OUTPUT_ADDR_VEC_ELT, ASM_OUTPUT_ADDR_DIFF_ELT): Use them.
+
+ * mips.c (mips_output_lineno): Use LOCAL_LABEL_PREFIX.
+
+Thu May 11 14:22:03 1995 Stan Cox (gcc@dg-rtp.dg.com)
+
+ * dwarfout.c (output_decl): Don't output DIE for struct or union type
+ with no name or with ERROR_MARK for the fields.
+
+Thu May 11 06:36:34 1995 Michael Meissner (meissner@cygnus.com)
+
+ * flow.c (mark_used_regs): If a SUBREG does not have a REG in the
+ SUBREG_REG position, recursively call mark_used_regs, instead of
+ segfaulting.
+
+Thu May 11 06:44:34 1995 Pat Rankin (rankin@eql.caltech.edu)
+
+ * expr.c (do_jump, case EQ_EXPR, NE_EXPR): Fix typo for complex.
+
+Wed May 10 12:34:46 1995 Michael Meissner <meissner@cygnus.com>
+
+ * configure: Add support for the little endian variant of the
+ PowerPC System V.4 and Eabi targets. If the GNU assembler was not
+ specified, don't build libgcc.a variants on the PowerPC systems
+ that use -mrelocatable, -mlittle, and -mbig.
+
+ * genmultilib: For MULTILIB_MATCHES arguments, map question marks
+ into equal signs after spliting the left and right side of
+ equivalent options, to all support for options like: -mcpu=403.
+
+ * rs6000/rs6000.md (rs6000_immed_double_const): New function that
+ is like immed_double_const, except that it reverses the two words
+ in the constant if the target is little endian.
+
+ * rs6000/rs6000.md (floatsidf2): Use rs6000_immed_double_const,
+ not immed_double_const.
+ (floatunssidf2): Ditto.
+
+ * rs6000/rs6000.h: Add declarations for all functions in rs6000.c.
+
+ * rs6000/sysv4.h (TARGET_SWITCHES): Add -mlittle, -mlittle-endian,
+ -mbig, and -mbig-endian for bi-endian support.
+ (ASM_SPEC): Pass -mlittle/-mbig to the assembler if it was passed
+ to us.
+ (LINK_SPEC): If explicit little or big endian support was
+ requested, tell the GNU linker to use the appropriate target
+ format.
+
+ * rs6000/t-eabi (MULTILIB_*): Build libgcc.a variants for software
+ floating point. Remove mrelocatable libgcc.a variant.
+
+ * rs6000/t-eabigas: New file, cloned from t-eabi. Build
+ mrelocatable libgcc.a variant in addition to the other variants.
+
+ * rs6000/t-ppc: New file, for PowerPC System V.4 support without
+ the GNU assembler.
+
+ * rs6000/t-ppcgas: New file, for PowerPC System V.4 support with
+ the GNU assembler.
+
+ * rs6000/eabile.h: New file, little endian eabi config file.
+ * rs6000/sysv4le.h: New file, little endian V.4 config file.
+
+Wed May 10 14:22:28 1995 Doug Evans <dje@cygnus.com>
+
+ * libgcc1-test.c (main_without__main): Renamed from `main'.
+ * Makefile.in (libgcc1-test): Tell the user to ignore warnings.
+
+ * configure: Support --enable-foo, --disable-foo.
+
+Wed May 10 10:34:00 1995 Lee Iverson <leei@Canada.AI.SRI.COM>
+
+ * unroll.c: Add declarations of static functions.
+ (unroll_loop): Renumber regs local to loop for each unrolled iteration.
+
+Wed May 10 08:27:03 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * alpha.c (alpha_set_emit_const): Cleanups to work properly
+ when run on 32-bit host.
+
+ * configure: Instead of symlinking tm.h and {h,t,}config.h,
+ make them files that #include the proper file; pass to Makefile.
+ Pass out_file and md_file to Makefile instead of making symlinks.
+ * Makefile.in (out_file, md_file, tm_file, {build,host}_xm_file):
+ New symbols, to be overridden by configure.
+ (insn-*): Use $(md_file), not md.
+ (aux-output.o): Use $(out_file), not aux-output.c.
+ ($(MD_FILE)): Rework to use new conventions.
+ (gen*.o, bi-*.o): Depend on $(build_xm_file), not hconfig.h.
+ (scan.o, fix-header.o, scan-decls.o): Likewise.
+ (distclean): Adjust files removed for new convention.
+
+Tue May 9 19:26:42 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * rs6000/rs6000.h (LIBGCC_SPEC): Do link with libgcc when -shared.
+
+ * Makefile.in (STAGESTUFF): Add underscore.c.
+ (underscore.c): Rename temporary files to begin with 'tmp-' so that
+ they will be removed by 'make mostlyclean'.
+
+Tue May 9 19:19:55 1995 Mike Stump <mrs@cygnus.com>
+
+ * toplev.c (lang_options): Add new flag -ffor-scope.
+
+Tue May 9 19:11:47 1995 Lee Iverson (leei@ai.sri.com)
+
+ * objc/init.c (objc_init_statics): Fix missing part of last change.
+
+Tue May 9 18:25:34 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * i386/gnu.h, i386/linux.h, i386/linux-aout.h, i386/lynx.h:
+ Use <...> in #include instead of "..." to avoid recursion.
+ * i386/netbsd.h, i386/xm-gnu.h, i386/xm-linux.h: Likewise.
+ * i386/xm-lynx.h, i386/xm-freebsd.h, i386/xm-netbsd.h: Likewise.
+ * m68k/lynx.h, m68k/netbsd.h, m68k/xm-lynx.h: Likewise.
+ * m68k/xm-netbsd.h, mips/gnu.h, ns32k/netbsd.h: Likewise.
+ * ns32k/xm-netbsd.h, rs6000/lynx.h, rs6000/xm-lynx.h: Likewise.
+ * sparc/lynx.h, sparc/netbsd.h, sparc/xm-lynx.h: Likewise.
+ * sparc/xm-netbsd.h, vax/netbsd.h, vax/xm-netbsd.h: Likewise.
+
+Tue May 9 15:52:05 1995 Michael Meissner <meissner@cygnus.com>
+
+ * config.sub: Recognize powerpcle as the little endian variant of
+ the PowerPC. Recgonize ppc as a PowerPC variant, and ppcle as a
+ powerpcle variant. Convert pentium into i586, not i486. Add p5
+ alias for i586. Map new x86 variants p6, k5, nexgen into i586
+ temporarily.
+
+Tue May 9 15:43:27 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * rs6000/rs6000.h (LINK_SPEC, LIB_SPEC): Don't mess with libg
+ if -shared.
+ * rs6000/aix41ppc.h (LINK_SPEC): Ditto.
+
+ * rs6000/powerpc.h: Don't emit .extern directives.
+
+Tue May 9 14:08:09 1995 Jim Wilson <wilson@cygnus.com>
+
+ * sh/lib1funcs.asm (__ashrsi3, __ashlsi3, __lshrsi3): Use .byte
+ instead of .word offsets in switch table.
+
+Tue May 9 11:44:47 1995 Jeremy Bettis <jbettis@cse.unl.edu>
+
+ * objc/sendmsg.c (__objc_send_initialize): Call superclass if object
+ does not implement +initialize.
+
+Tue May 9 02:44:16 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * rs6000/xm-rs6000.h (COLLECT_EXPORT_LIST): Define if not
+ cross-compiling.
+ * rs6000/xm-mach.h: #undef COLLECT_EXPORT_LIST.
+ * rs6000/rs6000.h (COLLECT_SCAN_OBJECTS): Lose.
+
+ * collect2.c (collect_exit): Unlink export_file.
+ (prefix_from_string): Broken out from prefix_from_env.
+ (prefix_from_env): Call it.
+ (main): Under AIX, recognize -bE: and -bexport:, and don't
+ automatically export everything if we see one. Otherwise, scan the
+ objects individually and add all their symbols to an export file to be
+ passed to the linker.
+ (write_export_file): New function.
+ (scan_prog_file): Ignore symbols starting with '.'
+
+ * c-common.c (declare_hidden_char_array): Mark decl artificial.
+
+Mon May 8 18:13:57 1995 Adam Fedor <fedor@colorado.edu>
+
+ * objc/init.c (_objc_load_callback): Add declaration.
+ (__objc_exec_class): Call _objc_load_callback after every Class
+ or Category is added.
+ * objc/objc-api.h (_objc_load_callback): Add declaration.
+
+Mon May 8 17:56:28 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (expand_expr, case INDIRECT_REF): Set RTX_UNCHANGING_P
+ if both TREE_READONLY and TREE_STATIC set.
+
+ * c-typeck.c (convert_for_assignment): Don't give errors about
+ adding const or volatile unless both sides point to functions.
+
+Mon May 8 11:48:23 1995 Michael Meissner <meissner@cygnus.com>
+
+ * configure: If ../ld/Makefile, symlink ../ld/ld.new to collect-ld,
+ not real-ld. Don't test for $use_collect2 any more.
+
+Sun May 7 17:52:23 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * calls.c (expand_call): Improve -Winline warnings.
+
+Sun May 7 17:28:27 1995 DJ Delorie (dj@delorie.com)
+
+ * configure.bat: Use "go32" instead of "msdos" for future expansion.
+
+ * i386/go32.h: Add support for win32's stdcall functions.
+
+ * configure.bat: Add ^M to end of each line.
+ * i386/config-nt.bat, alpha/config-nt.bat: Likewise.
+
+Sun May 7 02:12:26 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * tree.h (DECL_ARTIFICIAL): New macro.
+
+ * function.c (expand_function_end): Don't warn about unused
+ anonymous or artificial parms.
+
+Fri May 5 18:41:22 1995 Jim Meyering (meyering@comco.com)
+
+ * configure: Fix typo in name of "maintainer-clean".
+
+Fri May 5 14:58:01 1995 Jeffrey A. Law <law@snake.cs.utah.edu>
+
+ * pa.c (emit_move_sequence): Force problematical constants
+ into memory during the reload pass when generating PIC.
+
+Fri May 5 13:30:33 1995 Doug Evans <dje@cygnus.com>
+
+ * objc/NXConstStr.m: NXConstantString.h renamed to NXConststr.h.
+
+Fri May 5 07:10:15 1995 Stephen L Moshier (moshier@world.std.com)
+
+ * real.c (emdnorm, toe64, etoe64): Significand of Intel long double
+ denormals is shifted down one bit.
+
+Fri May 5 07:04:12 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-typeck.c (process_init_element): Don't clear_momentary if
+ constructor_stack is not empty.
+
+ * objc/Makefile (SHELL): Now /bin/sh.
+
+ * c-typeck.c (build_binary_op): Also warn about ordered
+ comparison of pointer with zero if -Wall.
+
+ * expr.c (do_jump, case EQ_EXPR, NE_EXPR): Properly compare complex.
+
+Thu May 4 18:01:25 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * objc/Makefile: NXConstantString renamed to NXConstStr.
+ * objc/NXConstStr.m: Renamed from objc/NXConstantString.m.
+ * objc/NXConstStr.h: Renamed from objc/NXConstantString.h.
+
+Thu May 4 17:38:21 1995 J.T. Conklin <jtc@netbsd.org>
+
+ * configure (vax-*-netbsd*): New configuration.
+ * vax/netbsd.h, vax/xm-netbsd.h: New files.
+
+Thu May 4 16:39:05 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * collect2.c (main): Add check for 'collect-ld', just like
+ 'real-ld', except that old versions won't be looking for it in the
+ path. Don't look for 'real-ld' in the path anymore. Sigh.
+
+ * collect2.c: #include demangle.h and obstack.h.
+ (obstack_chunk_alloc): Define.
+ (obstack_chunk_free): Define.
+ (generic): Don't define. Don't use.
+ (main): Initialize obstacks and demangling.
+
+ * collect2.c (dump_file): Adjust space padding in output to
+ maintain tabulation with Solaris ld. Don't demangle if the
+ environment variable COLLECT_NO_DEMANGLE is set.
+
+ * collect2.c (main): Redirect the output of the first link and
+ demangle it. Don't collect static c/dtors unless USE_COLLECT2 is
+ defined. Null-terminate the list of objects.
+ (dump_file): New function.
+ (file_exists): New function.
+ (collect_exit): Renamed from my_exit. Dump and remove the temporary
+ ld output file.
+ (collect_execute): Break out from fork_execute. Support redirection.
+ (fork_execute): Call it.
+ (fatal_perror, fatal, error): Make non-static.
+ (xcalloc, xmalloc): Don't use generic.
+ (xrealloc): Define.
+ (collect_wait): Break out for do_wait. Just return the exit status.
+ (do_wait): Call it.
+
+ * collect2.c: Check SUNOS4_SHARED_LIBRARIES using #if, not #ifdef.
+
+ * Makefile.in (collect2): Now uses cplus-dem.o and underscore.o.
+ (collect2.o): Pass MAYBE_USE_COLLECT2 to compile.
+ (underscore.c): Rules for creation.
+
+ * cplus-dem.c, demangle.h: Copy from libiberty.
+
+Thu May 4 14:12:35 1995 Jim Wilson <wilson@cygnus.com>
+
+ * sdbout.c (plain_type): Pass additional argument to plain_type_1.
+ (plain_type_1): New parameter level. Increment it when making
+ recursive calls. Force the type to void_type_mode before starting
+ a 7th level of recursion.
+
+ * sh.c (general_movsrc_operand, general_movdst_operand): Delete
+ references to POST_DEC and PRE_INC.
+ * sh.h: Clean up whitespace, comments, etc.
+ (TARGET_SH, RTL_BIT, DT_BIT, C_BIT, R_BIT, TARGET_DUMP_RTL,
+ TARGET_DUMP_R, TARGET_CDUMP): Delete.
+ (TARGET_SWITCHES): Delete -mR, -mc, -mr options.
+ (CONST_DOUBLE_OK_FOR_LETTER_P): Delete 'G' contraint.
+ (FUNCTION_VALUE): Simplify.
+ (REG_OK_FOR_PRE_POST_P, IS_INDEX): Delete.
+ (BASE_REGISTER_RTX_P, INDEX_REGISTER_RTX_P): Rewrite to allow
+ SUBREGs.
+ (GO_IF_LEGITIMATE_INDEX): Delete unused REGNO argument.
+ (GO_IF_LEGITIMATE_ADDRESS): Use BASE_REGISTER_RTX_P instead of
+ REG_OK_FOR_PRE_POST_P. Don't accept PRE_INC or POST_DEC addresses.
+ (PREDICATE_CODES, PROMOTE_MODE): Define.
+
+Wed May 3 09:57:55 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/rs6000.md (non power abs insns): If not powerpc, use
+ sf/subfc instructions, not subf.
+
+Wed May 3 08:49:06 1995 Alan Modra <alan@SPRI.Levels.UniSA.Edu.Au>
+
+ * protoize.c (gen_aux_info_file): Use strerror #ifdef HAVE_STRERROR.
+
+Wed May 3 01:06:01 1995 Jeffrey A. Law <law@mole.gnu.ai.mit.edu>
+
+ * pa.c (output_call): Fix typo/thinko in last change.
+ (output_function_epilogue): Align the data section before
+ emitting deferred plabels.
+
+ From Torbjorn:
+ * pa.c (before functions): Declare deferred_plabels and
+ n_deferred_plabels.
+ (output_call): When generating pic, don't use LP and RP. Use 32 bit
+ plabel instead.
+ (output_function_epilogue): Output plabels accumulated in output_call.
+
+Tue May 2 17:15:08 1995 Jeffrey A. Law <law@mole.gnu.ai.mit.edu>
+
+ * pa.c (hppa_expand_epilogue): Fix thinko in last change.
+
+Tue May 2 16:54:35 1995 Doug Evans <dje@cygnus.com>
+
+ * jump.c (jump_optimize, can_reach_end determination): A barrier can
+ follow the return insn.
+
+Tue May 2 12:39:55 1995 Mike Stump <mrs@cygnus.com>
+
+ * fold-const.c (fold): Ensure that we don't alter the expression's
+ type when folding CLEANUP_POINT_EXPRs.
+
+Tue May 2 13:36:08 1995 Michael Meissner <meissner@cygnus.com>
+
+ * expmed.c (emit_store_flag): When creating store flag
+ instructions from simpler parts, such as XOR, ABS, etc. do not
+ reuse pseudo registers if expensive optimizations, instead create new
+ pseudos for each insn result.
+
+Tue May 2 01:25:29 1995 Jeffrey A. Law <law@snake.cs.utah.edu>
+
+ * pa.c (hppa_expand_epilogue): Correctly handle restore of %rp
+ for functions with a stack size of exactly 8kbytes and no frame
+ pointer.
+
+Mon May 1 19:27:08 1995 Jim Wilson <wilson@cygnus.com>
+
+ * sdbout.c (sdbout_one_type): Don't switch to text section if
+ in function with section attribute.
+
+ * combine.c (combine_instrutions): Set subst_prev_insn to zero.
+ (try_combine, undo_all): Likewise.
+ (get_last_value): Return zero if subst_prev_insn set.
+
+ * sparc.h (INIT_TARGET_OPTABS): Move INIT_SUBTARGET_OPTABS to end.
+
+ * Makefile.in (install-dir): chmod a+rx all newly created directories.
+
+ * expr.c (expand_expr, case SAVE_EXPR): Handle the case where
+ mode is VOIDmode.
+
+Fri Apr 28 15:39:38 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * cpplib.h (cpp_buffer): Note new escape combination "@ ".
+ * cpplib.c (macroexpand): Delete "@ " if stringifying.
+ (cpp_skip_hspace): Also skip "@ " if input buffer has_escapes.
+ (collect_expansion): Cleanup white-space handling.
+ (create_definition): Remove all leading spaces, not just first one.
+ (cpp_expand_to_buffer): Set has_escapes on resulting input buffer.
+ (macroexpand): Set output_escapes during whole function (and
+ specifically during calls of macarg).
+ (macroexpand): Set "@ " before and after expansion result.
+ (push_macro_expansion): Remove unneeded initial "@ ", not " ".
+ (cpp_get_token): Remove unneeded "@ " (not " ") at end of expansion.
+ (cpp_get_token): Handle "@ ".
+
+ * cpplib.c (read_name_map): Add cpp_reader parameter. Access
+ map_list from former (instead of having it be static).
+ (open_include_file): Extra parameter (because of above changes).
+ (do_include, lookup_import): Update calls of open_include_file.
+
+ * cpplib.c (do_include): Fix memory leak.
+
+ * cpplib.c (delete_assertion): Also delete tokenlist.
+ (do_unassert): Don't delete tokenlist (handled by delete_assertion).
+ (cpp_cleanup): New function. Frees resources used by a cpp_reader.
+ * cpphash.c (cpp_hash_cleanup): New function.
+ (delete_macro): Enable commented-out code.
+ (file_cleanup): Free actual buffer.
+
+ * cpplib.c (cpp_options): Add map_list.
+
+ * cpplib.h (PARSE_GETC): Removed. Bogus and unused.
+ * cppmain.c (main): Remove commented-out code that used PARSE_GETC.
+
+ * cpplib.c: Don't #include <string.h>. Causes clashes
+ on Nextstep (when index/rindex are macros).
+ (cpp_grow_buffer, int_parse_file): Cast to U_CHAR*, rather than char*.
+
+Sun Apr 30 08:11:23 1995 Alan Modra (alan@spri.levels.unisa.edu.au)
+
+ * stdarg.h, varargs.h (va_arg): Don't assume __va_rounded_size (char)
+ has the value of 4.
+
+Sun Apr 30 07:13:43 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * vax.h (NOTICE_UPDATE_CC): Correctly handle aob insns.
+
+ * expr.c (expand_expr, case CONSTRUCTOR): Don't set target to
+ zero if more then one word.
+ Pass size and alignment to move_by_pieces_ninsns in bytes, not bits.
+
+ * cse.c (cse_insn): Properly set IN_MEMORY for SET_DEST.
+
+ * tree.c (substitute_in_expr): Preserve TREE_READONLY.
+
+ * c-common.c (enum attrs): Add A_UNUSED.
+ (init_attributes): Initialize it.
+ (decl_attributes, case A_UNUSED): New case.
+
+Sat Apr 29 15:42:03 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (do_include): Re-fix minor memory leak by using
+ alloca instead of xmalloc and free.
+
+ * cccp.c (macarg): Except for reporting error, treat unterminated
+ macro call as if it were terminated, since `macroexpand' relies
+ on *argptr being filled in.
+
+Sat Apr 29 06:09:35 1995 Torbjorn Granlund <tege@cygnus.com>
+
+ * pa.c (output_mul_insn): Simplify, it is never called with
+ UNSIGNEDP set.
+
+ * pa.md (divsi3, udivsi3, modsi3, umodsi3): Simplify.
+ (ashlsi3): Clean up indentation and commentary.
+
+Fri Apr 28 12:48:01 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * integrate.c (expand_inline_function): Don't emit any notes until
+ after we've expanded the actual parameters.
+
+Fri Apr 28 11:51:06 1995 Stan Cox (gcc@dg-rtp.dg.com)
+
+ * m88k/dgux.h: (ENDFILE_SPEC, LIB_SPEC) Fix crtbegin and crtend
+ (SELECT_RTX_SECTION) Put relocatable pic constants in data section
+
+ * m88k/dguxbcs.h: (LIB_SPEC) Likewise
+
+ * m88k/m88k.c: (symbolic_operand) Put relocatable pic constants in data
+
+ * m88k/m88k.h: (FRAME_POINTER_REQUIRED) Add -momit-leaf-frame-pointer
+
+ * m88k/m88k.md: (umulsidi3) Doesn't work for 88110 with mod/div changes
+
+ * m88k/x-dgux: (GCC_FOR_TARGET) tdesc gets mixed up for crtbegin/crtend
+
+Fri Apr 28 06:36:47 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-typeck.c (pop_init_level, output_init_element): Pass
+ require_constant_* to digest_init.
+
+ * alpha.c (alpha_emit_set_const): Now returns rtx and take MODE arg.
+ Rework to use a new pseudo for intermediate values if high opt level.
+ Also use expand_{bin,un}op.
+ * alpha.h (alpha_emit_set_const): Add declaration.
+ * alpha.md (mov[sd]i and splits): Change call to alpha_emit_set_const.
+
+ * reg-stack.c (stack_result): Fix bug in last change.
+
+Fri Apr 28 01:08:43 1995 Doug Evans <dje@cygnus.com>
+
+ * objc-act.c: Update calls to start_decl, finish_struct,
+ pass NULLs for attributes.
+
+Thu Apr 27 21:13:14 1995 Doug Evans <dje@cygnus.com>
+
+ * sparc.md (tablejump): Only if ! TARGET_MEDANY.
+ (casesi): New pattern for TARGET_MEDANY case.
+
+ * c-common.c (decl_attributes): Always continue if attribute not found.
+ * c-typeck.c (common_type): Call lookup_attribute instead of
+ value_member.
+ * tree.c (attribute_hash_list): New function.
+ (build_type_attribute_variant): Call it.
+ (valid_machine_attribute): Handle attributes with arguments.
+ (is_attribute_p): New function.
+ (lookup_attribute): New function.
+ (attribute_in_list): Deleted.
+ (attribute_list_contained): Check TREE_PURPOSE and TREE_VALUE.
+ * tree.h (valid_machine_attribute): Add prototype.
+ (is_attribute_p, lookup_attribute): Likewise.
+ * i386/winnt.h (RETURN_POPS_ARGS): Call lookup_attribute.
+ (ENCODE_SECTION_INFO): Likewise.
+ (CPP_PREDEFINES): Use __stdcall__, __cdecl__.
+ (VALID_MACHINE_DECL_ATTRIBUTE): Call is_attribute_p.
+ `args' must be NULL.
+
+Thu Apr 27 21:10:41 1995 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.md (insv): New anonymous patterns to combine insert with
+ arbitrary ashift, ashiftrt, lshiftrt, or zero_extract. (Based on
+ patch from John Brooks <jbrooks@ea.com>.)
+ (ashlsi3): Remove extraneous operand processing.
+
+Thu Apr 27 18:47:24 1995 Jim Wilson <wilson@cygnus.com>
+
+ * sh/ashlsi3.c, sh/ashrsi3.c, sh/lshrsi3.c: Delete.
+ * sh/lib1funcs.asm (ashiftrt_r4_*): Rewrite for efficiency.
+ (ashrsi3, lshrsi3, lshrsi3): Add.
+ * t-sh (LIB1ASMFUNCS): Add new functions.
+ (LIBGCC2_CFLAGS): Delete.
+ (LIB2FUNCS_EXTRA): Remove deleted files.
+ (ashlsi3.c, ashrsi3.c, lshrsi3.c): Remove rules for deleted files.
+
+ * stmt.c (expand_return): When returning BLKmode structure, use
+ operand_subword instead of doing arithmetic on the register number.
+ Also, for structures smaller than word_mode, copy it into a word_mode
+ temporary and then subreg it.
+
+ * sparc.md: Delete two define_peepholes which print `bad peephole'.
+
+Thu Apr 27 16:17:01 1995 Torbjorn Granlund <tege@cygnus.com>
+
+ * toplev.c (rest_of_compilation): Call shorten_branches even when
+ !optimize.
+ * final.c (shorten_branches): For non-optimizing compiles, break
+ after first pass.
+
+Thu Apr 27 14:22:50 1995 Michael Meissner <meissner@cygnus.com>
+
+ * i386/linux-oldld.h: New file, that is cloned from linux-aout.h,
+ except that it does not pass -m i386linux to the linker. This is
+ to support the original GNU/Linux ld that is on most distributions.
+
+ * configure (i[345]86-*-linux*oldld*): Use i386/linux-oldld.h as
+ the target file.
+
+Thu Apr 27 08:56:50 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * tree.c (valid_machine_attribute): Update last change.
+
+Thu Apr 27 08:06:33 1995 Philippe De Muyter (phdm@info.ucl.ac.be)
+
+ * fix-header.c, cpplib.c: Don't include <sys/stat.h> twice.
+ * cpplib.c (cpp_grow_buffer, init_parse_file): Cast {xmalloc,xrealloc}
+ for token_buffer to U_CHAR* instead of char*.
+
+ * m68k/x-mot3300: New file.
+ * configure (m68k-motorola-sysv*): Use x-mot3300 instead of x-alloca.
+
+Thu Apr 27 07:04:09 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (do_include): Fix minor memory leak.
+
+ * cccp.c (struct argdata): Remove unused `comments' member.
+ (macarg): Don't set `comments' member.
+
+ * cccp.c (collect_expansion): Assume leading white space
+ already removed.
+ Don't allocate unnecessary space for expansion.
+
+ * cccp.c (deps_output): Don't generate overly long output lines.
+ Do not invoke self recursively with spacer == 0; this simplifies
+ the code a bit.
+
+Wed Apr 26 19:20:02 1995 Andrew McCallum <mccallum@leopard.cs.rochester.edu>
+
+ * objc/Object.h: Changed Class * to Class in order to match NEXTSTEP
+ and OpenStep runtime.
+ * objc/Object.m, objc/Object.h, objc/archive.c, objc/class.c: Likewise.
+ * objc/encoding.c, objc/init.c, objc/objc-api.h, objc/objc.h: Likewise.
+ * objc/objects.c, objc/runtime.h, objc/selector.c: Likewise.
+ * objc/sendmsg.c, objc/typedstream.h: Likewise.
+
+Wed Apr 26 19:18:52 1995 Pieter Schoenmakers <tiggr@es.ele.tue.nl>
+
+ * objc/objc-api.h (objc_static_instances): New struct to record
+ static instances of a certain class.
+ (objc_module): New tag STATICS to point to the table of
+ objc_statics_instances.
+
+ * objc/init.c (OBJC_VERSION): Version 7.
+ (objc_init_statics): New function.
+ (__objc_exec_class): Invoke objc_init_statics if needed.
+
+ * objc/NXConstantString.m, objc/NXConstantString.h: New files.
+ * objc/Makefile (OBJC_O): Added bare-bones implementation of
+ NXConstantString.
+
+ * objc-act.c (OBJC_VERSION): Version 7.
+ (build_objc_string_object): Build a full declaration if not using
+ the next runtime.
+ (objc_add_static_instance): New function.
+ (init_module_descriptor): Add reference to static instances table.
+ (build_module_descriptor): Add field for static instances table.
+ (get_objc_string_decl): New function.
+ (generate_static_references): New function.
+ (finish_objc): Call generate_static_references if needed.
+
+ * c-tree.h (finish_decl_top_level): New declaration.
+ * c-decl.c (finish_decl_top_level): New function.
+
+Wed Apr 26 18:04:32 1995 Dirk Steinberg (Dirk.Steinberg@gmd.de)
+
+ * stddef.h: Treat _MACHINE_ANSI_H_ like _ANSI_H_.
+
+Wed Apr 26 14:09:59 1995 Jim Wilson <wilson@cygnus.com>
+
+ * sparc.h (NEGTF2_LIBCALL): Define.
+ (INIT_TARGET_OPTABS): Add support for all TFmode *_LIBCALL macros.
+ * optabs.c (init_optabs): Delete all uses of undocumented TImode and
+ TFmode *_LIBCALL macros.
+
+ * combine.c (simplify_rtx, case TRUNCATE): Add. Use force_to_mode.
+ (force_to_mode, case AND): Allow some simplifications when GET_MODE (x)
+ has more bits than HOST_BITS_PER_WIDE_INT.
+ * mips/mips.md (truncdiqi2+[456]): Add patterns to simplify ZERO_EXTEND
+ of a TRUNCATE.
+
+Wed Apr 26 13:01:22 1995 Doug Evans <dje@cygnus.com>
+
+ * sparc.md (memop define_splits): Rewrite to not use memop.
+ Preserve MEM_IN_STRUCT_P, MEM_VOLATILE_P, RTX_UNCHANGING_P bits.
+ * sparc.c (memop): Deleted.
+ (splittable_symbolic_memory_operand): New function.
+ (splittable_immediate_memory_operand): New function.
+
+Wed Apr 26 12:54:26 1995 Jeffrey A. Law <law@snake.cs.utah.edu>
+
+ * configure: Add hppa1.1-hp-lites support.
+
+Wed Apr 26 08:04:46 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * sh.md (ashrsi2_31): Don't use dead_or_set_p after reload.
+ * pyr.md: Remove bad peepholes that improperly use dead_or_set_p.
+
+ * function.c (expand_function_end): Warn about unused parms
+ if both -Wunused and -W.
+
+ * tree.h (TYPE_PARSE_INFO): Delete unused field.
+ (TYPE_PACKED): Add new macro.
+ (struct tree_type): Delete unused field `parse_info'.
+ Add new field `packed_flag'.
+ * c-tree.h (finish_enum, finish_struct): Add ATTRIBUTES argument.
+ * c-common.c (init_attributes): Don't require decl for A_PACKED.
+ (decl_attributes, case A_PACKED): Set TYPE_PACKED for type.
+ * c-parse.in: Update number of shift/reduce conflicts.
+ (structsp): Pass attribute arg to finish_struct.
+ Support attributes on enums and pass to finish_enum.
+ * c-decl.c (finish_struct): Add ATTRIBUTES argument, call
+ decl_attributes and set DECL_PACKED from TYPE_PACKED.
+ (finish_enum): Add ATTRIBUTES argument, call decl_attributes,
+ and make enum narrow if TYPE_PACKED.
+ * print-tree.c (print_node): Print TYPE_PACKED.
+
+ * c-decl.c (init_decl_processing): Don't give builtin__constant_p an
+ argument type.
+ * expr.c (expand_builtin, case BUILT_IN_CONSTANT_P): A pointer to a
+ string constant is a constant.
+
+ * c-typeck.c (output_init_element): Constructor is not simple if
+ a bitfield is being assigned a non-integer.
+
+ * c-typeck.c (push_init_level): Update constructor_depth when we
+ push spelling level.
+
+Tue Apr 25 19:50:06 1995 Jeffrey A. Law <law@snake.cs.utah.edu>
+
+ * pa.c (emit_move_sequence): Handle function label arithmetic for
+ PIC code generation too.
+
+Tue Apr 25 18:52:43 1995 Stephen R. van den Berg (berg@pool.informatik.rwth-aachen.de)
+
+ * reg-stack.c (current_function_returns_real): Deleted (unused).
+ (FP_mode_reg): Trimmed to a smaller size, less overhead.
+ (FP_MODE_REG): New macro over which FP_mode_reg will be accessed.
+ (mark_regs_pat, straighten_stack): New functions.
+ (reg_to_stack): Amend initialisation of FP_mode_reg.
+ Mark FP registers mentioned in USE insns before NOTE_INSN_FUNCTION_BEG.
+ (get_true_reg): Eliminate FP subreg accesses in favour of the
+ actual FP register in use.
+ (record_reg_life_pat): Make it work on SUBREGs as well. Make use of
+ the new mark_regs_pat function. Handle USE insns if called unnested.
+ (record_reg_life): Don't check for QImode again, we know that it
+ is there. Process CALL_INSNs like all other insns, they might `use'
+ some FP argument registers if register passing.
+ (stack_result_p): Changed in stack_result and returning an rtx.
+ (stack_reg_life_analysis): Take a new stackentry state argument.
+ Use stack_result and the rtx to mark using mark_regs_pat. This ensures
+ that types that need multiple FP registers are handled correctly.
+ Delete the no_live_regs shortcut to save space.
+ Use stackentry state to determine filled registers.
+ (replace_reg): Accept COMPLEX_FLOAT as well.
+ (move_for_stack_reg): Optimise away some pointer dereferencing.
+ (subst_stack_regs): Make sure the stack is in the right order
+ and of the right size for register passing.
+ (goto_block_pat): Make sure the stack is in the right order
+ to return possible multi-register values from the function.
+ (convert_regs): Fix comment about CALL_INSN, it's no longer valid.
+ Make sure the stack is of the right size and in the right order
+ to return possible multi-register values from the function.
+
+ * function.c (assign_parms): If STACK_REGS is defined, generate USE
+ insns before the function body, thus showing which registers are filled
+ with parameters.
+ * expr.c (expand_builtin_apply_args): Likewise.
+ Reverse order of saving registers, more compact code for i387.
+ (expand_builtin_apply): Likewise.
+ * emit-rtl.c (gen_highpart): Add comment about broken implementation.
+ * i386.md (untyped_call): Make it return a complex double.
+
+ * c-parse.in (attrib): Permit null-length argument list to attributes.
+
+ * tree.c (valid_machine_attribute): Use new function attribute_in_list,
+ makes sure type_attribute_variants are reused even when attributes have
+ parameters.
+ Assign any new type to TREE_TYPE (decl).
+ (attribute_in_list): New function.
+ (attribute_list_contained): Use it.
+ * tree.h (attribute_in_list): New declaration.
+
+Tue Apr 25 18:25:53 1995 Jim Wilson <wilson@cygnus.com>
+
+ * expr.c (struct move_by_pieces): Add to_struct and from_struct fields.
+ (move_by_pieces): Set to_struct and from_struct fields.
+ (move_by_pieces_1): Set MEM_IN_STRUCT_P of to1 and from1.
+ (expand_builtin, case BUILT_IN_MEMCPY): New variable type.
+ Set MEM_IN_STRUCT_P of src_mem and dest_mem.
+
+ * Makefile.in (clean): Delete libgcc1-asm.a.
+
+ * m68k/vxm68k.h (CPP_SPEC): Define.
+
+ * c-decl.c (pushdecl): Don't test DECL_EXTERNAL when deciding whether
+ to register a duplicate decl in the current block.
+
+ * cross64.h (INIT_ENVIRONMENT): Define as string not putenv call.
+ * gcc.c (main): Pass INIT_ENVIRONMENT to putenv.
+
+ * stmt.c (expand_return): When returning BLKmode structure in
+ registers, copy it to a psuedo-reg instead of to hard registers.
+
+Tue Apr 25 15:14:58 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.h (LEGITIMIZE_ADDRESS): Don't create a DF address using two
+ regs if -msoft-float or -mcpu=403.
+
+Tue Apr 25 15:45:44 1995 Richard Henderson (richard@atheist.tamu.edu)
+
+ * m68k.md (divhi3, udivhi3, modhi3, umodhi3): Deleted
+ these insns plus some surrounding trash.
+ (divmodhi4, udivmodhi4): Added these insns.
+
+Tue Apr 25 10:12:40 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * alpha.c (alpha_builtin_saveregs): Refine last change to work
+ for both stdarg and varargs.
+
+ * tree.c (chain_member_purpose): Make similar to chain_member_value.
+
+ * Makefile.in, configure: Change "realclean" to "maintainer-clean".
+
+ * protoize.c: Removed __NetBSD__ from conditional.
+ Declare strerror if HAVE_STRERROR is defined; otherwise
+ declare sys_errlist and sys_nerr.
+ (my_strerror): New function.
+ (errno): Don't define if already defined as a macro.
+
+ * alpha.c (current_file_function_operand): Return false if profiling.
+
+ * expr.c (convert_move): Don't access a hard reg in an invalid
+ mode when doing a truncation.
+
+ * alpha.c (add_operand): Test for exactly the constants allowed by
+ the constraints.
+ * alpha.h (CONST_OK_FOR_LETTER_P, case 'L'): Reject 0x80000000.
+
+ * c-parse.in (initdcl, notype_initdcl): Pass attributes to
+ start_decl; delete call to decl_attributes.
+ * c-tree.h (start_decl): Two new tree parameters.
+ * c-decl.c (start_decl): New args for attributes; call decl_attributes.
+
+ * c-decl.c (duplicate_decls): Don't look at TYPE_ACTUAL_ARG_TYPES
+ if it is not set.
+
+ * xm-1750a.h: New file.
+
+ * alpha.c (alpha_builtin_saveregs): Add to incoming args addr
+ if less than 6 named args, not less than or equal to.
+
+Mon Apr 24 15:25:19 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * mips-tfile.c (fatal, error): Make first arg const to avoid warning.
+
+ * stmt.c (expand_end_bindings): Write a BARRIER after call
+ to abort in nonlocal handler.
+
+ * stmt.c (expand_decl_init): Call preserve_temp_slots to keep
+ around any temp whose address was taken.
+
+Fri Apr 21 16:26:15 1995 Torbjorn Granlund <tege@adder.cygnus.com>
+
+ * pa.md (call_internal_reg): Fix typos in length calculation.
+ (call_value_internal_reg): Likewise.
+
+Fri Apr 21 13:17:15 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * config/gnu.h (STANDARD_INCLUDE_DIR): New macro.
+ * config/mips/gnu.h (STANDARD_INCLUDE_DIR): Macro moved there.
+
+Fri Apr 21 08:23:58 1995 Tom Quiggle (quiggle@lovelace.engr.sgi.com)
+
+ * toplev.c (lang_options): Add -I for GNAT.
+ * gcc.c (default_compilers): Pass -I to gnat1.
+
+Fri Apr 21 07:58:06 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * tree.c (integer_all_onesp): Test to size of mode, not TYPE_PRECISION.
+
+ * toplev.c (main): Turn on -fforce-mem for -O2.
+
+ * fold-const.c ([lr]rotate_double): Replace; old versions were bogus.
+ (fold, shift and rotate): Don't call tree_int_cst_sgn on non-integer.
+ (fold, case LROTATE_EXPR): If constant count, convert to RROTATE_EXPR.
+ (fold, case RROTATE_EXPR): Sometimes commute logical op with rotate.
+ Delete pair of counteracting shifts.
+
+ * combine.c (simplify_logical, case AND): If still an AND, get
+ new values for op0 and op1.
+
+Thu Apr 20 17:52:10 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * sh.c: Completely rewritten.
+ * sh.h (FAST_BIT, CONSTLEN_2_BIT, CONSTLEN_3_BIT, CONSTLEN_0_BIT,
+ TARGET_FASTCODE, TARGET_CLEN3, TARGET_CLEN0, TARGET_OPTIONS): Delete.
+ (TARGET_SWITCHES): Delete -mclen3 and -mclen0 options.
+ (TARGET_DEFAULT): Is zero.
+ (OVERRIDE_OPTIONS): Delete code to set max_count_si and max_count_hi.
+ (SPECIAL_REG): New macro.
+ (HARD_REGNO_MODE_OK): Allow any mode in any general register.
+ (GO_IF_LEGITIMATE_ADDRESS): Delete constant + reg address case.
+ (MOVE_RATIO): Define to 2 when TARGET_SMALLCODE.
+ (max_si, max_hi, max_count_si, max_count_hi): Delete.
+ * sh.md: Delete spurious constraints from all define_expands.
+ (rotlsi3_1): Set T reg instead of clobbering it.
+ (ashrsi3): Use expand_ashiftrt instead of gen_shifty_op.
+ (movsi_i, movhi_i, movsf_i): Add conditions to reject patterns
+ needing a reload.
+ (movdi-2, movdf_k): Correct conditions to reject patterns needing
+ a reload.
+ ([inverse_]branch_{true,false}): Pass operands to output_branch.
+ (jump): Delete unnecessary braces.
+ (call, call_value): Don't use expand_acall. Force operand0 into
+ a register.
+
+Thu Apr 20 12:57:16 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * function.c (assign_parms): Use TREE_ADDRESSABLE rather than
+ TYPE_NEEDS_CONSTRUCTING to decide whether a parameter needs to be
+ passed by invisible reference.
+
+ * calls.c (expand_call): Ditto. Abort if we try to pre-evaluate a
+ parameter of TREE_ADDRESSABLE type.
+
+Wed Apr 19 17:50:24 1995 Torbjorn Granlund <tege@cygnus.com>
+
+ * pa.h (TARGET_SWITCHES): Fix typo.
+
+Tue Apr 18 18:06:03 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * expr.c (store_constructor): Use BYTES_BIG_ENDIAN rather
+ than BITS_BIG_ENDIAN to layout bits within bitstring.
+ * tree.c (get_set_constructor_bytes): Likewise.
+
+Tue Apr 18 17:22:46 1995 Per Bothner (bothner@wombat.gnu.ai.mit.edu)
+
+ * config/m68k/{x-hp320,x-hp320g} (FIXPROTO_DEFINES):
+ Define _HPUX_SOURCE so putenv and other functions get seen.
+
+Tue Apr 18 03:57:35 1995 Michael Meissner (meissner@cygnus.com)
+
+ * varasm.c (weak_decls): Make this a unique structure, instead of
+ a tree structure.
+ (handle_pragma_weak): Don't redeclare asm_out_file. Use new weak
+ structure to copy name and value to. Protect name and value by
+ copying them to the permanent obstack.
+ (declare_weak): Call handle_pragma_weak, instead of duplicating
+ the code.
+ (finish_weak): Rewrite to use new weak symbols list structure.
+
+ * c-pragma.h: New file to define the c-pragma.c interfaces.
+ * c-pragma.c: Include it.
+ * varasm.c: Include it.
+ * c-lex.c: Include it.
+ * cp/lex.c: Include it.
+
+ * varasm.c (handle_pragma_weak): No longer pass output file
+ stream, since weak pragmas are delayed until the end of the
+ compilation.
+ * c-pragma.c (handle_pragma_token): Call handle_pragma_weak
+ without file stream argument.
+
+ * Makefile.in (varasm.o, c-lex.o, c-pragma.o): Add dependencies on
+ c-pragma.h.
+
+ * config/rs6000.md (movdf): If -msoft-float, do not generate
+ memory to memory references, like is already done for the
+ -mhard-float case. Remove an extra test for -mhard-float inside
+ of -mhard-float code.
+
+Tue Apr 18 06:19:50 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * fold-const.c (size_int): Arg is unsigned HOST_WIDE_INT.
+ * tree.h (size_int): Likewise.
+
+Mon Apr 17 23:36:57 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * rs6000/aix41.h: Restore March 11th changes, plus
+ (ASM_OUTPUT_EXTERNAL): Do add [DS] or [RW], just don't emit
+ anything.
+ * rs6000/aix3newas.h (ASM_OUTPUT_EXTERNAL): Ditto.
+
+Mon Apr 17 15:58:52 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * config/mips/x-iris (FIXPROTO_DEFINES): Add -D_LANGUAGE_C_PLUS_PLUS.
+ * config/mips/x-iris6: Likewise.
+
+ * cpplib.c: Rename make_definition to cpp_define.
+ * cpplib.h (cpp_define): New declaration.
+
+ * cpplib.c (special_symbol): For T_SPECLINE, calculate __LINE__
+ in enclosing file buffer, not current buffer (if macro expanding).
+ (cpp_get_token): Fix thinko (in code for chopping unneeded space).
+
+Mon Apr 17 11:36:07 1995 Jim Wilson <wilson@cygnus.com>
+
+ * abi64.h (CPP_SPECS): Define and use _ABI64 instead of
+ _MIPS_SIM_ABI64.
+ (SETUP_INCOMING_VARARGS): Set MEM_IN_STRUCT_P if big endian target.
+ * iris6.h (ASM_IDENTIFY_GCC, ASM_IDENTIFY_LANGUAGE): Define.
+
+ * combine.c (get_last_value): Ignore BARRIER when scanning backwards.
+ (move_deaths): New variables before_dead and after_dead. Set them
+ to instructions that have valid INSN_CUID values and use in test.
+
+ * combine.c (subst_prev_insn): New variable.
+ (try_combine): Set it.
+ (get_last_value): Use it.
+
+ * reload.c (find_reloads): Recompute reg_equiv_address from
+ reg_equiv_memory_loc before using it.
+ (find_reloads_toplev, make_memloc): Likewise.
+
+ * expr.c (expand_builtin, case BUILT_IN_MEMCPY): Call force_operand
+ on dest_rtx before returning it.
+
+ * function.c (instantiate_decls): Use temporary allocation if
+ DECL_DEFER_OUTPUT is set.
+
+Sat Apr 15 23:19:03 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * aoutos.h (ASM_OUTPUT_DEF): Define instead of SET_ASM_OP.
+ * sparc/sunos4.h (ASM_OUTPUT_DEF): Ditto.
+
+ * varasm.c (weak_finish): Don't handle aliases.
+ (declare_weak): Ditto.
+ (assemble_alias): Handle aliases.
+
+ * c-common.c (enum attrs): Add A_ALIAS.
+ (init_attributes): Ditto.
+ (decl_attributes): Ditto.
+
+Sat Apr 15 13:26:34 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * calls.c (expand_call): Call preserve_temp_slots on temps
+ made for BLKmode args returned in registers.
+
+ * pa.c (override_options): Fix typo.
+
+Sat Apr 15 12:11:46 1995 Brendan Kehoe <brendan@cygnus.com>
+
+ * alpha/alpha.c (output_epilog): Initialize fp_offset to 0, and
+ make sure it's non-zero before we try to use it to restore the
+ frame pointer.
+
+Fri Apr 14 19:45:05 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * ginclude/va-{clipper,pa,pyr,sparc,spur}.h (va_arg): Reorganize
+ to avoid BIND_EXPRs and COND_EXPRs of aggregate type.
+
+Fri Apr 14 19:31:14 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * config/svr4.h (ASM_OUTPUT_SECTION_NAME): Make the section
+ read-only executable "ax" if DECL is a FUNCTION_DECL; read-only
+ "a" (previously the case always) if DECL is TREE_READONLY;
+ otherwise writable "aw".
+
+Fri Apr 14 18:49:11 1995 Linus Torvalds <Linus.Torvalds@cs.Helsinki.FI>
+
+ * alpha.md (probe_stack): Probe with write, not read.
+ (allocate_stack): Update and correct stack probe code.
+ * alpha.c (output_prolog): Changed stack probe at function entry.
+
+Fri Apr 14 18:42:34 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * jump.c (delete_insn): When deleting after label, delete
+ a BARRIER as well.
+
+Fri Apr 14 14:40:48 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * toplev.c (compile_file): Call weak_finish.
+
+ * c-common.c (enum attrs): Add A_WEAK.
+ (init_attributes): Ditto.
+ (decl_attributes): Support __attribute__ ((weak)) by
+ calling declare_weak.
+
+ * sparc/sunos4.h (HANDLE_PRAGMA_WEAK, WEAK_ASM_OP, SET_ASM_OP):
+ Define to support weak symbols with -fgnu-linker.
+ * aoutos.h: Ditto.
+
+ * varasm.c (handle_pragma_weak): Add declared weak symbols to
+ weak_decls rather than emitting them immediately.
+ (declare_weak): Add the indicated declaration to weak_decls.
+ (weak_finish): Emit .weak directives for any weak symbols.
+
+ * libgcc2.c: The C++ free-store management functions are weak.
+
+Fri Apr 14 13:00:29 1995 Michael Meissner (meissner@cygnus.com)
+
+ * rs6000/rs6000.c (output_prolog): For eabi systems, emit main's
+ call to __eabi before setting up the minimal TOC used with the
+ -mrelocatable support.
+
+ * rs6000/eabi.h (INVOKE__main): Don't define any more,
+ output_prolog will emit the call.
+
+Fri Apr 14 09:09:03 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * alpha.c (call_operand): Any reg is valid for NT.
+ (output_prologue): Never need GP for Windows/NT.
+ Set SYMBOL_REF_FLAG in current function decl.
+
+Thu Apr 13 20:19:30 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * alpha/xm-alpha.h (HAVE_VPRINTF): Define.
+ (HAVE_PUTENV): Define.
+ (POSIX): Define.
+
+Thu Apr 13 19:57:44 1995 Doug Evans <dje@cygnus.com>
+
+ * emit-rtl.c (gen_sequence): If the insn has a non-null
+ CALL_INSN_FUNCTION_USAGE field, output it as a sequence so the
+ latter isn't discarded.
+
+ * c-parse.in: Update expected conflict count.
+
+Thu Apr 13 08:10:20 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * configure.bat: Arg 2 is which machine (i386 or alpha).
+ * configure (alpha-*-winnt3*): New configuration.
+ * alpha.c: Don't #include stamp.h for WINNT.
+ (input_operand, case CONST): Allow ptr_mode and DImode.
+ * alpha.h (WINDOWS_NT): Provide default definition.
+ (ASM_OUTPUT_INT): Use output_addr_const.
+ (ASM_OUTPUT_ADDR_DIFF_ELT): Use .long for NT.
+ * alpha.md (calll, tablejump, movsi): New variants for NT.
+ * alpha/winnt.h, alpha/xm-winnt.h, alpha/x-winnt: New files.
+ * alpha/config-nt.bat, alpha/config-nt.sed: New files.
+ * i386/config-nt.bat: Add Ada fragments to Makefile.
+ * i386/config-nt.sed: Adjust for deletion of config.run in Makefile.in
+ Change version to 2.6.3.
+ Add some missing tabs.
+ * winnt/winnt.h (TARGET_MEM_FUNCTIONS): Define.
+ (LINK_SPEC): Delete "align:0x1000".
+ * winnt/xm-winnt.h (OBJECT_SUFFIX): Define.
+ * ginclude/stdarg.h, ginclude/varargs.h: Clean up code that
+ defines *DEFINED* symbols.
+
+ * configure (a29k-*-sym1*): Same as a29k-*-bsd*.
+ * a29k.h (ASM_OUTPUT_SECTION_NAME): New macro.
+
+Wed Apr 12 14:36:03 1995 Jim Wilson <wilson@cygnus.com>
+
+ * dbxout.c (dbxout_type_fields): Correct arguments to CHARS macro
+ in flag_minimal_debug case.
+ (dbxout_symbol_name): Use DECL_ASSEMBLER_NAME unconditionally.
+ * sdbout.c (sdbout_record_type_name): Correct indentation.
+ (sdbout_symbol): Use DECL_ASSEMBLER_NAME unconditionally.
+ (sdbout_one_type): Likewise.
+
+Tue Apr 11 13:24:13 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * fix-header.c (main): Fix loop over required_functions_list.
+ (fatal): Also print inc_filename.
+
+ * cpplib.c (cpp_push_buffer): Added missing initializatuon of buf.
+ (cpp_file_buffer): Compare against CPP_NULL_BUFFER, not NULL.
+ (finclude): No longer call cpp_push_buffer - let callers do it.
+ (do_include): Add call to cpp_push_buffer.
+ (push_parse_file): Call cpp_push_buffer early, so initial
+ defines can use file and line from a valid cpp_buffer.
+ (nreverse_pending): New function.
+ (push_parse_file): Use nreverse_pending.
+ (push_parse_file): For -include files, just push them in reverse
+ order - we don't need to scan them now.
+ (cpp_error_from_errno, cpp_perror_with_name): Don't emit extra '\n'.
+
+Tue Apr 11 13:36:44 1995 Jim Wilson <wilson@cygnus.com>
+
+ * configure (mips-dec-mach3): Add.
+
+ * sh.c (shiftby_operand): Delete.
+ * sh.h (TARGET_SWITCHES): -m3 and -m3l also set SH2_BIT.
+ (OVERRIDE_OPTIONS): Don't add CPU_SH2 to CPU_SH3 when TARGET_SH3.
+ * sh.md (ashlsi3): Use nonmemory_operand as a predicate instead of
+ shiftby_operand. Don't use shiftby_operand in the output statement.
+ (lshrsi3): Likewise.
+
+ * c-decl.c (poplevel): Do output inline function if
+ DECL_ABSTRACT_ORIGIN points to itself.
+
+ * varasm.c (output_constant): Cast assemble_string argument to char *.
+
+Mon Apr 10 14:29:28 1995 Torbjorn Granlund <tege@adder.cygnus.com>
+
+ * recog.c (constrain_operands, case 'E'): Make this work like
+ constraint character `F' when REAL_ARITHMETIC is defined.
+ * regclass.c (record_reg_classes, case 'E'): Likewise.
+ * reload.c (find_reloads, case 'E'): Likewise.
+
+Mon Apr 10 14:30:31 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/aix3newas.h, rs6000/aix41.h: Eliminate March 11th changes
+ to undefine ASM_OUTPUT_EXTERNAL{,_LIBCALL}, since this causes the
+ compiler not to bootstrap.
+
+Mon Apr 10 07:17:39 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * cppalloc.c: #include config.h.
+ * cppexp.c: Add declarations of xmalloc and xrealloc.
+ (cpp_parse_expr): Cast args to bcopy to char *.
+ * cpphash.c: Add declaration of xmalloc.
+ * cpplib.c (init_parse_options, cpp_reader): Cast args to bcopy,
+ bcmp, and bzero to char *.
+ (add_import, push_parse_file, init_parse_file): Likewise.
+
+ * c-common.c (enum attrs): New attribute, A_NOCOMMON.
+ (init_attribute): Initialize it.
+ (decl_attributes): Implement it.
+ * varasm.c (make_decl_rtl): Allow section attribute if -fno-common
+ or variable is not to be placed in common for some other reason.
+
+ * combine.c (simplify_set): Don't move a SUBREG to dest if it
+ is changing the size of a hard reg in CLASS_CANNOT_CHANGE_SIZE.
+
+ * reload.c (find_equiv_reg): If goal is a pseudo that got memory,
+ a store into memory makes it invalid.
+ * reload1.c (reload_as_needed): Call forget_old_reloads_1 on
+ pattern before reg elimination.
+
+Mon Apr 10 00:26:14 1995 Jeffrey A. Law <law@snake.cs.utah.edu>
+
+ * pa.c (pa_reorg): Bump label use count for each entry in an
+ exploded ADDR_VEC.
+
+Sun Apr 9 09:22:51 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * i386.md (adddi3, subdi3): Need scratch reg whenever operand 0 in
+ mem and operands 1 not '0'.
+ (subdi3): Don't treat two non-equal MEMs as non-aliasing.
+
+Sat Apr 8 22:53:38 1995 Jeffrey A. Law <law@snake.cs.utah.edu>
+
+ * pa.c (pa_reorg): Fix typo.
+
+Sat Apr 8 19:36:36 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/rs6000.h (SELECT_SECTION): TREE_CODE_CLASS must be called
+ with a tree code, not a tree value.
+
+Sat Apr 8 12:41:01 1995 Mike Stump <mrs@cygnus.com>
+
+ * cpphash.c: Don't use const on compilers that don't support it.
+
+Sat Apr 8 16:32:22 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (expand_increment): Handle case where INCREMENTED
+ has a non-trivial conversion.
+
+Fri Apr 7 19:33:21 1995 Phil Nelson (phil@cs.wwu.edu)
+
+ * ns32k.h (TRAMPOLINE_TEMPLATE, TRANSFER_FROM_TRAMPOLINE):
+ Fix assembler syntax errors.
+
+Fri Apr 7 19:27:23 1995 Pat Rankin (rankin@eql.caltech.edu)
+
+ * cccp.c (VMS_fstat, VMS_stat): New functions.
+
+Fri Apr 7 19:25:21 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (collect_expansion): If traditional, set stringify
+ member to SHARP_TOKEN regardless of the value of
+ stringify_sharp_token_type.
+
+Fri Apr 7 07:48:35 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * cse.c (simplify_unary_operation): #ifdef POINTERS_EXTEND_UNSIGNED,
+ handle sign- or zero-extending addresses.
+
+ * optabs.c (init{,_integral,_floating,_complex}_libfuncs):
+ Change SUFFIX to "char" to avoid confusion with prototype.
+
+ * explow.c (convert_memory_address): No longer static.
+ New arg, TO_MODE.
+ Do something special for SYMBOL_REF, LABEL_REF, and CONST.
+ (memory_address): Add extra arg to call to convert_memory_address.
+ * rtl.h (convert_memory_address): Add extra arg.
+ * expr.c (expand_expr, case ADDR_EXPR): Always call
+ convert_memory_address when converting; add extra arg.
+ * stmt.c (expand_computed_goto): Convert from ptr_mode to Pmode.
+
+ * gcc.c (OBJECT_SUFFIX): Default now ".o", not "o".
+ (all specs): Remove "." before %O; use %O in a few missing cases.
+ * i386/os2.h (OBJECT_SUFFIX): Delete from here.
+ * i386/xm-os2.h (OBJECT_SUFFIX): Move to here; now has period.
+
+ * Makefile.in (STAGESTUFF): Use $(exeext) for executables.
+
+Fri Apr 7 03:32:29 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * config.sub: Accept -lites* as op sys.
+
+Thu Apr 6 23:08:50 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * cpplib.c (bcopy, bzero, bcmp): Remove #undefs.
+ * cppalloc.c (xcalloc): Re-implement using calloc,
+ rather than malloc+bzero.
+ * cpplib.c (SELF_DIR_DUMMY): New macro.
+ (do_include): Don't pass searchptr to finclude if it is dsp,
+ since that is on the stack, and would cause a dangling pointer.
+ If handling #include_next, recognize SELF_DIR_DUMMY.
+
+Fri Apr 7 00:54:24 1995 Jeffrey A. Law <law@snake.cs.utah.edu>
+
+ * pa.h (MACHINE_DEPENDENT_REORG): Define.
+ * pa.md (switch_jump): New pattern for jumps which implement
+ a switch table.
+ * pa.c (pa_reorg): New function to explode jump tables.
+ (pa_adjust_insn_length): Account for jumps in switch tables with
+ unfilled delay slots.
+
+Thu Apr 6 14:31:10 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * c-typeck.c (build_binary_op): Don't call common_type for
+ uncommon pointer types.
+
+Wed Apr 5 13:53:17 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ Re-write fixproto/fix-header/etc to use cpplib:
+ * fix-header.c: Comment out support for adding missing extern "C"
+ using #ifdef ADD_MISSING_EXTERN_C instead of #if 0.
+ * fixproto: Removed case of required functions. Instead use ...
+ * fix-header.c (std_include_table): ... new required-functions table.
+ (cpp_file_line_for_message, cpp_print_containing_files, cpp_message):
+ New stub functions, to intercept cpplib error message.
+ * fixproto: Don't call $CPP, since fix-header now incorporates cpplib.
+ * gen-protos.c (fatal, hashf): New functions.
+ (main): Use hashf, instead of hash.
+ * scan-decls.c (scan_decls, skip_to_closing_brace): Re-write to
+ take a cpp_reader* as argument, not a FILE*.
+ * scan.h (hash): Make parameter const.
+ * scan.c (hash): Removed.
+ * scan.c (memory_full, xmalloc, xrealloc): Removed.
+ Use functions from cppalloc.c instead.
+ * Makefile.in (gen-prtos, fix-header, stmp-fixproto): Update.
+
+Wed Apr 5 13:24:14 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * cpplib.c (cpp_get_token): If traditional, return after comment,
+ instead of reading more, so end-of-line can be peeked at.
+ * cpperror.c (cpp_file_line_for_message, cpp_message): New
+ functions, that do the actual printing of error messages.
+ (cpp_print_file_and_line, cpp_error, cpp_warning, cpp_pedwarn,
+ cpp_error_with_line, cpp_warning_with_line, cpp_pedwarn_with_line,
+ cpp_pedwarn_with_file_and_line, cpp_error_from_errno, my_strerror,
+ cpp_perror_with_name): Re-write to use cpp_file_line_for_message
+ and cpp_message, and move to cpplib.c.
+
+Tue Apr 4 23:35:49 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * config/gnu.h (GNU_CPP_PREDEFINES): Remove -D__HURD__.
+
+Tue Apr 4 17:15:54 1995 Jeffrey A. Law <law@mole.gnu.ai.mit.edu>
+
+ * pa.h (DO_GLOBAL_DTORS_BODY): Fix pointer -> integer assignment
+ problem.
+
+ * reorg.c (fill_simple_delay_slots): Don't use a JUMP_INSN
+ a the target of another JUMP_INSN to fill a delay slot.
+
+Mon Apr 3 19:03:48 1995 Torbjorn Granlund <tege@adder.cygnus.com>
+
+ * cse.c (simplify_unary_operation): Sign-extend constants when
+ they have the most significant bit set for the target.
+
+ * m68k.md (umulsi3_highpart): Test for CONST_INT and CONST_DOUBLE,
+ not CONSTANT_P.
+ (smulsi3_highpart): Likewise.
+ * m68k.c (const_uint32_operand): New function.
+ (const_sint32_operand): New function.
+ * m68k.md (const_umulsi3_highpart): Use const_uint32_operand instead
+ of immediate_operand for op3. Delete mode.
+ (const_smulsi3_highpart): Analogous change.
+
+Mon Apr 3 19:03:48 1995 Jim Wilson <wilson@cygnus.com>
+
+ * cse.c (simplify_binary_operation): Sign-extend constants when
+ they have the most significant bit set for the target.
+
+ * combine.c (force_to_mode, case PLUS): Sign extend masks that are
+ negative in OP_MODE.
+ (simplify_and_const_int): Sign-extend constants when they have the
+ most significant bit set for the target.
+ (merge_outer_ops): Likewise.
+ (simplify_shift_const): Likewise.
+
+Mon Apr 3 18:23:48 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * toplev.c (lang_options): Add -f{no-,}repo.
+
+Mon Apr 3 18:13:15 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * combine.c (nonzero_bits, case REG): Check POINTERS_EXTEND_UNSIGNED.
+ (num_sign_bit_copies, case REG): Likewise.
+ * explow.c (convert_memory_address): New function.
+ (memory_address): Call if it needed.
+ (promote_mode, case POINTER_TYPE): Use Pmode and pointer extension.
+ (allocate_dynamic_stack_space): Convert size from ptr_mode.
+ * expr.c (clear_storage, expand_assignment, store_{expr,constructor}):
+ Use ptr_mode instead of Pmode in some places.
+ (expand_expr, expand_builtin): Likewise.
+ (push_block, store_expr): Convert size to Pmode.
+ (expand_expr, case ADDR_EXPR): Convert from Pmode to ptr_mode.
+
+Mon Apr 3 18:00:52 1995 Jim Wilson <wilson@cygnus.com>
+
+ * explow.c (allocate_dynamic_stack_space): Correct typo in last
+ change.
+
+ * sh.c (gen_shifty_op, case ASHIFTRT): Return 0 if shift count is not
+ a constant.
+
+Mon Apr 3 12:17:10 1995 Michael Meissner (meissner@cygnus.com)
+
+ * expmed.c (extract_bit_field): When converting a SUBREG into a
+ REG, if the system is big endian, adjust the bit offset
+ appropriately.
+
+Mon Apr 3 00:08:45 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * config/i386/linux.h: Include "config/linux.h" instead of
+ "linux.h", to avoid recursion.
+
+Sun Apr 2 23:50:27 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+
+ * config/i386/gnuelf.h: Include i386/linux.h instead of
+ i386/linuxelf.h.
+
+Sun Apr 2 17:35:10 1995 Jim Wilson <wilson@cygnus.com>
+
+ * cse.c (simplify_relational_operation): Don't simplify A-B for
+ compare of A and B when the compare is unsigned.
+
+Sun Apr 2 08:23:38 1995 Paul Eggert <eggert@twinsun.com>
+
+ * fixincludes (stdio.h): BSDI 2.0 changed the spelling of _VA_LIST_
+ to _BSD_VA_LIST_.
+
+Sun Apr 2 07:57:28 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * i386/xm-bsd386.h: New file.
+ * configure (i[345]86-*-bsd*): Add xm_file.
+
+ * gcc.c (default_compilers): Pass -W and -w to gnat1.
+
+ * winnt/winnt.h (STDC_VALUE): Add #undef.
+ * i386/winnt.h (LIB_SPEC): Likewise.
+
+Sun Apr 2 07:55:25 1995 Douglas Rupp (drupp@cs.washington.edu)
+
+ * i386/winnt.h (RETURN_POPS_ARGS, ENCODE_SECTION_INFO): Call
+ chain_member_purpose, not chain_member_value.
+ (ASM_FILE_START, LIB_SPEC): Move to here.
+ * winnt/winnt.h (ASM_FILE_START, LIB_SPEC): Delete from here.
+ * tree.c (chain_member_purpose): New function.
+
+Sat Apr 1 12:19:14 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * c-typeck.c (build_binary_op): New variable build_type controls
+ type given to expression when created. Set to integer_type_node for
+ comparison ops instead of result_type so result_type still holds type
+ in which comparison is done. When checking for comparison between
+ signed and unsigned, use result_type rather than (possibly shortened)
+ type of op0. Don't warn about equality comparison of signed operand
+ to unsigned constant that fits in signed type.
+
+Sat Apr 1 09:47:02 1995 Douglas Rupp (drupp@cs.washington.edu)
+
+ * i386/winnt.h (CPP_PREDEFINES): Add definitions for __stdcall
+ and __cdecl.
+ * winnt/winnt.h (LIB_SPEC): Add OLDNAMES.LIB.
+ * winnt/xm-winnt.h: Remove unneeded #define's for non-ANSI functions.
+ * fixinc.winnt: Remove unneeded fixes relating to __stdcall.
+
+ * objc/Makefile (SHELL): New definition.
+
+Sat Apr 1 08:25:26 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * cse.c (cse_insn): When emitting a BARRIER, don't put it after
+ a deleted insn.
+
+ * reload.c (push_reload): Initialize secondary_{in,out}_icode.
+
+ * gcc.c (print_multilib_info): Don't use LAST_PATH if not set.
+
+Sat Apr 1 08:15:59 1995 Pat Rankin (rankin@eql.caltech.edu)
+
+ * vax.md (extv, extzv): Don't use immediate value for operand 1.
+
+Sat Apr 1 07:48:29 1995 Yury Shevchuk (sizif@botik.yaroslavl.su)
+
+ * stmt.c (expand_asm_operands): Properly ignore invalid reg in clobber.
+
+Sat Apr 1 07:02:24 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c: General code cleanup.
+ Add prototypes for static functions.
+ Remove unnecessary casts to (char *); add casts to (U_CHAR *).
+ Add parentheses suggested by `gcc -Wparentheses'.
+ Rename local variables as suggested by `gcc -Wshadow'.
+ <fcntl.h>, <stdlib.h>, <string.h>, <unistd.h>: New includes.
+ <sys/time.h>, <sys/resource.h>: Include only if defined(RLIMIT_STACK).
+ <time.h>: Include, unless <sys/time.h> already does.
+ (HAVE_FCNTL_H, HAVE_STDLIB_H, HAVE_SYS_TIME_H): New symbols.
+ (HAVE_UNISTD_H, STDC_HEADERS, TIME_WITH_SYS_TIME): Likewise.
+ (__attribute__, PROTO, VA_START, PRINTF_ALIST, PRINTF_DCL): New macros.
+ (PRINTF_PROTO{,_1,_2,_3}, DO_PROTO): Likewise.
+ (bcopy, bzero, bcmp): If #defined by configuration file, use that.
+ If STDC_HEADERS is defined, use standard C functions.
+ If BSTRING is defined, or USG and VMS are not defined, use
+ the C library. Otherwise, use my_bcopy, my_bzero, my_bcmp.
+ (localtime): Remove no-longer-necessary explicit declaration.
+ (getenv, index, rindex): Don't declare explicitly if the
+ appropriate system header should declare it.
+ (fdopen): Remove no-longer-used declaration.
+ (vprintf): Define a subsitute macro if !defined(HAVE_VPRINTF).
+ (main): Replace `fdopen (dup (fileno (stdout)), "w"))'
+ with `stdout'.
+ (get_lintcmd, rescan, create_definition): Use bcmp instead of strncmp
+ when both operands are known to be free of null bytes.
+ (check_macro_name, compare_defs, collect_expansion): Likewise.
+ (do_assert, compare_token_lists, assertion_lookup, do_line): Likewise.
+ (skip_if_group, lookup): Likewise.
+ (rescan): Remove unused label `startagain'.
+ Abort instead of printing nonsense if the stack is corrupted
+ when there was an unterminated successful conditional.
+ (pcfinclude): Include explicit double-cast through GENERICPTR
+ to identify particularly egregious type puns.
+ (create_definition, do_define, check_macro_name): Use %.*s
+ printf format to avoid painful copying-and-casting.
+ (do_once): Return void, not (unused) int.
+ (do_ident, do_pragma, do_sccs): Accept extra arguments so that
+ all directive-handler's types match.
+ (do_sccs): Define only if SCCS_DIRECTIVE is defined.
+ (skip_if_group, dump_single_macro): Add `default: break;' to
+ keep -Wswitch happy.
+ (error, warning, error_with_line, vwarning_with_line, pedwarn): Use
+ stdarg/vararg/vfprintf instead of passing bogus char * args around.
+ (pedwarn_with_line, pedwarn_with_file_and_line, fatal): Likewise.
+ (verror, vwarning, verror_with_line, vwarning_with_line): New fcns.
+ (dump_single_macro): Abort if ap points to garbage.
+ (make_definition, make_undef, make_assertion): Parameter now char *.
+ (xmalloc, xrealloc, xcalloc, savestring, index0): Make sizes size_t
+ instead of unsigned; make pointer parameters GENERICPTR, not char *.
+ (xcalloc): Use bzero to clear memory instead of using own loop.
+
+Fri Mar 31 08:33:07 1995 Ken Raeburn (raeburn@wombat.gnu.ai.mit.edu)
+
+ * longlong.h (umul_ppmm mc68000): Use %# instead of #.
+
+Fri Mar 31 06:37:54 1995 Michael Meissner (meissner@cygnus.com)
+
+ * stor-layout.c (layout_decl): Implment -fpack-struct.
+ (layout_record): Ditto.
+
+ * flags.h (flag_pack_struct): New flag variable.
+
+ * toplev.c (flag_pack_struct): New flag variable.
+ (f_options): Add -fpack-struct support.
+
+ * Makefile.in (stor-layout.o): Add flags.h dependency.
+
+Fri Mar 31 08:40:16 1995 Douglas Rupp (drupp@cs.washington.edu)
+
+ * configure (i[345]86-*-winnt3*): Add tmake_file.
+ * i386/x-winnt (winnt.o): Deleted.
+ * i386/t-winnt: New file.
+
+Fri Mar 31 07:26:37 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * m68k/netbsd.h, m68k/hp3bsd44.h: Remove #include of machine/ansi.h.
+
+ * configure (a29k-*-bsd): Set tmake_file to t-libc-ok.
+
+ * stmt.c (expand_asm_operands): Properly handle output that can't
+ be directly written into.
+
+ * c-parse.in (structsp): Correct error in last change.
+ * c-common.c (init_attributes): A_FORMAT is only for decls.
+
+Thu Mar 30 18:27:34 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * libgcc2.c: Remove explicit 0-initializations of static variables.
+
+Thu Mar 30 18:22:39 1995 Fergus Henderson <fjh@cs.mu.oz.au>
+
+ * c-typeck.c (internal_build_compound_expr): Warn if LHS of comma
+ expression has no side effects, or computes value which is not used.
+ * stmt.c (make warn_if_unused_value): No longer static.
+ * tree.h (warn_if_unused_value): Add declaration.
+
+Thu Mar 30 18:15:11 1995 Jim Wilson <wilson@cygnus.com>
+
+ * combine.c (get_last_value): Revert back to use prev_nonnote_insn
+ instead of prev_real_insn. Modify test that ignores USE insns.
+
+ * rs6000.h (SELECT_SECTION): Apply constant DECL_INITIAL test
+ only to DECLs.
+
+ * explow.c (allocate_dynamic_stack_space): Test STACK_BOUNDARY against
+ BIGGEST_ALIGNMENT at run time instead of at compile time.
+ Give MUST_ALIGN macro a value, and test this value in if statements.
+
+Thu Mar 30 08:59:56 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-parse.in: Now have 27 shift/reduce conflicts.
+ (attribute_list): Just make chain of all attributes.
+ (attrib): Consistently put name as PURPOSE, args, if any, as VALUE.
+ (structsp): Allow attributes on any struct or union.
+ * c-common.c (enum attrs): New enum class.
+ (attrtab, attrtab_idx): New variables.
+ (add_attribute, init_attributes): New functions.
+ (decl_attributes): Major rewrite.
+ * tree.c (valid_machine_attribute): Now receive name and args.
+
+Thu Mar 30 07:20:14 1995 Paul Eggert <eggert@twinsun.com>
+
+ * protoize.c: Use the phrase `preprocessing directive' consistently.
+ * cccp.c (handle_directive, do_line, skip_if_group): Likewise.
+ (output_line_directive): Renamed from output_line_command.
+ (no_line_directives): Renamed from no_line_commands.
+
+ * cccp.c (rescan): Don't recognize preprocessing directives
+ within macro args. Warn if one is found.
+
+Thu Mar 30 06:20:36 1995 H.J. Lu (hjl@nynexst.com)
+
+ * configure (i[345]86-*-linux*): Set xmake_file=x-linux,
+ tm_file=i386/linux.h, and don't set extra_parts.
+ (i[345]86-*-linux*aout*): New configuration.
+ (i[345]86-*-linuxelf): Deleted.
+ * config/linux{,-aout}.h, config/x-linux, config/xm-linux.h: New files.
+ * config/i386/linux-aout.h: New file.
+ * config/i386/linux.h: Extensive modifications to use ELF format
+ as default.
+ (LIB_SPEC): Don't use libc_p.a for -p. don't use libg.a
+ unless for -ggdb.
+ (LINUX_DEFAULT_ELF): Defined.
+ * config/i386/linuxelf.h,config/i386/x-linux: Files deleted.
+ * config/i386/xm-linux.h: Just include xm-i386.h and xm-linux.h.
+
+Wed Mar 29 19:09:36 1995 Mike Stump <mrs@cygnus.com>
+
+ * libgcc2.c (__throw_type_match): Update to use new calling convention.
+
+Wed Mar 29 14:53:23 1995 Jim Wilson <wilson@cygnus.com>
+
+ * gcc.c (process_command): Delete code modifying gcc_exec_prefix.
+ (main): Put it here after last use of gcc_exec_prefix. For cross
+ compiler, set startfile_prefixes if gcc_exec_prefix is set and
+ standard_startfile_prefix is a relative path.
+
+ * combine.c (make_compound_operation, AND case): Undo July 7, 1994
+ change.
+
+ * mips/mips.md (call_internal1, call_value_internal1): Move %* from
+ start of assembler output to immediately before the jal.
+
+ * mips/mips.c (function_prologue): Put SDB_DEBUGGING_INFO ifdef around
+ code for SDB_DEBUG support.
+ (mips_select_rtx_section, mips_select_section): Change rdata_section
+ to READONLY_DATA_SECTION and sdata_section to SMALL_DATA_SECTION.
+ * mips/mips.h (SMALL_DATA_SECTION): Define.
+
+ * reorg.c (mark_referenced_resources): Make setjmp use all registers.
+
+ * flow.c (mark_used_regs, case SUBREG): Only fall through to REG case
+ if operand is a REG.
+
+ * i960/i960.h (TARGET_SWITCHES): Make -mold-align set
+ TARGET_FLAG_STRICT_ALIGN.
+ (STRICT_ALIGNMENT): Test TARGET_STRICT_ALIGN.
+
+ * sh/sh.c (andcosts): Modify costs to match the hardware, and add
+ explanatory comments.
+
+ * sparc/sol2.h (CPP_PREDEFINES): Add -D__SVR4.
+
+Wed Mar 29 14:30:30 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/rs6000.md (movsf): When moving to/from integer registers,
+ don't move floating point to memory if it is being simulated with
+ -msoft-float.
+
+Wed Mar 29 06:47:36 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-parse.in (initdcl): Only call decl_attributes once.
+ * c-common.c (decl_attributes): Clean up test for __mode__.
+
+Tue Mar 28 08:34:37 1995 John Hassey (hassey@dg-rtp.dg.com)
+
+ * i386.md (adddi3): Don't treat two non-equal MEMs as non-aliasing.
+
+Tue Mar 28 08:20:49 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * a29k.h (CONSTANT_ADDRESS_P): Provide consistent definition.
+
+Tue Mar 28 07:26:41 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (do_xifdef, do_endif): Remove unnecessary pointer comparisons.
+
+Mon Mar 27 20:45:15 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * calls.c (expand_call, store_one_arg): Don't set KEEP in calls
+ to assign_stack_temp.
+ * function.c (preserve_temp_slots): Clear ADDR_TAKEN on item
+ that we are preserving.
+
+Mon Mar 27 14:39:35 1995 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips/mips.h (FIRST_PSEUDO_REGISTER): Increment.
+ (FIXED_REGISTERS, CALL_USED_REGISTERS): Add new register.
+ (MD_REG_LAST): Increment.
+ (ST_REG_FIRST, ST_REG_LAST): Increment.
+ (HILO_REGNUM): Define.
+ (enum reg_class): Add HILO_REG.
+ (REG_CLASS_NAMES): Add "HILO_REG".
+ (REG_CLASS_CONTENTS): Add HILO_REG initializer, and adjust ST_REGS
+ and ALL_REGS initializers.
+ (SECONDARY_RELOAD_CLASS): Remove.
+ (SECONDARY_INPUT_RELOAD_CLASS): Define.
+ (SECONDARY_OUTPUT_RELOAD_CLASS): Define.
+ (REGISTER_MOVE_COST): Treat HILO_REG as MD_REGS.
+ (REGISTER_NAMES): Add initialization line.
+ (DEBUG_REGISTER_NAMES): Add "accum".
+ * mips/mips.md: For each instruction which sets HI or LO, clobber
+ HILO_REGNUM with (clobber (match_scratch:MODE N "=a")). Change
+ each explicit reference to register 66 to register 67.
+ (mulsidi3): Change to define_expand.
+ (mulsidi3_internal): New name of old mulsidi3.
+ (mulsidi3_64bit): New insn.
+ (umulsidi3): Change to define_expand.
+ (umulsidi3_internal): New name of old umulsidi3.
+ (umulsidi3_64bit): New insn.
+ (madddi_64bit, umaddi_64bit): New insns.
+ (movdi_internal2): Add case for setting HILO_REG to zero.
+ (reload_indi, reload_outdi): New define_expands.
+ (movsi_internal1, movsi_internal2): Add cases for setting MD_REGS
+ to zero, and for setting a general reg to HILO_REG.
+ (reload_outsi): New define_expand.
+ * mips/mips.c (mips_reg_names): Add "accum".
+ (mips_sw_reg_names): Likewise.
+ (mips_regno_to_class): Map HILO_REGNUM to HILO_REG.
+ (mips_move_1word): Handle moving HILO_REGNUM to a general
+ register. Make sure that the normal MD_REG cases aren't used for
+ HILO_REGNUM. Handle moving zero to a MD_REG.
+ (mips_move_2words): Make sure that the normal MD_REG cases aren't
+ used for HILO_REGNUM. Handle moving zero to a MD_REG.
+ (override_options): Set mips_char_to_class for 'a' and 'b'.
+ (mips_secondary_reload_class): Add in_p argument. Handle
+ HILO_REGNUM.
+
+Mon Mar 27 07:16:05 1995 Warner Losh <imp@village.org>
+
+ * gcc.c: Removed __NetBSD__ from conditional.
+ Declare strerror if HAVE_STRERROR is defined; otherwise
+ declare sys_errlist and sys_nerr.
+ (my_strerror): New function.
+
+Fri Mar 24 18:08:14 1995 Jason Merrill <jason@python.cygnus.com>
+
+ * i386/linux.h (LIB_SPEC): Don't try to link with libraries we
+ know only exist in archive form unless -static.
+
+Fri Mar 24 16:12:16 1995 Doug Evans <dje@cygnus.com>
+
+ * Makefile.in (multilib.h): Depend on Makefile, not config.status.
+
+Fri Mar 24 15:01:17 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/rs6000.h (TARGET_MULTIPLE_SET): New target_flags bit that
+ indicates -mmultiple or -mno-multiple was explicitly passed by the
+ user, and not set as part of the cpu defaults.
+ (TARGET_SWITCHES): Set TARGET_MULTIPLE_SET bit for both -mmultiple
+ and -mno-multiple.
+
+ * rs6000/rs6000.c (rs6000_override_options): If -mmultiple or
+ -mno-multiple was explicitly used, don't override the setting with
+ the processor default.
+
+Wed Mar 22 21:42:13 1995 Doug Evans <dje@cygnus.com>
+
+ * i960/i960.c (i960_function_arg_advance): Ensure all regs marked
+ as used if stack is also used (for va_start).
+ (i960_setup_incoming_varargs): Rewrite to be similar to Intel's
+ version, but don't allocate reg block unless necessary.
+ * ginclude/va-i960.h (varargs va_start): Save g14 explicitly.
+ Account for arguments preceding va_alist.
+
+Wed Mar 22 13:24:55 1995 Torbjorn Granlund <tege@adder.cygnus.com>
+
+ * pa.c (singlemove_string): Handle SFmode constants again. Simplify.
+ (zdepi_cint_p): Make some variables HOST_WIDE_INT.
+ (lhs_lshift_cint_operand): Likewise.
+ (output_and): Likewise.
+ (output_ior): Likewise.
+
+Wed Mar 22 12:40:09 1995 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * sh.md (udivsi3): Don't clobber register 6.
+ (udivsi3, divsi3, mulsi3_call): Use a pseudo-reg with regclass 'z'
+ for output rather than hard register 0.
+ (block_move_real): Don't clobber registers 4 and 5.
+
+ * mips.c (mips_select_section): Apply constant DEC_INITIAL tests
+ only to VAR_DECLs.
+
+Wed Mar 22 03:53:17 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
+
+ * config.sub (rm400, rm600): New machine names.
+ (sinix5.*, sinix): New os aliases.
+ (mips-siemens): Default os to sysv4.
+
+Mon Mar 20 21:56:47 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ Merged Paul Eggert's patch to cccp.c of Wed Mar 8 18:21:51 1995:
+ * cpplib.c (do_include): Fix type typo: pcfbuflimit is char *, not int.
+
+ Merged Doug Evans' patch to cccp.c of Mon Feb 27 17:06:47 1995:
+ * cpplib.c (do_include): Check for redundant file before opening in
+ relative path case. Don't call fstat unnecessarily.
+
+ Merged J.T. Conklin's patch to cccp.c of Wed Feb 22 20:29:31 1995:
+ * cpperror.c: Removed __NetBSD__ from conditional.
+
+ Merged Kenner's patch to cccp.c & cexp.y of Tue Sep 20 17:49:47 1994:
+ * cppexp.c (struct operation): Make value by HOST_WIDE_INT.
+ (cpp_parse_expr): Change return type to HOST_WIDE_INT.
+ * cpplib (eval_if_expr): Likewise.
+ (do_if, do_elif): Update appropriately.
+ * cpplib.h (cpp_parse_expr): Removed, to avoid defining HOST_WIDE_INT.
+
+ Merged Paul Eggert's patch to cccp.c of Mon Aug 8 19:42:09 1994:
+ * cpplib.c (create_definition): Warn about `#define a@', since a
+ diagnostic is now required (see ISO TC1's addition to subclause 6.8).
+ Also warn about `#define is-empty(x) (!x)'.
+
+Tue Mar 21 00:10:50 1995 Jeffrey A. Law <law@mole.gnu.ai.mit.edu>
+
+ * x-pa (CC): Add "-Dbsd4_4".
+
+Mon Mar 20 18:40:31 1995 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * toplev.c (print_error_function): New function hook.
+ (default_print_error_function): New function. Default value
+ of print_error_function. Code moved here from report_error_function.
+ (report_error_function): Use print_error_function hook.
+
+Mon Mar 20 20:27:43 1995 Doug Evans <dje@cygnus.com>
+
+ * cccp.c (do_xifdef): Handle c++ comments.
+ (do_endif): Likewise.
+
+Mon Mar 20 15:31:45 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * configure (i386 configurations): Prepend i386/ to t-crt*.
+
+Mon Mar 20 07:58:04 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * stmt.c (fixup_gotos): Add missing call from last change.
+
+ * objc/misc.c: Put Alpha-specific decls before #include of runtime.h.
+
+ * alpha.h (EXTRA_SECTIONS): Write zeros first time in .rdata.
+
+Sat Mar 18 16:37:24 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * flow.c (mark_used_regs, case SUBREG): Set reg_changes_size even
+ for integer modes.
+ (mark_used_regs): Set reg_changes_size for RHS, if necessary.
+ * combine.c (gen_lowpart_for_combine): Set reg_changes_size, if needed.
+ * reload.c (push_reload): Reload a SUBREG if paradoxical and
+ class is CLASS_CANNOT_CHANGE_SIZE.
+ * reload1.c (gen_reload): Handle paradoxical SUBREGs.
+ * alpha.h (SECONDARY_{INPUT,OUTPUT}_RELOAD_CLASS): Need GENERAL_REGS
+ for paradoxical SUBREG and FLOAT_REGS.
+ (SECONDARY_NEEDED_MODE): Use actual mode for 4 bytes or wider.
+ * alpha.md (movsi): Allow FP regs and add case for store of FP reg.
+ Remove cvtlq from MEM to FP reg case.
+
+ * rtl.h (emit_insns_after): Add declaration.
+ * stmt.c (fixup_gotos): Do a cleanup for a block when it is exited
+ even if label if not defined yet.
+
+ * function.c (pop_function_context): Fix error in last change;
+ reference old value of current_function_decl before we modify it.
+
+Fri Mar 17 21:57:44 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * toplev.c (rest_of_compilation): Handle -Wreturn-type properly
+ for inlines we aren't compiling yet.
+
+Fri Mar 17 21:26:48 1995 Mike Stump <mrs@cygnus.com>
+
+ * libgcc2.c (__register_exceptions): Handle empty tables.
+
+Fri Mar 17 11:48:31 1995 Douglas Rupp (drupp@cs.washington.edu)
+
+ * i386/winnt.c (winnt_function_prologue): Deleted.
+ (gen_stdcall_suffix): New function.
+
+Thu Mar 16 17:36:52 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * svr4.h (LINK_SPEC): If the user did not specify -h name, use the
+ output file name, if any.
+ * sparc/sol2.h (LINK_SPEC): Ditto. Also, if the user did not
+ specify -R path, add an -R for each -L.
+
+ Move SunOS 4-specific assembler switches into the appropriate place.
+ * m68k/sun[23].h (ASM_SPEC): Add %{R} %{j} %{J} %{h} %{d2}
+ %{keep-local-as-symbols:-L}.
+ * i386/sun.h (ASM_SPEC): Add %{R} %{keep-local-as-symbols:-L}.
+ * sparc/sparc.h (ASM_SPEC): Ditto.
+ * gcc.c (default_compilers): Remove %{R} %{j} %{J} %{h} %{d2}
+ %{keep-local-as-symbols:-L} from assembler rules.
+
+Thu Mar 16 16:58:09 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/eabi-ctors.c: New file, handle C++ static constructors
+ and destructors without requiring anything else from a libc.
+
+ * rs6000/t-eabi (LIB2FUNCS_EXTRA): Build eabi-ctors.c.
+
+ * rs6000/eabi.asm: Do not load up register 2 if there is no .got
+ section. Jump to the __do_global_ctors function at the end of
+ processing to call C++ static constructors, and it will return to
+ __eabi's caller. Use normal volatile registers, instead of saving
+ and restoring registers 30 and 31.
+
+ * rs6000/eabi.h (STARTFILE_SPEC): Define as null.
+ (LIB_SPEC): Ditto.
+ (ENDFILE_SPEC): Ditto.
+ (LIBGCC_SPEC): Always look for libgcc.a.
+
+Thu Mar 16 17:05:14 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * stmt.c (warn_if_unused_value, case SAVE_EXPR): New case.
+ (warn_if_unused_value, case NOP_EXPR): OK if CALL_EXPR inside.
+
+ * c-common.c (decl_attributes): Allow alignment for TYPE_DECLs.
+
+ * Makefile.in (xsys-protos.h): Fix typo in -U operand.
+
+Thu Mar 16 13:49:10 1995 Per Bothner <bothner@rtl.cygnus.com>
+
+ * cpplib.c, cpplib.h: New files - a C PreProcessor library.
+ * cpphash.c, cpphash.h, cppalloc.c, cpperror.c, cppexp.c:
+ New files - utility features used by cpplib.
+ * cppmain.c: New file - cpp replacement main program for cpplib.
+ * Makefile.in: New rules to build cppmain.
+
+Thu Mar 16 16:11:05 1995 Douglas Rupp (drupp@cs.washington.edu)
+
+ * i386/winnt.h (FUNCTION_PROLOGUE, HAVE_probe, gen_probe): Deleted.
+ (ENCODE_SECTION_INFO, VALID_MACHINE_DECL_ATTRIBUTE): New macro.
+
+Thu Mar 16 15:58:24 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * combine.c (apply_distributive_law, case SUBREG): Fix typo when
+ checking for paradoxical SUBREG.
+
+Wed Mar 15 18:45:08 1995 Doug Evans <dje@cygnus.com>
+
+ * libgcc1-test.c: Renamed from cross-test.c.
+ * Makefile.in (LIBGCC1_TEST): Renamed from CROSS_TEST.
+ (all.cross): Delete $(ENQUIRE) dependency.
+ (libgcc1-test): Renamed from cross-test.
+ Delete unnecessary gcc-cross and $(LIBGCC) dependencies.
+ Link with -nostartfiles -nostdlib
+ `$(GCC_FOR_TARGET) --print-libgcc-file-name`.
+ (libgcc1-test.o): Renamed from cross-test.o.
+ Change gcc-cross dependency to xgcc since the latter is used.
+
+Wed Mar 15 13:49:21 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * tree.c (save_tree_status): Now takes a tree 'context' instead of
+ a boolean 'toplevel' as an argument. If 'context' is not
+ current_function_decl, create a new obstack for the new function.
+ Also save inline_obstacks.
+ (restore_tree_status): No longer takes a second argument. Also
+ restore inline_obstacks.
+ (temporary_allocation): Clear inline_obstacks.
+ (permanent_allocation): Free up the obstacks in inline_obstacks.
+
+ * function.h (struct function): New fields contains_functions and
+ inline_obstacks.
+
+ * function.c (push_function_context_to): Now takes a tree
+ 'context' instead of a boolean 'toplevel' as an argument.
+ Also save current_function_contains_functions.
+ (push_function_context): Pass current_function_decl to it.
+ (pop_function_context_from): Takes 'context' instead of 'toplevel'.
+ Set current_function_contains_functions properly.
+ (pop_function_context): Pass current_function_decl to it.
+
+Wed Mar 15 14:53:09 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/rs6000.md (abssi2): Turn into a define_expand. If
+ TARGET_POWER, do old code that uses the abs instruction. If not,
+ do abs in three instructions, using a temporary register, which
+ enables generating more reasonable code for sne. Add a recognizer
+ for negative of the absolute value. Add define_splits for the
+ PowerPC.
+ (sne insn): Add a recognizer for sne on the PowerPc to use two
+ instructions, compared to the four generated using the absolute
+ value insn.
+
+Tue Mar 14 18:38:40 1995 J.T. Conklin <jtc@cygnus.com>
+
+ * m68k.md ({add,sub,mul,div}[sdx]f3): Add new patterns for recognizing
+ SImode, HImode, and QImode operands.
+
+Mon Mar 13 18:59:36 EST 1995 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.h (CPP_SPEC): Add PPC403.
+ (processor_type): Add PPC403.
+ (RTX_COSTS): Add PPC403.
+ * powerpc.h (CPP_SPEC): Add PPC403.
+ * sysv4.h (CPP_SPEC): Add PPC403.
+ * rs6000.c (processor_target_table): Add PPC403.
+ * rs6000.md (define_attr cpu and function units): Add PPC403.
+
+Mon Mar 13 14:40:23 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/rs6000.md (call, call_value insns): Do not put a nop
+ after a bl instruction on System V.4 and eABI.
+
+ * rs6000/sysv.4 (SUBTARGET_SWITCHES): Add support for
+ -mno-traceback to suppress the V.4 traceback word.
+ (ASM_DECLARE_FUNCTION_NAME): Don't put out a traceback work if
+ -mno-traceback.
+
+Mon Mar 13 13:36:37 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * t-svr4, i386/t-{crtpic,sol2}, m88k/t-svr4, sparc/t-sol2:
+ Use -fPIC, rather than -fpic, for building crtstuff.
+
+Sat Mar 11 17:27:08 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * configure: Use aix3newas.h for AIX 3.2.4 and 5.
+ * rs6000/aix41.h: Undefine ASM_OUTPUT_EXTERNAL{,_LIBCALL}.
+ * rs6000/aix3newas.h: New file. Define ASM_SPEC to -u, and
+ undefine ASM_OUTPUT_EXTERNAL{,_LIBCALL}.
+
+Sat Mar 11 06:42:50 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * dbxout.c (dbxout_symbol): Properly handle decl whose DECL_NAME
+ points to a TYPE_DECL with a zero TYPE_NAME.
+
+Fri Mar 10 18:18:33 1995 Torbjorn Granlund <tege@cygnus.com>
+
+ * pa.h (PROMOTE_MODE): Define.
+
+Fri Mar 10 14:37:58 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * sdbout.c (sdbout_record_type_name): If TYPE_NAME is
+ a TYPE_DECL, get name from DECL_NAME.
+
+Fri Mar 10 14:09:26 1995 Doug Evans <dje@cygnus.com>
+
+ * arm/riscix.h (SUBTARGET_SWITCHES): Renamed from
+ ARM_EXTRA_TARGET_SWITCHES.
+ * arm/riscix1-1.h (SUBTARGET_SWITCHES): Likewise.
+ * arm.h (SUBTARGET_SWITCHES): Likewise.
+ (TARGET_HARD_FLOAT, TARGET_SOFT_FLOAT): Define.
+ (TARGET_SWITCHES): Add -msoft-float, -mhard-float.
+ (BYTES_BIG_ENDIAN): Delete #ifndef/#endif.
+ (CONDITIONAL_REGISTER_USAGE): If -msoft-float, disable fp regs.
+ (FUNCTION_VALUE): R16 is return reg only if !-msoft-float.
+ (LIBCALL_VALUE): Likewise.
+ * arm.md (all fp patterns): Conditionalize on TARGET_HARD_FLOAT.
+ (*movsf_soft_insn, *movdf_soft_insn): New patterns.
+
+Fri Mar 10 13:53:46 1995 Jim Wilson <wilson@cygnus.com>
+
+ * reorg.c (steal_delay_list_from_target): Exit at the top if the
+ branch in SEQ is not a single set.
+
+ * sh.md (movdi define_split, movdf define_split): Correct indentation
+ and formatting. Make the condition fail if an operand is a MEM
+ with an auto-inc address.
+
+ * varasm.c (copy_constant): Copy operand of ADDR_EXPR if it is a
+ constant.
+
+ * mips/abi64.h (SETUP_INCOMING_VARARGS): Correct arguments to
+ move_block_from_reg call.
+
+ * expr.c (expand_assignment): When offset is zero, make new MEM
+ before setting MEM_VOLATILE_P.
+
+ * reload.c (find_reloads, case 'o'): Accept a fully reloaded
+ auto-increment address.
+
+ * combine.c (max_uid_cuid): New static variable.
+ (INSN_CUID): Call abort if INSN is out of range.
+ (combine_instructions): Set max_uid_cuid. Set uid_cuid directly
+ instead of through INSN_CUID.
+ (get_last_value): Use prev_real_insn instead of prev_nonnote_insn.
+ Ignore USE insns generated by combine.
+
+Fri Mar 10 13:47:08 1995 Rod Barman <rodb@cs.ubc.ca>
+
+ * m68k/fpgnulib.c (__fixdfsi): Catch values < 0.5 in magnitude.
+
+Fri Mar 10 12:02:33 1995 Ian Lance Taylor <ian@cygnus.com>
+
+ * fixincludes: Fix `typedef struct term;' on hppa1.1-hp-hpux9.
+
+Fri Mar 10 05:50:11 1995 Oliver Kellogg (Oliver.Kellogg@RST13.DASA.DBMAIL.d400.de)
+
+ * 1750a.c (sectname): Reverse Init and Normal.
+ (print_operand_address, case PLUS): Add case for LABEL_REF.
+ (print_operand_address, case LABEL_REF): Split from SYMBOL_REF.
+ (print_operand_address, case CODE_LABEL): New case.
+ (ASM_FILE_END): Delete.
+ * 1750a.h (FUNCTION_EPILOGUE): Restore stack before freeing local vars.
+ (DEFAULT_SIGNED_CHAR): Now 1.
+ (DATA_SECTION_ASM_OP): Use pseudo-op for read-only data (later copied).
+ (JUMP_TABLES_IN_TEXT_SECTION): Define.
+ (ASM_OUTPUT_ASCII): Split into multiple lines if long.
+ (ASM_OUTPUT_{CHAR,SHORT,INT,LONG_INT}): Split up.
+ (ASM_OUTPUT_COMMON): Call check_section.
+
+Thu Mar 9 12:46:53 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.md (movsf): Do not call truncdfsf2 for non PowerPC
+ when expanding a store to memory and -msoft-float was used.
+
+Thu Mar 9 08:51:35 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-decl.c (start_function): Handle new parameter ATTRIBUTES.
+ * c-tree.h (start_function): Add new parameter.
+ * c-lang.c (finish_file): Pass new parm to start_function.
+ * objc-act.c (build_module_descriptor, really_start_method): Likewise.
+ * c-parse.in (fndef, nested_function): Pass prefix_attributes
+ to start_function.
+ (setspecs): Save prefix_attributes in declspec_stack.
+ (decl rules): Restore prefix_attributes along with current_declspecs.
+ (setattrs): Concatenate prefix_attributes to previous value.
+ * c-common.c (decl_attributes): Handle prefix and suffix attributes
+ the same way.
+
+ * print-tree.c (print_node): Fix typo in printing large INTEGER_CST.
+
+ * varasm.c (assemble_variable): Consistently use DECL_SIZE for
+ everything.
+
+ * c-typeck.c (convert_for_assignment): Fix typo in testing for
+ pointer to function type.
+
+ * varasm.c (record_constant_1): Handle NON_LVALUE_EXPR.
+ Rewrite to use switch instead of if/then/elseif/else.
+
+Wed Mar 8 18:21:51 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (do_include): Fix type typo: pcfbuflimit is char *, not int.
+
+Wed Mar 8 17:30:29 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * fold-const.c (force_fit_type): Always propagate OVERFLOW.
+
+ * rtl.def (INLINE_HEADER): Add new "e" field.
+ * rtl.h (FORCED_LABELS): New field; other fields adjusted.
+ (gen_inline_header_rtx): New parm FORCED_LABELS.
+ * emit-rtl.c (gen_inline_header): Add new parm FORCED_LABELS.
+ * integrate.c (initialize_for_inline, output_inline_function):
+ Handle FORCED_LABELS.
+
+Wed Mar 8 13:47:20 1995 Jason Merrill (jason@cygnus.com)
+
+ * alpha.h (WORD_SWITCH_TAKES_ARG): Add -rpath.
+ (LINK_SPEC): Pass through -taso and -rpath.
+ * alpha/osf12.h (LINK_SPEC): Ditto.
+
+Wed Mar 8 09:59:56 1995 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/eabi.asm: Rewrite so that the initialized pointers go
+ into the .got2 section, which allows eabi.asm to be assembled with
+ the -mrelocatable option. Move the data picked up from the bl
+ instruction to before the traceback tag.
+
+ * rs6000/sysv4.h (CPP_SPEC): Define _RELOCATABLE if -mrelocatable
+ switch is used.
+
+ * libgcc2.c (__new_handler): Don't initialize the pointer variable
+ with the address of __default_new_handler, which may not work in
+ some shared library mechanisms.
+ (__builtin_new): If __new_handler is NULL, call the function
+ __default_new_handler.
+
+Tue Mar 7 17:34:59 1995 Ian Lance Taylor <ian@cygnus.com>
+
+ * i960.h (PROCESS_PRAGMA): Define.
+ (ROUND_TYPE_ALIGN): Pass maximum of COMPUTED and SPECIFIED to
+ i960_round_align.
+ (ROUND_TYPE_SIZE): Delete.
+ * i960.c (process_pragma): Uncomment, and rewrite for gcc 2.
+ (i960_round_size): Delete.
+ (i960_round_align): Don't adjust suggested alignment downward.
+ Restrict alignment to value set by #pragma align.
+
+Tue Mar 7 12:14:46 1995 Doug Evans <dje@cygnus.com>
+
+ * configure (sparc64-*-elf): Add crtbegin.o, crtend.o to extra_parts.
+ * sparc/sp64-elf.h (TARGET_VERSION): Define.
+ (CPP_PREDEFINES): Delete sun, sparc, unix. Delete OS assertions.
+ (ASM_SPEC): Define.
+ (LINK_SPEC): Delete solaris stuff, this is an embedded target.
+ (STARTFILE_SPEC, ENDFILE_SPEC): Define.
+
+Mon Mar 6 17:54:01 1995 Doug Evans <dje@cygnus.com>
+
+ * Makefile.in (install-common): Fix typo in installation of cpp.
+ Likewise with gcc-cross.
+
+Mon Mar 6 02:29:05 1995 Jeffrey A. Law <law@mole.gnu.ai.mit.edu>
+
+ * pa.md (movsicc): New expander.
+
+Fri Mar 3 13:34:20 1995 Michael Meissner (meissner@cygnus.com)
+
+ * rs6000/sysv4.h (ASM_SPEC): If -mrelocatable was passed to
+ compiler, pass it on to the assembler.
+
+Fri Mar 3 12:11:28 1995 Ian Lance Taylor <ian@cygnus.com>
+
+ * fixincludes: Add fixes for VxWorks header files.
+ * ginclude/stddef.h: If VxWorks typedef macros are defined, invoke
+ them as appropriate.
+
+Fri Mar 3 05:48:54 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (dump_single_macro): Fix typo: % wasn't properly
+ doubled in printf formats.
+
+Thu Mar 2 19:44:02 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * expr.c (expand_expr, CLEANUP_POINT_EXPR): Force the operand out
+ of memory before running cleanups.
+
+Thu Mar 2 19:15:24 1995 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (rescan): Prevent accidental token-pasting to
+ get !=, *=, /=, ==, or ^=.
+
+Thu Mar 2 15:37:13 1995 Jason Merrill <jason@phydeaux.cygnus.com>
+
+ * c-typeck.c (build_binary_op): Avoid spurious warning
+ comparing enumerator to unsigned variable.
+
+Thu Mar 2 18:18:38 1995 J.T. Conklin <jtc@netbsd.org>
+
+ * m68k.md (sqrtsf2,sqrtdf2): Use fp precision specifiers.
+
+Thu Mar 2 18:09:01 1995 Stephen L Moshier (moshier@world.std.com)
+
+ * c-lex.c (yylex, case !NOT_FLOAT): Remove previous change.
+
+Thu Mar 2 15:26:50 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * Makefile.in (bootstrap*): Pass new STAGE_PREFIX to recursive makes.
+
+Wed Mar 1 14:52:16 1995 Ian Lance Taylor <ian@cygnus.com>
+
+ * i960/i960-coff.h (ASM_FILE_START): Define.
+ (CTORS_SECTION_ASM_OP, DTORS_SECTION_ASM_OP): Define.
+ (EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS): Define.
+ (CTORS_SECTION_FUNCTION, DTORS_SECTION_FUNCTION): Define.
+ (INT_ASM_OP): Define.
+ (ASM_OUTPUT_CONSTRUCTOR, ASM_OUTPUT_DESTRUCTOR): Define.
+ * i960/vx960-coff.h (CPP_PREDEFINES): Define.
+ (CPP_SPEC): Define.
+ (CC1_SPEC): Default to -mca.
+
+Wed Mar 1 11:10:54 1995 Michael Meissner (meissner@cygnus.com)
+
+ * rs6000/rs6000.c (output_prologue): Do not emit the word that
+ gives the PC relative location to the local GOT table for the
+ -mrelocatable option here.
+ * rs6000/sysv4.h (ASM_DECLARE_FUNCTION_NAME): Emit it here.
+
+ * t-eabi (MULTILIB_OPTIONS, MULTILIB_DIRNAMES): Build -msoft-float
+ and -mrelocatable versions of the library.
+
+ * rs6000/powerpc.h (CPP_PREDEFINES): Define the cpu and machine as
+ powerpc, not rs6000.
+
+ * libgcc2.c (_unwind_function): Clone for powerpc, using the
+ PowerPC mnemonics.
+
+ * rs6000/rs6000.md (uminsi3, umaxsi3): Silence warnings that
+ -2147483648 is too large to fit in a signed integer on 32-bit
+ hosts.
+
+Wed Mar 1 06:48:31 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * fold-const.c (decode_field_reference): Don't check TREE_CODE
+ of EXP; let get_inner_reference decide if have reference.
+ Allow no bit reference if have AND_MASK.
+ (all_ones_mask_p): Use tree_int_cst_equal, not operand_equal_p.
+ (unextend): New function.
+ (fold_truthop): For constant cases, use new function, rework
+ conversion, and warn if comparison can never be true.
+
+ * expr.c (store_expr): Do conversion in two steps for promoted lhs.
+
+See ChangeLog.9 for earlier changes.
diff --git a/contrib/gcc/FSFChangeLog.11 b/contrib/gcc/FSFChangeLog.11
new file mode 100644
index 0000000..38de90c
--- /dev/null
+++ b/contrib/gcc/FSFChangeLog.11
@@ -0,0 +1,14493 @@
+Wed Dec 31 18:40:26 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * stmt.c (expand_asm_operands): Treat ASM with no outputs as volatile.
+
+Wed Dec 31 08:03:45 1997 Paul Eggert <eggert@twinsun.com>
+
+ * toplev.c (flag_verbose_asm): Default to 0, not 1.
+
+ * i386/bsd386.h (ASM_COMMENT_START): Define to " #".
+
+Tue Dec 30 17:38:55 1997 Jim Wilson <wilson@cygnus.com>
+
+ * unroll.c (find_splittable_givs): Handle givs with
+ dest_reg created by loop.
+
+Tue Dec 30 14:21:33 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * svr4.h (LINK_SPEC): Never specify -h.
+ * ptx4.h (LINK_SPEC): Likewise.
+ * rs6000/sysv4.h (LINK_SPEC): Likewise.
+ * sparc/sol2.h (LINK_SPEC): Likewise.
+
+Tue Dec 30 06:15:23 1997 Philippe De Muyter <phdm@macqel.be>
+
+ * libgcc2.c (_eh_compat): Do not include stdlib.h, but provide a
+ private extern declaration for malloc.
+
+Mon Dec 29 06:56:41 1997 Laurent Guerby <guerby@gnat.com>
+
+ * Makefile.in (stmp-int-hdrs): Add "touch".
+
+Sun Dec 28 19:36:05 1997 Stephen L Moshier <moshier@mediaone.net>
+
+ * mips.h (CACHE_FLUSH_FUNC): New, defaults to _flush_cache.
+ (INITIALIZE_TRAMPOLINE): Use it.
+ * mips/ultrix.h (CACHE_FLUSH_FUNC): Define as cacheflush.
+ * mips/news4.h (CACHE_FLUSH_FUNC): Likewise.
+
+Sun Dec 28 08:19:13 1997 Paul Eggert <eggert@twinsun.com>
+
+ * arm.c: Don't include assert.h.
+ * i960.c: Likewise.
+ (i960_arg_size_and_align): Rewrite to avoid assert.
+ * m88k.c: Don't include assert.h.
+ (expand_block_move): Rewrite to avoid assert.
+ * except.c: Don't include assert.h.
+ (scan_region): Rewrite to avoid assert.
+ (save_eh_status, restore_eh_status, scan_region): Don't bother
+ testing whether pointer is null.
+ * dwarfout.c, dwarf2out.c: Do not include assert.h.
+ (assert): New macro, since we can't use system assert.
+
+Sat Dec 27 19:08:17 1997 Stephen L Moshier <moshier@mediaone.net>
+
+ * mips/ultrix.h (DWARF2_UNWIND_INFO): Define as 0.
+
+Fri Dec 26 05:57:06 1997 Philippe De Muyter <phdm@macqel.be>
+
+ * m68k/mot3300.h (FINALIZE_TRAMPOLINE): Macro defined.
+ * libgcc2.c (__clear_insn_cache): New sysV68-specific helper function
+ for trampolines.
+
+Thu Dec 25 15:22:43 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * rs6000.c (function_arg_padding): All aggregates pad upward.
+
+Wed Dec 24 18:05:13 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * sparc.c: Add prototypes for static functions.
+ (check_pic): Check for form of pic_pc_rtx, not it itself.
+ (pic_setup_code): New function, from finalize_pic.
+ (finalize_pic): Call pic_setup_code and insert after nonlocal_receiver.
+ * sparc.md (nonlocal_goto_receiver): New pattern.
+
+Tue Dec 23 05:54:38 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expr.c (expand_builtin_setjmp): Call builtin_setjmp_receiver.
+ * mips.md (builtin_setjmp_receiver): New pattern.
+
+ * crtstuff.c (__do_global_ctors_aux): Add missing call to
+ FORCE_INIT_SECTION_ALIGN and go back to text section.
+ * i386/sol2.h (FORCE_INIT_SECTION_ALIGN): Remove loop.
+
+ * expr.c (do_store_flag): For shift, get bit count using tree_pow2.
+
+Tue Dec 23 05:21:18 1997 Paul Eggert <eggert@twinsun.com>
+
+ * genattrtab.c (main): Check HAVE_{G,S}ETRLIMIT too.
+
+Mon Dec 22 19:30:59 1997 Michael P. Hayes <michaelh@ongaonga.chch.cri.nz>
+
+ * sdbout.c (plain_type_1): Add missing checks for named types "char"
+ and "int" and check for int by size first.
+
+Mon Dec 22 19:13:58 1997 Manfred Hollstein <manfred@s-direktnet.de>
+
+ * m68k/xm-mot3300.h (ADD_MISSING_{POSIX,XOPEN}): Define.
+ * m88k/xm-sysv3.h: Likewise.
+
+ * configure.in (getrlimit, setrlimit): Call AC_CHECK_FUNCS.
+ * cccp.c (main): Check HAVE_{G,S}ETRLIMIT in addition to RLIMIT_STACK.
+ * toplev.c (main): Likewise.
+
+ * fixincludes (target_canonical): New variable.
+ (size_t): Add support for Motorola's stdlib.h which fails to provide
+ a definition for size_t.
+ (str{len,spn,cspn} return value): Handle different layout on sysV88.
+ (fabs/hypot): Provide a fake for hypot which is broken on
+ m88k-motorola-sysv3; emit a prototype for fabs on m88k-motorola-sysv3.
+
+ * m68k/mot3300.h (ASM_BYTE_OP): Don't include '\t' in definition.
+ (ASM_OUTPUT_ASCII): Prefix ASM_BYTE_OP by one single '\t'.
+
+Mon Dec 22 19:05:49 1997 Richard Henderson <rth@cygnus.com>
+
+ * sparc.md (jump): Don't use the annul bit around an empty loop.
+
+Mon Dec 22 18:52:56 1997 Robert Lipe <robertl@dgii.com>
+
+ * i386/x-sco5 (CLIB) Deleted.
+ (ALLOCA) Added.
+ * i386/xm-sco5.h (USE_C_ALLOCA) Added.
+
+Mon Dec 22 18:42:16 1997 Philippe De Muyter <phdm@macqel.be>
+
+ * m68k/mot3300Mcrt0.S (mcount): Function removed.
+ (__stop_monitor): New function.
+ * m68k/mot3300-crt0.S (__stop_monitor): New (empty) function.
+ (mcount, mcount%, monitor): Common symbols removed.
+ * m68k/mot3300.h (FUNCTION_PROFILER): USE_GAS and !USE_GAS versions
+ fixed and merged.
+ (EXIT_BODY): Always call __stop_monitor without tricky tests.
+
+Mon Dec 22 18:35:05 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * objc/Make-lang.in (runtime-info.h, libobjc_entry.o): Create in
+ build directory.
+ (libobjc.a): Update dependency list.
+ (libobjc.dll): Likewise. Use libobjc_entry.o from build directory.
+ (objc/sendmsg.o): Add -Iobjc to find runtime-info.h.
+ (objc.mostlyclean): Remove runtime-info.h.
+
+Mon Dec 22 18:27:47 1997 Paul Eggert <eggert@twinsun.com>
+
+ * libgcc2.c (_eh_compat): New section.
+ * Makefile.in (LIB2FUNCS): Add _eh_compat.
+
+Mon Dec 22 17:52:37 1997 Marcus G. Daniels <mgd@wijiji.santafe.edu>
+
+ * objc/init.c (_objc_load_callback): Don't initialize.
+
+Sun Dec 21 15:06:00 1997 Paul Eggert <eggert@twinsun.com>
+
+ * mips/xm-iris5.h (HAVE_INTTYPES_H): Force undefined.
+
+Sun Dec 21 14:51:51 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * dwarf2out.c (add_bound_info, case COMPONENT_REF): New case.
+
+Sun Dec 14 06:49:05 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expr.c (expand_expr, case PLACEHOLDER_EXPR): Use placeholder_list
+ expression in preference to any other if correct type.
+
+ * i386.h (INITIAL_ELIMINATION_OFFSET): Correctly test for PIC
+ register used.
+
+Sat Dec 13 06:11:32 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * frame.h (__register_frame_info_table): Fix typo in declaration.
+
+Fri Dec 12 07:55:18 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * function.c (purge_addressof_1): For (mem (address (mem ...)),
+ when collapsing, preserve mode of outer MEM.
+
+ * frame.c (__register_frame_info): Renamed from __register_frame.
+ (__register_frame_info_table, __deregister_frame_info): Similarly.
+ * frame.h (__{,de}register_frame_info): Likewise.
+ (__register_frame_info_table): New declaration.
+ * crtstuff.c (__do_global_dtors{,_aux}): Rename __deregister_frame.
+ (frame_dummy, __do_global_ctors): Likewise for __register_frame.
+ * collect2.c (write_c_file_{stat,glob}): Rename __register_frame
+ to __register_frame_info and similarly for __deregister_frame and
+ __register_frame_table.
+
+ * sched.c (remove_dependencies): Set RTX_INTEGRATED_P on dependency
+ we delete. Properly update prev for multiple consecutive deletions.
+ (priority): Skip deleted dependence.
+
+ * integrate.c (initialize_for_inline): In DECL_RTL of a PARM_DECL,
+ look inside a (mem (addressof (mem ...))).
+
+Fri Dec 12 05:49:58 1997 Paul Eggert <eggert@twinsun.com>
+
+ * collect2.c (write_c_file_glob):
+ Allocate initial frame object in static storage and pass its address.
+
+Thu Dec 11 18:01:31 1997 Philippe De Muyter <phdm@macqel.be>
+
+ * acconfig.h (NEED_DECLARATION_GETENV): Define slot added.
+
+Thu Dec 11 17:54:23 1997 Paul Eggert <eggert@twinsun.com>
+
+ * crtstuff.c (__do_global_ctors): Fix typo in last change.
+
+Wed Dec 10 18:38:28 1997 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * libgcc2.c (__bb_exit_func): Fix test of return value of fopen.
+
+Wed Dec 10 07:07:37 1997 Bernd Schmidt <crux@starsky.Informatik.RWTH-Aachen.DE>
+ * combine.c (simplify_rtx, case ABS): Don't get confused by a
+ VOIDmode operand.
+
+Tue Dec 9 17:44:14 1997 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.h (FUNCTION_ARG_PADDING): Define.
+ * rs6000.c (function_arg_padding): New function.
+
+Tue Dec 9 08:53:56 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * integrate.c (save_for_inline_copying): Make a new reg_parm_stack_loc.
+
+Mon Dec 8 19:23:58 1997 Pat Rankin <rankin@eql.caltech.edu>
+
+ * toplev.c (get_run_time): [#if VMS] Cast arg in times call.
+
+ * vax/xm-vms.h (HAVE_UNISTD_H): Define for DEC C.
+ * make-cccp.com [CC]: Add /Prefix=All for DEC C.
+
+Mon Dec 8 08:09:17 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * stmt.c (expand_decl_cleanup_no_eh): Properly return a value.
+
+ * fold-const.c (fold_convert): Don't flag overflow when converting
+ pointer to integer.
+
+Sun Dec 7 09:42:05 1997 Pat Rankin <rankin@eql.caltech.edu>
+
+ * make-gcc.com (@make-l2): Pass along any command line arguments.
+ * make-l2.com: Add latent support to compile cp/inc/* if `cc1plus'
+ is specified [currently disabled].
+ * make-cc1.com: When building with GNU C, use -O2.
+ * make-cccp.com: Likewise.
+
+Sun Dec 7 06:56:48 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * crtstuff.c (__do_global_ctors): Add missing arg to __register_frame.
+
+ * collect2.c (write_c_file_stat): Fix error in last change;
+ use __SIZE_TYPE__, not size_t.
+
+Sun Dec 7 05:50:43 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (strings.h): Fix misspelling of `include' introduced
+ in last change to this file.
+
+Sat Dec 6 18:54:11 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alpha/vms.h (CPP_PREDEFINES): Remove redundant setting
+ of GCC version and unneeded setting of __VMS_VER.
+
+Fri Dec 5 07:24:36 1997 Richard Stallman <rms@gnu.org>
+
+ * sparc/linux64.h (TARGET_VERSION): Write "GNU/Linux".
+ * sparc/linux.h, sparc/linux-aout.h, rs6000/linux.h: Likewise.
+ * m68k/linux.h, arm/linux.h, alpha/{linux,elf}.h: Likewise.
+ * listing: Change linux to gnu-linux.
+
+Fri Dec 5 06:23:22 1997 Paul Eggert <eggert@twinsun.com>
+
+ Alter C startup code so that it doesn't invoke malloc on Solaris.
+ * frame.h (struct object): Decl moved here from frame.c.
+ * frame.c (struct object): Move decl to frame.h.
+ ("frame.h"): Include after <stddef.h>, so that size_t is defined.
+ (__register_frame, __register_frame_table, __deregister_frame):
+ It's now the caller's responsibility to allocate storage for object.
+ * crtstuff.c (frame_dummy), collect2.c (write_c_file_stat):
+ Allocate initial frame object in static storage and pass its address.
+ * crtstuff.c (<stddef.h>, "frame.h"): Include.
+ * Makefile.in ($(T)crtbegin.o, $(T)crtend.o, stamp-crtS):
+ Depend on defaults.h and frame.h.
+
+ * Makefile.in (RTL_H, TREE_H): Add gansidecl.h.
+ (DEMANGLE_H): New macro. All dependencies on demangle.h
+ changed to $(DEMANGLE_H).
+ (RECOG_H): Likewise.
+ (libgcc2.a, stmp-multilib): Add dependencies on frame.h, gansidecl.h.
+ (collect.o): Add dependency on gansidecl.h.
+ (gcc.o, choose-temp.o, pexecute.o, prefix.o): Likewise.
+ (obstack.o, choose-temp.o, pexecute.o): Add dependency on $(CONFIG_H).
+
+Fri Dec 5 06:20:06 1997 Dean Deaver <deaver@amt.tay1.dec.com>
+
+ * arm.md (casesi_internal): Add USE of label.
+
+Fri Dec 5 05:59:44 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * configure.in (sys/times.h): Check for this instead of times.h.
+ * cpplib.c, toplev.c: Properly test for and include sys/times.h.
+
+Thu Dec 4 12:30:40 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.c (final_prescan_insn): Use local label prefix when emitting
+ .uses pseudo-ops.
+
+Thu Dec 4 07:00:48 1997 Richard Earnshaw <rearnsha@arm.com>
+
+ * arm.c (arm_finalize_pic): Use an offset of 4 when adjusting the
+ GOT address.
+
+Thu Dec 4 06:58:32 1997 Dean Deaver <deaver@amt.tay1.dec.com>
+
+ * genoutput.c (scan_operands): Treat format of "u" like "e".
+
+Thu Dec 4 06:28:33 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * msdos/top.sed, winnt/config-nt.sed: Change version to 2.8.0.
+
+ * stmt.c (pushcase_range): Clean up handling of "infinite" values.
+
+Wed Dec 3 09:03:35 1997 Bernd Schmidt <crux@ohara.Informatik.RWTH-Aachen.DE>
+
+ * i386.c (notice_update_cc): Remove bogus Pentium GCC code.
+
+Wed Dec 3 08:46:32 1997 Paul Eggert <eggert@twinsun.com>
+
+ * arm.h (CPP_ARCH_DEFAULT_SPEC): Fix misspelling: `TARGET_CPU_DEFUALT'.
+ (TARGET_SWITCHES): Fix misspelling: `no-apcs-rentrant'.
+ * pa.c (override_options): Fix misspelling: `compatable'.
+ * enquire.c (main): Fix misspelling in diagnostic: `mallocatable'.
+ * gcov.c (function_summary): Fix misspelling in diagnostic: `funcion'.
+ * objc/thr-decosf1.c (__objc_thread_id): Fix misspelling in code:
+ `pthread_getuniqe_np'.
+
+ * tahoe.c (extensible_operand): Renamed from extendable_operand.
+ All callers changed.
+ * dwarf2.h (enum dwarf_discrim_list): Renamed from dwarf_descrim_list.
+ * dwarf2out.c: Fix misspellings in forward static function
+ declarations: `add_AT_setion_offset', `add_sibling_atttributes'.
+ * dwarfout.c: Fix misspellings in forward static function
+ declarations: `langauge_attribute', `geneate_new_sfname_entry'.
+ * stmt.c, tree.h (start_cleanup_deferral):
+ Renamed from start_cleanup_deferal.
+ (end_cleanup_deferral): Renamed from end_cleanup_deferal.
+ * toplev.c (rest_of_compilation): Rename local var from
+ inlineable to inlinable.
+
+Wed Dec 3 06:17:03 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * stmt.c (expand_decl_cleanup): Update thisblock after eh_region_start.
+
+Wed Dec 3 06:06:38 1997 Jim Wilson <wilson@cygnus.com>
+
+ * dwarf2out.c (gen_type_die, case POINTER_TYPE): See TREE_ASM_WRITTEN
+ before the recursive call.
+
+Wed Dec 3 05:57:29 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * configure.in (AC_HEADER_{STDC,TIME}): Add calls.
+ (AC_CHECK_HEADERS): Add fcntl.h times.h, sys/times.h,
+ sys/resource.h, and sys/param.h.
+ (getenv): Check if need declaration.
+ * cccp.c: Remove obsolete ways of including headers and use autoconf
+ symbols instead.
+ Include gansidecl.h; remove things defined there.
+ See if getenv needs to be declared.
+ * cpplib.c: Likewise.
+ * cexp.y: Use autoconf symbols to select what include files are needed.
+ * genattrtab.c, toplev.c: Likewise.
+
+Tue Dec 2 21:44:25 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * reload1.c (reload): Make copy of MEM before setting
+ req_equiv_mem if the address is a PLUS.
+
+Tue Dec 2 07:03:47 1997 Pat Rankin <rankin@eql.caltech.edu>
+
+ * vax/xm-vms.h (STDC_HEADERS, HAVE_STDLIB, HAVE_STRING): Define.
+ (mesg_implicit_function_declaration): New macro.
+
+ * make-l2.com: Compile libgcc2.c with `-fexceptions' specified.
+
+Mon Dec 1 17:44:59 1997 Jeffrey A Law (law@cygnus.com)
+
+ * dwarf2out.c (output_call_frame_info): Use ASM_OUTPUT_ASCII to
+ output ASCII by default; only use ASM_OUTPUT_DWARF_STRING if
+ flag_debug_asm is on.
+ (output_die, output_pubnames, output_line_info): Likewise.
+
+Mon Dec 1 17:15:30 1997 Philip Blundell <pb@nexus.co.uk>
+
+ * arm/linux.h (SUBTARGET_CPU_DEFAULT): Define instead
+ of TARGET_CPU_DEFAULT.
+
+Mon Dec 1 16:51:23 1997 J.J. van der Heijden <J.J.vanderHeijden@student.utwente.nl>
+
+ * i386/mingw32.h (MATH_LIBRARY): Set to "-lcrtdll".
+
+Mon Dec 1 16:46:57 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * c-aux-info.c: Add prototypes for static functions.
+ * c-lex.c, emit-rtl.c, rtl.c, xcoffout.c: Likewise.
+
+ * i386.h (TARGET_SWITCHES): Add entries for "windows" and "dll".
+
+Mon Dec 1 16:42:20 1997 Jim Wilson <wilson@cygnus.com>
+
+ * mips.md (fix_trunc{dfsi,sfsi,dfsi}2): Add '*' in operand 3.
+
+Sun Nov 30 20:25:59 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expr.c (get_inner_reference): For ARRAY_REF, if need
+ WITH_RECORD_EXPR, make it with the ARRAY_REF as exp.
+
+ * expr.c (store_constructor): Use TARGET, not EXP, for
+ WITH_RECORD_EXPR when offset has a placeholder.
+
+Sun Nov 30 11:19:00 1997 J.J. van der Heijden <J.J.vanderHeijden@student.utwente.nl>
+
+ * objc/Make-lang.in (libobjc.dll): Rename -dll flag to -mdll.
+
+Sun Nov 30 08:42:29 1997 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+ * stmt.c (expand_end_bindings): Cleanups and incoming gotos are
+ not incompatible.
+
+Sun Nov 30 05:45:06 1997 Michael P. Hayes <michaelh@ongaonga.chch.cri.nz>
+
+ * jump.c (jump_optimize): Use find_insert_position in two more places.
+
+Sat Nov 29 13:47:40 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alpha/vms.h (HAVE_STRERROR, HAVE_{LIMITS,STDDEF,TIME}_H): Define.
+
+Sat Nov 29 08:29:47 1997 J.J.van der Heijden <J.J.vanderHeijden@student.utwente.nl>
+
+ * configure.in: Add check for kill.
+ * gcc.c: Define kill as raise if not HAVE_KILL.
+
+Sat Nov 29 06:18:08 1997 Michael P. Hayes <michaelh@ongaonga.chch.cri.nz>
+
+ * jump.c (find_insert_position): New function.
+ (jump_optimize): Use it when making new copy of insn after test.
+
+Sat Nov 29 05:54:57 1997 Douglas Rupp <rupp@gnat.com>
+
+ * alpha/vms.h (BIGGEST_ALIGNMENT, ENCODE_SECTION_INFO): No longer
+ override.
+
+Sat Nov 29 05:43:37 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * getpwd.c (getpwd, [VMS]): Only add extra arg if VMS.
+
+ * alpha/xm-vms.h (HAVE_VPRINTF, HAVE_PUTENV): Define.
+
+ * cccp.c (index, rindex): Add conditional defs to strchr and strrchr.s
+ * cpplib.c: Likewise.
+ * gcov.c: Include gansidecl.h.
+
+Fri Nov 28 21:17:51 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * objc/objc-act.c: Include "output.h".
+
+ * objc/Make-lang.in (objc-parse.o, objc-act.o): Also depend on
+ $(srcdir)/output.h.
+
+ * objc/Object.m (+conformsTo:): Surround assignment with parentheses.
+
+ * objc/archive.c, objc/class.c, objc/encoding.c: Finish prototyping.
+ * objc/init.c, objc/objc-act.c, objc/objc-api.h: Likewise.
+ * objc/runtime.h, objc/sendmsg.c: Likewise.
+
+Fri Nov 28 19:15:53 1997 Mark Kettenis <kettenis@phys.uva.nl>
+
+ * objc/thr-posix.c (__objc_mutex_allocate): Allocate
+ mutex type instead of assuming it fits in a void * type.
+ (__objc_mutex_deallocate): Free mutex type.
+ (__objc_mutex_lock): Pass mutex type instead of pointer to it.
+ (__objc_mutex_{try,un}lock): Likewise.
+ (__objc_condition_allocate): Allocate condition type instead
+ of assuming it fits in a void * type.
+ (__objc_condition_deallocate): Free condition type.
+ (__objc_condition_wait): Pass condition type instead of pointer to it.
+ (__objc_condition_{broadcast,signal}): Likewise.
+
+Fri Nov 28 17:07:25 1997 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.c (function_arg_partial_nregs): Undo 11/26 change.
+
+Fri Nov 28 12:34:03 1997 Scott Christley <scottc@net-community.com>
+
+ * objc/Make-lang.in (runtime-info.h): Add comment in file.
+
+ * objc/selector.c: Replace all occurrences of sarray_get
+ with sarray_get_safe.
+ * objc/sendmsg.c: Likewise.
+
+ * protoize.c (include_defaults): Add component element as in cccp.c.
+ * nextstep.h (INCLUDE_DEFAULTS): Add component element.
+ (ASM_COMMENT_START): Correct assembly comment string.
+ * objc/Make-lang.in (objc/{NXConstStr,Object,Protocol,linking):
+ Compile with GNU runtime.
+
+Fri Nov 28 12:27:50 1997 Ovidiu Predescu <ovidiu@net-community.com>
+
+ Generate platform information required by ObjC runtime.
+ * toplev.c (lang_options): New ObjC specific compiler flag.
+ * objc/Make-lang.in: Add target to generate runtime-info.h file.
+ * objc/objc-act.c (print_struct_values): New variable.
+ (generate_struct_by_value_array): New function.
+ (lang_init): Call generate_struct_by_value_array if requested.
+ (lang_decode_option): Check for new compiler flag.s
+ * objc/sendmsg.c (__objc_get_forward_imp): Check size of type
+ for determining proper forwarding function.
+
+Fri Nov 28 05:58:30 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * regclass.c (record_address_regs): Use REG_OK_FOR_{INDEX,BASE},
+ not the REGNO versions.
+
+Thu Nov 27 16:28:04 1997 Scott Snyder <snyder@d0sgif.fnal.gov>
+
+ * dwarf2out.c (outout_call_frame_info): Ensure info has proper
+ alignment.
+
+ * libgcc2.c (__throw): Initialize HANDLER.
+
+Thu Nov 27 16:23:25 1997 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * tree.h, rtl.h: See if need declarations for free.
+ * tree.c, bc-optab.c: Get the declaration of free from stdlib.h.
+
+Thu Nov 27 07:21:54 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * except.h: Add outer_context_label_stack.
+ * except.c: Likewise.
+ (expand_start_all_catch): Push the outer_context for the try block
+ onto outer_context_label_stack.
+ (expand_end_all_catch): Use it and pop it.
+
+ * except.c (expand_start_all_catch): One more do_pending_stack_adjust.
+
+ * expr.c (preexpand_calls): Don't look past a TRY_CATCH_EXPR.
+
+Thu Nov 27 07:15:10 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.c (SMALL_DATA_REG): Register to use for small data relocs.
+ (print_operand{,_address}): Use SMALL_DATA_REG for register involved in
+ small data relocations.
+
+ * rs6000/linux.h (LINK_SPEC): Pass -dynamic-linker /lib/ld.so.1 if
+ -dynamic linker is not used.
+
+ * rs6000.md (call insns): For local calls, use @local suffix under
+ System V; don't use @plt under Solaris.
+
+Wed Nov 26 15:12:32 1997 Jeffrey A Law (law@cygnus.com)
+
+ * Makefile.in (LIBGCC2_CFLAGS): Add -fexceptions.
+
+ * toplev.c (flag_exceptions): Default value is 2.
+ (compile_file): If flag_exceptions still has the value 2, then
+ set it to 0.
+
+Wed Nov 26 14:58:42 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.c (output_function_profiler): Put label address in r0, and
+ store LR in 4(sp) for System V/eabi.
+
+ * rs6000.h (ASM_OUTPUT_REG_{PUSH,POP}): Keep stack aligned to 16
+ byte boundary, and maintain stack backchain.
+
+ (Originally from Geoffrey Keating)
+ * rs6000.c (function_arg): Excess floating point arguments don't
+ go into GPR registers after exhausting FP registers under the
+ System V.4 ABI.
+ (function_arg_partial_nregs): Likewise.
+
+ * rs6000.md (call insns): If -fPIC or -mrelocatable, add @plt
+ suffix to calls.
+
+Wed Nov 26 14:09:01 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarfout.c (output_type): If finalizing, write out nested types
+ of types we've already written.
+
+ * toplev.c (main): Complain about -gdwarfn.
+
+Wed Nov 26 12:37:56 1997 J.J. van der Heijden <J.J.vanderHeijden@student.utwente.nl>
+
+ * mingw32.h (PATH_SEPARATOR): Moved to xm-mingw32.h
+ * xm-mingw32.h (PATH_SEPARATOR): Moved here from mingw32.h.
+
+ * getpwd.c (getpwd): Use VMS implementation of _WIN32 unless cygwin32.
+
+Wed Nov 26 12:26:44 1997 John Hassey <hassey@dg-rtp.dg.com>
+
+ * m88k/dgux.h (ASM_CPU_SPEC) : No whitespace allowed.
+
+ * m88k.h (SUPPORTS_ONE_ONLY) : Must be svr4.
+
+ * i386/dgux.h (ASM_OUTPUT_ALIGN): Deleted.
+
+ * i386/dgux.c (output_file_start) : Changed ix86_isa_string
+ to ix86_arch_string.
+
+ * cplus-dem.c (fancy_abort): Added.
+
+Wed Nov 26 06:07:50 1997 Richard Earnshaw <rearnsha@arm.com>
+
+ * arm/coff.h (TARGET_DEFAULT): Add ARM_FLAG_APCS_32 to defaults.
+
+ * configure.in (arm*-*-*): Recognize --with-cpu for ARM processors.
+
+Wed Nov 26 05:05:36 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * libgcc2.c (inhibit_libc): Define #ifdef CROSS_COMPILE.
+
+ * mips/xm-iris6.h (malloc, realloc, calloc): No longer declare.
+ (USG): Define here.
+ (xm-iris5.h): No longer include; just include xm-mips.h.
+
+ * mips-tfile.c (parse_def): Properly recognize bitfield and
+ count array dimensions.
+
+ * protoize.c: Remove declarations of void, exit, and free.
+
+ * i386/mingw32.h (LINK_SPEC, STARTFILE_SPEC): Change -dll to -mdll.
+
+ * configure.in: Check for sys/file.h.
+ * gcc.c (sys/file.h): Include if HAVE_SYS_FILE_H.
+
+ * configure.in: Only give error on bad --with-cpu value for target.
+
+Sat Nov 22 19:21:55 1997 Philippe De Muyter <phdm@macqel.be>
+
+ * dwarf2out.c (CIE_LENGTH_LABEL, FDE_LENGTH_LABEL): New macros.
+ (ASM_OUTPUT_DWARF_VALUE4): New macro.
+ (ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL): Define if SET_ASM_OP is
+ defined.
+ (output_call_frame_info): Don't output forward label differences
+ if ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL is defined.
+ Substitute instead simple label and define this label later to be
+ difference of desired labels after they have been defined.
+ * m68k/mot3300.h (SET_ASM_OP): Define when not using gas.
+
+ * gcc.c (process_command): Don't take address of function fatal when
+ calling lang_specific_driver.
+
+Sat Nov 22 17:08:03 1997 J. Kean Johnston <jkj@sco.com>
+
+ * i386/sco5.h (SELECT_RTX_SECTION): Redefine to work with -fpic.
+ (LIBGCC_SPEC, LIB_SPEC): Link with correct libgcc.a.
+ (HAVE_ATEXIT): Define.
+
+Sat Nov 22 12:20:22 1997 Richard Earnshaw <rearnsha@arm.com>
+
+ * arm.md (movsfcc{,_hard}_insn): Specify mode for all alternatives.
+
+Sat Nov 22 06:56:16 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * function.c (instantiate_decl): Only ignore ADDRESSOF if arg is REG.
+
+ * configure.in: Check for functions before checking which need decls.
+ (bcopy, bzero, bcmp, index, rindex): Add checks.
+ (vax-*-sysv*): Fix typo in setting of xm_file.
+ * aclocal.m4: Add conditional definitions of index and rindex.
+ * gansidecl.h (bcopy, bzero, bcmp, index, rindex): If don't
+ have one of these, define macro to use ANSI form.
+ * pa/xm-pahpux.h (bcopy, bzero, bcmp, rindex, index): No longer define.
+ * mips/xm-sysv.h, xm-m88k.h, m68k/xm-plexus.h: Likewise.
+ * m68k/xm-mot3300.h, m68k/xm-m68kv.h, m68k/xm-hp320.h: Likewise.
+ * winnt/xm-winnt.h, vax/xm-vms.h, m68k/xm-3b1.h: Likewise.
+ * i386/xm-os2.h, i386/xm-mingw32.h, alpha/xm-vms.h: Likewise.
+ * xm-svr4.h, xm-svr3.h: Likewise.
+ * clipper/xm-clix.h: Likewise.
+ (TARGET_MEM_FUNCTIONS): Define here.
+ * xm-linux.h (bcmp, bcopy, bzero, index, rindex): No longer undefine.
+ * xm-convex.h (bcopy, bzero): No longer define.
+ * vax/xm-vaxv.h, sparc/xm-pbd.h, mips/xm-iris{3,4,5}.h: Likewise.
+ * m68k/xm-crds.h, m68k/xm-altos3068.h, i386/xm-sun.h: Likewise.
+ * i386/xm-osf.h, i386/xm-aix.h, xm-i370.h, ns32k/xm-genix.h: Likewise.
+
+Sat Nov 22 06:46:26 1997 Paul Eggert <eggert@twinsun.com>
+
+ * c-typeck.c, collect2.c, cpplib.c, dwarfout.c, gcov.c, protoize.c:
+ Don't include <strings.h> unless there's no <string.h>.
+
+Fri Nov 21 06:46:50 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * configure.in (i[3456]86-*-freebsd{,elf}*): Delete i386/xm-freebsd.h.
+ * xm-freebsd.h, i386/xm-freebsd.h: Deleted.
+
+ * i386/xm-cygwin32.h (HAVE_RUSAGE, HAVE_FILE_H): Deleted.
+ * i386/xm-mingw32.h, rs6000/xm-cygwin32.h: Likewise.
+
+ * xm-std32.h: New file, so far unused.
+
+Fri Nov 21 05:50:54 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m68k.c (legitimize_pic_address): Make sure pic register marked used.
+
+ * dwarf2out.c (output_call_frame_info): Call app_enable and
+ app_disable if flag_debug_asm, not if flag_verbose_asm.
+
+Thu Nov 20 16:37:36 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expr.c (expand_builtin_apply): Fix typo in last change.
+
+ * expr.c (expand_assignment): If assigning to readonly field,
+ mark rtx as unchanging.
+
+ * configure.in: Add checks for functions putenv, popen, and vprintf.
+ (i[3456]86-*-netbsd*): No longer need i386/xm-netbsd.h.
+ (i860-alliant-*): No longer need i860/xm-fx2800.h.
+ (m68k-ncr-sysv*): Use xm-svr3.h instead of m68k/xm-tower.h.
+ (m68k-sun-sunos*): No longer need m68k/xm-sun3.h.
+ (m68k-*-netbsd*): No longer need m68k/xm-netbsd.h.
+ (mips-dec-netbsd*): No longer need mips/xm-netbsd.h.
+ (ns32k-pc532-netbsd*): No longer need ns32k/xm-netbsd.h.
+ (sparc-*-netbsd*): No longer need sparc/xm-netbsd.h.
+ (vax-*-netbsd*): No longer need config/xm-netbsd.h.
+ * arm/xm-netbsd.h: No longer include xm-netbsd.h.
+ * xm-linux.h (HAVE_VPRINTF, HAVE_POPEN, HAVE_PUTENV): Deleted.
+ * xm-mips.h (HAVE_VPRINTF, HAVE_PUTENV): Deleted.
+ * i386/xm-osf.h, xm-arm.h, xm-alpha.h: Likewise.
+ * xm-sparc.h (HAVE_POPEN): Deleted.
+ * xm-sh.h (HAVE_VPRINTF): Deleted.
+ * mips/xm-iris4.h, mips/xm-iris5.h, xm-m88k.h: Likewise.
+ * m68k/xm-crds.h, m68k/xm-atari.h, m68k/xm-amix.h: Likewise.
+ * xm-svr3.h, xm-svr4.h, i386/xm-mingw32.h: Likewise.
+ * i386/xm-os2.h (HAVE_PUTENV): Deleted.
+ * i386/xm-dos.h, i386/xm-aix.h: Likewise.
+ * arm/xm-netbsd.h (HAVE_VPRINTF, HAVE_STRERROR): No longer
+ need undefine.
+ * xm-netbsd.h, i386/xm-netbsd.h, m68k/xm-netbsd.h: Deleted.
+ * mips/xm-netbsd.h, ns32k/xm-netbsd.h, sparc/xm-netbsd.h: Likewise.
+ * i860/xm-fx2800.h, m68k/xm-sun3.h, m68k/xm-tower.h: Likewise.
+
+Thu Nov 20 16:04:24 1997 Richard Earnshaw <rearnsha@arm.com>
+
+ * explow.c (plus_constant_wide, case MEM): If about to call
+ force_const_mem, generate the rtl in a saveable obstack.
+
+ * arm.md (movhi): Pass the full MEM to storeinthi, storehi and
+ storehi_bigend.
+ (storeinthi, storehi, storehi_bigend): Be more conservative about
+ when not to force a PLUS or MINUS into a REG. Use change_address
+ to create new MEMs.
+
+Wed Nov 19 15:16:04 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * c-common.c (print_char_table): Add a and A to float formats.
+ (scan_char_table): Likewise.
+ (check_format_info): Recognize `a' as allocate flag only if used
+ in correct context.
+
+Wed Nov 19 12:56:54 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * configure.in: Fix check for <inttypes.h>.
+
+Tue Nov 18 19:27:01 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.md (attribute "type"): Add nil.
+ (movsi_ie): y/y alternative is type nil.
+ (movsf_ie): Replace ry/yr/X alternative by r/y/X , y/r/X and y/y/X.
+ (movsf_ie+1): Delete.
+
+Tue Nov 18 18:38:41 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (warn_undef): Now static.
+ (eval_if_expression): Don't warn about undefined preprocessor symbols
+ in system headers.
+ * cexp.y (parse_c_expression):
+ Now takes new arg specifying whether to warn
+ about undefined preprocessor symbols.
+ (warn_undef): Now local and static; independent of warn_undef in cccp.c
+ (yylex): `register' -> `register int', needed for C9X.
+
+ The following changes are only if TEST_EXP_READER is defined:
+ (expression_signedp): New var.
+ (start): Set expression_signedp to signedness of expression.
+ (print_unsigned_host_wide_int): New function.
+ (main): Use it to print value of expression, instead of hoping that
+ `long' is long enough. Print "u" after unsigned values.
+
+Tue Nov 18 18:33:30 1997 Jim Wilson <wilson@cygnus.com>
+
+ * mips.c (save_restore_insns): If gp_offset or fp_offset are
+ large_int, emit two insns instead of one splitable insn.
+ * dwarf2out.c (dwarf2out_frame_debug): When set cfa_store_offset
+ from cfa_temp_value, use cfa_offset. Add assert checking that
+ cfa_reg is SP.
+
+Tue Nov 18 09:11:58 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * fold-const.c (div_and_round_double): Return overflow for
+ divide-by-zero instead of aborting.
+
+ * tree.c (substitute_in_expr, case TREE_LIST): Fix two typos.
+
+Tue Nov 18 05:03:52 1997 Jeffrey A Law <law@cygnus.com>
+
+ * arm.c (output_move_double): Allocate 3 entries in otherops array.
+
+Tue Nov 18 02:41:01 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (quote_string_for_make): New function.
+ (deps_output): Use it to fix bug with file name quoting in -M output.
+
+Mon Nov 17 13:28:33 1997 Philip Blundell <Philip.Blundell@pobox.com>
+
+ * arm/lib1funcs.asm (__div0): Provide GNU/Linux implementation.
+ * arm/t-linux (LIB1ASMFUNCS): Use it.
+
+Mon Nov 17 09:13:59 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * function.c (purge_addressof_1): Make copy when substituting argument
+ of ADDRESSOF.
+ (fixup_var_refs_1): Likewise.
+
+ * m68k.c: Include tree.h.
+
+Mon Nov 17 09:01:05 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * getpwd.c (getpwd, [VMS]): Add extra arg of 0 to getcwd call.
+
+ * alpha/vms.h ({OPTIMIZATION,OVERRIDE}_OPTIONS): Delete, for now.
+ * alpha/xm-vms.h (DIR_SEPARATOR, PATH_SEPARATOR): Delete.
+
+Mon Nov 17 08:52:45 1997 Richard Earnshaw <rearnsha@arm.com>
+
+ * function.c (fixup_stack_1): Also fix-up refs via ARG_POINTER_REGNUM.
+
+ * configure.in (arm-*-netbsd*): Doesn't need collect2.
+
+Mon Nov 17 08:50:01 1997 Stephen L Moshier <moshier@world.std.com>
+
+ * i386/isc.h (DWARF2_UNWIND_INFO): Define as 0.
+
+Mon Nov 17 08:42:28 1997 Michael P. Hayes <michaelh@ongaonga.chch.cri.nz>
+
+ * flow.c (propagate_block): Look for pre-inc/dec within PARALLEL.
+
+Mon Nov 17 03:14:46 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cpplib.c (file_size_and_mode): Remove.
+ (finclude): Don't assume long and off_t are same size or that
+ mode_t fits in int.
+ * cccp.c: (main, finclude, check_precompiled): Don't assume size_t
+ and off_t are same size.
+ * gcov.c (read_files): Don't assume off_t and unsigned are same size.
+
+Sun Nov 16 18:56:40 1997 Scott Christley <scottc@net-community.com>
+
+ * objc/objc-act.c (objc_demangle): New function.
+ (objc_printable_name): New function.
+ (init_objc): Change default function.
+
+ * expr.c (expand_builtin_apply): Prefer nonlocal over block.
+
+Sun Nov 16 18:10:13 1997 Fila Kolodny <fila@ibi.com>
+
+ * i370.c (i370_function_prolog): New function from i370.h.
+ * i370.h (FUNCTION_PROLOG): Just call i370_function_prolog.
+
+Sun Nov 16 08:40:35 1997 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+ * calls.c (expand_call, store_one_arg): Don't pass QImode arguments
+ to emit_library_call.
+ * expr.c (emit_push_insn, expand_assignment, store_expr): Likewise.
+ (expand_expr, expand_builtin): Likewise.
+ * function.c (put_var_into_stack, assign_parms): Likewise.
+ * alpha.c (alpha_builtin_saveregs): Likewise.
+ * clipper.c (clipper_builtin_saveregs): Likewise.
+ * m88k.c (m88k_builtin_saveregs): Likewise.
+ * pa.c (hppa_builtin_saveregs): Likewise.
+ * sparc.c (sparc_builtin_saveregs): Likewise.
+
+Sun Nov 16 07:39:08 1997 Paul Eggert <eggert@twinsun.com>
+
+ * real.h (REAL_VALUES_IDENTICAL): New macro.
+ * expr.c (is_zeros_p): Don't consider -0.0 to be all zeros.
+ * fold-const.c (operand_equal_p): Don't consider -0.0 identical to 0.0.
+ * tree.c (simple_cst_equal): Likewise.
+ * varasm.c (immed_real_const_1): Use new REAL_VALUES_IDENTICAL macro.
+
+Sun Nov 16 07:29:12 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * acconfig.h (NEED_DECLARATION_{,R}INDEX): New cases.
+ * configure.in: See if need declarations for index and rindex.
+ * c-typeck.c, collect2.c, cpplib.c, dwarfout.c, gcov.c, protoize.c:
+ Include stdlib.h, string.h, and strings.h, if they exist.
+ Only declare index and rindex if needed.
+ * collect2.c: Only declare free if needed.
+
+ * regclass.c (record_address_regs): Refine choice of index and base
+ when have sum of two regs, one of which is a hard reg.
+
+Sun Nov 16 07:07:45 1997 Robert Lipe (robertl@dgii.com)
+
+ * i386/sco5.h (ASM_OUTPUT_ALIGNED_BSS): Define as in sysv4 and linux
+ (HAVE_ATEXIT): No longer define. This confused ELF destructors.
+ (DBX_DEBUGGING_INFO): Define.
+
+Sat Nov 15 09:55:11 1997 Richard Earnshaw (rearnsha@arm.com)
+
+ * arm.h (GO_IF_LEGITIMATE_ADDRESS): Don't accept MINUS (until reload
+ knows what to do with it).
+
+Thu Nov 13 11:07:41 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.c (num_insns_constant): Use REAL_VALUE_FROM_CONST_DOUBLE to
+ pick apart floating point values, instead of using CONST_DOUBLE_LOW
+ and CONST_DOUBLE_HIGH.
+
+ * rs6000.md (define_splits for DF constants): Use the appropriate
+ REAL_VALUE_* interface to pick apart DF floating point constants in
+ a machine independent fashion.
+
+Thu Nov 13 07:30:53 1997 Richard Earnshaw (rearnsha@arm.com)
+
+ * arm/netbsd.h (LINK_SPEC): Redefine -- pass -X.
+
+ * arm.md (movsicc_insn): Add extra reload alternatives for better
+ register tying.
+ (movsfcc_hard_insn, movsfcc_soft_insn, movdfcc_insn): Likewise.
+
+Mon Nov 10 19:32:14 1997 Doug Evans <dje@cygnus.com>
+
+ * sparc.md (mov[sdt]f_const_insn): Fix condition to match what
+ instruction can handle.
+
+Mon Nov 10 03:02:19 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * stmt.c (expand_decl_cleanup_no_eh): New fn.
+
+ * except.c (expand_leftover_cleanups): do_pending_stack_adjust.
+
+Sun Nov 9 14:34:47 1997 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.md (lshrdi3_power): Delete '&' from first alternative and
+ swap instruction order.
+
+Sun Nov 9 09:51:08 1997 Michael P. Hayes <michaelh@ongaonga.chch.cri.nz>
+
+ * machmode.def (QCmode, HCmode): New modes.
+
+Sun Nov 9 09:24:21 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * combine.c (sets_function_arg_p): New function.
+ (combinable_i3pat): Check if combining with any but the first
+ argument register setting insn for a function call.
+
+ * a29k.h (ELIGIBLE_FOR_EPILOGUE_DELAY): Avoid sheduling load from
+ stack slot.
+
+Sun Nov 9 09:17:53 1997 Richard Earnshaw (rearnsha@arm.com)
+
+ * loop.c (strength_reduce): If initial value of BIV is equivalent to
+ a constant, record that as initial value.
+ (check_dbra_loop): Don't reverse loop if initial value isn't CONST_INT.
+
+Sun Nov 9 09:12:41 1997 Tristan Gingold <gingold@haendel.enst.fr>
+
+ * expr.c (emit_push_insn): Avoid infinite recursion
+ when -fcheck-memory-usage.
+
+Sun Nov 9 08:03:42 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * cse.c (simplify_binary_operation): Fix error in last change.
+
+Sun Nov 9 07:56:31 1997 Pat Rankin <rankin@eql.caltech.edu>
+
+ * vmsconfig.com [version.opt]: Parse version string more robustly.
+ [@variable@]: Discard configure tokens when using Makefile.in.
+ [libgcc2-cxx.list]: Generate this new file for CXX_LIB2FUNCS.
+ [cp/input.c]: Suppress it as workaround to avoid linker warning.
+ [objc-parse.y]: Now lives in the objc subdirectory.
+ * make-cc1.com [objc-parse.{c,y}]: Ditto.
+ * make-cccp.com [prefix.c]: Compile additional source file.
+
+ * cccp.c (VMS_freopen, VMS_fopen, VMS_open, VMS_fstat): Call
+ corresponding library routine specified via its ordinary name
+ rather than with a decc$ prefix. (Reverses Oct 19 change.)
+
+ * cccp.c, cexp.y [HOST_WIDE_INT]: Manually splice long lines
+ of avoid backslash+newline continuation on #if directives.
+
+Sun Nov 9 01:54:54 1997 Jeffrey A Law (law@cygnus.com)
+
+ * local-alloc.c (block_alloc): Don't lose if two SCRATCH expressions
+ are shared.
+
+Sat Nov 8 23:01:37 1997 Michael P. Hayes <michaelh@ongaonga.chch.cri.nz>
+
+ * cse.c (simplify_binary_operation): Don't simplify divide by zero
+ for targets that don't support a representation of INFINITY.
+
+Sat Nov 8 22:37:29 1997 Richard Earnshaw <rearnsha@arm.com>
+
+ * Makefile.in (cse.o): Depend on expr.h.
+ * cse.c: Include expr.h.
+ (fold_rtx, case MEM): For ADDRESSOF, create new MEM.
+
+Sat Nov 8 19:27:56 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * expr.c (expand_increment): When enqueing a postincrement for a MEM,
+ use copy_to_reg if address is not a general_operand.
+
+Sat Nov 8 18:39:56 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * libgcc2.c (L_eh): Define __eh_pc here.
+ Replace __eh_type with generic pointer __eh_info.
+
+Sat Nov 8 07:03:47 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alpha.h (SECONDARY_OUTPUT_RELOAD_CLASS): If FLOAT_REGS,
+ need secondary reload for QImode and HImode even if BWX.
+
+ * expmed.c (store_split_bit_field): Force ADDRESSOF into register.
+
+ * cse.c (fold_rtx, case ADDRESSOF): New case (that does nothing).
+
+ * function.c (fixup_var_refs_1, case ADDRESSSOF): Check that
+ new value is valid for insn.
+
+ * stor-layout.c (get_best_mode): Refine test for field within
+ unit to work properly for negative positions.
+
+ * print-rtl.c (print_inline_rtx): Save and restore sawclose and indent.
+
+ * reload.c (find_replacement): If PLUS, MINUS, or MULT, see if
+ either arg contains a replacement.
+
+Fri Nov 7 10:22:24 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * frame.c (add_fdes, count_fdes): Go back to checking pc_begin for
+ linked once FDEs.
+
+Fri Nov 7 06:50:57 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alpha.h (FUNCTION_VALUE): Take into account promotion of pointers.
+
+ * unroll.c (back_branch_in_range_p): Refine check for INSN at loop end.
+
+Wed Nov 5 18:17:50 1997 Paul Eggert <eggert@twinsun.com>
+
+ * fixinc.svr4: Replace `__STDC__ - 0 == 1'
+ with `defined (__STRICT_ANSI__)'.
+
+Tue Nov 4 18:32:44 1997 Jim Wilson <wilson@cygnus.com>
+
+ * mips.md (insv, extzv, extv): Add change_address call.
+ (movsi_ulw, movsi_usw): Change QImode to BLKmode in pattern.
+ * mips.c (mips_expand_epilogue): Emit blockage insn before call to
+ save_restore_insns if no FP and GP will be restored.
+
+ * acconfig.h (HAVE_INTTYPES_H): Undef.
+ * configure.in (inttypes.h): Check for conflicts between sys/types.h
+ and inttypes.h, and verify that intmax_t is defined.
+ * mips/x-iris (CC, OPT, OLDCC): Comment out.
+ * mips/x-iris3: Likewise.
+
+Tue Nov 4 17:28:31 1997 Doug Evans <dje@cygnus.com>
+
+ * c-lex.c (MULTIBYTE_CHARS): #undef if cross compiling.
+ (yylex): Record wide strings using target endianness, not host.
+
+Tue Nov 4 16:18:19 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * Makefile.in (distdir-start): Add dependency on $(srcdir)/config.in.
+
+Tue Nov 4 06:14:30 1997 Paul Eggert <eggert@twinsun.com>
+
+ * c-lex.c (yylex): Don't warn about constants like
+ 9223372036854775807 and 18446744073709551615U on an L32LL64 host
+ unless pedantic.
+
+Mon Nov 3 18:42:44 1997 Jim Wilson <wilson@cygnus.com>
+
+ * i386.c (load_pic_register): Call prologue_get_pc_and_set_got.
+ * i386.md (prologue_{set_got,get_pc}): Add UNSPEC_VOLATILE to pattern.
+ (prologue_get_pc_and_set_got): New pattern.
+
+Mon Nov 3 13:42:21 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c, cpplib.c (compare_defs): Don't complain about arg name
+ respellings unless pedantic.
+ * cpplib.c (compare_defs): Accept pfile as new arg.
+ All callers changed.
+
+Fri Oct 31 07:10:09 1997 Jeffrey A Law (law@cygnus.com)
+
+ * global.c (global_alloc): Free the conflict matrix after
+ reload has finished.
+
+Thu Oct 30 17:30:42 1997 Doug Evans <dje@cygnus.com>
+
+ * configure.in (sparc-*-elf*): Use sparc/elf.h, sparc/t-elf.
+ Set extra_parts.
+ (sparc*-*-*): Recognize --with-cpu=v9.
+ * sparc/elf.h: New file.
+ * sparc/t-elf: New file.
+
+Thu Oct 30 16:36:17 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * stmt.c (expand_asm_operand): If error in matching constraint,
+ don't emit asm.
+
+Thu Oct 30 12:21:06 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * va-sh.h (__va_arg_sh1): Define.
+ (va_arg): Use it.
+ SH3E doesn't use any integer registers for subsequent arguments
+ once a non-float value was passed in the stack.
+ * sh.c (machine_dependent_reorg): If optimizing, put explicit
+ alignment in front label for ADDR_DIFF_VEC.
+ * sh.h (PASS_IN_REG_P): Fix SH3E case.
+ (ADJUST_INSN_LENGTH): If not optimizing, add two extra bytes length.
+
+Tue Oct 28 21:09:25 1997 Jim Wilson <wilson@cygnus.com>
+
+ * m68k.md (btst patterns): Add 5200 support.
+
+1997-10-28 Brendan Kehoe <brendan@cygnus.com>
+
+ * global.c (global_alloc): Use xmalloc instead of alloca for
+ CONFLICTS, since max_allocno * allocno_row_words alone can be more
+ than 2.5Mb sometimes.
+
+Tue Oct 28 15:06:44 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh/elf.h (PREFERRED_DEBUGGING_TYPE): Undefine before including
+ svr4.h.
+
+Tue Oct 28 10:19:01 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ From Brendan:
+ * dwarf2out.c (output_call_frame_info): Use l1 instead of ".".
+
+Mon Oct 27 16:01:14 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.h (GO_IF_LEGITIMATE_ADDRESS): Disable reg+reg.
+
+Mon Oct 27 16:11:52 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.c (machine_dependent_reorg): When -flag_delayed_branches,
+ put an use_sfunc_addr before each sfunc.
+ * sh.md (use_sfunc_addr, dummy_jump): New insns.
+ (casesi): For TARGET_SH2, emit a dummy_jump after LAB.
+
+Mon Oct 27 11:49:43 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2.h: Remove dwarf2out prototypes.
+ * tree.h: And put them here.
+ * m68k.c, i386.c: Don't include dwarf2.h.
+
+Mon Oct 27 00:02:13 1997 Paul Eggert <eggert@twinsun.com>
+
+ Remap include files with header.gcc only if user or configuration
+ file specifies "-remap".
+
+ * cccp.c (remap): New var.
+ (main): Set it if user specifies "-remap".
+ (open_include_file): Remap only if `remap' is nonzero.
+
+ * cpplib.h (struct cpp_options): New member `remap'.
+ * cpplib.c (cpp_options_init): Set remap to 0.
+ (open_include_file): Remap only if `remap' is nonzero.
+ (cpp_handle_options): Set remap if user specifies "-remap".
+
+ * i386/cygwin32.h, rs6000/cygwin32.h (CPP_SPEC): Define with -remap.
+
+Sun Oct 26 11:41:49 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (output_call_frame_info): The CIE pointer is now a 32
+ bit PC-relative offset. The exception range table pointer is now in
+ the CIE.
+ * frame.c (dwarf_cie, dwarf_fde): Rename CIE_pointer to CIE_delta.
+ (count_fdes, add_fdes, get_cie): Adjust.
+ (cie_info, extract_cie_info, __frame_state_for): Adjust eh_ptr uses.
+
+ From H.J. Lu:
+ * frame.c (count_fdes, add_fdes): Skip linked once FDE entries.
+
+Sat Oct 25 20:29:39 1997 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * Makefile.in (float.h-nat): If float.h is to be empty, ensure it is.
+
+Sat Oct 25 20:16:52 1997 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * prefix.c: Use stdarg.h only ifdef __STDC__. Otherwise,
+ use varargs.h. Wrap header with <>, not "".
+
+Sat Oct 25 20:10:57 1997 Robert Lipe (robertl@dgii.com)
+
+ * i386/sco5.h (EH_FRAME_SECTION_ASM_OP{,_ELF,_COFF}): Define.
+ (DWARF2_UNWIND_INFO): Likewise.
+ (EXTRA_SECTIONS): Add in_eh.
+
+Sat Oct 25 12:20:58 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.h (TARGET_SWITCHES): Add -mmult-bug and -mno-mult-bug.
+ (TARGET_MULT_BUG): Define.
+ (TARGET_DEFAULT): Default to TARGET_MULT_BUG.
+ * mn10300.md (mulsi3): Handle TARGET_MULT_BUG.
+
+Fri Oct 24 15:43:57 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.c (toplevel): Move include stdio.h before config.h.
+
+ (Patch from H.J. Lu, Aug 27, 1997)
+ * rs6000/linux.h (DEFAULT_VTABLE_THUNKS): New; defined as 1.
+
+ (Patch from Jeff Law, Oct 22, 1997)
+ * rs6000.c (struct machine_function): Add pic_offset_table_rtx.
+ (rs6000_{save,restore}_machine_status): Save/restore it.
+
+ * rs6000.md (movsi_got_internal_mem): New pattern to work around
+ case where GOT value did not get a register.
+ (movsi_got_internal_mem splitter): Split above pattern.
+
+ (Patch from Geoffrey Keating, Oct 21, 1997)
+ * rs6000.c (rs6000_stack_info): Avoid creating a stack
+ frame under System V ABI if we only need to save the LR.
+
+ (Patch from Joel Sherrill, Sep 1, 1997)
+ * rs6000/sysv4.h (SUBTARGET_SWITCHES): Add new macro
+ EXTRA_SUBTARGET_SWITCHES, which defaults to nothing.
+
+ (Patch from Geoffrey Keating, Oct 20, 1997)
+ * rs6000/t-ppccomm (CRTSTUFF_T_CFLAGS{,_S}): Add -msdata=none
+ switch.
+
+Fri Oct 24 15:25:50 1997 Doug Evans <dje@cygnus.com>
+
+ * sparc.h (ASM_SPEC): Delete.
+
+Fri Oct 24 13:16:24 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10200.c (indirect_memory_operand): Delete unused function.
+ * mn10200.h (EXTRA_CONSTRAINT): Handle 'R'.
+ * mn10200.md (bset, bclr insns): Handle output in a reg too.
+
+ * mn10300.c (symbolic_operand, legitimize_address): New functions.
+ * mn10300.h (LEGITIMIZE_ADDRESS): Call legitimize_address.
+ (GO_IF_LEGITIMATE_ADDRESS): Don't allow base + symbolic.
+
+Thu Oct 23 08:03:59 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * dbxout.c (dbxout_start_new_source_file): Use output_quoted_string
+ for FILENAME.
+
+Tue Oct 21 16:18:13 1997 Paul Eggert <eggert@twinsun.com>
+
+ * winnt/win-nt.h (CPP_SPEC): Remove reference to obsolete
+ option -lang-c-c++-comments.
+
+Tue Oct 21 10:00:20 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.md (movqi, movhi): Avoid using address registers as
+ destinations unless absolutely necessary.
+
+ * mn10200.c (expand_prologue): Fix typo.
+
+ * mn10200.h (GO_IF_LEGITIMATE_ADDRESS): Do not allow indexed addresses.
+ * mn10200.md (neghi2): Provide an alternative which works if
+ the input and output register are the same.
+
+ * mn10300.c (print_operand): Handle 'S'.
+ * mn10300.md (ashlsi3, lshrsi3, ashrsi3): Use %S for
+ shift amount in last alternative
+
+ * mn10300.c (expand_epilogue): Rework to handle register restores
+ in "ret" and "retf" instructions correctly.
+
+Tue Oct 21 07:35:19 1997 Richard Earnshaw (rearnsha@arm.com)
+
+ * arm.md (insv): Avoid writing result into a paradoxical subreg.
+
+Tue Oct 21 07:12:28 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh/elf.h (PREFERRED_DEBUGGING_TYPE): Don't redefine.
+
+Mon Oct 20 12:04:04 1997 Nick Clifton <nickc@cygnus.com>
+
+ * v850.h (CPP_SPEC): Define __v850__.
+ (CPP_PREDEFINES): Do not define __v850__.
+
+ * xm-v850.h: Use __v850 rather than __v850__ to identify v850 port.
+
+Mon Oct 20 17:29:55 1997 Doug Evans <dje@cygnus.com>
+
+ * sparc.h (SPARC_V9,SPARC_ARCH64): Delete.
+ (DEFAULT_ARCH32_P): New macro.
+ (TARGET_ARCH{32,64}): Allow compile time or runtime selection.
+ (enum cmodel): Declare.
+ (sparc_cmodel_string,sparc_cmodel): Declare.
+ (SPARC_DEFAULT_CMODEL): Provide default.
+ (TARGET_{MEDLOW,MEDANY}): Renamed to TARGET_CM_{MEDLOW,MEDANY}.
+ (TARGET_FULLANY): Deleted.
+ (TARGET_CM_MEDMID): New macro.
+ (CPP_CPU_DEFAULT_SPEC): Renamed from CPP_DEFAULT_SPEC.
+ (ASM_CPU_DEFAULT_SPEC): Renamed from ASM_DEFAULT_SPEC.
+ (CPP_PREDEFINES): Take out stuff now handled by %(cpp_arch).
+ (CPP_SPEC): Rewrite.
+ (CPP_ARCH{,32,64,_DEFAULT}_SPEC): New macros.
+ (CPP_{ENDIAN,SUBTARGET}_SPEC): New macros.
+ (ASM_ARCH{,32,64,_DEFAULT}_SPEC): New macros.
+ (ASM_SPEC): Add %(asm_arch).
+ (EXTRA_SPECS): Rename cpp_default to cpp_cpu_default.
+ Rename asm_default to asm_cpu_default.
+ Add cpp_arch32, cpp_arch64, cpp_arch_default, cpp_arch, cpp_endian,
+ cpp_subtarget, asm_arch32, asm_arch64, asm_arch_default, asm_arch.
+ (NO_BUILTIN_{PTRDIFF,SIZE}_TYPE): Define ifdef SPARC_BI_ARCH.
+ ({PTRDIFF,SIZE}_TYPE): Provide 32 and 64 bit values.
+ (MASK_INT64,MASK_LONG64): Delete.
+ (MASK_ARCH64): Renamed to MASK_64BIT.
+ (MASK_{MEDLOW,MEDANY,FULLANY,CODE_MODEL}): Delete.
+ (EMBMEDANY_BASE_REG): Renamed from MEDANY_BASE_REG.
+ (TARGET_SWITCHES): Always provide 64 bit options.
+ (ARCH64_SWITCHES): Delete.
+ (TARGET_OPTIONS): New option -mcmodel=.
+ (INT_TYPE_SIZE): Always 32.
+ (MAX_LONG_TYPE_SIZE): Define ifdef SPARC_BI_ARCH.
+ (INIT_EXPANDERS): sparc64_init_expanders renamed to sparc_init_....
+ (FUNCTION_{,BLOCK_}PROFILER): Delete TARGET_EMBMEDANY support.
+ (PRINT_OPERAND_PUNCT_VALID_P): Add '_'.
+ * sparc/linux-aout.h (CPP_PREDEFINES): Take out stuff handled by
+ CPP_SPEC.
+ (CPP_SUBTARGET_SPEC): Renamed from CPP_SPEC.
+ * sparc/linux.h: Likewise.
+ * sparc/linux64.h (SPARC_V9,SPARC_ARCH64): Delete.
+ (ASM_CPU_DEFAULT_SPEC): Renamed from ASM_DEFAULT_SPEC.
+ (TARGET_DEFAULT): Delete MASK_LONG64, MASK_MEDANY, add MASK_64BIT.
+ (SPARC_DEFAULT_CMODEL): Define.
+ (CPP_PREDEFINES): Take out stuff handled by CPP_SPEC.
+ (CPP_SUBTARGET_SPEC): Renamed from CPP_SPEC.
+ (LONG_DOUBLE_TYPE_SIZE): Define.
+ (ASM_SPEC): Add %(asm_arch).
+ * sparc/sol2.h (CPP_PREDEFINES): Take out stuff handled by CPP_SPEC.
+ (CPP_SUBTARGET_SPEC): Renamed from CPP_SPEC.
+ (TARGET_CPU_DEFAULT): Add ultrasparc case.
+ * sparc/sp64-aout.h (SPARC_V9,SPARC_ARCH64): Delete.
+ (TARGET_DEFAULT): MASK_ARCH64 renamed to MASK_64BIT.
+ (SPARC_DEFAULT_CMODEL): Define.
+ * sparc/sp64-elf.h (SPARC_V9,SPARC_ARCH64): Delete.
+ (TARGET_DEFAULT): MASK_ARCH64 renamed to MASK_64BIT. Delete
+ MASK_LONG64, MASK_MEDANY.
+ (SPARC_DEFAULT_CMODEL): Define.
+ (CPP_PREDEFINES): Delete.
+ (CPP_SUBTARGET_SPEC): Renamed from CPP_SPEC.
+ (ASM_SPEC): Add %(asm_arch).
+ (LONG_DOUBLE_TYPE_SIZE): Define.
+ (DWARF2_DEBUGGING_INFO): Define.
+ * sparc/splet.h (CPP_SPEC): Delete.
+ * sparc/sysv4.h (CPP_PREDEFINES): Take out stuff handled by CPP_SPEC.
+ (FUNCTION_BLOCK_PROFILER): Delete TARGET_EMBMEDANY support.
+ (BLOCK_PROFILER): Likewise.
+ * sparc.c (sparc_cmodel_string,sparc_cmodel): New globals.
+ (sparc_override_options): Handle code model selection.
+ (sparc_init_expanders): Renamed from sparc64_init_expanders.
+ * sparc.md: TARGET_<code_model> renamed to TARGET_CM_....
+ TARGET_MEDANY renamed to TARGET_CM_EMBMEDANY.
+ (sethi_di_embmedany_{data,text}): Renamed from sethi_di_medany_....
+ (sethi_di_fullany): Delete.
+
+Mon Oct 20 17:20:17 1997 Jim Wilson <wilson@cygnus.com>
+
+ * mips.c (compute_frame_size): Not a leaf function if profile_flag set.
+
+Sun Oct 19 17:46:02 1997 Douglas Rupp <rupp@gnat.com>
+
+ * cccp.c (OBJECT_SUFFIX): Add default definition.
+ (main): Use OBJECT_SUFFIX.
+ (VMS_{freopen,fopen,open}): Use instead of using macro on
+ unprefixed name.
+ (VMS_fstat): Use decc$fstat explicitly, not via macro.
+
+Sun Oct 19 09:07:38 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * prefix.c (get_key_value): Initialize prefix to null.
+ * Makefile.in (prefix.o): Properly pass in prefix.
+
+ * objc/Make-lang.in (objc.distdir): Make the objc directory.
+ * Makefile.in (distdir-start): No longer depend on objc-parse.[cy].
+ Don't copy objc files here.
+ (TAGS): Don't delete objc-parse.y
+
+ * i386/mingw32.h (LIB_SPEC): Add -ladvapi32.
+ (STARTFILE_SPEC): If -dll, use dllcrt1.o.
+ (INCOMING_RETURN_ADDR_RTX): Undefine.
+
+ * Makefile.in (float.h-nat): Avoid using /dev/null for input,
+ since it's not present on all systems.
+
+ * prefix.c : New file.
+ * Makefile.in (xgcc, cccp, cppmain, fix-header): Add prefix.o.
+ (prefix.o): New rule.
+ * cccp.c (update_path): Add extern definition.
+ (struct default_include): New field `component'.
+ (default_include): Add initializer for new field to all entries.
+ (new_include_prefix): Take new arg and call update_path;
+ all callers changed.
+ Add trailing "." before doing stat of file.
+ * cpplib.c (update_path): Add extern definition.
+ (struct default_include): New field `component'.
+ (default_include): Add initializer for new field to all entries.
+ (cpp_start_read): Call update_path.
+ * gcc.c (upate_path): Add extern definition.
+ (find_a_file): For MS-DOS-based, consider a drive spec as absolute.
+ (add_prefix): New arg component and pass to update_path;
+ all callers changed.
+ * netbsd.h (INCLUDE_DEFAULTS): Add `component' to values.
+ * i386/freebsd.h, mips/netbsd.h, winnt/win-nt.h: Likewise.
+ * i386/mingw32 (STANDARD_INCLUDE_COMPONENT): New macro.
+ * vax/vms.h (INCLUDE_DEFAULTS): New macro.
+ * vax/xm-vms.h (INCLUDE_DEFAULTS): Delete from here.
+
+ * sparc/sol2.h (WIDEST_HARDWARE_FP_SIZE): New macro.
+
+ * i386.c (ix86_prologue): Conditionalize Dwarf2 calls
+ on #ifdef INCOMING_RETURN_ADDR_RTX.
+ * i386.md (allocate_stack): Fix incorrect operand number.
+
+ * alpha.c (vmskrunch): Deleted.
+ (output_prolog, VMS): Use alloca for entry_label and don't
+ truncate to 64 characters.
+ * alpha/vms.h (vmskrunch): No longer define.
+ (ENCODE_SECTION_INFO): No longer call vmskrunch.
+ (ASM_DECLARE_FUNCTION_NAME): No longer override.
+
+ * toplev.c (output_quoted_string): Call new OUTPUT_QUOTED_STRING macro.
+ * i386/mingw32.h (OUTPUT_QUOTED_STRING): New macro.
+
+ * stmt.c (using_eh_for_cleanups_p): New variable.
+ (using_eh_for_cleanups): New function.
+ (expand_decl_cleanup): Don't call expand_eh_region_start_tree
+ unless using EH for cleanups.
+
+ * function.c (purge_addressof_1): When dealing with a
+ bare (address (mem)), verify that what's inside is valid in insn.
+ (instantiate_virtual_regs_1, case ADDRESSOF): If have MEM, just
+ do instantiation inside and leave alone here.
+
+ * fold-const.c (fold, case COND_EXPR): Allow creation
+ of {MIN,MAX}_EXPR, but preserve info on orginal comparison code.
+
+ * function.h (restore_tree_status): Update prototype.
+
+ * cse.c (cse_basic_block): Flush the hash table every 1,000 insns.
+
+Sat Oct 18 13:48:14 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * longlong.h (count_leading_zeros): Add missing casts to USItype.
+
+Sat Oct 18 13:35:09 1997 Marc Lehmann (pcg@goof.com)
+
+ * toplev.c (main): Don't execute "ps" under MSDOS.
+
+Sat Oct 18 13:26:42 1997 Richard Earnshaw (rearnsha@arm.com)
+
+ * function.c (instantiate_virtual_regs): Don't instantiate the
+ stack slots for the parm registers until after the insns have had
+ their virtuals instantiated.
+
+ * varargs.h (va_arg): For ARM systems, definition is endian-dependent.
+ * stdarg.h (va_arg): Likewise.
+
+Sat Oct 18 11:23:04 1997 Nick Clifton <nickc@cygnus.com>
+
+ * final.c (end_final): Use ASM_OUTPUT_ALIGNED_DECL_LOCAL if defined.
+ * varasm.c (assemble_static_space): Likewise.
+ (assemble_variable): Use ASM_OUTPUT_ALIGNED_DECL_{COMMON,LOCAL} if def.
+
+Sat Oct 18 11:02:19 1997 Doug Evans <dje@canuck.cygnus.com>
+
+ * expr.c (use_group_regs): Don't call use_reg unless REG.
+
+Sat Oct 18 10:39:22 1997 Jim Wilson <wilson@cygnus.com>
+
+ * cse.c (simplify_ternary_operation, case IF_THEN_ELSE): Collapse
+ redundant conditional moves to single operand.
+
+ * expmed.c (extract_bit_field): Don't make flag_force_mem disable
+ extzv for memory operands.
+
+Sat Oct 18 09:58:44 1997 Jeffrey A Law <law@cygnus.com>
+
+ * ptx4.h: Fix typo.
+
+ * integrate.c (save_for_inline_copying): Avoid undefined pointer
+ operations.
+ (expand_inline_function): Likewise.
+
+Sat Oct 18 09:49:46 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * tree.c (restore_tree_status): Also free up temporary storage
+ when we finish a toplevel function.
+ (dump_tree_statistics): Print stats for backend obstacks.
+
+ * libgcc2.c (__throw): Don't copy the return address.
+ * dwarf2out.c (expand_builtin_dwarf_reg_size): Ignore return address.
+
+ * tree.c (expr_tree_cons, build_expr_list, expralloc): New fns.
+ * tree.h: Declare them.
+
+ * except.c (exceptions_via_longjmp): Initialize to 2 (uninitialized).
+ * toplev.c (main): Initialize exceptions_via_longjmp.
+
+ * tree.c: Add extra_inline_obstacks.
+ (save_tree_status): Use it.
+ (restore_tree_status): If this is a toplevel inline obstack and we
+ didn't want to save anything on it, recycle it.
+ (print_inline_obstack_statistics): New fn.
+ * function.c (pop_function_context_from): Pass context to
+ restore_tree_status.
+
+Sat Oct 18 09:45:22 1997 Michael Meissner <meissner@cygnus.com>
+
+ * profile.c (get_file_function_name): Remove declaration.
+ * c-lang.c (finish_file): Likewise.
+
+Sat Oct 18 09:35:40 1997 Tristan Gingold <gingold@messiaen.enst.fr>
+
+ * expr.c (expand_assignment): If -fcheck-memory-usage, add call to
+ chkr_check_addr if size not zero.
+ (expand_expr, case COMPONENT_REF): Likewise.
+ (expand_builtin): If -fcheck_memory-usage, check memory usage
+ of operands for strlen, strcpy, and memcpy or don't use builtins
+ for memcmp and strcmp.
+ * expr.h (chkr_check_str_libfunc): Declare.
+ * optabs.c (chkr_check_str_libfunc): New variable.
+ (init_optabs): Initialize it.
+
+Sat Oct 18 09:29:21 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * i386/cygwin32.h (ASM_COMMENT_START): Redefine.
+
+Sat Oct 18 09:23:54 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * frame.c (__frame_state_for): Execute the FDE insns until the
+ current pc value is strictly bigger than the target pc value.
+
+ * expr.c (expand_expr, case TARGET_EXPR): If target and slot has
+ no DECL_RTL, then call mark_addressable again for the slot after
+ we give it RTL.
+
+Sat Oct 18 08:58:36 1997 Manfred Hollstein (manfred@lts.sel.alcatel.de)
+
+ * m88k/dolph.h (INITIALIZE_TRAMPOLINE): Delete here.
+ * m88k/sysv3.h (INITIALIZE_TRAMPOLINE): Unconditionally define.
+ * libgcc2.c (__enable_execute_stack): Check for __sysV88__ not
+ __DOLPHIN__.
+
+ * m68k/mot3300.h (ASM_OUTPUT_ALIGN): Accept any alignment.
+ * dwarf2out.c (output_call_frame_info): Call app_enable and
+ app_disable to let GNU as accept the generated comments.
+
+ * m88k.c (m88k_begin_prologue): Remove superfluous backslash.
+
+Sat Oct 18 08:50:04 1997 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * flow.c (print_rtl_with_bb): Cast alloca return values.
+
+Sat Oct 18 08:47:46 1997 Douglas Rupp <rupp@gnat.com>
+
+ * alpha/vms.h (LITERALS_SECTION_ASM_OP, ASM_OUTPUT_DEF):
+ (EXTRA_SECTION_FUNCTIONS): Add literals_section.
+ (EXTRA_SECTIONS): Include in_literals.
+
+Sat Oct 18 08:40:55 1997 Nick Burrett <nick.burrett@btinternet.com>
+
+ * cpplib.c: (initialize_builtins): Cast all string constants for the
+ function install, to type U_CHAR *.
+ (eval_if_expression): Likewise.
+ * cppexp.c: (cpp_lex): Cast string, for cpp_lookup, to type U_CHAR *.
+
+Sat Oct 18 08:38:13 1997 Ken Raeburn <raeburn@cygnus.com>
+
+ * c-lex.c (check_newline) At `skipline', flush nextchar as well.
+
+Sat Oct 18 08:17:13 1997 Paul Russell <Paul.Russell@RustCorp.com.au>
+
+ * input.h (struct file_stack): Added indent_level.
+ * c-lex.c (check_newline): Add {}-count & balance warning.
+
+Sat Oct 18 06:54:39 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * regclass.c (record_address_regs, case PLUS): Refine how to choose
+ which is base and index.
+
+ * alpha.h (FUNCTION_VALUE): Use word_mode only for integral types,
+ not types with integral modes.
+
+ * final.c (alter_cond): Properly conditionalize forward decl.
+
+ * tree.h (SAVE_EXPR_NOPLACEHOLDER): New flag.
+ * tree.c (contains_placeholder_p, case SAVE_EXPR): Avoid
+ checking each SAVE_EXPR more than once.
+
+ * rs6000.md (nonlocal_goto_receiver): Don't test pool size.
+
+ * i386.c (load_pic_register): New function.
+ (ix86_prologue): Code to load PIC register moved to new function.
+ Don't emit blockage if not generating RTL.
+ * i386.md (nolocal_goto_receiver): New pattern.
+
+ * i386.c: Major cleanup, mostly reformatting.
+ Include dwarf2.h.
+ Remove many spurious casts.
+ (ix86_{pro,epi}logue): Use proper mode for SET rtx.
+
+Fri Oct 17 17:13:42 1997 David S. Miller <davem@tanya.rutgers.edu>
+
+ * sparc/linux64.h (LINK_SPEC): Dynamic linker is ld-linux64.so.2.
+ * sparc.h (FUNCTION_PROFILER): Fix format string when TARGET_MEDANY.
+ * sparc.c (output_double_int): Output DI mode values
+ correctly when HOST_BITS_PER_WIDE_INT is 64.
+ (output_fp_move_quad): If TARGET_V9 and not TARGET_HARD_QUAD, use
+ fmovd so it works if a quad float ends up in one of the upper 32
+ float regs.
+ * sparc.md (pic_{lo_sum,sethi}_di): New patterns for PIC support
+ on sparc64.
+
+Fri Oct 17 16:27:07 1997 Doug Evans <dje@cygnus.com>
+
+ * sparc/sp64-elf.h (TARGET_DEFAULT): Delete MASK_STACK_BIAS.
+ * sparc.h (PROMOTE_MODE): Promote small ints if arch64.
+ (PROMOTE_FUNCTION_ARGS,PROMOTE_FUNCTION_RETURN): Define.
+ (SPARC_FIRST_FP_REG, SPARC_FP_REG_P): New macros.
+ (SPARC_{OUTGOING,INCOMING}_INT_ARG_FIRST): New macros.
+ (SPARC_FP_ARG_FIRST): New macro.
+ (CONDITIONAL_REGISTER_USAGE): All v9 fp regs are volatile now.
+ (REG_ALLOC_ORDER,REG_LEAF_ALLOC_ORDER): Reorganize fp regs.
+ (NPARM_REGS): There are 32 fp argument registers now.
+ (FUNCTION_ARG_REGNO_P): Likewise.
+ (FIRST_PARM_OFFSET): Update to new v9 abi.
+ (REG_PARM_STACK_SPACE): Define for arch64.
+ (enum sparc_arg_class): Delete.
+ (sparc_arg_count,sparc_n_named_args): Delete.
+ (struct sparc_args): Redefine and use for arch32 as well as arch64.
+ (GET_SPARC_ARG_CLASS,ROUND_REG,ROUND_ADVANCE): Delete.
+ (FUNCTION_ARG_ADVANCE): Rewrite.
+ (FUNCTION_ARG,FUNCTION_INCOMING_ARG): Rewrite.
+ (FUNCTION_ARG_{PARTIAL_NREGS,PASS_BY_REFERENCE}): Rewrite.
+ (FUNCTION_ARG_CALLEE_COPIES): Delete.
+ (FUNCTION_ARG_{PADDING,BOUNDARY}): Define.
+ (STRICT_ARGUMENT_NAMING): Define.
+ (doublemove_string): Declare.
+ * sparc.c (sparc_arg_count,sparc_n_named_args): Delete.
+ (single_move_string): Use GEN_INT, and HOST_WIDE_INT.
+ (doublemove_string): New function.
+ (output_move_quad): Clean up some of the arch64 support.
+ (compute_frame_size): Add REG_PARM_STACK_SPACE if arch64.
+ Don't add 8 bytes of reserved space if arch64.
+ (sparc_builtin_saveregs): Combine arch32/arch64 versions.
+ (init_cumulative_args): New function.
+ (function_arg_slotno): New static function.
+ (function_arg,function_arg_partial_nregs): New functions.
+ (function_arg_{pass_by_reference,advance}): New functions.
+ (function_arg_padding): New function.
+ * ginclude/va-sparc.h: Rewrite v9 support.
+
+Fri Oct 17 13:21:45 EDT 1997 Philip Blundell <pb@nexus.co.uk>
+
+ * arm/netbsd.h (TYPE_OPERAND_FMT): use % not @ to avoid
+ problems with comments.
+
+Fri Oct 17 13:00:38 EDT 1997 Richard Earnshaw (rearnsha@arm.com)
+
+ * arm/aout.h (ASM_OUTPUT_LABEL): Define in place of ARM_OUTPUT_LABEL.
+ * arm/aof.h (ASM_OUTPUT_LABEL): Likewise.
+ * arm.h (ASM_OUTPUT_LABEL): Delete.
+ (ASM_OUTPUT_INTERNAL_LABEL): Call ASM_OUTPUT_LABEL directly.
+ * arm.c (arm_asm_output_label): Delete.
+
+ * arm/aout.h (ASM_OUTPUT_ALIGNED_LOCAL): Do what is needed inline.
+ * arm.c (output_lcomm_directive): Delete.
+
+ * arm.h (PUSH_ROUNDING): Delete; this is not what happens.
+ (ACCUMULATE_OUTGOING_ARGS): Define.
+ (PROMOTE_FUNCTION_ARGS): Define.
+ (INITIAL_ELIMINATION_OFFSET): Take current_function_outgoing_args_size
+ into account.
+ * arm.c (use_return_insn, output_func_epilogue,
+ arm_expand_prologue): Likewise.
+
+ * arm.c (const_ok_for_arm): If HOST_WIDE_INT more than 32 bits,
+ insist high bits are all zero or all one.
+ (output_move_double): Handle case where CONST_INT is more than 32 bits.
+
+ * arm.c (load_multiple_sequence): Support SUBREG of MEM.
+ (store_multiple_sequence): Likewise.
+
+ * arm.c (arm_gen_load_multiple): New args UNCHANGING_P and IN_STRUCT_P.
+ Use them if we create any new MEMs; all callers changed.
+ (arm_gen_store_multiple): Likewise.
+ (arm_gen_movstrqi): Preserve RTX_UNCHANGING_P and MEM_IN_STRUCT_P
+ on any MEMs created.
+
+ * arm.h (ASM_OUTPUT_MI_THUNK): Use branch instruction to jump to label.
+ (RETURN_ADDR_RTX): Use NULL_RTX rather than casting zero.
+ (output_move_double): Correct typo in prototype.
+
+ * arm.md (movsfcc): If not TARGET_HARD_FLOAT, ensure operand[3] valid.
+
+ * arm/netbsd.h (CPP_PREDEFINES): Always predefine __arm__.
+ * arm/xm-netbsd.h (SYS_SIGLIST_DECLARED, HAVE_STRERROR): Define these.
+
+ * arm/t-netbsd (CROSS_LIBGCC1, LIB1ASMSRC, LIB1ASMFUNCS) Don't define
+ these any more.
+ * configure.in (arm-*-netbsd*): Pick up t-netbsd before arm/t-netbsd.
+
+Thu Oct 16 19:31:22 1997 Jim Wilson <wilson@cygnus.com>
+
+ * v850.c (ep_memory_offset): New function.
+ (ep_memory_operand, substitute_ep_register, v850_reorg): Call it.
+
+ * v850.h (CONST_OK_FOR_*): Add and correct comments.
+ (CONSTANT_ADDRESS_P): Add comment.
+ (EXTRA_CONSTRAINT): Define 'U'.
+ * v850.md: Add comments on bit field instructions.
+ (addsi3): Delete &r/r/r alternative. Add r/r/U alternative.
+ (lshrsi3): Use N not J constraint.
+
+ * v850.md (v850_tst1+1): New define_split for tst1 instruction.
+
+ * v850.c (reg_or_0_operand): Call register_operand.
+ (reg_or_int5_operand): Likewise.
+ * v850.h (MASK_BIG_SWITCH, TARGET_BIG_SWITCH): New macros.
+ (TARGET_SWITCHES): Add "big-switch".
+ (ASM_OUTPUT_ADDR_VEC_ELT, ASM_OUTPUT_ADDR_DIFF_ELT, CASE_VECTOR_MODE,
+ ASM_OUTPUT_BEFORE_BASE_LABEL): Add support for TARGET_BIG_SWITCH.
+ (CASE_DROPS_THROUGH): Comment out.
+ (CASE_VECTOR_PC_RELATIVE, JUMP_TABLES_IN_TEXT_SECTION): Define.
+ * v850.md (cmpsi): Delete compare mode.
+ (casesi): New pattern.
+
+ * v850.h (CONST_OK_FOR_N): Delete redundant compare against zero.
+ * v850.md (ashlsi3): Use SImode not QImode for shift count.
+ (lshrsi3): Likewise.
+
+ * v850.c (print_operand): Add 'c', 'C', and 'z' support. Delete
+ unreachable switch statement after 'b' support. Remove "b" from
+ strings for 'b' support.
+ * v850.md (branch_normal, branch_invert): Change %b to b%b.
+
+Thu Oct 16 13:08:45 1997 Doug Evans <dje@cygnus.com>
+
+ * configure.in (sparc-*-elf*): New target.
+
+Wed Oct 15 22:30:37 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * h8300.h (REG_CLASS_CONTENTS): AP is a general register.
+ (REG_OK_FOR_BASE_P, ! REG_OK_STRICT case): Reject special registers.
+
+Wed Oct 15 22:00:57 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.md (movhi+1): Add x/r alternative.
+
+ * sh/elf.h (HANDLE_SYSV_PRAGMA): Undefine.
+
+ * va-sh.h (va_arg): Fix big endian bugs for small integers.
+
+Wed Oct 15 21:34:45 1997 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.md (udivsi3, divsi3): Split into MQ and non-MQ cases for
+ PPC601.
+ (umulsidi3,umulsi3_highpart): Likewise.
+ (smulsi3_highpart_no_mq): Add !TARGET_POWER.
+
+Wed Oct 15 18:45:31 1997 Doug Evans <dje@cygnus.com>
+
+ * sparc/t-sp64 (LIBGCC2_CFLAGS): Delete.
+
+Wed Oct 15 17:17:33 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (following_call): Fail if the CALL_INSN is an indirect call.
+
+Wed Oct 1 17:52:09 1997 Douglas Rupp <rupp@gnat.com>
+
+ * vms.h (UNALIGNED_{SHORT,INT,DOUBLE_INT}_ASM_OP): Define.
+
+Wed Oct 1 16:09:42 1997 Benjamin Kosnik <bkoz@melange.gnu.ai.mit.edu>
+
+ * fixincludes: Fix sys/param.h so that MAXINT will not be redefined
+ on HPUX.
+
+Wed Oct 1 08:08:21 1997 Jeffrey A Law <law@chunks.cygnus.com>
+
+ * cse.c (this_insn_cc0_mode): Initialize.
+
+Wed Oct 1 07:22:12 1997 Richard Henderson <rth@cygnus.com>
+
+ * i386.h (RETURN_ADDR_RTX): Use FRAME arg, not ap.
+
+Tue Sep 30 19:19:58 1997 Jim Wilson <wilson@cygnus.com>
+
+ * except.c (find_exception_handler_labels): Correct argument to free.
+
+Fri Sep 26 14:06:45 1997 Mike Stump <mrs@wrs.com>
+
+ * c-decl.c (start_struct): Ensure that structs with forward
+ declarations are in fact packed when -fpack-struct is given.
+
+Wed Sep 24 11:31:24 1997 Mike Stump <mrs@wrs.com>
+
+ * stor-layout.c (layout_record): Ignore STRUCTURE_SIZE_BOUNDARY if
+ packing structure. This allows a structure with only bytes to be
+ aligned on a byte boundary and have no padding on a m68k.
+
+Tue Sep 30 11:00:00 1997 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * except.c (find_exception_handler_labels): Free LABELS when done.
+
+Tue Sep 30 10:47:33 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cexp.y, cppexp.c (HOST_BITS_PER_WIDE_INT):
+ Define only if not already defined.
+
+Mon Sep 29 17:55:55 1997 Gavin Koch <gavin@cygnus.com>
+
+ * c-decl.c (warn_implicit): Deleted.
+ (warn_implicit_int, mesg_implicit_function_declaration}): New vars.
+ (c_decode_option): For -Wimplicit, set both new variables.
+ Add -Wimplicit-function-declarations, -Wimplicit-int,
+ and -Werror-implicit-function-declaration.
+ (implicitly_declare, grokdeclarator): Use new flags.
+ * toplev.c (lang_options): Add new -W options.
+
+Mon Sep 29 17:55:15 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * c-common.c (check_format_info): Add check for scanf into
+ constant object or via constant pointer type.
+
+Mon Sep 29 16:10:12 1997 Richard Henderson <rth@cygnus.com>
+
+ * alpha.md (beq): For registers and ints 0-255, use cmpeq+bne.
+ (bne): Likewise for cmpeq+beq.
+
+Mon Sep 29 15:58:22 1997 Doug Evans <dje@cygnus.com>
+
+ * reload1.c (reload_cse_simplify_set): Fix return values.
+
+Mon Sep 29 08:21:35 1997 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+ * i386.c (notice_update_cc): Use reg_overlap_mentioned_p.
+
+Sun Sep 28 18:59:58 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * libgcc2.c (__throw): Fix thinko.
+
+Sun Sep 28 12:00:52 1997 Mark Mitchell <mmitchell@usa.net>
+
+ * cplus-dem.c (demangle_template): Add new parameter. Handle new
+ template-function mangling.
+ (consume_count_with_underscores): New function.
+ (demangle_signature): Handle new name-mangling scheme.
+
+Sun Sep 28 11:19:09 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * flow.c (print_rtl_with_bb): Reformat messages about BB boundaries.
+
+ * calls.c: Include regs.h.
+ * profile.c: Likewise.
+ * Makefile.in (calls.o, profile.o): Depend on regs.h.
+ * except.h (expand_builtin_dwarf_reg_size): Put in #ifdef TREE_CODE.
+
+ * tree.h (get_file_function_name): Add decl.
+ * dwarf2out.c (output_call_frame_info): Don't cast its result.
+
+Sun Sep 28 10:58:21 1997 Manfred Hollstein <manfred@s-direktnet.de>
+
+ * Makefile.in (sub-makes): Pass value of LANGUAGES.
+
+Sun Sep 28 10:52:59 1997 Ian Dall <ian.dall@dsto.defence.gov.au>
+
+ * regs.h (SMALL_REGISTER_CLASSES): Default to 0.
+ * calls.c (prepare_call_address, expand_call):
+ Remove #if test on SMALL_REGISTER_CLASSES.
+ * combine.c (can_combine_p, combinable_i3pat, try_combine): Likewise.
+ * cse.c (canon_hash): Likewise.
+ * function.c (expand_function_start): Likewise.
+ * jump.c (jump_optimize): Likewise.
+ * local-alloc.c (optimize_reg_copy_1): Likewise.
+ * loop.c (scan_loop, valid_initial_value_p): Likewise.
+ * profile.c (output_arc_profiler): Likewise.
+ * reload.c (push_secondary_reload, push_reload): Likewise.
+ (combine_reloads): Likewise.
+ * reload1.c (reload, scan_paradoxical_subregs): Likewise.
+ (order_regs_for_reload, reload_as_needed): Likewise.
+ (choose_reload_regs): Likewise.
+ (merge_assigned_reloads): Declare unconditionally.
+
+Sat Sep 27 11:02:38 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * c-decl.c (init_decl_processing): Add __builtin_dwarf_reg_size.
+ * tree.h (built_in_function): Likewise.
+ * expr.c (expand_builtin): Likewise.
+ * except.h: Likewise.
+ * dwarf2out.c (expand_builtin_dwarf_reg_size): New fn.
+ * libgcc2.c (copy_reg): New fn.
+ (__throw): Use it.
+
+Fri Sep 26 09:00:13 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * frame.c (gansidecl.h): New include, for PROTO.
+ * dwarf2out.c: Move inclusion of dwarf2.h down.
+ (dwarf2out_cfi_label): Don't declare here.
+ * dwarf2.h (dwarf2out_{do_frame,cfi_label,def_cfa}): New declarations.
+ (dwarf2out_{window_save,args_size,reg_save,return_save}): Likewise.
+ (dwarf2out_{return_reg,begin_prologue,end_epilogue}): Likewise.
+ * m68k.c (dwarf2.h): Include.
+ (output_function_prologue): Add dwarf2 support.
+ * m68k.h (INCOMING_RETURN_ADDR_RTX, DWARF_FRAME_REGNUM): New macros.
+ (INCOMING_FRAME_SP_OFFSET): Likewise.
+
+ * integrate.c (copy_rtx_and_substitute, case ADDRESSOF): New case.
+
+ * integrate.c (expand_inline_function): Make sure there is at
+ least one insn that can be used as an insertion point.
+
+Fri Sep 26 08:54:59 1997 Paul Eggert <eggert@twinsun.com>
+
+ * c-typeck.c (build_binary_op): Warn about comparing signed vs
+ unsigned if -W is specified and -Wno-sign-compare is not.
+ * c-decl.c (warn_sign_compare): Initialize to -1.
+ (c_decode_option): -Wall no longer implies -Wsign-compare.
+
+Wed Sep 24 21:34:06 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c: s/flag_verbose_asm/flag_debug_asm/
+
+Wed Sep 24 19:17:08 1997 Doug Evans <dje@cygnus.com>
+
+ * sparc.md (get_pc_via_call): Renamed from get_pc_sp32.
+ (get_pc_via_rdpc): Renamed from get_pc_sp64.
+ * sparc.c (finalize_pic): Update call to gen_get_pc_via_call.
+
+Wed Sep 24 18:38:22 1997 David S. Miller <davem@tanya.rutgers.edu>
+
+ * sparc.h (ASM_CPU_SPEC): Pass -Av9a for v8plus, ultrasparc.
+ (TARGET_OPTIONS): Add -malign-loops=, -malign-jumps=,
+ and -malign-functions=.
+ (sparc_align_{loops,jumps,funcs}_string): Declare.
+ (sparc_align_{loops,jumps,funcs}): Declare.
+ (DEFAULT_SPARC_ALIGN_FUNCS): New macro.
+ (FUNCTION_BOUNDARY): Use sparc_align_funcs.
+ (STACK_BIAS): Define.
+ (SPARC_SIMM*_P): Cast to unsigned HOST_WIDE_INT, then perform test.
+ (SPARC_SETHI_P): New macro.
+ (CONST_OK_FOR_LETTER_P): Use it.
+ (ASM_OUTPUT_ALIGN_CODE): Define.
+ (ASM_OUTPUT_LOOP_ALIGN): Define.
+ * sparc.c (sparc_align_{loops,jumps,funcs}_string): New globals.
+ (sparc_align_{loops,jumps,funcs}): New globals.
+ (sparc_override_options): Handle -malign-loops=, -malign-jumps=,
+ -malign-functions=.
+ (move_operand): Use SPARC_SETHI_P.
+ (arith_double_operand): Cast to unsigned HOST_WIDE_INT, then test.
+ (arith11_double_operand): Likewise.
+ (arith10_double_operand): Likewise.
+ (finalize_pic): Finish sparc64 support.
+ (emit_move_sequence): Use SPARC_SETHI_P. Simplify low part of
+ 64 bit constants if able.
+ (output_fp_move_quad): Don't use fmovq unless TARGET_HARD_QUAD.
+ (sparc_builtin_saveregs [sparc64]): Don't save fp regs if ! TARGET_FPU.
+ * sparc.md: Use GEN_INT instead of gen_rtx.
+ (get_pc_sp32): Use for sparc64 as well.
+ (lo_sum_di_sp{32,64}): Fix handling on 64 bit hosts.
+ (sethi_di_sp64_const): Likewise.
+ (movtf_cc_sp64): Check TARGET_HARD_QUAD.
+ (cmp_zero_extract_sp64): Use unsigned HOST_WIDE_INT in cast.
+ (ashlsi3, ashldi3, ashrsi3, ashrdi3, lshrsi3, lshrdi3): Likewise.
+
+Wed Sep 24 08:25:28 1997 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * i386.md (allocate_stack): Fix typo in last change.
+
+Tue Sep 23 19:02:46 1997 Doug Evans <dje@cygnus.com>
+
+ * sparc/linux-aout.h (COMMENT_BEGIN): Delete.
+ * sparc/linux.h (COMMENT_BEGIN): Likewise.
+ * sparc/linux64.h (COMMENT_BEGIN): Likewise.
+
+Tue Sep 23 14:48:18 1997 David S. Miller <davem@tanya.rutgers.edu>
+
+ Add sparc64 linux support.
+ * configure.in (sparc64-*-linux*): Recognize. Add sparc/xm-sparc.h
+ to xm_file list on 32-bit sparc-linux.
+ * sparc/xm-sp64.h: New file.
+ * sparc/linux64.h: New file.
+ * sparc/xm-linux.h: Include some standard headers if not inhibit_libc.
+ Don't include xm-sparc.h.
+ * config/xm-linux.h (HAVE_PUTENV, HAVE_ATEXIT): Define.
+ * glimits.h (LONG_MAX): Handle sparc64.
+
+Tue Sep 23 08:32:51 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * final.c (final_end_function): Also do dwarf2 thing if
+ DWARF2_DEBUGGING_INFO.
+ (final_start_function): Likewise.
+
+Tue Sep 23 06:55:40 1997 David S. Miller <davem@tanya.rutgers.edu>
+
+ * expmed.c (expand_divmod): If compute_mode is not same as mode,
+ handle case where convert_modes causes op1 to no longer be CONST_INT.
+
+Tue Sep 23 00:58:48 1997 Jim Wilson <wilson@cygnus.com>
+
+ * mips.c (save_restore_insns): Only set RTX_FRAME_RELATED_P if store_p.
+
+Mon Sep 22 18:26:25 1997 J. Kean Johnston <jkj@sco.com>
+
+ * i386/sco5.h: Make ELF default file format and add -mcoff/-melf..
+ (MULTILIB_DEFAULTS): Define.
+ (ASM_SPEC, CPP_SPEC): Handle -mcoff.
+ (STARTFILE_SPEC, ENDFILE_SPEC, LINK_SPEC): Likewise.
+ (LIBGCC_SPEC): Likewise.
+ (MASK_COFF, TARGET_COFF, TARGET_ELF): Define.
+ (SUBTARGET_SWITCHES): Add -mcoff and -melf.
+ * i386/t-sco5 (CRTSTUFF_T_CFLAGS): Add -fPIC.
+ (CRTSTUFF_T_CFLAGS_S): Tweak for COFF.
+ (EXTRA_PARTS, TAROUTOPTS): Delete.
+ (libgcc1-elf, libgcc2-elf, libgcc-elf targets): Delete.
+ (MULTILIB_OPTIONS): Define.
+ (MULTILIB_DIRNAMES, MULTILIB_EXCEPTIONS): Likewise.
+ (MULTILIB_MATCHE, MULTILIB_EXTRA_OPTS): Likewise.
+
+Mon Sep 22 14:42:11 1997 Jeffrey A Law (law@cygnus.com)
+
+ * reg-stack.c (find_blocks): Fix thinko in last change.
+
+Mon Sep 22 16:22:41 1997 David S. Miller <davem@tanya.rutgers.edu>
+
+ * combine.c (try_combine): Use NULL_RTX, not 0, in gen_rtx calls.
+ * cse.c (cse_main): Likewise.
+ * emit-rtl.c (gen_label_rtx): Likewise.
+ * expr.c (init_expr_once): Likewise.
+ * sched.c (schedule_insns): Likewise.
+ * varasm.c (immed_double_const): Likewise.
+
+ * sparc.h (INCOMING_FRAME_SP_OFFSET): Define as SPARC_STACK_BIAS.
+
+Mon Sep 22 16:13:21 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * alpha/linux.h (HANDLE_SYSV_PRAGMA): Define.
+
+Mon Sep 22 16:02:01 1997 Benjamin Kosnik <bkoz@rhino.cygnus.com>
+
+ * c-common.c (decl_attributes): Add support for TYPE_UNUSED on types.
+ * c-decl.c (finish_decl): Set TREE_USED on decls if TREE_USED on type.
+ * stmt.c (expand_end_bindings): Check DECL_NAME and DECL_ARTIFICIAL
+ before unused variable warning.
+
+Mon Sep 22 14:04:18 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * rtlanal.c (computed_jump_p): Fix typo in last change.
+
+ * clipper.md (movstrsi): Use change_address instead of making new MEM.
+ * dsp16xx.md (movstrqi): Likewise.
+ * i370.md (movstrsi): Likewise.
+ * i860.md (movstrsi): Likewise.
+ * pa.md (movstrsi): Likewise.
+ * mips.md (movstrsi): Fix (unused) pattern in define_expand.
+ * pdp11.md (movstrhi): Likewise.
+
+ * alpha.md (allocate_stack): Use virtual_stack_dynamic for result.
+ * i386.md (allocate_stack): Likewise.
+ * rs6000.md (allocate_stack): Likewise.
+
+ * alpha.h (FLOAT_STORE_FLAG_VALUE): Different for VAX and IEEE float.
+
+ * function.c (assign_parms): Make max_parm_reg handling more
+ precise and make it agree with size of parm_reg_stack_loc.
+ * integrate.c (save_for_inline_{nocopy,copying}): Remove
+ redundant assignment of max_parm_reg.
+
+ * function.c (assign_parms): Properly set RTX_UNCHANGING_P for
+ copy of parm.
+
+ * integrate.c (copy_rtx_and_substitute, case SET): Handle
+ a SET_DEST of the virtual fp or ap specially and undo
+ the adjustment into the local area as well.
+ (mark_stores): Don't wipe out map entries for virtual fp and ap.
+
+ * alpha.h (FLOAT_STORE_FLAG_VALUE): Different for VAX and IEEE float.
+
+ * emit-rtl.c (gen_lowpart): Handle ADDRESSOF.
+
+Mon Sep 22 13:35:56 1997 Doug Evans <dje@cygnus.com>
+
+ * rtlanal.c (replace_regs): Fix up lossage in last patch.
+
+Sun Sep 21 19:28:48 1997 Jeffrey A Law (law@cygnus.com)
+
+ * flow.c (jmp_uses_reg_or_mem): Deleted unused function.
+ (find_basic_blocks): Use computed_jump_p to determine if a
+ particular JUMP_INSN is a computed jump.
+ * reg-stack.c (find_blocks): Use computed_jump_p to determine
+ if a particular JUMP_INSN is a computed jump.
+ * rtlanal.c (jmp_uses_reg_or_mem): New function.
+ (computed_jump_p): Likewise.
+ * rtl.h (computed_jump_p): Declare.
+ * genattrtab.c (pc_rtx): Define and initialize.
+
+ * cse.c (simplify_relational_operation): Set h0u just like h0s.
+ Similarly for h1u and h1s.
+
+Sun Sep 21 14:13:31 1997 Doug Evans <dje@cygnus.com>
+
+ * function.c (instantiate_virtual_regs): Fix thinko in last patch.
+
+Sun Sep 21 10:33:26 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c, cpplib.c (special_symbol): If STDC_0_IN_SYSTEM_HEADERS
+ is defined, expand __STDC__ to 0 in system headers.
+ * i386/sol2.h, rs6000/sol2.h, sparc/sol2.h:
+ (STDC_0_IN_SYSTEM_HEADERS): New macro.
+ (CPP_SPEC): Remove -D__STDC__=0; it's no longer needed.
+
+ * fixinc.math (_MATH_H_WRAPPER): Define at the end of the
+ wrapper, not the start, so that if #include_next gets another
+ instance of the wrapper, this will follow the #include_next
+ chain until we arrive at the real <math.h>.
+
+ * fixproto (subdirs_made): New var, to keep track of which
+ subdirectories we've made (in reverse order). At the end,
+ attempt to rmdir them all, so that we don't create any empty
+ directories.
+
+Sun Sep 21 10:02:07 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * pa.c (move_operand): Respect -mdisable-indexing.
+ * pa.h (GO_IF_LEGITIMATE_ADDRESS): Likewise.
+
+Sun Sep 21 09:29:23 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * function.c (purge_addressof_1): Don't convert (MEM (ADDRESSOF (REG)))
+ to (SUBREG (REG)) on big endian machines.
+ Don't fall through to substitute the inner (REG) unchanged
+ when the above conversion cannot be validated.
+
+Sat Sep 20 16:22:06 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * frame.c (__deregister_frame): Properly check for initialized object.
+
+ * function.c (instantiate_virtual_regs): Instantiate
+ parm_reg_stack_locs.
+
+Sat Sep 20 03:07:54 1997 Doug Evans <dje@cygnus.com>
+
+ * sparc/sysv4.h (ASM_COMMENT_START): Delete.
+ * sparc.h (ASM_COMMENT_START): Define.
+ * sparc.c (output_function_prologue): Use it.
+ (sparc_flat_output_function_{epi,pro}logue): Likewise.
+
+Fri Sep 19 19:43:09 1997 Jeffrey A Law (law@cygnus.com)
+
+ * loop.c (strength_reduce): Fix typo.
+
+ * m68k/xm-mot3300.h (alloca): Properly declare if __STDC__.
+ * mips.h, xm-rs6000.h, rs6000/xm-sysv4.h: Likewise.
+
+Fri Sep 19 20:10:30 1997 Doug Evans <dje@cygnus.com>
+
+ * rtl.h (find_use_as_address): Delete accidentally added decl.
+
+Fri Sep 19 08:36:16 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * jump.c (thread_jumps): Check can_reverse_comparison_p before
+ threading a reversed-condition jump.
+
+Fri Sep 19 08:16:12 1997 Andrew M. Bishop <amb@gedanken.demon.co.uk>.
+
+ * Add support for new -dI option for cxref,
+ * cccp.c (dump_includes): New variable.
+ (struct directive, directive_table): Remove members angle_brackets,
+ traditional_comments, pass_thru; all code using struct directive
+ now uses `type' member instead.
+ (IS_INCLUDE_DIRECTIVE_TYPE): New macro.
+ (main, handle_directive): Add support for new -dI option.
+ (do_ident): Avoid unnecessary alloca.
+ (do_pragma): Avoid unnecessary comparison to newline.
+
+ * cpplib.h (struct cpp_options): New member dump_includes.
+ * cpplib.c (struct directive, directive_table): Remove members
+ traditional_comments, pass_thru; all code using struct directive
+ now uses `type' member instead.
+ (IS_INCLUDE_DIRECTIVE_TYPE): New macro.
+ (handle_directive, cpp_handle_options): Add support for new -dI option.
+
+Fri Sep 19 07:57:19 1997 Pat Rankin <rankin@eql.caltech.edu>
+
+ * vax/xm-vms.h (expand_builtin_{extract,set}_return_addr): New macros.
+
+Fri Sep 19 07:47:29 1997 Nick Burrett <n.a.burrett@btinternet.com>
+
+ * cpplib.c (pcstring_used, pcfinclude): Delete unused declarations.
+ (check_preconditions, print_containing_files, pipe_closed): Likewise.
+ (dump_defn_1, dump_arg_n, make_undef): Likewise.
+ (trigraph_pcp): Pre-process out decl.
+ (quote_string): Cast CPP_PWRITTEN macro to char * for sprintf.
+ (output_line_command): Likewise.
+ (macro_expand): Likewise.
+ (do_line): Cast atoi argument to char *.
+ * genattrtab.c (simplify_by_alternatives): Pre-process out decl.
+ * genpeep.c (gen_exp): Remove decl.
+
+Fri Sep 19 07:29:40 1997 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>
+
+ * enquire.c (basic): Elminate dangling else warning.
+ * except.h (struct function, save_eh_status, restore_eh_status):
+ Don't declare.
+ * expr.c (clear_storage): Don't return without a value.
+ * function.h ({save,restore}_machine_status): Add proper prototype.
+ ({save,restore}_{tree,eh,stmt,expr,emit,storage}_status): Declare.
+ * real.h (real_value_truncate): Add proper prototype.
+ (target_isnan, target_isinf, target_negative, debug_real): Declare.
+ (assemble_real): Likewise.
+ * recog.c (strict_memory_address_p, memory_address_p): Don't declare.
+ (find_single_use_1): Add prototype.
+ * recog.h (init_recog, init_recog_no_volatile): Declare.
+ (check_asm_operands, constrain_operands, memory_address_p): Likewise.
+ (strict_memory_address_p, validate_replace_rtx): Likewise.
+ (reg_fits_class_p, find_single_use, general_operand): Likewise.
+ (address_operand, register_operand, scratch_operand): Likewise.
+ (immediate_operand, const_int_operand, const_double_operand): Likewise.
+ (nonimmediate_operand, nonmemory_operand, push_operand): Likewise.
+ (memory_operand, indirect_operand, mode_independent_operand): Likewise.
+ (comparison_operator, offsettable_{,nonstrict_}memref_p): Likewise.
+ (offsettable_address_p, mode_dependent_address_p, recog): Likewise.
+ (add_clobbers): Likewise.
+ * reload.h (strict_memory_address_p): Don't declare here.
+ * rtl.h (struct rtvec_def): Make num_elem an integer.
+ (PUT_NUM_ELEM): Delete cast to unsigned.
+ (rtx_unstable_p, rtx_varies_p, reg_mentioned_p): Declare.
+ (reg_{referenced,used_between,referenced_between}_p: Likewise.
+ ({reg_set,modified,no_labels}_between_p, modified_in_p): Likewise.
+ (reg_set_p, refers_to_regno_p, reg_overlap_mentioned_p): Likewise.
+ (note_stores, rtx_equal_p, dead_or_set{,_regno}_p): Likewise.
+ (remove_note, side_effects_p, volatile_{refs,insn}_p): Likewise.
+ (may_trap_p, inequality_comparison_p): Likewise.
+ * rtlanal.c (note_stores, reg_set_p): Don't declare.
+ (rtx_addr_can_trap_p): Add prototype, make static.
+ (reg_set_p_1): Add declaration for parameter pat.
+ * emit-rtl.c: Include recog.h.
+ * integrate.c: Likewise.
+ * jump.c: Likewise.
+ * unroll.c: Likewise.
+ * Makefile.in (emit-rtl.o, integrate.o, jump.o, unroll.o): Depend
+ on recog.h.
+
+Fri Sep 19 06:52:22 1997 Paul Eggert <eggert@twinsun.com>
+
+ * enquire.c (SYS_FLOAT_H_WRAP): New macro.
+ Include "float.h" if SYS_FLOAT_H_WRAP is nonzero.
+ (f_define): New argument `req'.
+ (main): Output `#include_next <float.h>' if wrapping float.h.
+ (i_define, f_define): Don't output anything if wrapping float.h
+ and if the system defn is already correct. Put other value tests
+ inside `#ifdef VERIFY'.
+ (UNDEFINED): New macro.
+ (I_MAX, I_MIN, U_MAX, F_RADIX, F_MANT_DIG, F_DIG, F_ROUNDS):
+ Define even if VERIFY isn't defined, because SYS_FLOAT_H_WRAP may need
+ these values. Give them the value UNDEFINED if not already defined.
+ (F_EPSILON, F_MIN_EXP, F_MIN, F_MIN_10_EXP, F_MAX_EXP): Likewise.
+ (F_MAX, F_MAX_10_EXP): Likewise.
+ (FPROP): Prefer system float.h definition of F_ROUNDS.
+ Pass system values to f_define.
+ * Makefile.in (FLOAT_H_TEST): New var.
+ (float.h-nat): Make it empty if we can use the system float.h without
+ change.
+ (enquire.o): Define SYS_FLOAT_H_WRAP=1 if we can build a wrapper
+ around the system <float.h>. Remove include/float.h before compiling.
+ (stmp-headers): Remove include/float.h if we would just be installing
+ an empty file (which is a placeholder that stands for no file).
+
+ * fix-header.c: Don't munge headers for POSIX and XOPEN,
+ as this is too error-prone.
+ (ADD_MISSING_POSIX, ADD_MISSING_XOPEN): New macros, normally undefed.
+ (POSIX1_SYMBOL, POSIX2_SYMBOL): Now 0 unless ADD_MISSING_POSIX.
+ (XOPEN_SYMBOL, XOPEN_EXTENDED_SYMBOL): Now 0 unless ADD_MISSING_XOPEN.
+ (main): Ignore symbols whose flags are 0.
+
+Thu Sep 18 10:43:07 1997 Nick Clifton <nickc@cygnus.com>
+
+ * v850.c (compute_register_save_size): Correct register number.
+ * v850.md (save_interrupt, return_interrupt): Likewise.
+ * v850/lib1funcs.asm (save_interrupt): Likewise.
+ (return_interrupt): Use stack pointer, not element pointer.
+
+Thu Sep 18 14:22:22 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * final.c (final_scan_insn): Hand BARRIERs to dwarf2 code.
+ * dwarf2out.c (dwarf2out_frame_debug): Pass the whole insn along.
+ (dwarf2out_stack_adjust): A BARRIER resets the args space to 0.
+
+ * except.c (end_eh_unwinder): Subtract 1 from return address.
+ * libgcc2.c (__throw): Likewise.
+ (find_exception_handler): Don't change PC here. Compare end with >.
+
+Thu Sep 18 14:01:20 1997 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * configure.in: Make sure to create the stage* and include
+ symbolic links in each subdirectory.
+
+Thu Sep 18 13:20:37 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh/lib1funcs.asm (LOCAL): Define.
+ (whole file): Use it.
+
+Thu Sep 18 09:52:24 1997 Benjamin Kosnik <bkoz@beauty.cygnus.com>
+
+ * collect2.c (collect_execute): Specify name of new file when
+ redirecting stdout/stderr.
+
+Thu Sep 18 01:47:06 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.md (reload_peepholes): Don't allow addresses with side
+ effects for the memory operand.
+
+Wed Sep 17 18:19:53 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * libgcc2.c (find_exception_handler): Subtract one from our PC when
+ looking for a handler, to avoid hitting the beginning of the next
+ region.
+
+ * except.c (expand_builtin_set_return_addr_reg): Use force_operand.
+
+Wed Sep 17 18:23:09 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mips/abi64.h (LONG_MAX_SPEC): Define.
+ * mips.h (LONG_MAX_SPEC): Define.
+ (CPP_SPEC): Include long_max_spec.
+ (EXTRA_SPECS): Include long_max_spec.
+
+Wed Sep 17 14:17:26 1997 Paul Eggert <eggert@twinsun.com>
+
+ * configure.in (AC_CHECK_HEADERS): Add inttypes.h, limits.h.
+ ({sparc,i[3456]86,powerpcle}-*-solaris2*): Use fixinc.math.
+
+ * fixinc.math (PWDCMD, ORIGDIR, LINKS): Remove.
+ Remove duplicate test for missing $1.
+ Don't cd to $INPUT.
+ Build wrapper around system <math.h> instead of copying it;
+ this is better if the system <math.h> is updated later by a software
+ patch or upgrade.
+
+ * cccp.c (HAVE_STDLIB_H, HAVE_UNISTD_H):
+ Do not define any more; now autoconfed.
+ <limits.h>: Include if HAVE_LIMITS_H.
+ (HOST_BITS_PER_WIDE_INT): Remove.
+ (HOST_WIDE_INT): Use intmax_t or long long if available.
+ (pcfinclude): Use size_t, not HOST_WIDE_INT, for cast from pointer;
+ this is less likely to annoy the compiler.
+
+ * cexp.y (HAVE_STDLIB_H): Do not define any more; now autoconfed.
+ <limits.h>: Include if HAVE_LIMITS_H.
+ (HOST_WIDE_INT): Use intmax_t or long long if available.
+ (unsigned_HOST_WIDE_INT, CHAR_BIT): New macros.
+ (HOST_BITS_PER_WIDE_INT): Define in terms of CHAR_BIT and sizeof.
+ (MAX_CHAR_TYPE_MASK, MAX_CHAR_TYPE_MASK): Rewrite so that we don't use
+ HOST_BITS_PER_WIDE_INT in a preprocessor expression, since it now
+ uses sizeof.
+
+ * cppexp.c: <limits.h>: Include if HAVE_LIMITS_H.
+ (HOST_WIDE_INT): Use intmax_t or long long if available.
+ (CHAR_BIT): New macro.
+ (HOST_BITS_PER_WIDE_INT): Define in terms of CHAR_BIT and sizeof.
+ * cpplib.c: <limits.h>: Include if HAVE_LIMITS_H.
+ (HOST_WIDE_INT): Use intmax_t or long long if available.
+ (HOST_BITS_PER_WIDE_INT): Remove.
+
+Wed Sep 17 14:11:38 1997 Jeffrey A Law (law@cygnus.com)
+
+ * v850.c (construct_save_jarl): Fix thinko in last change.
+
+Wed Sep 17 15:04:19 1997 Doug Evans <dje@cygnus.com>
+
+ * sparc/sysv4.h (ASM_OUTPUT_{FLOAT,DOUBLE,LONG_DOUBLE}): Delete,
+ use sparc.h's copies.
+ * sparc.h (ASM_OUTPUT_{FLOAT,DOUBLE,LONG_DOUBLE}): Print ascii form
+ as well.
+
+Wed Sep 17 14:08:20 1997 Nick Burrett <nick.burrett@btinternet.com>
+
+ * explow.c (allocate_dynamic_stack_space): Make allocate_stack
+ pass 'target' as an extra operand.
+ * expr.c (expand_builtin_apply): Use allocate_dynamic_stack_space
+ to push a block of memory onto the stack.
+ * alpha.md (allocate_stack): Alter in accordance with new operand.
+ * i386.md (allocate_stack): Likewise.
+ * rs6000.md (allocate_stack): Likewise.
+
+Wed Sep 17 13:34:43 1997 Robert Lipe <robertl@dgii.com>
+
+ * i386/xm-sco5.h (sys_siglist, SYS_SYGLIST_DECLARED): Define.
+
+Wed Sep 17 13:27:05 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * Makefile.in (native): Correct dependency to auto-config.h from
+ config.h.
+
+Tue Sep 16 10:02:02 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * libgcc2.c (find_exception_handler): Not found is -1.
+
+ * integrate.c (expand_inline_function): Move expand_start_bindings
+ after expanding the arguments.
+
+ * i386.c (ix86_prologue): Pass SYMBOL_REF to
+ gen_prologue_{get_pc,set_got}.
+ * i386.md (prologue_set_got, prologue_get_pc): Adjust.
+
+Tue Sep 16 07:33:15 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * fold-const.c (make_range): Correctly handle cases of converting
+ from unsigned to signed type.
+
+ * function.c (flush_addressof): New function.
+
+ * combine.c (num_sign_bit_copies): If asking about wider mode,
+ treat like paradoxical subreg.
+
+Tue Sep 16 00:26:52 1997 Jeffrey A Law (law@cygnus.com)
+
+ * cse.c (simplify_relational_operation): If MODE specifies mode wider
+ than HOST_WIDE_INT, high word of CONST_INT is derived from sign bit
+ of low word.
+
+Tue Sep 16 00:13:20 1997 Nick Clifton <nickc@cygnus.com>
+
+ * v850.c ({register,pattern}_is_ok_for_epilogue): New functions.
+ (construct_{save,restore}_jr, pattern_is_ok_for_prologue): Likewise.
+ * v850.h (pattern_is_ok_for_{pro,epi}logue): New predicates.
+ (register_is_ok_for_epilogue): Likewise.
+ * v850.md: Replace prologue and epilogue patterns with a
+ match_parallel pattern.
+ * v850.c (output_move_single_unsigned): Cope with zero
+ extending and moving between registers at the same time.
+
+Mon Sep 15 22:02:46 1997 Jeffrey A Law (law@cygnus.com)
+
+ * fixinc.math: New file to fix math.h on some systems.
+ * configure.in (*-*-freebsd*, *-*-netbsd*): Use fixinc.math on these
+ systems.
+
+Mon Sep 15 18:58:36 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sched.c (update_flow_info) When looking if to set found_split_dest
+ or found_orig_dest, look at all parts of a PARALLEL.
+
+ * sh.md (casesi_0): Reduce functionality, exclude insns from
+ mova onwards. Changed expander caller.
+ (casesi_worker_0): New insn.
+ (casesi_worker_0+[12]): New define_splits.
+ (casesi_worker): Need no gen_* function.
+ (casesi): Use casesi_worker_0 instead of casesi_worker.
+ * sched.c (update_flow_info): Don't pass SCRATCH to dead_or_set_p.
+
+Mon Sep 15 11:43:38 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ Support dwarf2 unwinding on PUSH_ROUNDING targets like the x86.
+ * dwarf2.h: Add DW_CFA_GNU_args_size.
+ * frame.c (execute_cfa_insn): Likewise.
+ * dwarf2out.c (dwarf_cfi_name, output_cfi): Likewise.
+ (dwarf2out_args_size, dwarf2out_stack_adjust): New fns.
+ (dwarf2out_frame_debug): If this isn't a prologue or epilogue
+ insn, hand it off to dwarf2out_stack_adjust.
+ (dwarf2out_begin_prologue): Initialize args_size.
+ * frame.h (struct frame_state): Add args_size.
+ * libgcc2.c (__throw): Use args_size.
+ * final.c (final_scan_insn): If we push args, hand off all insns
+ to dwarf2out_frame_debug.
+ * defaults.h (DWARF2_UNWIND_INFO): OK for !ACCUMULATE_OUTGOING_ARGS.
+
+ * dwarf2out.c (dwarf2out_frame_debug): Fix typo.
+ Handle epilogue restore of SP from FP.
+ * emit-rtl.c (gen_sequence): Still generate a sequence if the
+ lone insn has RTX_FRAME_RELATED_P set.
+
+ * frame.c (extract_cie_info): Handle "e" augmentation.
+ * dwarf2out.c (ASM_OUTPUT_DWARF_*): Provide definitions in the
+ absence of UNALIGNED_*_ASM_OP.
+ (UNALIGNED_*_ASM_OP): Only provide defaults if OBJECT_FORMAT_ELF.
+ (output_call_frame_info): Use "e" instead of "z" for augmentation.
+ Don't emit augmentation fields length.
+ (dwarf2out_do_frame): Move outside of #ifdefs.
+ * defaults.h (DWARF2_UNWIND_INFO): Don't require unaligned data
+ opcodes.
+
+ * sparc.h (UNALIGNED_INT_ASM_OP et al): Don't define here after all.
+ * sparc/sysv4.h (UNALIGNED_INT_ASM_OP): Define here.
+ * sparc/sunos4.h (DWARF2_UNWIND_INFO): Define to 0.
+ * sparc/sun4gas.h: New file.
+ * configure.in: Use sun4gas.h if SunOS 4 --with-gnu-as.
+
+ * collect2.c (write_c_file_stat, write_c_file_glob): Declare
+ __register_frame_table and __deregister_frame.
+
+Mon Sep 15 19:04:34 1997 Brendan Kehoe <brendan@cygnus.com>
+
+ * except.c (find_exception_handler_labels): Use xmalloc instead of
+ alloca, since MAX_LABELNO - MIN_LABELNO can be more than 1 million
+ in some cases.
+
+Sat Sep 13 23:13:51 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cpplib.h (PARAMS): Fix misspelling of __STDC__.
+ (cpp_get_token): Arg is cpp_reader *, not struct parse_marker *.
+
+ * cpplib.c (cpp_fatal, cpp_file_line_for_message): New decls.
+ (ppp_hash_cleanup, cpp_message, cpp_print_containing_files): Likewise.
+ (copy_rest_of_line): Fix typo that prevented recognition of
+ C++ style comments.
+ (output_line_command, special_symbol): Use %ld for long, not %d.
+
+ * cppexp.c (xrealloc): Declare first arg as void *, not char *.
+ (cpp_lex): Cast 2nd arg of cpp_parse_escape from const char ** to
+ char **.
+
+Fri Sep 12 16:54:04 1997 Doug Evans <dje@cygnus.com>
+
+ * bitmap.h (bitmap_print): Don't use STDIO_PROTO.
+
+Fri Sep 12 13:49:58 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * except.h: Prototype dwarf2 hooks.
+ * expr.c: Adjust.
+
+Thu Sep 11 18:36:51 1997 Jim Wilson <wilson@cygnus.com>
+
+ * local-alloc.c (contains_replace_regs): New function.
+ (update_equiv_regs): When adding a REG_EQUIV note for a set of a MEM,
+ verify that there is no existing REG_EQUIV note, and add a call to
+ contains_place_regs.
+
+ * m68k.h (MACHINE_STATE_{SAVE,RESTORE}): Add __HPUX_ASM__ versions.
+
+Wed Sep 10 21:49:38 1997 Michael Meissner <meissner@cygnus.com>
+
+ * toplev.c (rest_of_compilation): For passes starting with
+ flow_analysis, use print_rtl_with_bb instead of print_rtl.
+ * print-rtl.c (print_rtl_single): Print a single rtl value to a
+ file.
+ * flow.c (print_rtl_with_bb): Print which insns start and end
+ basic blocks. For the start of a basic block, also print the live
+ information.
+ * bitmap.h (EXECUTE_IF_AND_IN_BITMAP): New macro, to iterate over
+ two bitmaps ANDed together.
+ (bitmap_print): Declare.
+ * bitmap.c (function_obstack): Don't declare any more.
+ (bitmap_obstack): Obstack for allocating links from.
+ (bitmap_obstack_init): New static to say whether to initialize
+ bitmap_obstack.
+ (bitmap_element_allocate): Use bitmap_obstack to allocate from.
+ (bitmap_release_memory): Free all memory allocated from
+ bitmap_obstack.
+ (toplevel): Conditionally include stdlib.h.
+ (free): Provide a declaration if NEED_DECLARATION_FREE.
+
+ * basic-block.h (EXECUTE_IF_AND_IN_REG_SET): New macro, invoke
+ EXECUTE_IF_AND_IN_BITMAP.
+
+Wed Sep 10 17:53:33 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.c (addr_diff_vec_adjust): Properly propagate considered
+ address changes through alignments.
+
+Wed Sep 10 13:10:52 1997 Per Bothner <bothner@cygnus.com>
+
+ * stor-layout.c (layout_type): Simplify special BOOLEAN_TYPE handling.
+
+Wed Sep 10 12:59:57 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * expr.c (expand_builtin): Only support __builtin_dwarf_fp_regnum()
+ if DWARF2_UNWIND_INFO.
+
+Wed Sep 10 15:43:10 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * cplus-dem.c (demangle_fund_type): Change "complex" to "__complex".
+
+Wed Sep 10 11:13:53 1997 Paul Eggert <eggert@twinsun.com>
+
+ Handle `extern int errno;' correctly when fixing <errno.h>.
+ * fix-header.c (recognized_extern): Use name_length when comparing.
+ * scan-decls.c (scan_decls): Don't ignore the first CPP_NAME in a
+ declaration, so that we see the `extern' in `extern int errno;'.
+
+Wed Sep 10 11:49:20 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ Add support for exception handling using DWARF 2 frame unwind info.
+ * libgcc2.c (get_reg, put_reg, get_return_addr, put_return_addr,
+ next_stack_level, in_reg_window): Helper fns.
+ (__throw): Implement for DWARF2_UNWIND_INFO.
+
+ * expr.c (expand_builtin): Handle builtins used by __throw.
+ * tree.h (enum built_in_function): Add builtins used by __throw.
+ * c-decl.c (init_decl_processing): Declare builtins used by __throw.
+ * dwarf2out.c (expand_builtin_dwarf_fp_regnum): Used by __throw.
+ * except.c (expand_builtin_unwind_init): Hook for dwarf2 __throw.
+ (expand_builtin_extract_return_addr): Likewise.
+ (expand_builtin_frob_return_addr): Likewise.
+ (expand_builtin_set_return_addr_reg): Likewise.
+ (expand_builtin_eh_stub): Likewise.
+ (expand_builtin_set_eh_regs): Likewise.
+ (eh_regs): Choose two call-clobbered registers for passing back values.
+
+ * frame.c, frame.h: New files for parsing dwarf 2 frame info.
+ * Makefile.in (LIB2ADD): New variable. Add $(srcdir)/frame.c.
+ (libgcc2.a): Use it instead of $(LIB2FUNCS_EXTRA) $(LANG_LIB2FUNCS)
+ (stmp-multilib): Likewise.
+ ($(T)crtbegin.o, $(T)crtend.o): Add -fno-exceptions.
+
+ * except.c: #include "defaults.h".
+ (exceptions_via_longjmp): Default depends on DWARF2_UNWIND_INFO.
+ (emit_throw): Don't defeat assemble_external if DWARF2_UNWIND_INFO.
+ (register_exception_table_p): New fn.
+ (start_eh_unwinder): Don't do anything if DWARF2_UNWIND_INFO.
+ (end_eh_unwinder): Likewise.
+
+ * crtstuff.c: Wrap .eh_frame section, use EH_FRAME_SECTION_ASM_OP,
+ call __register_frame and __deregister_frame as needed.
+ * varasm.c (eh_frame_section): New fn if EH_FRAME_SECTION_ASM_OP.
+ * dwarf2out.c (EH_FRAME_SECTION): Now a function-like macro. Check
+ EH_FRAME_SECTION_ASM_OP.
+ * sparc/sysv4.h (EH_FRAME_SECTION_ASM_OP): Define.
+ * mips/iris6.h: (EH_FRAME_SECTION_ASM_OP): Define.
+ (LINK_SPEC): Add __EH_FRAME_BEGIN__ to hidden symbols.
+
+ * dwarf2out.c (output_call_frame_info): If no support for
+ EXCEPTION_SECTION, mark the start of the frame info with a
+ collectable tag.
+ * collect2.c (frame_tables): New list.
+ (is_ctor_dtor): Recognise frame entries.
+ (scan_prog_file): Likewise.
+ (main): Pass -fno-exceptions to sub-compile. Also do collection
+ if there are any frame entries.
+ (write_c_file_stat): Call __register_frame_table and
+ __deregister_frame as needed.
+ (write_c_file_glob): Likewise.
+
+ * defaults.h (DWARF2_UNWIND_INFO): Default to 1 if supported.
+ Also require unaligned reloc support.
+ * sparc.h (UNALIGNED_SHORT_ASM_OP, UNALIGNED_INT_ASM_OP,
+ UNALIGNED_DOUBLE_INT_ASM_OP): Define here.
+ * sparc/sysv4.h: Not here.
+
+ * toplev.c (compile_file): Call dwarf2out_frame_{init,finish}.
+ * dwarf2out.c (dwarf2out_init): Don't call dwarf2out_frame_init.
+ (dwarf2out_finish): Don't call dwarf2out_frame_finish.
+
+ * libgcc2.c (L_eh): Reorganize, moving code shared by different
+ EH implementations to the top.
+ (find_exception_handler): Split out. Start from 0. Compare against
+ end with >=.
+ (__find_first_exception_table_match): Use it.
+ * except.c (output_exception_table): Don't do anything if there's
+ no table. Don't output a first entry of zeroes.
+ (eh_outer_context): Adjust properly.
+ (add_eh_table_entry): Use xrealloc.
+ * toplev.c (compile_file): Just call output_exception_table.
+
+Wed Sep 10 11:49:20 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * varasm.c (save_varasm_status): Take the target function context.
+ * function.c (push_function_context_to): Pass it in.
+
+ * rtl.def (ADDRESSOF): Add new field for original regno.
+ * function.c (put_reg_into_stack and callers): Add original_regno
+ argument.
+ (gen_mem_addressof): Remember the original regno.
+ * rtl.def (INLINE_HEADER): Add new field for parm_reg_stack_loc.
+ * rtl.h (PARMREG_STACK_LOC): New macro.
+ (ADDRESSOF_REGNO): New macro.
+ * emit-rtl.c (gen_inline_header_rtx): Add parm_reg_stack_loc.
+ * function.c (max_parm_reg, parm_reg_stack_loc): No longer static.
+ (assign_parms): Allocate parm_reg_stack_loc on saveable obstack.
+ * integrate.c (output_inline_function): Set max_parm_reg and
+ parm_reg_stack_loc from inline header.
+ (initialize_for_inline): Pass in parm_reg_stack_loc.
+
+Wed Sep 10 11:30:36 1997 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.c (override_options): Don't set TARGET_SCHEDULE_PROLOGUE
+ (ix86_expand_prologue, ix86_expand_epilogue): Emit rtl by default.
+
+Wed Sep 10 11:30:36 1997 Jason Merrill <jason@cygnus.com>
+
+ * i386.c (ix86_prologue): Add dwarf2 support for !do_rtl case.
+
+Wed Sep 10 08:48:44 1997 Jeffrey A Law (law@cygnus.com)
+
+ * xm-m88k.h (USG): Only define if it hasn't already been defined.
+
+ * i386.h (CPP_CPU_DEFAULT): Avoid using #elif.
+
+ * expr.c (do_jump_by_parts_equality_rtx): Don't clobber the
+ source operand when performing an IOR of the parts.
+
+ * expr.c (emit_block_move): Always return a value.
+
+ * expr.c (clear_storage): Use CONST0_RTX instead of const0_rtx.
+ when clearing non-BLKmode data.
+
+ * final.c (shorten_branches): Remove last change for ADDR_VEC
+ alignment computation. During first pass, assume worst
+ possible alignment for ADDR_VEC and ADDR_VEC_DIFF insns.
+
+Wed Sep 10 09:33:19 1997 Kamil Iskra <iskra@student.uci.agh.edu.pl>
+
+ * explow.c (emit_stack_save, emit_stack_restore): Correctly
+ handle HAVE_{save,restore}_stack_* evaluating to 0.
+
+Wed Sep 10 09:27:45 1997 Weiwen Liu <liu@hepvms.physics.yale.edu>
+
+ * Makefile.in (sdbout.o): Add dependency on insn-config.h.
+
+Wed Sep 10 09:24:56 1997 Nick Burrett <n.a.burrett@btinternet.com>
+
+ * sched.c (birthing_insn_p): Rename prototype decl from birthing_insn.
+ * final.c (leaf_renumber_regs, alter_cond): Declare prototype only
+ if LEAF_REGISTERS is defined.
+ * reload1.c (merge_assigned_reloads): Declare prototype only if
+ SMALL_REGISTER_CLASSES is defined.
+ * loop.c (replace_call_address): Pre-process out prototype decl.
+ * real.c (dectoe, etodec, todec): Declare proto if DEC is defined
+ (ibmtoe, etoibm, toibm): Declare proto if IBM is defined
+
+Wed Sep 10 09:13:51 1997 Manfred Hollstein <manfred@s-direktnet.de>
+
+ * configure.in (out_file): Emit definition to config.status.
+
+Wed Sep 10 08:37:56 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * final.c (shorten_branches): Fix alignment calculation.
+ Don't count the lengths of deleted instructions.
+
+Wed Sep 10 08:34:11 1997 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * cpplib.c (cpp_start_read): Make known_suffixes static.
+
+Wed Sep 10 08:27:05 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m68k.c (print_operand_address) [MOTOROLA]: When compiling
+ with -fpic (not -fPIC) force the GOT offset to 16 bits.
+
+Wed Sep 10 08:22:51 1997 Christian Iseli <chris@lslsun.epfl.ch>
+
+ * expr.c (convert_move): Add missing use of trunctqtf2.
+
+Wed Sep 10 08:17:10 1997 Torbjorn Granlund <tege@pdc.kth..se>
+
+ * except.c (eh_outer_context): Do masking using expand_and.
+
+Wed Sep 10 07:52:21 1997 Joel Sherrill <joel@OARcorp.com>
+
+ * pa/rtems.h (subtarget_switches): Removed -mrtems subtarget_switch.
+ * configure.in (sh*-*-rtems*): New target.
+ * sh.h (TARGET_SWITCHES: Call SUBTARGET_SWITCHES.
+ (SUBTARGET_SWITCHES): Provide default definition.
+
+Wed Sep 10 06:33:47 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * i386/mingw32.h ({LIB,LINK}_SPEC): Check for -mwindows, not -windows.
+
+ * alpha/vms.h (ASM_OUTPUT_SECTION): Clear NAME if overlaid.
+
+ * c-parse.in (unary_expr): Test DECL_C_BIT_FIELD, not DECL_BIT_FIELD.
+ * c-typeck.c (default_conversion): Likewise.
+
+ * tree.c (contains_placeholder_p, substitute_in_expr):
+ Handle placeholders inside args of CALL_EXPR (and hence in TREE_LIST).
+
+ * expr.c (expand_expr, case PLACEHOLDER_EXPR): Check all
+ expressions in placeholder_list.
+
+Tue Sep 9 18:10:30 1997 Doug Evans <dje@cygnus.com>
+
+ Add port done awhile ago for the ARC cpu.
+ * arc.h, arc.c, arc.md, t-arc, xm-arc.h: New files.
+ * arc/initfini.c, arc/lib1funcs.asm: New files.
+ * ginclude/va-arc.h: New file.
+ * ginclude/stdarg.h: Include va-arc.h ifdef __arc__.
+ * ginclude/varargs.h: Likewise.
+ * Makefile.in (USER_H): Add va-arc.h.
+ * configure.in (arc-*-elf*): Recognize.
+ * longlong.h: Add ARC support.
+
+Tue Sep 9 01:30:37 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * mips.h (DWARF_FRAME_REGNUM): Use the same numbering regardless of
+ write_symbols.
+
+Mon Sep 8 15:15:11 1997 Nick Clifton <nickc@cygnus.com>
+
+ * v850.h (ASM_SPEC): Pass on target processor.
+ (CPP_PREDEFINES): Only define if not already specified.
+ (TARGET_VERSION): Only define if not already specified.
+ (MASK_CPU, MASK_V850, MASK_DEFAULT): Bits to specify target
+ processor.
+ (EXTRA_SWITCHES): Extra entries in the switches array.
+ (TARGET_DEFAULT): Set default target processor.
+
+Tue Sep 9 09:50:02 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * configure.in (alpha*-*-*): Support pca56 and ev6.
+
+ * varasm.c (named_section): Set in section after writing directive.
+ * dwarf2out.c (output_call_frame_info): Call named_section.
+
+Mon Sep 8 16:32:43 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * mips.c (function_prologue): Set up the CFA when ABI_32.
+
+ * sparc.c (save_regs): Check dwarf2out_do_frame instead of DWARF2_DEBUG
+ for dwarf2 unwind info.
+ (output_function_prologue, sparc_flat_output_function_prologue): Same.
+
+ * final.c (final_end_function): Check dwarf2out_do_frame instead
+ of DWARF2_DEBUG for dwarf2 unwind info.
+ (final_scan_insn): Likewise.
+ (final_start_function): Likewise. Initialize dwarf2 frame debug here.
+ (final): Not here.
+
+ * expr.c (expand_builtin_return_addr): Only SETUP_FRAME_ADDRESSES if
+ count > 0.
+
+ * varasm.c (exception_section): Check EXCEPTION_SECTION first.
+
+Mon Sep 8 14:58:07 1997 Jim Wilson <wilson@cygnus.com>
+
+ * toplev.c (main): Change #elif to #else/#ifdef
+
+ * i386/t-sol2 (TARGET_LIBGCC2_CFLAGS): Define to -fPIC.
+
+Mon Sep 8 08:45:19 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alpha.h (processor_type): Add EV6.
+ ({TARGET,MASK}_BWX): Renamed from _BYTE_OPS.
+ ({TARGET,MASK}_{CIX,MAX}): New macros.
+ (MASK_CPU_EV5): Change bit number.
+ (MASK_CPU_EV6, {TARGET,MASK}_SUPPORT_ARCH): New macros.
+ (TARGET_OPTIONS): Rename "byte" to "bwx" and add "cix" and "max".
+ (MINIMUM_ATOMIC_ALIGNMENT): Rename TARGET_BYTE_OPS to TARGET_BWX.
+ (SECONDARY_{INPUT,OUTPUT}_RELOAD_CLASS, ASM_FILE_START): Likewise.
+ (SECONDARY_MEMORY_NEEDED): Not needed if CIX.
+ (ASM_FILE_START): Only write if TARGET_SUPPORT_ARCH.
+ Add "pca56" and "ev6".
+ * alpha.c (input_operand): Rename TARGET_BYTE_OPS to TARGET_BWX.
+ (override_options): Likewise; also add new CPU types and subset flags.
+ * alpha.md: Rename TARGET_BYTE_OPS to TARGET_BWX.
+ (cpu attr): Add "ev6".
+ (ev5 function units): Use for ev6 as well, for now.
+ (ffsdi2): New define_expand and define_insn, for TARGET_CIX.
+ (sqrt[sd]f2): New patterns, for TARGET_CIX.
+ (s{min,max}[qh]i3): New patterns, for TARGET_MAX.
+ (movsi): Use ldf/lsf when appropriate, instead of lds/sts.
+ (mov[sd]i): Add use of ftio/itof for TARGET_CIX.
+ * configure.in (alpha*-dec-osf*): Set MASK_SUPPORT_ARCH for >= 4.0B.
+ Rename MASK_BYTE_OPS to MASK_BWX.
+
+ * i386/mingw32.h (STANDARD_INCLUDE_DIR): New macros.
+ (STARTFILE_SPEC, PATH_SEPARATOR): Likewise.
+
+ * configure.in (AC_PROG_LN_S): Remove; unneeded.
+ (*cygwin32*, *mingw32*): Default prefix to /usr.
+ (symbolic_link): Set to "cp -p" if no "ln -s"; add AC_SUBST.
+ (configure.lang call): Change remaining use of config.h to auto-conf.h.
+
+ * Makefile.in (LN): Add new symbol.
+ (FLAGS_TO_PASS): Pass it down.
+ (stage[1-4]-start): Use $(LN), not "ln -s".
+
+ * mips.h (flag_omit_frame_pointer, frame_pointer_needed, optimize):
+ Remove declarations: no longer needed.
+ * pyr.md: Remove unneeded declarations of `optimize'.
+ * h8300.md: Likewise.
+ * sparc.c (dwarf2out_cfi_label): Add declaration.
+ (save_regs, output_function_prologue): Remove cast for it.
+ (sparc_flat_{save_restore,output_function_prologue): Likewise.
+ ({save,restore}_regs): No longer inline.
+
+Mon Sep 8 03:08:35 1997 Jim Wilson <wilson@cygnus.com>
+
+ * i960.h (LINK_SPEC): Handle -mjX and -mrp switches.
+
+ * mips.md (nonlocal_goto_receiver): Define.
+
+ * unroll.c (calculate_giv_inc): Handle increment with code PLUS.
+
+ * alpha.h (PREFERRED_RELOAD_CLASS): Return NO_REGS if NO_REGS
+ is passed in.
+ * emit-rtl.c (gen_lowpart_common): Add code to convert CONST_INT to
+ SFmode for 64 bit hosts.
+
+ * profile.c (output_arc_profiler): Verify next_insert_after is an
+ INSN before and after skipping a stack pop. Check next_insert_after
+ for non NULL before deferencing it.
+ (output_func_start_profiler): Set DECL_EXTERNAL to zero.
+
+ * va-mips.h: Add _VA_MIPS_H_ENUM ifdef/define/endif.
+
+ * m68k.md (iorsi_zexthi_ashl16): Disable.
+
+ * varasm.c (mark_constants): Don't look inside CONST_DOUBLEs.
+
+Sun Sep 7 18:30:46 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (dwarf2out_frame_debug): Assume that in a PARALLEL
+ prologue insn, only the first elt is significant.
+ (output_call_frame_info): For exception handling, always use 4-byte
+ fields as specified by the dwarf2 spec.
+ Don't skip trivial FDEs.
+
+Sun Sep 7 03:35:28 1997 Paul Eggert <eggert@twinsun.com>
+
+ * fix-header.c (std_include_table): Remove bogus entry for popen
+ under stdio.h with ANSI_SYMBOL. popen is a POSIX2_SYMBOL.
+
+Fri Sep 5 17:19:58 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.md (movsf_ie+1): Typo fix.
+
+Fri Sep 5 10:08:44 1997 Jeffrey A Law (law@cygnus.com)
+
+ * v850: New directory for v850 port.
+ * v850/lib1funcs.asm: New file.
+ * t-v850, v850.c, v850.h, v850.md, xm-v850.h: New files.
+ * ginclude/va-v850.h: New file.
+ * varargs.h, stdarg.h: Include va-mn10200.h.
+ * configure.in (mn10200-*-*): New target.
+ * Makefile.in (USER_H): Add va-mn10200.h.
+
+ * xm-svr4.h (SYS_SIGLIST_DECLARED): Define.
+ * mips/xm-news.h (SYS_SIGLIST_DECLARED): Define.
+ * mips/xm-sysv4.h (SYS_SIGLIST_DECLARED): Define.
+
+Fri Sep 5 03:50:15 1997 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.md (fma patterns): Extend previous -mno-fused-madd
+ patch to DFmode patterns inadvertently omitted.
+
+Thu Sep 4 20:06:02 1997 Christian Kuehnke <Christian.Kuehnke@arbi.Informatik.Uni-Oldenburg.DE>
+
+ * sparc.md: Add ultrasparc scheduling support.
+ * sparc.h (RTX_COSTS): For MULT give v9 a cost of 25 insns.
+
+Wed Sep 3 20:56:24 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.h (UNALIGNED_SHORT_ASM_OP, UNALIGNED_INT_ASM_OP): Define.
+
+Wed Sep 3 20:52:07 1997 Joel Sherrill <joel@OARcorp.com>
+
+ * sh/rtems.h: New file.
+
+Wed Sep 3 17:30:36 1997 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * reg-stack.c (subst_stack_regs): Pop the stack register for a
+ computed goto which sets the same stack register.
+
+Wed Sep 3 17:30:36 1997 Jim Wilson <wilson@cygnus.com>
+
+ * i386.c (ix86_expand_epilogue): Emit blockage instruction when pic.
+
+Wed Sep 3 11:25:19 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.md (reload peepholes): Fix typo in last change.
+
+Wed Sep 3 03:02:02 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.md (movsi_ie): Move t/r alternative after r/r alternative.
+
+Tue Sep 2 18:41:55 1997 Jeffrey A Law (law@cygnus.com)
+
+ * cccp.c (sys_errlist): Remove special 4.4bsd declaration.
+ * collect2.c (sys_errlist): Likewise.
+ * cpplib.c (sys_errlist): Likewise.
+ * gcc.c (sys_errlist): Likewise.
+ * protoize.c (sys_errlist): Likewise.
+ * configure.in: Check for strerror.
+ * xm-freebsd.h (HAVE_STRERROR): Remove definition.
+ * xm-gnu.h (HAVE_STRERROR): Likewise.
+ * xm-linux.h (HAVE_STRERROR): Likewise.
+ * xm-netbsd.h (HAVE_STRERROR): Likewise.
+ * alpha/xm-linux.h (HAVE_STRERROR): Likewise.
+ * i386/xm-bsd386.h (HAVE_STRERROR): Likewise.
+ * i386/xm-cygwin32.h (HAVE_STRERROR): Likewise.
+ * i386/xm-dos.h (HAVE_STRERROR): Likewise.
+ * i386/xm-mingw32.h (HAVE_STRERROR): Likewise.
+ * pa/xm-pa.h (HAVE_STRERROR): Likewise.
+ * pa/xm-papro.h (HAVE_STRERROR): Likewise.
+ * rs6000/xm-cygwin32.h (HAVE_STRERROR): Likewise.
+ * rs6000/xm-sysv4.h (HAVE_STRERROR): Likewise.
+
+ * collect2.c (SYS_SIGLIST_DECLARED): Renamed from
+ DONT_DECLARE_SYS_SIGLIST.
+ * mips-tfile.c (SYS_SIGLIST_DECLARED): Likewise.
+ * xm-linux.h (DONT_DECLARE_SYS_SIGLIST): Delete definition.
+ * xm-freebsd.h (DONT_DECLARE_SYS_SIGLIST): Likewise.
+ * alpha/xm-linux.h (DONT_DECLARE_SYS_SIGLIST): Delete definition.
+ * i386/xm-bsd386.h (DONT_DECLARE_SYS_SIGLIST): Likewise.
+ * i386/xm-sysv4.h (DONT_DECLARE_SYS_SIGLIST): Likewise.
+ * mips/xm-sysv4.h (DONT_DECLARE_SYS_SIGLIST): Likewise.
+ * rs6000/xm-sysv4.h (DONT_DECLARE_SYS_SIGLIST): Likewise.
+ * sparc/xm-sol2.h (DONT_DECLARE_SYS_SIGLIST): Likewise.
+ * configure.in: Check for sys_siglist declaration.
+
+ * Makefile.in (libgcc2.a): Add missing "else true" clause.
+ (stage{1,2,3,4}-start): Likewise.
+
+ * mn10200.h (INITIALIZE_TRAMPOLINE): PC relative instructions
+ are relative to the next instruction, not the current instruction.
+
+Tue Sep 2 14:15:32 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * toplev.c (xrealloc): Handle null ptr.
+
+Tue Sep 2 13:42:38 1997 Paul N. Hilfinger <hilfingr@CS.Berkeley.EDU>
+
+ * fixincludes: Permits spaces between # and define. Discard C++
+ comments in sys/pci.h on HP/UX 10.20.
+
+Tue Sep 2 09:28:31 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * rs6000.h (ROUND_TYPE_ALIGN): Don't blow up if no fields in record.
+
+Tue Sep 2 00:19:01 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * expr.c (expand_expr, case COND_EXPR): It's OK to merge two
+ SAVE_EXPRs.
+
+Mon Sep 1 23:36:45 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (restore_unscaled_index_insn_codes): New function.
+ (record_unscaled_index_insn_codes): Likewise.
+ (output_function_prologue): Call restore_unscaled_index_insn_codes.
+ (output_function_epilogue): Free memory for unscaled_index_insn_codes.
+ (pa_reorg): Call record_unscaled_index_insn_codes.
+
+Mon Sep 1 14:46:09 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.md (casesi_jump_1, casesi_jump2): Generate expanders.
+ (casesi_jump): Delete.
+ (casesi) Use gen_casesi_jump_1 and gen_casesi_jump2 instead of
+ gen_casesi_jump.
+
+Mon Sep 1 14:36:36 1997 Paul Eggert <eggert@twinsun.com>
+
+ * sparc/sol2.h (CPP_SPEC): Add -D__STDC__=0 unless -ansi
+ or -traditional, for compatibility with Sun's practice.
+ * i386/sol2.h (CPP_SPEC), rs6000/sol2.h (CPP_SPEC): Likewise.
+ * configure.in ({sparc,i[3456]86,powerpcle}-*-solaris2*):
+ Set fixincludes=Makefile.in.
+
+Mon Sep 1 14:08:23 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * Makefile.in (config.status): Depend on version.c.
+
+Mon Sep 1 13:48:02 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * acconfig.h: Remove include of config2.h.
+ * configure.in: Build auto-config.h, not config.h, from autoconf data.
+ Add auto-conf.h in front of all other host_xm_file entries.
+ Make config.h, not config2.h, from host_xm_file.
+ * Makefile.in (auto-config.h): New rule; was config.h.
+ (distclean): Remove auto-config.h, not config2.h.
+
+ * expr.c (do_jump_by_parts_equality_rtx): Try to do by IOR of
+ all the words.
+
+Mon Sep 1 13:07:36 1997 Bob Manson <manson@charmed.cygnus.com>
+
+ * sparc/t-vxsparc (TARGET_LIBGCC2_CFLAGS): New definition.
+ (LIBGCC2_CFLAGS): Deleted.
+ * m68k/t-vxworks68: Likewise.
+ * i960/t-vxworks960: Likewise.
+ * a29k/t-vx29k: Likewise.
+
+Sun Aug 31 17:12:27 1997 Paul Eggert <eggert@twinsun.com>
+
+ * real.c (EMULONG): Correct typo in spelling of HOST_BITS_PER_LONGLONG.
+
+Fri Aug 29 16:13:51 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mips.md (movstrsi_internal[23]): Set insn type to "store" to
+ get more accurate schedules.
+
+ * pa.md (reload_peepholes): Make sure operand is a REG before
+ examining REGNO. Allow general registers too.
+
+Thu Aug 28 12:34:56 1997 Doug Evans <dje@seba.cygnus.com>
+
+ * reload1.c (reload_cse_no_longer_dead): Don't pass incremented regno
+ to SET_HARD_REG_BIT, it can be evaluated twice.
+
+Wed Aug 27 20:15:53 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh/elf.h: (LINK_SPEC): Use shlelf.
+ (USER_LABEL_PREFIX, LOCAL_LABEL_PREFIX, ASM_FILE_START): Redefine.
+ * sh/lib1funcs.asm (___ashrsi3, ___ashlsi3, ___lshrsi3):
+ Truncate shift count. Use braf if not SH1.
+ * sh.c (sfunc_uses_reg): No longer static.
+ Check for SImode inside the USE.
+ (shiftcosts, expand_ashiftrt, shl_sext_kind):
+ Use SH_DYNAMIC_SHIFT_COST.
+ (sh_dynamicalize_shift_p, output_branchy_insn): New functions.
+ (output_ieee_ccmpeq, mova_p, cache_align_p, fixup_aligns): Likewise.
+ (branch_offset, short_cbranch_p, med_branch_p): Likewise.
+ (braf_branch_p, align_length, fixup_addr_diff_vecs): Likewise.
+ (addr_diff_vec_adjust, get_dest_uid, gen_far_branch): Likewise.
+ (split_branches, regs_used, gen_block_redirect): Likewise.
+ (from_compare): Can't compare non-zero DImode constant directly.
+ Emit special code for TARGET_SH3E floating point with code == GE.
+ Force 0.0 into a register for SH3E.
+ (print_operand): Add ','.
+ Emit the actual comparison instruction.
+ (sh_builtin_saveregs): Save floating point registers in order that
+ allows pre-decrement.
+ (find_barrier): New arguments num_mova and mova. Changed caller.
+ When rewinding to before a mova, also restore the last found barrier.
+ Branch is now known to be shortened.
+ Prefer barriers where no new alignment is needed.
+ More generic alignment for cache lines.
+ Add checks for pieces of code that use more table space than their
+ own size.
+ Fix up the barrier we return so that the alignment will always be
+ after the table.
+ Remove limit adjustments for table alignment.
+ Handle PARALLELs correctly.
+ (machine_dependent_reorg): Add extra pass to split insns.
+ Don't scan instructions twice for broken moves.
+ Calculate insn length, call fixup_addr_diff_vecs.
+ Call split_branches.
+ Add alignment for loops and after BARRIERs.
+ Initialize max_uid_before_fixup_addr_diff_vecs.
+ Advance mdep_reorg_phase.
+ Clear insn_addresses.
+ (output_far_jump): Use braf and/or pre-allocated scratch register
+ when possible.
+ (expand_ashiftrt): Truncate shift count.
+ (push_regs): Push PR last.
+ (sh_expand_epilogue): Pop PR first.
+ (code_for_indirect_jump_scratch, mdep_reorg_phase): New variables.
+ (uid_align, uid_align_max): Likewise.
+ (max_uid_before_fixup_addr_diff_vecs, sh_addr_diff_vec_mode): Likewise.
+ (braf_label_ref_operand): New predicate.
+ (initial_elimination_offset): calculate offset from
+ RETURN_ADDRESS_POINTER_REGNUM starting with total_saved_regs_space.
+ (output_branch): Expect out-of-range condbranches to have been split.
+ * sh.md (rotlsi3_16): Named insn.
+ (rotlsi3): Rewritten to use superoptimizer patterns.
+ (adddi3, subdi3, ashrsi2_16, ashrsi2_31): Always split.
+ (movsi_i, movsi_ie): replace t/z alternative with t/r alternative.
+ Use pcload_si and load_si insn types.
+ (adddi3+1, subdi3+1, ashrsi2_16+1, ashrsi2_31+1) New define_splits.
+ (addc, subc, ashlsi_c): New insns.
+ (attribute "type"): New values dyn_shift, load_si, pcload_si, fmove,
+ jump_ind, arith3 and arith3b.
+ (function_unit "fp"): Take fmove into account.
+ (function_unit "int"): Uses one cycle for !dyn_shift.
+ (function_unit "memory"): Special case for load_si and pcload_si.
+ (attribute "in_delay_slot): handle pcload_si.
+ (cmpgtdi_t, cmpgedi_t, cmpgeudi_t, cmpgtudi_t): Type arith3.
+ (cmpsi+1, cmpeqdi_t) Type arith3b.
+ (movsf_ie, alternatives f/fGH/X, f/y/X, y/f/X): Type fmove.
+ (extendsidi2): Delete.
+ (cmpeqsi_t-2): Delete. (Redundant with movt.)
+ (*rotlhi3_8) Name.
+ (iorsi3, rotlsi3_1, rotlsi3_31, rotlsi3_16, (*rotlhi3_8): Type arith.
+ (ashlsi3_k, ashlhi3_ki, ashrsi2_16, ashrsi2_31, lshrsi3_m): Likewise.
+ (lshrsi3_k, lshrhi3_m, lshrhi3_k, ashldi3_k, lshrdi3_k): Likewise.
+ (ashrdi3_k, xtrct_left, xtrct_right, dect, mova, movt): Likewise.
+ (movt): Likewise.
+ (ashlsi3_d, ashrsi3_d, lshrsi3_d): Type dyn_shift.
+ (indirect_jump_scratch, *casesi_jump_1, *casesi_jump_2): Type jump_ind.
+ (ashlsi3, ashlsi3_n, lshrsi3, lshrsi3_n): Use sh_dynamicalize_shift_p.
+ (movsf_ie+1, movsf_ie+2): Exchange.
+ (cmpeqdi_t-1, cmpeqdi_t, cmpgtdi_t, cmpgedi_t): New insns.
+ (cmpgeudi_t, cmpgtudi_t, movsi_i_lowpart, ieee_ccmpeqsf_t): Likewise.
+ (cmpdi, movnegt): New define_expands.
+ (movsi_ie): Add y,y alternative.
+ (sge): Use it for ! TARGET_IEEE. Use special code for TARGET_IEEE.
+ (sle): Use sge.
+ (align_4, casesi_jump): Now define_expand.
+ (casesi_0, addr_diff_vec_adjust, align_log): New patterns.
+ (*casesi_jump_[12]): Likewise.
+ (casesi): Use casesi_0 and casesi_jump.
+ (casesi_worker): Depends on the mode used for the table.
+ (define_delay for cbranches): Test TARGET_SH2.
+ Changed all callers of from_compare.
+ (attribute "length"): Take use of braf and scratch registers into
+ account.
+ (indirect_jump_scratch, block_branch_redirect): New patterns.
+ (jump): Call output_far_jump for any jump larger than 4 bytes.
+ (inverse_branch_true, inverse_branch_false): Remove.
+ (bne, blt, ble, bltu, bleu): Canonicalize.
+ (attribute "cpu"): Remove "sh0" alternative.
+ * sh.h (ADJUST_COST): Lower cost of non-address sfunc dependencies.
+ Adjust cost of load_si / pcload_si insns when not used for call.
+ (enum reg_class): Move GENERAL_REGS after FPUL_REGS.
+ (REG_CLASS_NAMES, REG_CLASS_CONTENTS): Likewise.
+ (REGISTER_MOVE_COST): Add costs for fpul <-> mac, pr moves.
+ Fix to match default cost in regclass. Move to T reg not costly.
+ When checking for GENERAL_REGS, check for R0_REGS too.
+ (INITIALIZE_TRAMPOLINE): Include code for constant parts.
+ (SHIFT_COUNT_TRUNCATED): Not true for TARGET_SH3.
+ (CPP_SPEC): Define __sh1__ if no specific cpu is selected.
+ (FUNCTION_BOUNDARY): Align to cache line boundary.
+ (optimize, sh_addr_diff_vec_mode, machine_dependent_reorg): Declare.
+ (addr_diff_vec_adjust, code_for_indirect_jump_scratch): Declare.
+ (short_cbranch_p, med_branch_p, braf_branch_p, align_length): Declare.
+ (output_ieee_ccmpeq, output_branchy_insn, sfunc_uses_reg): Declare.
+ (ASM_OUTPUT_ADDR_DIFF_ELT): Depends on sh_addr_diff_vec_mode.
+ (PREDICATE_CODES): Add braf_label_ref_operand and register_operand.
+ (IEEE_BIT, TAGET_IEEE, LOCAL_LABEL_PREFIX, ASSEMBLER_DIALECT): Define.
+ (CACHE_LOG, enum mdep_reorg_phase_e, TRAMPOLINE_ALIGNMENT): Define.
+ (SH_DYNAMIC_SHIFT_COST): Define.
+ (TARGET_SWITCHES): Remove -m0 entry. Add -mieee, -mno-ieee.
+ (OVERRIDE_OPTIONS): sh_cpu defaults to CPU_SH1.
+ Initialize sh_addr_diff_vec_mode.
+ (REG_ALLOC_ORDER): Move FP0 behind FP7.
+ Move all FP registers in front of the general registers.
+ (SECONDARY_OUTPUT_RELOAD_CLASS): Add case for MAC_REGS / PR_REGS.
+ When checking for GENERAL_REGS, check for R0_REGS too.
+ Fix direction of compares to {FIR,LA}ST_FP_REG.
+ (SECONDARY_INPUT_RELOAD_CLASS): check for fp_one_operand.
+ (ASM_OUTPUT_ALIGN_CODE, ASM_OUTPUT_LOOP_ALIGN, SH0_BIT): Delete.
+ (TARGET_SH0, PUSH_ROUNDING, TRAMPOLINE_TEMPLATE): Delete.
+ (TRAMPOLINE_ALIGN): Delete.
+ (processor_type): Remove PROCESSOR_SH0.
+ (ADJUST_INSN_LENGTH): Remove check for preceding BARRIER.
+ Adjust ADDR_DIFF_VECs. Add code for alignment instructions.
+ Check if insn needing a delay slot is already inside a SEQUENCE.
+
+ * va-sh.h (__va_rounded_size): Delete.
+ (__LITTLE_ENDIAN_P, __SCALAR_TYPE, __PASS_AS_FLOAT): Define.
+ (va_arg): Unify big and little endian code.
+ Optimization for small integers.
+
+ From Fred Fish:
+ * sh.h (INITIAL_ELIMINATION_OFFSET): Proper bracketing.
+ (REGNO_REG_CLASS, PREFERRED_RELOAD_CLASS): Likewise.
+ (SECONDARY_{OUTPUT,INPUT}_RELOAD_CLASS, LIBCALL_VALUE): Likewise.
+ (ROUND_ADVANCE, FUNCTION_ARG, FUNCTION_ARG_PARTIAL_NREGS): Likewise.
+ (FUNCTION_PROFILE, FUNCTION_EPILOGUE, RETURN_ADDR_RTX): Likewise.
+ (REGNO_OK_FOR_INDEX_P, EXTRA_CONSTRAINT_Q, MODE_DISP_OK_4): Likewise.
+ (GO_IF_LEGITIMATE_{INDEX,ADDRES}, LEGITIMIZE_ADDRESS): Likewise.
+ (CONST_COSTS, REGISTER_MOVE_COST, ASM_OUTPUT_CONSTRUCTOR): Likewise.
+ (ASM_OUTPUT_CONSTRUCTOR, ASM_OUTPUT_DESTRUCTOR): Likewise.
+ (ASM_OUTPUT_REG_PUSH, ASM_OUTPUT_REG_POP, ASM_OUTPUT_LABEL): Likewise.
+ (ASM_OUTPUT_ALIGN), ASM_DECLARE_FUNCTION_NAME): Likewise.
+ (ASM_GLOBALIZE_LABEL, ASM_OUTPUT_CASE_LABEL): Likewise.
+ (ASM_OUTPUT_ADDR_DIFF_ELT, ASM_OUTPUT_ADDR_VEC_ELT) Likewise.
+ (ASM_OUTPUT_DOUBLE, ASM_OUTPUT_FLOAT, ASM_OUTPUT_INT): Likewise.
+ (ASM_OUTPUT_SHORT, ASM_OUTPUT_CHAR, ASM_OUTPUT_BYTE): Likewise.
+ (ASM_OUTPUT_SKIP, FINAL_PRESCAN_INSN, PRINT_OPERAND): Likewise.
+ (PRINT_OPERAND_ADDRESS, HANDLE_PRAGMA, ADJUST_INSN_LENGTH): Likewise.
+ (PROMOTE_MODE): Likewise.
+ (ASM_GENERATE_INTERNAL_LABEL): Use LOCAL_LABEL_PREFIX.
+ (ASM_OUTPUT_INTERNAL_LABEL): Use %L.
+ * sh/elf.h: (ASM_OUTPUT_LABELREF): Use %U.
+ (ASM_GENERATE_INTERNAL_LABEL): Use LOCAL_LABEL_PREFIX.
+ (ASM_OUTPUT_INTERNAL_LABEL, ASM_OUTPUT_SOURCE_LINE): Use %L.
+
+Wed Aug 27 16:42:21 1997 Bob Manson (manson@cygnus.com)
+
+ * t-h8300 (TARGET_LIBGCC2_CFLAGS): New definit.
+ (LIBGCC2_CFLAGS): Deleted.
+ * t-mn10200: Likewise.
+
+Wed Aug 27 17:10:51 1997 Jim Wilson <wilson@cygnus.com>
+
+ * m68k.md (iorsi3_internal): Readd ! TARGET_5200 check lost in
+ last change.
+
+Wed Aug 27 15:19:55 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * dwarfout.c (dwarfout_start_new_source_file): Strip leading '*'s
+ from label names.
+
+Wed Aug 27 14:33:38 1997 Jim Wilson <wilson@cygnus.com>
+
+ * reload.c (find_reloads, case '0'): Reject matching a non-offsettable
+ address where an offsettable address is required.
+
+Wed Aug 27 10:38:32 1997 Jeffrey A Law (law@cygnus.com)
+
+ * reorg.c (dbr_schedule): Allow current_function_return_rtx
+ to be something other than a REG.
+ * function.c (expand_function_end): Fix current_function_return_rtx
+ if it was a pseudo.
+
+ * t-freebsd (USER_H): Include EXTRA_HEADERS and LANG_EXTRA_HEADERS.
+ * x-netbsd: Likewise
+ * x-dgux (USER_H): Include EXTRA_HEADERS and LANG_EXTRA_HEADERS
+ (INSTALL_HEADERS): Delete.
+ * x-dguxbcs: Likewise.
+ * x-hp3bsd44: Likewise
+ * x-pa: Likewise.
+
+Wed Aug 27 07:15:58 1997 Klaus Espenlaub <kespenla@hydra.informatik.uni-ulm.de>
+
+ * configure.in (AC_PROG_CC, AC_PROG_MAKE_SET): Check for gcc before
+ testing for flex.
+
+Wed Aug 27 02:24:35 1997 Jim Wilson <wilson@cygnus.com>
+
+ * dwarfout.c (dwarfout_file_scope_decl, case TYPE_DECL): Check
+ TYPE_DECL_IS_STUB instead of DECL_NAME.
+
+ * Makefile.in (install-info): Don't cd into srcdir. Add srcdir to
+ filenames. Use sed to extract base filename for install.
+
+Wed Aug 27 01:56:18 1997 Doug Evans <dje@seba.cygnus.com>
+
+ * loop.c (combine_movables): Earlier insns don't match later ones.
+
+ * c-decl.c (grokdeclarator): If array index or size calculations
+ overflow, issue an error.
+ * fold-const.c (int_const_binop): New static function.
+ (const_binop, size_binop): Call it.
+
+Tue Aug 26 17:51:56 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * collect2.c (main): Check SCAN_LIBRARIES instead of LDD_SUFFIX
+ to decide whether to always emit init and fini handles.
+
+Tue Aug 26 13:51:10 1997 Jim Wilson <wilson@cygnus.com>
+
+ * stor-layout.c (layout_record): Test DECL_PACKED instead of
+ TYPE_PACKED to determine alignment.
+
+ * combine.c (try_combine): Distribute REG_DEAD notes created for
+ i3dest_killed similar to the ones created for i2dest_in_i2src
+ and for i1dest_in_i1src.
+
+Tue Aug 26 11:36:34 1997 Jeffrey A Law (law@cygnus.com)
+
+ * loop.c (check_final_value): Don't miss a biv increment in a
+ parallel.
+
+ * loop.c (check_dbra_loop): If the loop biv is only used
+ for counting, then normalize it so that the initial
+ value is zero.
+
+Tue Aug 26 06:19:48 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarfout.c (*_LABEL): Add initial '*'.
+
+Tue Aug 26 05:27:28 1997 Richard Henderson <rth@cygnus.com>
+
+ * alpha/elf.h (LINK_SPEC): Conditionalize on USE_GNULIBC_1.
+ * configure.in (alpha-*-linux-gnulibc1): New target.
+ (alpha-*-linux-gnu*): Don't build crtbegin/end.
+
+Mon Aug 25 19:11:38 1997 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>
+
+ * reload1.c (reload_cse_simplify_operands): Fix typo.
+
+Mon Aug 25 19:04:42 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * c-typeck.c (common_type): Always prefer long double to double.
+
+Mon Aug 25 08:55:00 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (secondary_reload_class): (mem (mem ... )) does not need
+ secondary reloads.
+
+ * pa.c (hppa_builtin_saveregs): Emit a blockage insn after the
+ store of the argument registers.
+
+Sun Aug 24 21:25:06 1997 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>
+
+ * reload1.c (reload_cse_mem_conflict_p, case MEM): Also check
+ for conflict with the address.
+
+Sat Aug 23 18:43:22 1997 Jim Wilson <wilson@cygnus.com>
+
+ * acconfig.h (NEED_DECLARATION_CALLOC): Add.
+ * configure.in: Add GCC_NEED_DECLARATION call for calloc.
+ * rs6000/xm-rs6000.h (malloc, realloc, calloc, free): Delete
+ declarations.
+
+ * m68k/m68kemb.h (LIB_SPEC): Add missing comment end before it.
+ * m68k/next.h (GO_IF_INDEXABLE_BASE): Fix typo in undef.
+
+Sat Aug 23 00:18:22 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (pa_reorg): Always put begin_brtab and end_brtab insns
+ around branch tables.
+ * pa.md (begin_brtab, end_brtab): Only emit the .begin_brtab
+ and .end_brtab directives if TARGET_GAS.
+
+Fri Aug 22 19:17:25 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * function.c (instantiate_virtual_regs_1, case ADDRESSOF):
+ New case.
+ (fix_lexical_addr): Handle (addressof (mem ...)).
+
+Thu Aug 21 17:56:06 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * reload.c (push_secondary_reload): If SECONDARY_MEM_NEEDED,
+ call get_secondary_mem for input before adding reload and
+ for output after.
+ (push_reload): Likewise.
+
+Thu Aug 21 15:57:03 1997 Jim Wilson <wilson@cygnus.com>
+
+ * stmt.c (start_cleanup_deferal, end_cleanup_deferal): Test
+ block_stack before dereferencing it.
+
+Wed Aug 20 15:45:52 1997 Dave Love <d.love@dl.ac.uk>
+
+ * dwarf2.h (enum dwarf_call_frame_info): Remove trailing comma from
+ list.
+
+Wed Aug 20 15:30:36 1997 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.c (ix86_prologue, ix86_epilogue): New functions.
+ ({function,ix86_expand}_{pro,epi}logue, ix86_expand_prologue):
+ Use ix86_prologue.
+
+Wed Aug 20 14:57:11 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.h (ISSUE_RATE): Define instead of MACHINE_issue_rate.
+
+Tue Aug 19 17:10:56 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * cplus-dem.c: Add 'extern' to prepends_underscore.
+
+Tue Aug 19 15:46:30 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mips/r3900.h (SUBTARGET_CC1_SPEC): Remove some unnecessary stuff.
+ (MIPS_CPU_STRING_DEFAULT, MIPS_ISA_DEFAULT): Define.
+
+Mon Aug 18 21:49:02 1997 Jim Wilson <wilson@cygnus.com>
+
+ * reload.c (find_reloads): Add code to convert RELOAD_FOR_OPADDR_ADDR
+ reloads to RELOAD_FOR_OPERAND_ADDRESS reloads.
+
+Mon Aug 18 17:39:02 1997 Mike Meissner <meissner@cygnus.com>
+
+ * configure.in ({powerpc,rs6000}*-*-*, --with-cpu): Remove single
+ quotes around the name.
+
+Mon Aug 18 17:26:42 1997 Doug Evans <dje@cygnus.com>
+
+ * mips.md (movsi_ulw,movsi_usw,loadgp): Give unspec a mode.
+
+Mon Aug 18 11:05:17 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mips/r3900.h (TARGET_DEFAULT): Turn on MASK_MIPS3900.
+
+Sun Aug 17 14:39:18 1997 Gavin Koch (gavin@cygnus.com)
+
+ * mips/elf.h (PREFERRED_DEBUGGING_TYPE): Only set if not already set.
+ * mips.c (TARGET_{SINGLE,SOFT}_FLOAT): Make sure both aren't set.
+ (PROCESSOR_R3900): Set flag from option.
+ * mips.h: Add m3900 option.
+ ({PROCESSOR,TARGET,MASK}_R3900): Define.
+ (GENERATE_{BRANCHLIKELY,MADD,MULT3): Likewise.
+ (debugj,MASK_DEBUG_J): Delete to make room for m3900.
+ (BRANCH_LIKELY_P): Redefine to include 3900.
+ (GAS_ASM_SPEC,CC1_SPEC): Add m3900 option.
+ (RTX_COSTS): Add 3900.
+ * mips.md: Add 3900, including three op madd and mult.
+ * configure.in (mipstx39{,el}-*-elf*): New cases.
+ * mips/r3900.h: New file.
+
+Fri Aug 15 07:34:12 1997 Richard Earnshaw (rearnsha@arm.com)
+
+ * arm.md (umulsi3_highpart, smulsi3_highpart): Add extra reloading
+ alternatives.
+
+Fri Aug 15 07:34:12 1997 Torbjorn Granlund <tege@tege.pdc.kth.se>
+
+ * arm.md (umulsi3_highpart, smulsi3_highpart): New patterns.
+ * arm.c (arm_rtx_costs, case TRUNCATE): New case.
+
+Fri Aug 15 06:40:03 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * genemit.c (main): Write an include for flags.h.
+ * genoutput.c (main): Likewise.
+
+ * alpha.c (override_options): Turn off byte insns for cpu=ev4 or ev5.
+
+ * alpha.md (allocate_stack): If stupid reg allocation, add USE
+ for loop variable.
+
+ * fold-const.c (fold, compare cases): Add calls to `fold' to
+ previous change.
+
+Wed Aug 13 17:32:38 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * rtl.h ({SET,}ADDRESSOF_DECL): op 1 of ADDRESSOF is now the decl.
+ * function.c (put_var_into_stack, gen_mem_addressof,
+ put_addressof_into_stack): Adjust.
+
+ * expr.c (expand_expr, case TARGET_EXPR): Call mark_addressable
+ again for the slot after we give it RTL.
+ (expand_expr, case VAR_DECL): Lose gen_mem_addressof case.
+
+Wed Aug 13 17:29:25 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * c-lex.c (check_newline): Pass finput again to HANDLE_PRAGMA.
+
+Wed Aug 13 16:51:35 1997 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>
+
+ * reload1.c (reload_cse_simplify_operands): New function.
+ (reload_cse_no_longer_dead,reload_cse_delete_death_notes): Likewise.
+ (no_longer_dead_regs): New static variable.
+ (reload_cse_simplify_set): Now returns int.
+ Don't delete death notes on previous insns, call
+ reload_cse_no_longer_dead instead.
+ Call validate_change with nonzero value for in_group.
+ (reload_cse_noop_set_p): Don't delete death notes on previous insns,
+ call reload_cse_no_longer_dead instead.
+ (reload_cse_regs): Initialize no_longer_dead_regs and call
+ reload_cse_delete_death_notes as appropriate.
+ Call apply_change_group after calling reload_cse_simplify_set.
+ Call reload_cse_simplify_set on elements of a PARALLEL.
+ Call reload_cse_simplify_operands if reload_cse_simplify_set could
+ not simplify things.
+
+Wed Aug 13 16:18:42 1997 Douglas Rupp <rupp@gnat.com>
+
+ * vms.h (LINK_SPEC): Echo -shared, not -share, to linker.
+
+Wed Aug 13 12:51:11 1997 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
+
+ * m68k.md: Add braces to clarify nesting.
+
+Wed Aug 13 12:51:11 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * calls.c (expand_call): Use assign_temp and mark_addressable
+ instead of calling gen_mem_addressof directly.
+
+Wed Aug 13 12:40:15 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * Makefile.in (install-man): Add missing $(exeext).
+
+ * configure.in (alpha*-dec-osf*): Merge various cases;
+ split off version-specific files in new case statement.
+ Include osf2or3.h even for OSF1.2.
+
+ * alpha.c (NUM_ARGS): New macro.
+ (CURRENT_FUNCTION_ARGS_INFO): Deleted.
+ (alpha_builtin_saveregs): Use new macro.
+ (function_arg): Deleted.
+ (alpha_arg_type, alpha_arg_info_reg_val): New functions.
+ * vms.h (enum avms_arg_type, avms_arg_info): New types.
+ (CUMULATIVE_ARGS, INIT_CUMULATIVE_ARGS): Update definitions
+ to use new types.
+ (SETUP_INCOMING_VARARGS): Likewise.
+ (FUNCTION_ARG{,_PARTIAL_NREGS}, FUNCTION_ARG_ADVANCE): Likewise.
+ Only update CUM in FUNCTION_ARG_ADVANCE.
+
+Tue Aug 12 19:27:32 1997 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * integrate.c (save_for_inline_copying): Use 0, not NULL_PTR,
+ as initial value for real_label_map.
+ (copy_for_inline): Likewise.
+
+Tue Aug 12 16:15:36 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * rtl.h (BYTECODE_LABEL): Use XSTR, not XEXP.
+
+ * calls.c (expand_calls): Properly call any_pending_cleanups.
+
+Tue Aug 12 12:18:01 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * function.c (purge_addressof_1): Add force argument.
+ (purge_addressof): If there are any ASM_OPERANDS in an insn, always
+ put ADDRESSOFs into the stack.
+
+ * function.c (setjmp_protect): See through addressof.
+ (setjmp_protect_args): Likewise.
+ * calls.c (expand_call): For now, only use addressof if the type
+ doesn't promote.
+ * function.c (put_var_into_stack): Likewise.
+ * expr.c (expand_expr): Likewise.
+ * toplev.c (rest_of_compilation): Check inlineable instead of
+ DECL_INLINE.
+ * function.c (purge_addressof_1): Try recognizing the insn with
+ and without the SUBREG. If it doesn't work, just put the REG into
+ the stack.
+ (gen_mem_addressof): Set the mode of the MEM to the mode of the type.
+ (put_var_into_stack): Don't be fooled by addressof in an enclosing
+ scope.
+
+Sun Aug 10 22:19:19 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * explow.c (probe_stack_range): Add USE for test_addr if -O0.
+
+Sun Aug 10 22:15:40 1997 Jason Merrill <merrill@churchy.gnu.ai.mit.edu>
+
+ * toplev.c (rest_of_compilation): Move purge_addressof before loop.
+
+Sun Aug 10 15:25:51 1997 Jim Wilson <wilson@cygnus.com>
+
+ * toplev.c (main): In -g handling code, add code to set len.
+
+ * sdbout.c (plain_type_1, case ARRAY_TYPE): Verify that TYPE_DOMAIN
+ has integer TYPE_{MAX,MIN}_VALUE before using them.
+
+ * alpha.md (extendqihi2): Use HImode not QImode in force_reg call.
+
+Sun Aug 10 16:47:34 1997 Nick Burrett <nick.burrett@btinternet.com>
+
+ * arm/aof.h (COMMON_SECTION): New macro, define common_section.
+ (EXTRA_SECTION_FUNCTIONS): Add COMMON_SECTION.
+ (EXTRA_SECTIONS): Add in_common.
+ (ASM_OUTPUT_COMMON): Call common_section() to indicate we've
+ changed areas.
+
+Sat Aug 9 20:04:35 1997 Jim Wilson <wilson@cygnus.com>
+
+ * dwarf2out.c (gen_subprogram_die): Handle redefinition of an
+ extern inline function.
+
+Sat Aug 9 13:01:06 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/sysv4.h (*_SPEC): Add support for -mads and -myellowknife.
+ Use a common crt0.o for all embedded platforms. Use --start-group
+ and --end-group instead of -( and -) to allow better cut and pasting
+ when debugging the linker. Set default start for MVME text.
+ (TARGET_SWITCHES): Add -mads and -myellowknife.
+
+Fri Aug 8 20:12:43 1997 Per Bothner <bothner@cygnus.com>
+
+ * dwarf2out.c (gen_enumeration_type_die):
+ Make code work for a tag name, without a TYPE_STUB_DECL.
+ (gen_struct_or_union_type_die): Likewise.
+
+Fri Aug 8 18:10:40 1997 Marc Lehmann <pcg@goof.com>
+
+ * i386/go32.h (HAS_INIT_SECTION, HAVE_ATEXIT): New macros.
+
+Fri Aug 8 17:30:22 1997 H.J. Lu <hjl@gnu.ai.mit.edu>
+
+ * i386.c (output_pic_addr_const, case PLUS): Emit the constant first.
+
+Fri Aug 8 17:07:36 1997 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * m88k.c (m88k_expand_prologue): Set MEM_IN_STRUCT_P of va_list
+ template.
+
+ * reg-stack.c (compare_for_stack_reg): Swap only if the source and
+ destination are both on the regstack.
+ (subst_stack_regs_pat): Put the destination at the top of the regstack.
+
+Fri Aug 8 17:03:21 1997 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
+
+ * i386.md (pop): pop increments the stack pointer.
+ (prologue_set_stack_ptr): New pattern.
+ * i386.c (ix86_expand_prologue): Use prologue_set_stack_ptr
+ instead of subsi3.
+
+Fri Aug 8 17:00:36 1997 Paul Eggert <eggert@twinsun.com>
+
+ * gansidecl.h, halfpic.h (STDIO_PROTO): Remove.
+ * bitmap.h, c-tree.h, output.h, reload.h, rtl.h (STDIO_PROTO):
+ Replace with PROTO in include files.
+ * bc-emit.c: Include <stdio.h> before include files that formerly
+ used STDIO_PROTO.
+ * bc-optab.c, c-common.c, c-decl.c, caller-save.c, calls.c: Likewise.
+ * convex.c, i860.c, mips.c, spur.c, tahoe.c, emit-rtl.c: Likewise.
+ * explow.c, expmed.c, expr.c, genattrtab.c, halfpic.c: Likewise.
+ * jump.c, optabs.c, profile.c, recog.c, regclass.c: Likewise.
+ * rtlanal.c, sdbout.c, unroll.c: Likewise.
+ * genattrtab.c (main): Generate files that include <stdio.h>
+ before including files that formerly used STDIO_PROTO.
+ * genemit.c (main), genextract.c (main), genopinit.c (main): Likewise.
+ * genoutput.c (output_prologue), genpeep.c (main): Likewise.
+ * genrecog.c (main): Likewise.
+ * halfpic.h (PROTO): Use "gansidecl.h" to define this instead.
+ (half_pic_finish): Declare without prototype; FILE isn't defined.
+
+ * bitmap.c, c-aux-info.c, c-lex.c: Include "config.h" first.
+ * c-parse.in, c-pragma.c, 1750a.c, a29k.c, alpha.c: Likewise.
+ * arm.c, clipper.c, dsp16xx.c, elxsi.c, fx80.c, gmicro.c: Likewise.
+ * h8300.c, i370.c, i386.c, i386/winnt.c, i960.c: Likewise.
+ * m32r.c, m68k.c, m88k.c, mn10200.c, mn10300.c, ns32k.c: Likewise.
+ * pa.c, pdp11.c, pyr.c, romp.c, rs6000.c, sparc.c, vax.c: Likewise.
+ * we32k.c, cppmain.c, dbxout.c, flow.c, fold-const.c: Likewise.
+ * gcc.c, gcov.c, global.c, integrate.c, local-alloc.c: Likewise.
+ * loop.c, mips-tdump.c, mips-tfile.c, objc-act.c: Likewise.
+ * real.c, reg-stack.c, reload.c, reload1.c, reorg.c, sched.c: Likewise.
+ * stupid.c, tree.c, varasm.c, xcoffout.c: Likewise.
+
+Fri Aug 8 14:52:35 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * function.c (fixup_stack_1): Stack slots can also be relative to
+ the frame or stack pointers.
+
+Fri Aug 8 14:13:49 1997 Richard Henderson <richard@gnu.ai.mit.edu>
+
+ * dwarf2out.c (reg_loc_descriptor): Fix prototype.
+ (concat_loc_descriptor): New function.
+ (loc_descriptor): Call it.
+ (add_AT_location_description): Also elide the descriptor if both
+ halves of a CONCAT are pseudos.
+ (add_location_or_const_value_attribute): Recognize CONCAT too.
+
+Fri Aug 8 06:36:29 1997 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>
+
+ * c-common.c (if_stack{,_space,_pointer}): New static variables.
+ (c_expand_{start_cond,start_else,end_cond}): New functions.
+ * c-parse.in (compstmt_count): New static variable.
+ (compstmt_start): New rule.
+ (compstmt): Use new rule.
+ (do_stmt_start): Update compstmt_count.
+ (simple_if, stmt): Use new versions of start_cond, start_else,
+ and end_cond.
+
+Thu Aug 7 15:35:25 1997 Jim Wilson <wilson@cygnus.com>
+
+ * mips/iris6.h (TARGET_LONG64): Don't define here.
+ * mips.c (override_options): Set MASK_LONG64 for ABI_64.
+
+ * mips.c (function_prologue): Don't emit ".ent", ".frame",
+ ".mask", ".fmask" if flag_inhibit_size_directive is true.
+ (function_epilogue): Don't emit ".end" if
+ flag_inhibit_size_directive is true.
+
+ * mips/iris6.h (STARTFILE_SPEC, LIB_SPEC): Move
+ -L/usr/lib{32,64}/mips? from STARTFILE_SPEC to LIB_SPEC.
+
+Thu Aug 7 13:14:21 1997 Torbjorn Granlund <tege@tunnis.tmg.se>
+
+ * fold-const.c (fold): Optimize unsigned x <= 0x7fffffff.
+
+Thu Aug 7 12:46:31 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * explow.c (convert_memory_address, case LABEL_REF): Copy
+ LABEL_REF_NONLOCAL_P.
+
+ * expr.c (store_constructor): Use CONST0_RTX macro, not always
+ the integer version, when clearing a register.
+
+ * varasm.c (output_constructor): Correctly check for
+ multi-word constant.
+
+Thu Aug 7 10:04:42 1997 Douglas Rupp <rupp@gnat.com>
+
+ * alpha/vms-tramp.asm: New file.
+
+ * gcc.c (execute): Don't allow -pipe on VMS.
+
+ * alpha.c (vmskrunch): Don't strip off trailing digits.
+ (vms_valid_decl_attribute_p): New function.
+ * alpha/vms.h (TRAMPOLINE_TEMPLATE): Add another quadword of zeros.
+ (TRAMPOLINE_SIZE): Now 32 bytes.
+ (INITIALIZE_TRAMPOLINE): Put FNADDR at offset 16, CXT at 24.
+ (DBX_DEBUGGING_INFO, ASM_FORMAT_PRIVATE_NAME): Always undefine.
+ (STARTFILE_SPEC): Likewise.
+ (PREFERRED_DEBUGGING_TYPE): Define to be Dwarf-2.
+ (VALID_MACHINE_DECL_ATTRIBUTE, ASM_OUTPUT_SECTION{,_NAME}): New macros.
+ (ASM_OUTPUT_ALIGN{,ED_COMMON}): Redefine.
+ (LINK_SPEC): Pass -share and -v.
+ (ENDFILE_SPEC, LIBGCC2_SPEC): Don't redefine.
+
+Thu Aug 7 06:21:47 1997 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>
+
+ * Eliminate most -Wswitch warnings.
+ * c-common.c (binary_op_error): Add default case to switch.
+ (shorten_compare, truthvalue_conversion): Likewise.
+ * c-iterate.c (collect_iteratores): Likewise.
+ * c-typeck.c (comptypes, build_component_ref): Likewise.
+ (build_binary_op, lvalue_p, build_unary_op): Likewise.
+ (build_modify_expr, initializer_constant_valid_p): Likewise.
+ (c_expand_return): Likewise.
+ * calls.c (calls_function_1): Likewise.
+ * combine.c (find_split_point, simplify_rtx): Likewise.
+ (simplify_if_then_else, simplify_logical): Likewise.
+ (extract_left_shift, make_compound_operation, force_to_mode): Likewise.
+ (known_cond, nonzero_bits, num_sign_bit_copies): Likewise.
+ (merge_outer_ops, simplify_shift_const, simplify_comparison): Likewise.
+ (reversible_comparison_p, mark_used_regs_combine): Likewise.
+ * convert.c (convert_to_integer): Likewise.
+ * cse.c (canon_hash, exp_equiv_p): Likewise.
+ (set_nonvarying_address_components, canon_reg): Likewise.
+ (simplify_unary_operation, simplify_plus_minus): Likewise.
+ (simplify_relational_operation, fold_rtx): Likewise.
+ (cse_process_note, count_reg_usage): Likewise.
+ * dbxout.c (dbxout_symbol): Likewise.
+ * dwarf2out.c (lookup_cfa_1, print_die): Likewise.
+ * emit_rtl.c (copy_rtx_if_shared, reset_used_flags): Likewise.
+ * explow.c (plus_constant_wide, convert_memory_address): Likewise.
+ (promote_mode, emit_stack_save, emit_stack_restore): Likewise.
+ * expmed.c (expand_divmod, emit_store_flag): Likewise.
+ * expr.c (queued_subexp_p, is_zeros_p, safe_from_p): Likewise.
+ (bc_expand_expr, preexpand_calls, convert_move): Likewise.
+ * final.c (get_attr_length, final_scan_insn): Likewise.
+ (walk_alter_subreg, alter_cond): Likewise.
+ * flow.c (jmp_uses_reg_or_mem, mark_used_regs): Likewise.
+ * fold-const.c (operand_equal_p, twoval_comparison_p): Likewise.
+ (eval_subst, invert_truthvalue, range_binop): Likewise.
+ (make_range, fold): Likewise.
+ * function.c (fixup_var_refs_1, instantiate_virtual_regs_1): Likewise.
+ * genattrtab.c (attr_copy_rtx, make_canonical): Likewise.
+ (encode_units_mask, simplify_test_exp): Likewise.
+ (find_and_mark_used_attributes, write_test_expr): Likewise.
+ (simplify_with_current_value_aux, clear_struct_flag): Likewise.
+ (count_sub_rtxs, gen_insn walk_attr_value): Likewise.
+ (copy_rtx_unchanging): Likewise.
+ * genconfig.c (walk_insn_part): Likewise.
+ * genextract.c (walk_rtx): Likewise.
+ * genoutput.c (scan_operands): Likewise.
+ * genpeep.c (match_rtx): Likewise.
+ * genrecog.c (add_to_sequence): Likewise.
+ * integrate.c (copy_for_inline, copy_rtx_and_substitute): Likewise.
+ (subst_constants): Likewise.
+ * jump.c (duplicate_loop_exit_test, comparison_dominates_p): Likewise.
+ (mark_jump_label, rtx_renumbered_equal_p): Likewise.
+ (rtx_equal_for_thread_p): Likewise.
+ * local-alloc.c (memref_referenced_p): Likewise.
+ * loop.c (record_excess_regs, reg_in_basic_block_p): Likewise.
+ (get_condition, replace_call_address): Likewise.
+ (count_nonfixed_reads, find_and_verify_loops, find_mem_givs): Likewise.
+ (maybe_eliminate_biv_1, invariant_p, simplify_giv_expr): Likewise.
+ * optabs.c (emit_float_lib_cmp): Likewise.
+ * print-tree.c (print_node): Likewise.
+ * recog.c (validate_replace_rtx_1, find_single_use_1): Likewise.
+ * reload.c (subst_reg_equivs, find_reloads_address_1): Likewise.
+ (refers_to_regno_for_reload_p, find_equiv_reg): Likewise.
+ * reload1.c (set_label_offsets, eliminate_regs): Likewise.
+ (scan_paradoxical_subregs, count_occurrences): Likewise.
+ * rtl.c (copy_rtx, copy_most_rtx): Likewise.
+ * rtlanal.c (rtx_varies_p, rtx_addr_can_trap_p): Likewise.
+ (reg_mentioned_p, reg_referenced_p, modified_between_p): Likewise.
+ (modified_in_p, refers_to_regno_p, volatile_insn_p): Likewise.
+ (volatile_refs_p, side_effects_p): Likewise.
+ (inequality_comparison_p, replace_regs): Likewise.
+ * sched.c (sched_analyze_2): Likewise.
+ * stmt.c (expand_return): Likewise.
+ * tree.c (staticp, unsave_expr_now, contains_placeholder_p): Likewise.
+ (substitute_in_expr, build_type_attribute_variant): Likewise.
+ (simple_cst_equal): Likewise.
+ * unroll.c (remap_split_bivs): Likewise.
+ * varasm.c (const_hash, compare_constant_1): Likewise.
+ (decode_rtx_const, output_addressed_constants): Likewise.
+ (output_constant): Likewise.
+ * print-tree.c (print_node): Convert switch with one case into an if.
+ * sched.c (memrefs_conflict_p): Likewise.
+ * genrecog.c (write_tree_1): Output default case for every switch.
+
+ * profile.c (output_arc_profiler) [SMALL_REGISTER_CLASSES]:
+ Apply PATTERN only to insns.
+
+Thu Aug 7 06:13:20 1997 Robert Lipe <robertl@dgii.com>
+
+ * i386/t-sco5 (libgcc2-elf.a): Resync with Makefile.in.
+
+Wed Aug 6 19:28:05 1997 Jim Wilson <wilson@cygnus.com>
+
+ * dwarf2out.c (build_abbrev_table): Use xrealloc not xmalloc.
+
+Wed Aug 6 12:57:24 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (output_call_frame_info): Always emit the info.
+ (dwarf2out_frame_debug): We can initialize the temp reg in the
+ epilogue, too.
+
+ * rtl.def: Add ADDRESSOF.
+ * rtl.h (ADDRESSOF_TYPE, SET_ADDRESSOF_TYPE): New macros.
+ * Makefile.in (mostlyclean): Remove *.addressof.
+ * toplev.c (rest_of_compilation): Set DECL_DEFER_OUTPUT on
+ non-nested inlines. Run purge_addressof after CSE.
+ (various): Add .addressof RTL dump file.
+ * rtl.c (copy_rtx): No need to copy ADDRESSOF.
+ * reload1.c (eliminate_regs): Elide ADDRESSOF.
+ * recog.c (general_operand): (MEM (ADDRESSOF ())) is a valid operand.
+ So is (ADDRESSOF ()).
+ (memory_address_p): (ADDRESSOF ()) is a valid memory address.
+ * integrate.c (expand_inline_function): If the structure_value_addr
+ is an ADDRESSOF, we can use it as a constant.
+ (copy_rtx_and_substitute): Copy a '0' operand over unchanged.
+ * function.c (fixup_var_refs_1): Remove (ADDRESSOF (MEM ())).
+ (gen_mem_addressof): New fn.
+ (put_addressof_into_stack): New fn.
+ (purge_addressof_1): New fn.
+ (purge_addressof): New fn.
+ (instantiate_decl): Don't bother looking into an ADDRESSOF.
+ (put_var_into_stack): Call gen_mem_addressof for local REGs instead
+ of calling put_reg_into_stack.
+ * expr.c (expand_expr, case TARGET_EXPR): Put the temp in a register
+ if it will fit.
+ (expand_expr, case ADDR_EXPR): Call gen_mem_addressof to take the
+ address of a REG.
+ * explow.c (memory_address): An ADDRESSOF is a valid memory address.
+ * dwarfout.c (location_or_const_value_attribute): Handle ADDRESSOF.
+ * dwarf2out.c (add_location_or_const_value_attribute): Handle
+ ADDRESSOF.
+ * cse.c (FIXED_BASE_PLUS_P): Add ADDRESSOF.
+ (NONZERO_BASE_PLUS_P): Add ADDRESSOF.
+ (canon_hash): Ignore '0' operands.
+ (find_best_addr): Don't try to replace an ADDRESSOF.
+ (fold_rtx): If our address has a const equiv of an ADDRESSOF, use it.
+ * calls.c (expand_call): Put the struct value in a register if
+ it fits.
+
+Tue Aug 5 16:10:45 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * mips.c (function_arg): Handle passing a struct
+ containing a double in a DFmode register without the PARALLEL.
+
+Tue Aug 5 12:27:31 1997 Doug Evans <dje@cygnus.com>
+
+ * configure.in (sparc-*-solaris2): Set float_format to i128.
+ * config/float-i128.h: New file.
+
+Mon Aug 4 17:45:19 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * combine.c (try_combine): If have PARALLEL of independent SETs
+ and have cc0, ensure insn using CC0 come first.
+
+Mon Aug 4 15:22:41 1997 Mike Meissner <meissner@cygnus.com>
+
+ * rs6000/sysv4.h (JUMP_TABLES_IN_TEXT_SECTION): Undef for System V
+ environments.
+
+Mon Aug 4 12:34:41 1997 Philip Blundell <pb@nexus.co.uk>
+
+ * configure.in (arm-*-aout): Set tmake_file correctly.
+
+Mon Aug 4 08:06:48 1997 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
+
+ * reload.c (find_reloads_address_1): Don't pass VOIDmode for an
+ integer argument of push_reload.
+
+ * rtlanal.c (may_trap_p): Fix unintended fall-through so divisions by
+ non-zero constants are handled properly. Return 1 for FP divisions.
+
+Mon Aug 4 06:52:20 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * c-common.c (check_format_info): Store each flag character only
+ once in the flag_chars array.
+
+Sun Aug 3 21:57:31 1997 Jim Meyering <meyering@eng.ascend.com>
+
+ * objc/Make-lang.in (objc/*.o): Depend on $(GCC_PASSES).
+
+Sun Aug 3 21:54:51 1997 Nick Burrett <n.a.burrett@btinternet.com>
+
+ * cpplib.c (cpp_start_read): Recognise suffixes 'cp' and 'c++'.
+
+Sun Aug 3 19:18:27 1997 Ralf Baechle <ralf@uni-koblenz.de>
+
+ * Makefile.in (mostlyclean): Remove libgcc1-test.
+
+Sun Aug 3 19:10:27 1997 Klaus Espenlaub <kespenla@hydra.informatik.uni-ulm.de>
+
+ * Makefile.in (T): Move to place where it can be overridden.
+ (install_common): Fix permissions of specs and EXTRA_PARTS files.
+
+Sun Aug 3 19:07:04 1997 Jan-Jaap van der Heijden <J.J.vanderHeijden@student.utwente.nl>
+
+ * gcc.c (default_compilers): Add default entries for Pascal.
+
+Sun Aug 3 18:38:41 1997 Richard Henderson <rth@cygnus.com>
+
+ * alpha.c (alpha_return_addr): New function.
+ (output_epilog): Zero alpha_return_addr_rtx.
+ * alpha.h (RETURN_ADDR_RTX): Call alpha_return_addr.
+
+Sun Aug 3 17:27:44 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * Makefile.in (INSTALL): Build in $(srcdir).
+
+ * config/linux.h (DEFAULT_VTABLE_THUNKS): New macro.
+
+Sun Aug 3 17:18:31 1997 Richard Earnshaw (rearnshaw@cambridge.arm.com)
+
+ * expr.c (expand_builtin, case BUILT_IN_RETURN_ADDRESS): Emit warning
+ if return address cannot be determined.
+
+Sun Aug 3 17:04:00 1997 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
+
+ * stupid.c (stupid_life_analysis): If function receives non-local
+ goto, don't let any registers live across calls.
+
+ * fold-const.c (merge_ranges): Make sure that if one range is subset
+ of another, it will always be the second range. Correct (+,-) case to
+ account for this.
+
+Sun Aug 3 16:48:30 1997 Paul Eggert <eggert@twinsun.com>
+
+ * c-lex.c (yylex): Remove duplicate check on high bit before
+ invoking int_fits_type_p.
+
+Sun Aug 3 16:44:41 1997 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
+
+ * reload.c (find_equiv_reg): If goal is a pseudo that got memory, a
+ store into memory makes it invalid. This was handled in the single
+ set case, but missing in the PARALLEL case.
+
+Sun Aug 3 09:13:47 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expr.c (store_field): Return quickly if EXP is ERROR_MARK.
+
+ * c-typeck.c (unary_complex_lvalue): Don't warn about COMPOUND_EXPR
+ or COND_EXPR if FUNCTION_TYPE.
+
+ * alpha.h (ASM_SPEC): Add -O0.
+
+ * expr.h (clear_storage): Now returns rtx.
+ (emit_block_move): Likewise; delete duplicate declaration.
+ * expr.c (clear_storage, emit_block_move): Return address of
+ dest if calling memset/memcpy.
+ (expand_builtin, BUILT_IN_MEM{CPY,SET}): Return value from
+ clear_storage or emit_block_move if present.
+
+ * c-decl.c (start_function): Reset immediate_size_expand on
+ error return.
+
+Sat Aug 2 18:50:43 1997 Paul Eggert <eggert@twinsun.com>
+
+ * tree.c (int_fits_type_p): Negative ints never fit unsigned
+ types, and unsigned ints with top-bit-set never fit signed types.
+
+Sat Aug 2 16:25:43 1997 Per Bothner <bothner@frobnitz.gnu.ai.mit.edu>
+
+ * Makefile.in (EXTRA_C_OBJS): Removed.
+ (C_AND_OBJC_OBJS): New. Subsumes EXTRA_C_OBJS and OBJC_CCOMMON.
+ * objc/Make-lang.in (OBJC_CCOMMON): Removed.
+
+Sat Aug 2 16:11:57 1997 Doug Evans <dje@cygnus.com>
+
+ * configure.in: Build .gdbinit for top level build dir here.
+ (AC_OUTPUT): Pass oldstyle_subdirs to configure.lang.
+ * configure.lang: Fix building of .gdbinit for oldstyle lang subdirs.
+
+Sat Aug 2 13:48:15 1997 Ken Raeburn <raeburn@cygnus.com>
+
+ * cse.c (cse_insn): Ignore paradoxical SUBREGs unless we are
+ looking for such.
+
+Sat Aug 2 13:25:33 1997 Tristan Gingold (gingold@email.enst.fr)
+
+ * calls.c (expand_call): If -fcheck-memory-usage, use pseudo-register,
+ check indirectly called function is executable, and set rights of
+ memory for aggregate as write only.
+ (store_one_arg): If -fcheck-memory-usage, set rights for pushed
+ stack argument.
+ * c-decl.c (init_decl_processing): Add
+ __builtin_aggregate_incoming_address.
+ * explow.c (expr_size): Call expand_expr with appropriate flag.
+ * expr.c (expand_builtin, case BUILT_IN_AGGREGATE_INCOMING_ADDRESS):
+ New case.
+ (expand_assignment, expand_expr, emit_push_insn, store_expr):
+ Insert calls to chkr_check_addr, chkr_set_right, and chkr_copy_bitmap
+ when -fcheck-memory-usage.
+ (get_push_address, get_memory_usage_from_modifier): New functions.
+ * expr.h: Add expand_modifier flags.
+ (chkr_*_libfunc): New decls.
+ (memory_use_mode): New declaration.
+ * flags.h (flag_check_memory_usage, flag_prefix_function_name): New
+ declaration.
+ * function.c (put_var_into_stack, assign_parms): If
+ -fcheck-memory-usage, set the rights of pushed variable.
+ * optabs.c (chkr_{check_addr,set_right}_libfunc): New definitions.
+ (chkr_{copy_bitmap,check_exec}_libfunc): Likewise.
+ (init_optabs): Initialize these chkr_*_libfunc.
+ * stmt.c (expand_computed_goto): If -fcheck-memory-usage, check that
+ computed address of a goto is executable.
+ (expand_asm, expand_asm_operands): If -fcheck-memory-usage,
+ disallow asm statements.
+ * toplev.c (flag_check_memory_usage, flag_prefix_function_name): New
+ variable.
+ (f_options): Add `check-memory-usage' and `prefix_function_name'.
+ (main): Disable `-fomit-frame-pointer' if `-fcheck-memory-usage' is set
+ and the machine can't debug without the frame pointer.
+ * tree.h (built_in_function): Add BUILT_IN_AGGREGATE_INCOMING_ADDRESS.
+ * varasm.c (make_function_rtl, make_decl_rtl): Add a prefix when
+ flag_prefix_function_name_usage is set.
+ (assemble_name): Strip the CHKR_PREFIX.
+ * alpha.c (alpha_builtin_saveregs): If -fcheck-memory-usage,
+ set rights of saved registers.
+ * clipper.c (clipper_builtin_saveregs): Likewise.
+ * m88k.c (m88k_builtin_saveregs): Likewise.
+ * pa.c (hppa_builtin_saveregs): Likewise.
+ * sparc.c (sparc_builtin_saveregs): Likewise.
+
+Sat Aug 2 08:01:12 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * c-decl.c (grokdeclarator): Give error for `long double' and
+ refine text of some error messages.
+
+ * alpha.h (FLOAT_VALUE_TYPE, INTIFY, FLOATIFY, FLOAT_ARG_TYPE): Define.
+ * i860.h (FLOAT_VALUE_TYPE): Fix typo; was FLOAT_TYPE_VALLUE.
+
+ * calls.c (store_one_arg): Allow stack_slot to be SP in
+ ARGS_GROW_DOWNWARD case.
+
+ * c-decl.c (parmlist_tags_warning): Only suppress warning on
+ union if anonymous.
+
+ * libgcc2.c (_trampoline): Rework last change; both getpagesize
+ and mprotect are in cygwin32.
+
+ * reload1.c (reload): Add IN_ADDR to IN_ADDR_ADDR when computing
+ needs since they conflict.
+
+ * print-rtl.c (indent): Move to file level; was static in print_rtx.
+ (print_inline_rtx): New function.
+ * reload.c (debug_reload): Rework to make output more compact.
+
+ * dwarfout.c (output_compile_unit_die): Add support for Pascal.
+ * dwarf2out.c (gen_compile_unit_die): Likewise.
+
+ * c-typeck.c (lvalue_p, case BIND_EXPR, RTL_EXPR): Return 1 if array.
+
+ * Makefile.in (OBJC_OBJC): Delete from here.
+
+ * varasm.c (compare_constant_1, case STRING_CST): Compare TYPE_MODE.
+ (record_constant_1, case STRING_CST): Record TYPE_MODE.
+
+ * tree.c (contains_this_placeholder_p): Delete.
+ (contains_placeholder_p): Now contains code from above function.
+ (contains_placeholder_p, case 'r'): Don't look at offset info.
+ * expr.c (expand_expr, case PLACEHOLDER_EXPR): Find innermost
+ matching and don't check contains_placeholder_p.
+
+Fri Aug 1 17:15:07 1997 Per Bothner <bothner@cygnus.com>
+
+ * objc/objc-act.c (lang_init): Don't check_newline #if USE_CPPLIB.
+ * c-lex.c (lang_init): Remove (recently moved here).
+ * c-lang.c (lang_init): Restore, but add #if !USE_CPPLIB.
+
+Fri Aug 1 11:26:45 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (pa_reorg): Explode ADDR_DIFF_VEC insns too.
+
+Thu Jul 31 19:37:22 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * libgcc2.c (getpagesize): Don't compile if __CYGWIN32__.
+
+Thu Jul 31 16:04:42 1997 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.c (output_to_reg, output_fix_trunc): Use scratch memory,
+ if available, instead of dynamically extending the stack.
+ (put_condition_code, print_operand): Added reverse_cc to reverse the
+ comparison when $ah is accessed directly instead of using eflags
+
+ * i386.md (*trunc*): Use scratch memory for output_fix_trunc.
+ (movsicc_1, movhicc_1) Change alternative 3 to:
+ jCC L1; mov; jmp L2; L1:mov; L2:
+ (movsfcc, movdfcc, movxfcc): Force constant operands to memory.
+ (movsfcc_1, movdfcc_1, movxfcc_1): Change alternative 3 as above.
+
+Thu Jul 31 16:04:42 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * i386.h (MAX_FIXED_MODE_SIZE): Define.
+
+Thu Jul 31 16:04:42 1997 Robert Lipe <robertl@dgii.com>
+
+ * i386/sco5.h (SWITCHES_NEED_SPACES) Define.
+ Required by the COFF (but not ELF) linker.
+
+Wed Jul 30 15:03:52 1997 Per Bothner <bothner@cygnus.com>
+
+ * demangle.h (DMGL_JAVA): New option to request Java demangling.
+ * cplus-dem.c: Various changes to produce Java output when passed
+ DMGL_JAVA. Thus "::" becomes "." and "JArray<Foo>" becomes "Foo[]".
+ (main): Support --java and -j flags to set DMGL_JAVA.
+
+Wed Jul 30 08:56:08 1997 Philip Blundell <Philip.Blundell@pobox.com>
+
+ * configure.in (arm-*-*): Replace with arm-*-aout.
+ * arm/aout.h (SET_ASM_OP): Define by default.
+ * arm/riscix.h (SET_ASM_OP: Undefine.
+ * arm.h (CPP_SPEC): Add %(subtarget_cpp_spec).
+ (SUBTARGET_CPP_SPEC): New macro.
+ * arm/linux.h: Include aout.h rather than arm.h directly.
+ (TARGET_CPU_DEFAULT): Define.
+ ({ASM,CPP}_SPEC): Remove.
+ * arm/t-linux (MULTILIB_OPTIONS): Use -mapcs-NN instead of -mN.
+ (LIB1ASMSRC): Use generic ARM version.
+ (CROSS_LIBGCC1): Define.
+ * arm/lib1funcs-linux.asm: Remove.
+
+Tue Jul 29 17:57:47 1997 Per Bothner <bothner@cygnus.com>
+
+ * Add hooks for using autconf-style Makefile.in in language subdirs.
+ * configure.in (all_outputs, oldstyle_subdirs): New variables.
+ Pass all_outputs to AC_OUTPUT.
+ * configure.lang: Only iterate over oldstyle_subdirs.
+
+ * Patches to use cpplib with cc1 #if USE_CPPLIB.
+ * configure.in (--enable-c-cpplib): New option.
+ (extra_c_flags, extra_c_objs): New variables.
+ * Makefile.in (EXTRA_C_OBJS): New variable.
+ (INTERNAL_CFLAGS): Add @extra_c_flags@.
+ (C_OBJS): Add $(EXTRA_C_OBJS).
+ * c-lex.c (generally): Replace getc and ungetc by macros GETC and
+ UNGETC. Avoid explicit references to finput.
+ (yy_get_token): New function, that calls cpp_get_token.
+ (init_parse): New function - calls init_lex.
+ (finish_parse): New function (called by compile_file).
+ (GET_DIRECTIVE_LINE): New macro wrapper replaces get_directive_line.
+ (lang_init): Don't check_newline - already know main_input_filename.
+ (handle_sysv_pragma): Remove FILE* parameter.
+ * toplev.c (finput): Remove #if USE_CPPLIB.
+ (compile_file): #if USE_CPPLIB don't open input file here,
+ do it in cpp_start_read. Call init_parse instead of init_lex.
+ At end, call finish_parse instead of fclose(finput).
+
+Mon Jul 28 15:48:29 1997 Brendan Kehoe <brendan@cygnus.com>
+
+ * integrate.c (expand_inline_function): Use xmalloc instead of
+ alloca for the LABEL_MAP.
+ (save_for_inline_copying): Likewise.
+
+Mon Jul 28 11:22:16 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * toplev.c (compile_file): Also emit any deferred TREE_PUBLIC inlines.
+ (rest_of_compilation): Use decl_printable_name instead of DECL_NAME
+ to identify functions in the RTL dump files.
+
+ * dwarf2out.c (add_location_or_const_value_attribute):
+ leaf_renumber_regs_insn. Also eliminate_regs here.
+ (add_AT_location_description): Not here. Don't emit anything
+ for a variable that has been optimized away.
+ (add_const_value_attribute): Likewise.
+
+ * dwarfout.c (location_or_const_value_attribute):
+ leaf_renumber_regs_insn. Also eliminate_regs here.
+ (location_attribute): Not here.
+
+ * stor-layout.c (layout_type): Fix ancient code to match ancient
+ comment. Use mode of field for one-field structs.
+
+Sun Jul 27 12:09:02 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * function.c (put_var_into_stack, trampoline_address): Treat
+ inline_function_decl like current_function_decl.
+ * expr.c (expand_expr, case LABEL_DECL): Likewise.
+ (expand_expr, case SAVE_EXPR): Handle top-level SAVE_EXPR by
+ moving into current function; abort if in incorrect context.
+ * fold-const.c (fold_range_test, fold): Avoid making SAVE_EXPR
+ if at top level.
+
+ * dwarfout.c (ASM_OUTPUT_SOURCE_FILENAME): Delete default value.
+
+ * alpha.h (TARGET_SWITCHES): Add -mno-byte.
+
+ * expr.c (get_inner_unaligned_p): Deleted.
+ (expand_assignment): Remove special-case of constant array.
+ (expand_expr, case ARRAY_REF): Likewise, and clean up remaining code.
+
+ * explow.c (probe_stack_range): Do probing with loop if more
+ than a small number.
+
+Fri Jul 25 15:42:34 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * configure.in: Finish fixing calculation if default thread
+ support is enabled.
+
+Fri Jul 25 15:30:09 1997 Doug Evans <dje@cygnus.com>
+
+ * Makefile.in (native): Depend on config.h.
+ (gcc.o): Depend on Makefile, not config.status.
+
+Fri Jul 25 10:56:50 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (pa_reorg): If TARGET_BIG_SWITCH, then do not explode
+ ADDR_VEC insns. Slightly rework code which explodes ADDR_VEC
+ insns.
+ * pa.h (TARGET_BIG_SWITCH): Define.
+ (TARGET_SWITCHES): Add "big-switch" and "no-big-switch".
+ (CASE_VECTOR_MODE): Use TI or DI depending on TARGET_BIG_SWITCH.
+ (CASE_DROPS_THROUGH): Remove definition.
+ (ASM_OUTPUT_ADDR_VEC_ELT): Rewrite to handle TARGET_BIG_SWITCH.
+ (ASM_OUTPUT_ADDR_DIFF_ELT): Likewise.
+ * pa.md (casesi): Rework to avoid some potential long branch
+ problems (also makes generated code faster!). Handle
+ TARGET_BIG_SWITCH.
+ (casesi0): Corresponding changes.
+
+Fri Jul 25 08:36:47 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * calls.c: (expand_call): If -fstack-check and temp needed
+ for arg is too large, use alloca.
+ * expr.c (expand_expr, case MODIFY_EXPR): Don't preexpand calls
+ if LHS is an indirect via a constant pointer.
+
+Thu Jul 24 21:49:11 1997 Pat Rankin <rankin@eql.caltech.edu>
+
+ * bitmap.c (bitmap_operation): Reset CURRENT on deferred deletion.
+
+Wed Jul 23 23:52:14 1997 Chris Smith <csmith@convex.hp.com>
+
+ * convex.h (CHECK_FLOAT_VALUE): Fix OVERFLOW capitalization.
+
+Wed Jul 23 13:00:47 1997 Richard Earnshaw <rearnsha@cambridge.arm.com>
+
+ * configure.in (arm-*-netbsd*): Fix typo setting tmake_file.
+
+Wed Jul 23 06:39:35 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * configure.in (alpha*): Put quotes around MASK_GAS.
+
+Tue Jul 22 15:24:45 1997 Brendan Kehoe <brendan@cygnus.com>
+
+ * tree.c (array_type_nelts): Make sure the domain of TYPE is set
+ before we try to use it.
+
+Tue Jul 22 12:26:13 1997 Doug Evans <dje@cygnus.com>
+
+ * sparc.c (gen_v9_scc): Handle early clobber of result.
+ * sparc.md (seqdi_special): Don't clobber %xcc.
+ (snedi_special, seqdi_special_trunc, snedi_special_trunc): Likewise.
+ (snedi_zero, neg_snedi_zero, seqdi_zero, neg_seqdi_zero): Likewise.
+ (snedi_zero_trunc, seqdi_zero_trunc): Likewise. Renamed from ..._sp64.
+ (snedi_zero_trunc_sp32, seqdi_zero_trunc_sp32): Delete.
+
+ * Makefile.in (Makefile): Pass xmake_file, tmake_file to
+ configure.frag
+ (distclean): Delete Make-host, Make-target.
+ * configure.in (host_overrides): Set to Make-host.
+ (dep_host_xmakefile): Loop over all elements in host_make_file.
+ (target_overrides): Set to Make-target.
+ (dep_tmake_file): Loop over all elements in tmake_file.
+ (configure.frag): Pass dep_host_xmake_file, dep_tmake_file.
+ * configure.frag: New arguments xmake_files, tmake_files.
+ Build Make-host, Make-target.
+
+Mon Jul 21 23:17:44 1997 Paul Eggert <eggert@twinsun.com>
+
+ * objc/Make-lang.in, objc/Makefile.in: Comment out lines containing
+ just formfeeds.
+
+Mon Jul 21 14:05:46 1997 Doug Evans <dje@cygnus.com>
+
+ * Makefile.in (Makefile): Depend on config.status instead
+ of configure.
+ (config.status): Depend on configure. Run config.status --recheck
+ if out of date.
+ (cstamp-h.in): Use echo instead of touch.
+
+ * reload1.c (reload_cse_mem_conflict_p): Restore handling of
+ (mem:BLK const0_rtx) meaning all memory is clobbered.
+
+Mon Jul 21 06:20:10 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m68k.md (iorsi_zexthi_ashl16): Mark output operand as earlyclobber.
+
+Sun Jul 20 06:11:30 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * configure.in (alpha*-*-*): Set cpu_type to alpha.
+ Change "alpha-" to "alpha*-" in all entries.
+ Set target_cpu_default for ev5 and ev56 systems.
+ Use symbolic names for target_cpu_default.
+ * alpha.c (override_options): Set default for alpha_cpu
+ from TARGET_CPU_DEFAULT.
+ * alpha.h (MASK_CPU_EV5): New macro.
+
+ * tree.c (contains_placeholder_p): Call contains_this_placeholder_p.
+ (contains_this_placeholder_p): Renamed from contains_placeholder_p.
+ Added new arg, PL.
+ Rework to make more consistent, check more codes, and avoid
+ undefined fields.
+ * expr.c (expand_expr, case PLACEHOLDER_EXPR): Pick outermost
+ object in placeholder_list of right type without a PLACEHOLDER_EXPR.
+
+Sat Jul 19 18:00:01 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alpha.c (override_options): Allow processor of ev56 or 21164a.
+ (input_operand, case MEM): Correct test involving TARGET_BYTE_OPS.
+ * alpha.h (SECONDARY_{IN,OUT}PUT_RELOAD_CLASS): Don't need for
+ QImode or HImode if TARGET_BYTE_OPS.
+ (ASM_FILE_START): Write a .arch directive.
+ (STACK_CHECK_BUILTIN): New macro.
+ * alpha.md ({zero_,}extend[qh]i[dsh]i2): Rework TARGET_BYTE_OPS cases.
+ (mov[hq]i): Likewise.
+ (extend[qh]i[hsd]i2x): Add missing cases and fix typo in constraint.
+ (reload_{in,out}[qh]i): Disable for TARGET_BYTE_OPS.
+
+Fri Jul 18 23:24:57 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * varasm.c (make_decl_rtl): Don't use ASM_FORMAT_PRIVATE_NAME for
+ local decls with TREE_PUBLIC set.
+ (bc_make_decl_rtl): Likewise.
+
+Fri Jul 18 22:16:28 1997 Doug Evans <dje@cygnus.com>
+
+ * configure.in: Invoke AC_CONFIG_HEADER.
+ Check for string.h, strings.h, stdlib.h, time.h, unistd.h.
+ Check for whether malloc/realloc/free need to be declared.
+ (links): Rename config.h to config2.h.
+ (AC_OUTPUT): Create cstamp-h.
+ * Makefile.in (config.in,cstamp-h.in): Add rules for.
+ (config.h,cstamp-h): Add rules for.
+ (distclean): Delete config2.h, cstamp-h.
+ (ALL_CFLAGS): Add @DEFS@.
+ * aclocal.m4, acconfig.h: New files.
+
+ * Makefile.in (distclean): Delete Make-host, Make-target.
+ * configure.in (host_overrides): Set to host_xmake_file, don't create
+ Make-host.
+ (target_overrides): Set to tmake_file, don't create Make-target.
+ (language subdir support): Keep together.
+
+ * c-decl.c (duplicate_decls): Set DECL_ABSTRACT_ORIGIN to olddecl
+ if inline function and not new definition.
+
+ * configure.in: Don't loop trying to configure language subdirs.
+ Don't pass to configure.lang variables it doesn't use.
+ * configure.lang: Delete top level directory from loop.
+ Delete code not useful for language subdirs.
+
+Fri Jul 18 08:12:53 1997 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>
+
+ * toplev.c (rest_of_compilation): Call reload_cse_regs here.
+ * reload1.c (reload): Don't call it here.
+ (reload_cse_mem_conflict_p): Remove MEM_OFFSET and MEM_MODE args.
+ (reload_cse_mem_conflict_p, case MEM): Call anti_dependence.
+ (reload_cse_invalidate_mem): Update call to reload_cse_mem_conflict_p.
+ (reload_cse_regs): No longer static.
+ Call init_alias_analysis.
+ Ignore CLOBBER in a PARALLEL.
+
+Fri Jul 18 06:44:22 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * objc/Make-lang.in (objc-headers): Fix command for the new build
+ directory layout, don't pass srcdir variable.
+ * objc/Makefile.in (copy-headers): Use $(srcdir) from this
+ makefile, not the parent's.
+
+Thu Jul 17 16:03:03 1997 Doug Evans <dje@cygnus.com>
+
+ * configure.lang (EXTRA_HEADERS,EXTRA_PASSES,EXTRA_PARTS): Delete.
+ (EXTRA_PROGRAMS,EXTRA_OBJS,EXTRA_GCC_OBJS,MD_DEPS): Delete.
+ (version) Delete duplicate entry.
+ * configure.in (merged_frags): Delete unused variable.
+ (extra_headers_list): Move setting outside of subdir loop.
+ (extra_headers,extra_passes): Don't pass to configure.lang.
+ (extra_programs,extra_parts,extra_objs): Likewise.
+ (host_extra_gcc_objs,gxx_include_dir,md_cppflags): Likewise.
+
+Thu Jul 17 07:00:43 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expr.h (STACK_CHECK_*): Provide default values.
+ (probe_stack_range): New declaration.
+ * flags.h (flag_stack_check): Likewise.
+ * explow.c (allocate_dynamic_stack_space): Call probe_stack_range.
+ (emit_stack_probe, probe_stack_range): New functions.
+ * function.c (expand_function_end): If function is non-leaf and stack
+ checking is requested, emit needed probes.
+ * reload1.c (reload): If checking stack, verify frame small enough.
+ * stmt.c (expand_decl): If stack checking, use alloca for large vars.
+ * toplev.c (flag_stack_check): New variable.
+ (f_options): Add "stack-check".
+
+ * reorg.c (mark_target_live_regs): Pass FIRST_PSEUDO_REGISTER to
+ call to EXECUTE_IF_SET_IN_REG_SET.
+
+Wed Jul 16 14:51:00 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * i960.h (ASM_OUTPUT_ALIGNED_BSS): Define.
+ (ASM_OUTPUT_ALIGNED_LOCAL): Use standard method to convert ALIGN
+ to power-of-two of bytes.
+
+ * sparc.h (ASM_OUTPUT_ALIGNED_BSS): Define.
+ * sparc/sysv4.h (ASM_OUTPUT_ALIGNED_BSS): Undef before definition.
+
+Wed Jul 16 14:34:09 1997 Klaus Espenlaub (kespenla@hydra.informatik.uni-ulm.de)
+
+ * calls.c (emit_library_call_value): Initialize all argvec elements.
+
+Wed Jul 16 14:31:39 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * global.c (global_conflicts): Pass FIRST_PSEUDO_REGISTER to
+ call to EXECUTE_IF_SET_IN_REG_SET.
+
+Wed Jul 16 10:57:03 1997 Richard Earnshaw (rearnsha@cambridge.arm.com)
+
+ * From Rob Black (r.black@ic.ac.uk) and Mark Brinicombe
+ (amb@physig.ph.kcl.ac.uk):
+ * configure.in (arm-*-netbsd*): New configuration.
+ * arm/netbsd.h, arm/t-netbsd, arm/xm-netbsd.h: New files.
+
+Wed Jul 16 10:57:03 1997 Richard Earnshaw (rearnsha@cambridge.arm.com)
+
+ * arm.c (tune_flags): New variable.
+ (target_{cpu,fpe}_name): Delete.
+ (arm_fpu_arch): New variable.
+ (arm_select): Also allow -march=... to configure just the
+ architecture.
+ (all_procs): Allow armv{2,2a,3,3m,4,4t} for use with -march=.
+ (arm_override_options): Handle -march=, but don't let -mcpu=
+ and -mtune= match the architecture names, since we can only
+ tune for an implementation. Rework selection of tuning options
+ for floating point.
+ (use_return_insn): Support interworking with Thumb code.
+ (arm_rtx_costs): Rework multiply costs so that cost is based on
+ the tune, not the architecture.
+ (f_register_operand): New function.
+ (output_return_instruction): Support interworking with Thumb code.
+ (output_func_epilogue): Support interworking with Thumb code.
+ Remove redundant calculation of code_size. Use floating-point
+ load-multiples if permitted.
+ (emit_sfm): New function.
+ (arm_expand_prologue): Use floating-point store-multiples if
+ permitted.
+
+ * arm.h (CPP_CPU_ARCH_SPEC): Handle -march=...
+ (TARGET_OPTIONS): Add arch= and fp=. Delete fpe=.
+ (enum processor_type): Add PROCESSOR_NONE, for use in all_procs table.
+ (FP_DEFAULT): Default floating point architecture for generic
+ back-end.
+ (PREDICATE_CODES): Add f_register_operand.
+
+ * arm.md (*push_fp_multi): New pattern.
+
+
+Tue Jul 15 22:08:47 1997 Jim Wilson <wilson@cygnus.com>
+
+ * Makefile.in (exeext): Set to build_exeext not exeext.
+ * configure.in (exeext): Delete redundant set and AC_SUBST call.
+ Change remaining AC_SUBST to use build_exeext instead of exeext.
+
+Tue Jul 15 15:48:25 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * configure.in: Fix calculation if default thread support is enabled.
+
+Tue Jul 15 13:38:46 1997 Mike Meissner <meissner@cygnus.com>
+
+ * rtl.h (replace_regs): Declare.
+
+Mon Jul 14 16:18:19 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * i960.h (ASM_OUTPUT_MI_THUNK): Define.
+
+ * dwarf2out.c (gen_subprogram_die): Remove unreachable and redundant
+ code.
+
+Mon Jul 14 14:22:45 1997 Jeffrey A Law (law@cygnus.com)
+
+ * calls.c (emit_library_call): Use right index into argvec array
+ when iterating over arguments which need to be pushed on the stack.
+ (emit_library_call_value): Likewise.
+
+Mon Jul 14 08:17:41 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * gcc.c (convert_filename): Fix typo.
+
+Mon Jul 14 08:10:12 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * configure.in: Clear headers and lib2funcs before re-reading
+ config-lang.in.
+
+ * m68k/linux.h (LINK_SPEC): Fix last change.
+
+Mon Jul 14 08:03:38 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * configure.in (sparc-*-linux-gnu{*,libc1*}): Add sparc/t-linux.
+ * sparc/t-linux: New file.
+
+ * alpha/elf.h (LINK_SPEC): Fix typo.
+ * configure.in (alpha-*-linux-gnu*): Set tmake_file.
+ * alpha/t-linux: New file.
+
+Mon Jul 14 07:41:37 1997 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * m68k.c (output_{and,ior,xor}si3): New functions from patterns bodies.
+ * m68k.h (output_{and,ior,xor}si3): New extern declarations.
+ * m68k.md (adddi3, subdi3): Allow constant operand.
+ (anddi3, iordi3, xordi3): New patterns.
+ ({and,ior,xor}si3_internal): Use corresponding output_???si3 function.
+
+Mon Jul 14 07:33:11 1997 Fila Kolodny <fila@ibi.com>
+
+ * configure.in (*-*-gnu*): Add crt{begin,end}S.o to extra_parts.
+
+Mon Jul 14 07:26:36 1997 Craig Burley <burley@gnu.ai.mit.edu>
+
+ * varasm.c (assemble_variable): If low part of size
+ doesn't fit in an int, variable is too large.
+
+Mon Jul 14 06:51:37 1997 Mike Meissner <meissner@cygnus.com>
+
+ * bitmap.{h,c}: New files.
+ * Makefile.in (OBJS): Add bitmap.o.
+ (BASIC_BLOCK_H): New make variable for basic-block.h, bitmap.h.
+ ({flow,combine,regclass,local-alloc,reload1,reorg,sched}.o): Use
+ BASIC_BLOCK_H variable instead of basic-block.h.
+ * basic-block.h (*REG_SET): Delete old implementation; use bitmap.h.
+ (regset_{size,bytes}): Delete.
+ (regs_live_at_setjmp): Declare.
+ (EXECUTE_IF_SET_AND_RESET_IN_REG_SET): Delete.
+ * flow.c (init_regset_vector): Make global; don't take basic block
+ times # of pseduos as argument.
+ (life_analysis): Change all init_regset_vector calls.
+ Use free_regset_vector to release arrays only flow uses at end.
+ (allocate_for_life_analysis): Change init_regset_vector call.
+ Don't set regset_{size,bytes}.
+ (free_regset_vector): Call FREE_REG_SET to release any
+ memory allocated by each vector.
+ (propagate_block): Call FREE_REG_SET on dead/live.
+ (mark_used_regs): Don't use REGSET_ELT_TYPE anymore.
+ * output.h (allocate_for_life_analysis): Add declaration.
+ (regno_uninitialized, regno_clobbered_at_setjmp): Likewise.
+ (dump_flow_info, flow_analysis): Likewise.
+ * regclass.c (init_reg_sets): Invoke INIT_ONCE_REG_SET.
+ (allocate_reg_info): Invoke MAX_REGNO_REG_SET.
+ (regset_release_memory): Free basic_block_live_at_start storage.
+ * reorg.c (mark_target_live_regs): Delete unused variables.
+ * sched.c (schedule_block): Free space associated with
+ reg_pending_sets and old_live_regs.
+ (schedule_insns): Free bb_{dead,live}_regs on first pass.
+ (sched_analyze_insn): Use EXECUTE_IF_SET_IN_REG_SET and then clear.
+ * toplev.c (rest_of_compilation): Call regset_release_memory.
+
+Mon Jul 14 00:14:13 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * toplev.c (main): Prefer DWARF 2 or stabs with -ggdb.
+ * ns32k/tek6000.h (PREFERRED_DEBUGGING_TYPE): DBX_DEBUG.
+ * alpha.h (PREFERRED_DEBUGGING_TYPE): SDB_DEBUG.
+ * mips.h (PREFERRED_DEBUGGING_TYPE): SDB_DEBUG.
+
+Sun Jul 13 15:11:08 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * stupid.c (stupid_mark_refs): If setting reg set only in this
+ insn and not referenced, make REG_UNUSED note.
+
+Sun Jul 13 14:03:19 1997 Michael Meissner <meissner@cygnus.com>
+
+ * gcc.c (process_command): If -save-temps and -pipe were specified
+ together, don't do -pipe.
+
+Sun Jul 13 12:27:03 1997 Doug Evans <dje@cygnus.com>
+
+ * gcc.c (main): Handle blank in version_string when comparing
+ with compiler_version.
+
+Sat Jul 12 01:53:55 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * sparc.c (output_function_prologue): Fix offset from CFA.
+ (sparc_flat_output_function_prologue): Likewise.
+
+Fri Jul 11 09:49:15 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mips.c (epilogue_reg_mentioned_p): Delete unused function.
+ (mips_epilogue_delay_slots): Likewise.
+ (function_epilogue): Greatly simplify.
+ (mips_expand_epilogue): If we have a null prologue/epilogue,
+ then use a normal return insn. Emit blockage insns before
+ stack pointer adjustments.
+ (mips_can_use_return_insn): Renamed from simple_epilogue_p. All
+ callers changed. Do not use return insns if $31 is live in the
+ function or if generating profiling information.
+ * mips.h (DELAY_SLOTS_FOR_EPILOGUE): Delete.
+ (ELIGIBLE_FOR_EPILOGUE_DELAY): Likewise.
+ * mips.md (return): Remove expander and change the pattern to
+ look like a standard "return" insn.
+ (return_internal): Show use of $31 explictly.
+ (epilogue expander): Enable.
+
+Thu Jul 10 13:04:53 1997 Doug Evans <dje@cygnus.com>
+
+ * cccp.c (INO_T_EQ): Return 0 for MSDOS.
+
+ * Makefile.in (CC): Use autoconf value.
+
+Tue Jul 8 18:08:00 1997 Jim Wilson <wilson@cygnus.com>
+
+ * dwarf2out.c (gen_subprogram_die): When handling declarations, test
+ DECL_CONTEXT not decl_class_context before equate_decl_number_to_die.
+
+Tue Jul 8 16:47:13 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.md (movsi define_split): Use unsigned HOST_WIDE_INT,
+ not unsigned.
+
+Sat Jul 7 00:01:41 1997 Jim Meyering <meyering@eng.ascend.com>
+
+ * i386/t-sol2 (crt[1in].o): Also depend on $(GCC_PASSES).
+
+Fri Jul 4 11:45:39 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (DWARF_CIE_HEADER_SIZE, DWARF_FDE_HEADER_SIZE,
+ size_of_cfi, size_of_fde, calc_fde_sizes, next_fde_offset,
+ cie_size): Lose.
+ (ASM_OUTPUT_DWARF_STRING): Move earlier.
+ (INCOMING_FRAME_SP_OFFSET): Provide default.
+ (initial_return_save): Adjust for CFA offset.
+ (dwarf2out_frame_debug): Lookup initial CFA offset when setting up.
+ (output_call_frame_info): Use label subtraction for length fields.
+ Add pointer to exception region information in for_eh case.
+ (dwarf2out_do_frame): New fn.
+ (dwarf2out_frame_init): Use INCOMING_FRAME_SP_OFFSET.
+ (dwarf2out_frame_finish): Don't bother emitting .debug_frame for
+ non-Irix targets. Just emit .eh_frame.
+ (output_die): Refer to an FDE with label subtraction.
+ * i386.h (INCOMING_FRAME_SP_OFFSET): Define.
+ * defaults.h (DWARF2_UNWIND_INFO): Define if
+ INCOMING_RETURN_ADDR_RTX is provided.
+ * final.c (final): Don't call dwarf2out_frame_debug unless we are
+ doing dwarf 2.
+
+Thu Jul 3 17:37:52 1997 Jim Wilson <wilson@cygnus.com>
+
+ * fp-bit.c (unpack_d): Check fraction not sign to distinquish QNaN.
+
+Wed Jul 2 09:48:03 1997 Michael Meissner <meissner@cygnus.com>
+
+ * loop.c (strength_reduce): Make sure register does not exceed the
+ table size when looking up the last UID.
+
+Wed Jul 2 07:47:44 1997 Nick Burrett <n.a.burrett@btinternet.com>
+
+ * genoutput.c (process_template): Place increment expression
+ outside of putchar function call.
+
+Wed Jul 2 06:56:52 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * sparc/linux.h (LIBGCC_SPEC): Removed.
+ (CC1_SPEC): Add %{profile:-p}.
+ ({CPP,LIB,LINK}_SPEC): Choose glibc 1 or 2 depending on USE_GNULIBC_1.
+ * configure.in (sparc-*-linux-gnulibc1*): New configuration.
+
+ * configure.in (powerpc-*-linuxgnu*): Default thread_file is posix.
+ Set xmake_file to x-linux. Add extra_parts.
+ * rs6000/linux.h (LINK_SPEC): Defined.
+
+ * m68k/linux.h (LINK_SPEC): Pass -shared for -shared.
+ ({CPP,LINK}_SPEC): Choose for glibc 1 or 2 depending on USE_GNULIBC_1.
+ * configure.in (m68k-*-linux-gnu*): Default thread_file is `posix'.
+ (m68k-*-linux-gnulibc1): New configuration.
+
+ * alpha/elf.h (LINK_SPEC): Change ld-gnu.so.1 to ld-linux.so.2.
+ * configure.in (alpha-*-linux-gnu*): Default thread_file is `posix'.
+
+Wed Jul 2 06:12:37 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alpha.md (divsi3, modsi3, udivsi3): Comment out.
+ (extendsfsd2_no_tp): Add alternative with output in MEM, input in REG.
+
+ * configure.in (*-linux*): Add "-gnu" to names to match.
+
+ * libgcc2.c (_trampoline): Add stdcall attribute to VirtualProtect
+ on i386.
+
+ * objc/objc.gperf: Renamed from gperf.
+
+Wed Jul 2 05:42:19 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * objc/Make-lang.in ($(srcdir)/objc/objc-parse.c): Fix command
+ to use the right file names.
+
+Tue Jul 1 23:25:42 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * reorg.c (redundant_insn): If INSN or possible match has REG_UNUSED
+ note, don't have match.
+
+Tue Jul 1 18:36:24 1997 Doug Evans <dje@cygnus.com>
+
+ * mips.c (mips_output_external): Don't output .extern's for
+ variables in user specified sections unless they're .sbss/.sdata.
+
+Tue Jul 1 18:30:26 1997 Jim Wilson <wilson@cygnus.com>
+
+ * cse.c (find_best_addr): Add missing rtx_cost arguments.
+
+ * fp-bit.c (float_to_usi): Move code for negative numbers before code
+ for infinity. Modify infinty code to only handle positive infinities.
+
+Tue Jul 1 11:16:41 1997 Robert Lipe <robertl@dgii.com>
+
+ * fixinc.sco: Restore pwd after copy.
+ Convert declaration of abs in math.h to prototype.
+ Fix static functions in sys/stat.h for C++.
+
+Tue Jul 1 10:55:47 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.md ({add,ior,xor}si3): Change to use define_expand wrapper
+ and split add/ior/xor of large constants early.
+ (andsi3): Remove 6/29 code to do and of large constants.
+ (nor, nand, eqv, maskir): Add names to all logical define_insns.
+
+Tue Jul 1 09:03:35 1997 Jeffrey A Law (law@cygnus.com)
+
+ * h8300.h (BIGGEST_FIELD_ALIGNMENT): Remove definition.
+ * mips.h (BIGGEST_FIELD_ALIGNMENT): Likewise.
+
+Mon Jun 30 14:58:00 1997 Jeffrey A Law (law@cygnus.com)
+
+ * sh.c (sh_expand_epilogue): Emit blockage insn before cutting
+ back stack.
+
+Sun Jun 29 11:27:07 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.h (TARGET_FLAGS): Add -m{,no-}update to suppress
+ creating load/store with update instructions, and also
+ -m{,no-}fused-madd to suppress the generation of fused add and
+ multiply instructions. Move debug flags to TARGET_OPTIONS.
+ (GO_IF_LEGITIMATE_ADDRESS): Don't allow PRE_{INC,DEC} if -mno-update.
+ (GO_IF_MODE_DEPENDENT_ADDRESS): Ditto.
+ (rs6000_debug_{name,stack,arg}): Add declarations.
+ (toc_initialized): Likewise.
+ (got_no_const_operand): Likewise.
+ (PREDICATE_CODES): Add got_no_const_operand.
+ (toc_section): Make toc_initialized a global.
+ (RTX_COSTS): Set appropriate costs for add, logical operators that
+ are really two instructions.
+
+ * rs6000.c (rs6000_debug_{name,stack,arg}): Add definitions.
+ (rs6000_override_options): Process debug flags.
+ (toc_initialized): Global to say toc initialized.
+ (small_data_operand): Use #if TARGET_ELF, not #ifdef TARGET_SDATA.
+ (rs6000_init_expanders): Likewise.
+ (SMALL_DATA_RELOC): Likewise.
+ (got_no_const_operand): Recognize SYMBOL_REF and LABEL_REF.
+ (rs6000_makes_calls): System V profiling doesn't count as a call.
+ (rs6000_stack_info): Likewise.
+ (rs6000_output_load_toc_table): Take register number argument to
+ determine register to load. Generate correct code if more than
+ one toc table is done in System V due to profiling or non-local
+ gotos. If System V toc is not initialized, initialize it now.
+ (rs6000_allocate_stack_space): Move code from output_prolog to
+ allocate stack space. Take -mno-update into account.
+ (output_prolog): Call rs6000_allocate_stack_space. Only set
+ rs6000_pic_func_labelno if not profiling.
+ (output_function_profiler): Implement System V profiling.
+ (and_operand): Don't call reg_or_short_operand.
+ (rs6000_finalize_pic): If not optimizing, insert a USE of the GOT
+ register as the last insn.
+
+ * rs6000.md (load/store update): Take -mno-update into account.
+ If -msoft-float, support SF load/store with update to GPR regs.
+ (allocate_stack): Take -mno-update into account.
+ (add/subtract + multiply instructions): Take -mno-fused-madd into
+ account.
+ (nonlocal_goto_receiver): Specify register # to load.
+ ({add,and,ior,xor}si3): Recognize operation done with full 32 bit
+ constant, splitting latter if need be.
+ (andsi3 define_split): Fix up splitting andsi3 of large constant.
+ ({ior,xor}si3 define_split): Use GEN_INT to create integer rtx
+ values.
+ (movsi_got{,_internal}): Split the load of a CONST into load of
+ the SYMBOL_REF/LABEL_REF and an add.
+ (movsi): Know that addsi3 can handle large values now for NT.
+
+ * sysv4.h (TARGET_SDATA): Remove explicit bit for -msdata.
+ (SUBTARGET_OVERRIDE_OPTIONS): Likewise.
+ (ASM_OUTPUT_ALIGNED_LOCAL): Likewise.
+ (SUBTARGET_SWITCHES): Indicate -m{,no-}sdata doesn't set any flags.
+ (ASM_SPEC): Only pass -m{,no-}reg-names if assembling .s/.S files.
+ (CC1_SPEC): If -msdata, invoke compiler with -msdata=default.
+ (PROFILE_BEFORE_PROLOGUE): Likewise.
+ (RS6000_MCOUNT): Define as "_mcount".
+ (toc_section): Make toc_initialized a global.
+
+Fri Jun 27 19:01:11 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * config/t-linux-gnulibc1: New file.
+ * configure.in (i[3456]86-*-linux*): Default thread_file is `posix'.
+ (i[3456]86-*-linux*gnulibc1): New case.
+ * config/linux.h (LIB_SPEC): Choose for glibc 1 or 2 depending
+ on USE_GNULIBC_1.
+ * i386/linux.h (CPP_SPEC, LINK_SPEC): Likewise.
+
+Fri Jun 27 19:00:52 1997 Ralf Baechle <ralf@waldorf-gmbh.de>
+
+ * config/linux.h (PREFERRED_DEBUGGING_TYPE): Undefine before define.
+
+Fri Jun 27 18:35:04 1997 Alan Modra <alan@spri.levels.unisa.edu.au>
+
+ * configure.in: Clean up Make-{host,target,hooks} in all
+ subdirs, not just '.'.
+ * Makefile.in (distclean): Delete */Make-{host,target,lang,hooks}.
+
+Fri Jun 27 18:27:11 1997 Fila Kolodny <fila@ibi.com>
+
+ * config/xm-gnu.h (fcntl.h): Only include if not building libgcc.a.
+
+Fri Jun 27 18:17:44 1997 Doug Evans <dje@cygnus.com>
+
+ * configure.frag: Rewrite.
+
+ * objc/Make-lang.in (OBJC_CCOMMON): Object files don't go in srcdir.
+ (OBJC_OBJS): Likewise.
+ (OBJC_O): Likewise.
+ (objc-parse.o, objc-act.o): Fix rules.
+ (objc/libobjc files): Fix rules.
+
+Fri Jun 27 13:23:38 1997 Andrew Cagney <cagney@tpgi.com.au>
+
+ * fp-bit.c (float_to_si): Correct return value when Inf.
+
+Fri Jun 27 10:47:09 1997 Scott Christley <scottc@net-community.com>
+
+ * Makefile.in (DLLTOOL): Define.
+ * objc/Make-lang.in (libobjc_entry.o, libobjc_s.a, libobjc.dll):
+ New targets.
+ (objc.install-normal): Install Objective-C runtime as a DLL.
+ (objc.mostlyclean): Clean up files used to build DLL.
+ * objc/libobjc.def: New file.
+ * objc/libobjc_entry.c: New file.
+
+ * objc/sendmsg.c (search_for_method_in_list): No longer static.
+
+ * Makefile.in (GCC_THREAD_FILE): Renamed from OBJC_THREAD_FILE.
+ * configure.lang (GCC_THREAD_FILE): Likewise.
+ * configure.in (--enable-threads): New parameter.
+ * objc/Make-lang.in (OBJC_THREAD_FILE): New definition.e
+ * objc/config-lang.in: Print message about ObjC thread file.
+
+ * cccp.c (INO_T_EQ): Define for Win32 but not Cygwin32.
+ * i386/mingw32.h: New file.
+ * i386/xm-mingw32.h: New file.
+ * configure.in (i[3456]86-*-mingw32): New target.
+ * protoize.c (link): Eliminate definition on Win32.
+
+ * objc/thr-posix.c (__objc_thread_yield): Use sched_yield instead.
+
+Fri Jun 27 10:36:41 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * stor-layout.c (layout_record, PCC_BITFIELD_TYPE_MATTERS):
+ Round up when calculating possible end address.
+
+Wed Jun 25 19:54:29 1997 Jim Wilson <wilson@cygnus.com>
+
+ * unroll.c (final_giv_value): Verify that bl->initial_value is
+ invariant before trying to use it.
+
+Wed Jun 25 18:13:05 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/sysv4.h (WCHAR_TYPE{,_SIZE}): Make wchar_t long as per
+ ABI spec.
+
+Wed Jun 25 16:56:16 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * sparc.h (INCOMING_RETURN_ADDR_RTX): Define.
+ (DBX_REGISTER_NUMBER): Fix frame pointer regno for -mflat.
+ * sol2.h (DBX_REGISTER_NUMBER): Likewise.
+ * sparc.c (save_regs): Emit dwarf2 frame debug info.
+ (output_function_prologue, sparc_flat_save_restore,
+ sparc_flat_output_function_prologue): Likewise.
+
+ * dwarf2.h (enum dwarf_call_frame_info): Add DW_CFA_GNU_window_save.
+ * dwarf2out.c (dwarf_cfi_name, output_cfi): Support it.
+ (dwarf2out_cfi_label): Make non-static.
+ (initial_return_save): Support PLUS.
+ (dwarf2out_window_save, dwarf2out_return_save,
+ dwarf2out_return_reg): New fns.
+
+ * dwarf2out.c (SECTION_FORMAT): Use PUSHSECTION_FORMAT, if defined.
+ (DEBUG_INFO_SECTION): Rename from DEBUG_SECTION.
+ (DEBUG_LINE_SECTION): Rename from LINE_SECTION.
+ * mips/iris6.h: Likewise.
+
+Wed Jun 25 16:25:41 1997 Scott Christley <scottc@net-community.com>
+
+ * Makefile.in (GCC_PASSES): Don't define with $(exeext).
+ * configure.in ({cc,stage_prefix}_set_by_configure): Eliminate extra
+ comma and don't pass value to configure.lang.
+ * objc/Make-lang.in (objc-runtime): Add objc-headers.
+
+ * configure.in: Execute configure.frag in a shell.
+
+ * configure.in (cross_overrides, build_overrides): Default to
+ /dev/null to help platforms where sed cannot handle empty filenames.
+
+ * Reorganize thread implementation to make a clearly defined
+ front-end/back-end interface.
+ * objc/thr-{decosf1,irix,mach,os2,posix,pthreads,single}.c: Completely
+ rework according to new interface.
+ * objc/thr-{solaris,win32}.c: Likewise.
+ * objc/thr.c: Likewise.
+ * objc/thr.h: Define front-end/back-end interface functions and
+ structures.
+
+Wed Jun 25 16:14:10 1997 Ovidiu Predescu <ovidiu@net-community.com>
+
+ * Complete implementation of +load.
+ * objc/init.c (objc_send_load): New function.
+ (objc_class_tree): New structure.
+ (create_tree_of_subclasses_inherited_from): New function.
+ (__objc_tree_insert_class): New function.
+ (objc_tree_insert_class): New function.
+ (objc_preorder_traverse): New function.
+ (objc_postorder_traverse): New function.
+ (__objc_tree_print): New function.
+ (__objc_destroy_class_tree_node): New function.
+ (class_is_subclass_of_class): New function.
+ (__objc_exec_class): Allocate class tree list and load hash table.
+ (__objc_send_message_in_list): Rewrite using hash table.
+ (__objc_send_load): Remove calls to _objc_load_callback.
+ (objc_send_load): Make static. Create Tree of classes resembling
+ class hierarchy for all modules. Call __objc_send_load on all of
+ the modules in __objc_module_list.
+ (__objc_create_classes_tree): New function.
+
+ * objc/encoding.h (method_get_sizeof_arguments): Fix typo.
+ * objc/objc-api.h (OBJC_ERR_BAD_STATE): New error code.
+ On NeXT redefine object_copy and object_dispose to avoid
+ a conflict with those defined in system library.
+ * objc/selector.c (__objc_register_instance_methods_to_class): New
+ function.
+ * objc/runtime.h: Likewise. Add missing function prototypes.
+
+Wed Jun 25 15:09:01 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * Makefile.in (Makefile): Execute configure.frag from srcdir.
+
+ * Makefile.in (configure): Target is $(srcdir)/configure.
+
+Tue Jun 24 15:18:14 1997 Jim Wilson <wilson@cygnus.com>
+
+ * m68k.h (LIMIT_RELOAD_CLASS): Define.
+
+ * recog.c (constrain_operands): When checking earlyclobbers, use
+ operands_match_p instead of rtx_equal_p.
+
+ * dwarfout.c (field_byte_offset): Check for object_offset_in_bits
+ greater than bitpos_int and recompute object_offset_in_bytes if true.
+
+ * mips.md (movdi_internal): Add x/J alternative.
+ (movdi_internal2): Add x/J alternative; change a/I to a/J.
+ (movsi_internal1, movsi_internal2): Change x/I alternative to x/J.
+
+Tue Jun 24 08:49:56 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.h (ASM_OUTPUT_SECTION_NAME): Fix typo.
+
+Mon Jun 23 22:48:00 1997 Jim Wilson <wilson@cygnus.com>
+
+ * unroll.c (find_splittable_givs): Set splittable_regs_updates to
+ biv_count for reduced givs.
+
+Mon Jun 23 10:51:53 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10200.c, mn10200.h, mn10200.md: New files for mn10200 port.
+ * lib1funcs.asm, divmod.c, udivmod.c, udivmodsi4.c: Likewise.
+ * t-mn10200, xm-mn10200.h, va-mn10200.h: Likewise.
+ * Makefile.in (USER_H): Add va-mn10200.h.
+ * varargs.h, stdarg.h: Include va-mn10200.h.
+ * configure.in (mn10200-*-*): New target.
+
+Sun Jun 22 06:47:19 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * combine.c (force_to_mode): Don't do anything for ASM_OPERANDS insn.
+
+Sun Jun 22 06:29:28 1997 J. Kean Johnston <jkj@sco.com>
+
+ * ginclude/stdarg.h: Protect va_list definition from SCO headers.
+ * ginclude/varargs.h: Likewise.
+
+Sat Jun 21 20:56:23 1997 Scott Christley <scottc@net-community.com>
+
+ * Make ObjC a front-end language.
+ * Makefile.in (LANGUAGES, COMPILERS, .PHONY, stmp-int-hdrs): Remove
+ specific references to ObjC compiler and source files.
+ ({mostly,dist,maintainer,}clean, install-normal): Likewise
+ (OBJC_OBJS, OBJC, OBJECTIVE-C, cc1obj, objc-runtime): Rules deleted.
+ (libobjc.a, sublibobjc.a, objc-parse.{o, c, y}): Rules deleted.
+ (objc-headers, install-libobjc): Rules deleted.
+ * objc/Make-lang.in: New file; from rules deleted above.
+ * objc/config-lang.in: New file.
+ * objc/Makefile.in: Changes to support ObjC as a front-end language;
+ renamed from Makefile.in.
+ * objc-act.{c,h}, objc-parse.{c,y}, objc-tree.def: Moved to objc dir.
+
+Sat Jun 21 07:54:36 1997 Robert Lipe <robertl@dgii.com>
+
+ * fixinc.sco (math.h): Correct the collision of "exception".
+
+Sat Jun 21 06:51:40 1997 Peter Gerwinski <peter@agnes.dida.physik.uni-essen.de>
+
+ * rs6000.c (output_epilog): Name is "GNU Pascal", not all caps.
+
+Sat Jun 21 06:29:19 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * gcc.c (main): Check for and read ${libdir}/gcc-lib/specs to
+ override the default specs.
+
+Fri Jun 20 17:20:15 1997 Jim Wilson <wilson@cygnus.com>
+
+ * mips.c (output_block_move): When loading addresses into registers,
+ add checks for ABI_N32 and ABI_64.
+ (mips_expand_prologue): Add check for SImode in code splitting
+ tsize_rtx when it is large_int.
+
+Fri Jun 20 09:07:31 1997 Russell King <rmk92@ecs.soton.ac.uk>
+
+ * configure.in (arm-*-linuxaout): New target.
+ * arm/lib1funcs-linux.asm, arm/linux-gas.h: New files.
+ * arm/linux.h, arm/t-linux, arm/xm-linux.h: New file.
+ * xm-linux.h: Undef some macros before defining them.
+
+Thu Jun 19 21:18:20 1997 Jim Wilson <wilson@cygnus.com>
+
+ * dwarf2out.c (output_line_info): Always use DW_LNE_set_address instead
+ of DW_LNS_fixed_advance_pc for line number addresses.
+ (size_of_line_info): Adjust size calculation as per above change.
+ (text_end_label): Make it static.
+
+Thu Jun 19 14:55:49 1997 Brendan Kehoe <brendan@cygnus.com>
+
+ * toplev.c (xmalloc): Only give the fatal msg if SIZE is non-zero.
+
+Sun Apr 27 23:19:13 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * libgcc2.c (__eh_type): Remove `extern' to make this a definition.
+
+Wed Jun 18 18:10:16 1997 Per Bothner <bothner@cygnus.com>
+
+ * dbxout.c (dbxout_type_fields): Skip field if DECL_IGNORED_P.
+
+Wed Jun 18 18:04:33 1997 Mike Stump <mrs@cygnus.com>
+
+ * except.c (end_eh_unwinder): If we have a return instruction, we
+ have to make sure we use it and don't fall off the end of the
+ function in the unwinder.
+
+Wed Jun 18 14:27:58 1997 Mike Stump <mrs@cygnus.com>
+
+ * flow.c (find_basic_blocks): Fix end case bug.
+
+Tue Jun 17 18:35:57 1997 Mike Stump <mrs@cygnus.com>
+
+ * libgcc2.c (__eh_pcnthrow): Add support -fno-sjlj-exceptions
+ -fPIC exception handling on the SPARC.
+ * sparc.h (DONT_ACCESS_GBLS_AFTER_EPILOGUE): Likewise.
+ * libgcc2.c (__eh_ffetmnpc): Remove.
+
+Mon Jun 16 20:28:51 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * collect2.c (extract_string): Null-terminate.
+
+Mon Jun 16 14:38:44 1997 Michael Meissner <meissner@cygnus.com>
+
+ * combine.c (set_nonzero_bits_and_sign_copies): Use REG_SET macros
+ instead of doing bit operations directly.
+ (try_combine,reg_dead_at_p): Ditto.
+ * caller-save.c (save_call_clobbered_regs): Ditto.
+ * reload1.c (reload): Ditto.
+ * local-alloc.c (update_equiv_regs,block_alloc): Ditto.
+ * sched.c (schedule_block): Dito.
+
+Sun Jun 15 20:46:12 1997 Jim Wilson <wilson@cygnus.com>
+
+ * dwarf2out.c (dwarf2out_frame_debug): Handle IOR.
+ (struct limbo_die_struct): Define.
+ (TYPE_DECL_IS_STUB): Call decl_ultimate_origin if DECL_ABTRACT_ORIGIN
+ is set.
+ (limbo_die_count): Delete.
+ (libmo_die_list): Define.
+ (new_die): Add die to limbo_die_list instead of incrementing
+ limbo_die_count.
+ (add_AT_location_description): Renamed from add_location_attribute.
+ New parameter attr_kind.
+ (add_location_or_const_value_attribute, gen_subprogram_die,
+ add_bound_info): Change call to add_AT_location_description.
+ (add_bound_info): Add call to contains_placeholder_p. Ignore
+ MAX_EXPR and VAR_DECL.
+ (add_subscript_info): Ignore the index type if it is an unnamed
+ integral type.
+ (scope_die_for): Move check for function-local tags after code setting
+ containing_scope, and add check for non-NULL containing_scope
+ (add_type_attribute): If unnamed type, use TREE_TYPE instead.
+ (gen_enumeration_type_die, gen_struct_or_union_type_die): Call
+ add_child_die if die_parent is NULL.
+ (gen_subprogram_die): Ifdef out DW_AT_static_link code.
+ (decls_for_scope): Delete decrement of limbo_die_count.
+ (dwarf2out_finish): Add code to traverse the limbo_die_list, and
+ call add_child_die if die_parent is NULL. Delete limbo_die_count code.
+ * mips.c (mips_expand_prologue): If tsize_rtx is large_int, emit two
+ insns instead of one splitable insn, setting RTX_FRAME_RELATED_P.
+
+Fri Jun 13 19:33:35 1997 Brendan Kehoe <brendan@cygnus.com>
+
+ * fixincludes: Also fix AIX NULL macro in sys/{dir,param,types}.h.
+
+Thu Jun 12 22:53:12 1997 Jim Wilson <wilson@cygnus.com>
+
+ * m68k.md (mov[qhs]i): Remove pair of constraints which allow
+ offsetable memory addresses to be moved to the same for TARGET_5200.
+
+Thu Jun 12 15:33:01 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.h (SELECT_RTX_SECTION): Place symbolic operands into the
+ data section.
+
+ * pa.c (emit_move_sequence): Rewrite code to handle arithmetic
+ involving plabels.
+
+Wed Jun 11 08:57:14 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * tree.c (unsave_expr_now): Avoid recursing into the parts of
+ the tree that are RTL.
+
+Thu Jun 12 09:43:55 1997 Jeffrey A Law (law@cygnus.com)
+
+ * reorg.c (emit_delay_sequence): Call set_new_first_and_last_insn
+ after the new sequence insn has been spliced into the insn chain.
+
+Wed Jun 11 23:10:49 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.md (call, call_value): Use "call" instead of "calls"
+ for calls to named functions.
+
+Wed Jun 11 00:22:34 1997 Jim Wilson <wilson@cygnus.com>
+
+ * configure, configure.in: Restore changes from Feb 15 to Apr 13
+ lost during conversion to autoconf.
+
+Tue Jun 10 18:23:35 1997 Mike Stump <mrs@cygnus.com>
+
+ * stmt.c (expand_decl_cleanup): Avoid core dumping when exceptions
+ aren't on.
+
+Tue Jun 10 18:22:30 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * collect2.c (extract_string): New fn.
+ (main): Use it.
+
+Tue Jun 10 17:40:15 1997 Jim Wilson <wilson@cygnus.com>
+
+ * expr.c (emit_group_load): Add case using gen_lowpart.
+
+Tue Jun 10 17:14:58 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.c (rs6000_override_options): If -mcpu=403, set -mstrict-align.
+
+ * rs6000/t-ppc{,gas} (MULTILIB_EXTRA_OPTS): Build libraries with
+ -mstrict-align.
+
+ * configure.in ({powerpc,rs6000}*-*-*): Add embedded targets to
+ --with-cpu=n support.
+
+Tue Jun 10 07:06:12 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * flow.c (mark_used_regs): Fix typo in Jun 4 change.
+
+Mon Jun 9 20:26:26 1997 Jim Wilson <wilson@cygnus.com>
+
+ * Makefile.in (MAYBE_USE_COLLECT2): Renamed from MAYBE_USE_COLLECT.
+
+Mon Jun 9 19:42:21 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * fold-const.c (fold): Don't do COND_EXPR -> MIN_EXPR folding if it
+ loses information that might be needed by a later use as an lvalue.
+
+Mon Jun 9 19:10:50 1997 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * configure.in: Don't override a user's setting for prefix
+ on platforms that use the native prefix.
+
+Mon Jun 9 19:00:49 1997 Brendan Kehoe <brendan@melange.gnu.ai.mit.edu>
+
+ * integrate.c (expand_inline_function): Use the mode of FNDECL's
+ result rtl, not the result type itself, in setting ARRIVING_MODE.
+
+ * reload1.c (reload): Use xmalloc instead of alloca for the label
+ offsets in OFFSETS_AT and OFFSETS_KNOWN_AT.
+
+Mon Jun 9 15:16:52 1997 Mike Stump <mrs@cygnus.com>
+
+ * flow.c (find_basic_blocks): Eliminate more dead code, enables
+ dead throws to be eliminated.
+
+Mon Jun 9 17:15:50 1997 Stephen L Moshier <moshier@world.std.com>
+
+ * alpha.c (check_float_value): Underflow and overflow constants
+ are different for FLOAT_VAX and default targets.
+
+Mon Jun 9 16:48:21 1997 Scott Christley <scottc@net-community.com>
+
+ * Makefile.in (Makefile): Process language fragments.
+ * configure.frag: New file.
+ * configure.in: Move language fragment processing to configure.lang.e
+
+ * Makefile.in (GCC_PASSES): Prevent all compilers from being
+ built when only the C compiler is needed.
+
+ * configure.in (cross_overrides, build_overrides): Use absolute
+ path to GCC top-level source directory.
+
+ * configure.in: Save target alias for language directories.
+
+ * configure.in (with-gxx-include-dir): New parameter for
+ setting the g++ header file directory.
+ * Makefile.in (gxx_include_dir): Use autoconf variable.
+
+ * configure.in: Add parameter for setting local prefix.
+
+ * configure.lang: New file.
+ * configure.in: Move language subdirectory Makefile processing
+ into configure.lang.
+
+Mon Jun 9 16:44:47 1997 Jim Wilson <wilson@cygnus.com>
+
+ * sched.c (attach_deaths): Fix typo in Jun 4 change.
+
+Mon Jun 9 15:13:00 1997 Marc Lehmann (pcg@goof.com)
+
+ * varasm.c (assemble_end_function): Switch back to function
+ section after outputting constant pool.
+
+Mon Jun 9 14:47:22 1997 Paul Eggert <eggert@twinsun.com>
+
+ * tree.c (change_main_variant): Remove unused function.
+ (build_array_type): Remove obsolete references to
+ change_main_variant.
+ * c-decl.c (complete_array_type): Likewise.
+
+ * c-common.c (c_build_type_variant): Don't futz with main type
+ variant of array since C Standard requires main type variant of
+ array-of-const also be array-of-const.
+
+ * Makefile.in: Comment out lines containing just formfeeds.
+
+ * Makefile.in (distclean): Remove config.bak.
+ (maintainer-clean): Output warning.
+ Do not remove `configure'.
+
+Mon Jun 9 14:44:17 1997 J.T. Conklin <jtc@netbsd.org>
+
+ * configure.in (*-*-netbsd): Restore changes of Apr 13th lost in
+ autoconf conversion: tmake_file now t-netbsd; delete xmake_file.
+
+Mon Jun 9 14:39:29 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expr.c (expand_builtin, case BUILT_IN_FRAME_ADDRESS):
+ Use correct function name in error message.
+
+ * Makefile.in (diff): Exclude bi-parser.h.
+
+ * i386.h (CC1_CPU_SPEC): Renamed, was CC1_SPEC.
+ (CC1_SPEC): New macro.
+ (EXTRA_SPECS): Add "cc1_cpu".
+ * i386/linux.h (CC1_SPEC): New macro.
+
+Mon Jun 9 13:23:06 1997 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * m68k/next.h (TARGET_DEFAULT): Use MASK_68040,
+ not MASK_68040_ALSO.
+ * m68k/mot3300.h, m68k/ccur-GAS.h (TARGET_DEFAULT): Likewise.
+
+ * m68k.h (MACHINE_STATE_{SAVE,RESTORE}): Test #ifdef __mcf52000__,
+ not if (TARGET_52000); fixed for mc68000 case.
+
+ * m68k/mot3300.h (CPP_SPEC): Define __mc68020__ if no -m[c]68000
+ command-line option given.
+
+Mon Jun 9 09:19:17 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * Makefile.in (target_alias): Substitute with target_alias.
+
+ * final.c (final_scan_insn): Use single_set to check cc_status.flags.
+
+Mon Jun 9 09:09:07 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * c-common.c (check_format_info): Correct handling of the 'a' flag
+ which adds another pointer level.
+
+Sun Jun 8 00:34:25 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.md (conditional branch insns): Get length right for branches
+ to targets which can not be reached with a "bl" instruction.
+ * pa.c (output_cbranch): Handle branches to targets which can not
+ be reached with a "bl" instruction.
+
+ * pa.md (alternate dbra pattern): Remove incorrect pattern.
+
+Sat Jun 7 23:30:25 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (struct defer_plab): Renamed to struct deferred_plabel.
+ Remove "symbol" field and replace with "name" field.
+ (output_function_epilogue): Don't output deferred plabels here.
+ (output_deferred_labels): New function. Output them here instead.
+ (output_call): Rewrite long call support.
+ * pa.h (ASM_FILE_END): Define.
+ (LEGITIMATE_CONSTANT_P): Never accept a function_label_operand.
+ * pa.md (HIGH and LO_SUM of function address): Remove patterns.
+
+Fri Jun 6 16:09:04 1997 Mike Stump <mrs@cygnus.com>
+
+ * libgcc2.c (__eh_ffetmnpc): Add support for machines that cannot
+ access globals after throw's epilogue when -fno-sjlj-exceptions is
+ used.
+ * rs6000.c (DONT_ACCESS_GBLS_AFTER_EPILOGUE): Likewise.
+ * mips.h (DONT_ACCESS_GBLS_AFTER_EPILOGUE): Likewise.
+ (INITIAL_ELIMINATION_OFFSET): Fix RETURN_ADDRESS_POINTER_REGNUM
+ for 64 bit words, with 32 bit pointers and variable endianness.
+
+Fri Jun 6 17:27:58 1997 Mike Meissner <meissner@cygnus.com>
+
+ * regclass.c (allocate_reg_info): Fix off by one error.
+
+Fri Jun 6 17:17:41 1997 Doug Evans <dje@cygnus.com>
+
+ * basic-block.h (EXECUTE_IF_SET_IN_REG_SET): Fix setting of scan_rs_.
+ (EXECUTE_IF_SET_AND_RESET_IN_REG_SET): Likewise.
+ (EXECUTE_IF_AND_IN_REG_SET): Likewise.
+ (EXECUTE_IF_AND_COMPL_IN_REG_SET): Likewise.
+
+Fri Jun 6 15:42:59 1997 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.c (notice_cc_update): Set CC_FCOMI is this is a float compare.
+
+Fri Jun 6 15:12:38 1997 Jim Wilson <wilson@cygnus.com>
+
+ * basic-block.h (REG_SET_TO_HARD_REG_SET): Fix typo.
+
+ * sched.c (update_flow_info): When add extra REG_DEAD note for original
+ dest, handle case where last insn both uses and sets dest.
+
+Thu Jun 5 22:19:36 1997 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * fixinc.irix: Add declaration of __vfork to unistd.h.
+
+ * i960/vx960-coff.h (CPP_SPEC): Always define CPU, even if they
+ use -ansi; the VxWorks headers assume it's always present.
+ * sparc/vxsparc.h (CPP_SPEC): Define, adding the CPU definition to
+ what came from sparc.h.
+ (CPP_PREDEFINES): Don't define it here.
+
+Thu Jun 5 13:40:33 1997 Mike Meissner <meissner@cygnus.com>
+
+ * basic-block.c (OBSTACK_ALLOC_REG_SET): Rename from
+ OBALLOC_REG_SET. Add obstack pointer parameter.
+
+ * flow.c (function_obstack): Add declaration.
+ (life_analysis): Don't allocate the space to hold to vector of
+ regsets here.
+ (init_regset_vector): Add pointer parameter and delete space
+ parameter. Use OBSTACK_ALLOC_REG_SET to allocate. Change callers.
+ (propagate_block): Use ALLOCA_REG_SET instead of bare alloca.
+
+ * sched.c (schedule_block): Fix typo in yesterday's changes.
+ * reorg.c (mark_target_live_regs): Ditto.
+
+Thu Jun 5 09:44:49 1997 Jeffrey A Law (law@cygnus.com)
+
+ * sh.c (trap_exit, sp_switch): New variables.
+ (print_operand, case '@'): If trap_exit is nonzero, then use
+ a trapa instead of an rte/rts to exit the current function.
+ (sh_expand_prologue): Switch stacks at function entry as needed.
+ (sh_expand_epilogue): Similarly at function exit.
+ (function_epilogue): Clear trap_exit and sp_switch too.
+ (sh_valid_machine_decl_attribute): New function.
+ * sh.h (VALID_MACHINE_DECL_ATTRIBUTE): Define.
+ (sp_switch): Declare.
+ * sh.md (sp_switch_1, sp_switch_2): New named patterns.
+
+Wed Jun 4 18:11:14 1997 Michael Meissner <meissner@cygnus.com>
+
+ * basic-block.h (REGSET_ELT_BITS): Make this explicitly unsigned, so
+ that division and modulus of REGSET_ELT_BITS uses a pure shift.
+ (*_REG_SET): New macros to abstract the register set interface.
+
+ * caller-save.c (save_call_clobbered_regs): Use new *_REG_SET
+ macros.
+ * flow.c (life_analysis,propagate_block,insn_dead_p): Ditto.
+ (regno_uninitialized,regno_clobbered_at_setjmp,mark_set_1): Ditto.
+ (mark_used_regs,dump_flow_info,global_conflicts): Ditto.
+ global.c (mark_elimination): Ditto.
+ * reorg.c (mark_target_live_regs): Ditto.
+ * sched.c (sched_{analyze_{1,insn},note_set}): Ditto.
+ (birthing_insn_p,attach_deaths,unlink_notes,schedule_block): Ditto.
+
+ * sched.c (sometimes structure): Delete offset, bit fields, replace
+ with regno.
+ (new_sometimes_live): Take regno argument, not offset and bit.
+ Change all callers.
+
+Tue Jun 3 19:18:36 1997 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * fixincludes: Fix AIX NULL macro use of void*.
+
+Tue Jun 3 15:21:04 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * sparc.h (ASM_OUTPUT_MI_THUNK): Handle -fpic.
+
+Mon Jun 2 16:53:53 1997 Michael Meissner <meissner@cygnus.com>
+
+ * loop.c (n_times_{set,used}): Make type int, not short.
+ (scan_loop): n_times{set,used} are now int pointers.
+
+ * sched.c (sched_reg_n_deaths): Remove unused variable.
+ (struct sometimes): Make fields int sized, not short.
+ (schedule_insns): Don't set sched_reg_n_deaths, nobody uses it.
+
+ * regclass.c (allocate_reg_info): Allocate space for reg_renumber,
+ but don't set unless new argument RENUMBER_P is set. If this is first
+ call for function and we need to grow space, use free/xmalloc instead
+ of realloc since we will be initializing the whole array. If number
+ of registers is < 0, just free up space.
+ (reg_scan): Update allocate_reg_info call.
+ * regs.h (allocate_reg_info): Change prototype.
+ * flow.c (allocate_for_life_analysis): Update allocate_reg_info call.
+ * local-alloc.c (local_alloc): Call allocate_reg_info to allocate
+ and initialize the reg_renumber array.
+ * stupid.c (stupid_life_analysis): Likewise.
+
+Mon Jun 2 14:50:06 1997 Dave Miller <davem@jenolan.rutgers.edu>
+
+ * sparc.md (v9 eq/ne cond move patterns): Add early clobber
+ constraint to destination.
+
+Fri May 30 11:00:44 1997 Michael Meissner <meissner@cygnus.com>
+
+ * regs.h (reg_info): New structure to group the arrays indexed by
+ register number created by reg_scan and flow_analysis that are
+ globally visiable.
+ (reg_n_info): Pointer to the register information array.
+ (reg_n_{refs,sets,deaths,calls_crossed}): Delete variables.
+ (reg_changes_size): Likewise.
+ (REG_N_{REFS,SETS,DEATHS,CALLS_CROSSED}): New macros to reference
+ reg_n_info.
+ (REG_{CHANGES_SIZE,{FIRST,LAST,LAST_NOTE}_UID}): Likewise.
+ (allocate_reg_info): Add declaration.
+
+ * basic-block.h (reg_basic_block): Delete.
+ (REG_BASIC_BLOCK): Use reg_n_info structure.
+
+ * caller-save.c: Change all references to the above arrays to use
+ the corresponding macro to access the reg_n_info array.
+ * combine.c, cse.c, flow.c, global.c, jump.c, local-alloc.c: Likewise.
+ * loop.c, regclass.c, reload1.c, sched.c, stupid.c, unroll.c: Likewise.
+
+ * regclass.c (allocate_reg_info): New function to allocate the
+ reg_info array and initialize the appropriate fields.
+ (reg_scan): Call it.
+ * flow.c (allocate_for_life_analysis): Call allocate_reg_info to do
+ the actual allocation.
+
+Thu May 29 15:42:59 1997 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.md (movsfcc_1, movdfcc_1, movxfcc_1): Use singlemove_string
+ for float conditional move when destination and operands all differ.
+
+ * i386.h (ASM_OUTPUT_REG_{PUSH,POP}): add %% before register name.
+
+ * go32.h (ASM_OUTPUT_ALIGN): Use .p2align, not byte alignments.
+
+Wed May 28 20:44:00 1997 Mike Stump <mrs@cygnus.com>
+
+ * except.c (push_eh_entry): Eliminate start of exception region
+ label, as it isn't used. Rename end_label to outer_context.
+ (expand_eh_region_start_for_decl): Likewise.
+ (expand_leftover_cleanups): Likewise.
+ (expand_start_all_catch): Likewise.
+ * except.h (eh_entry): Likewise.
+ * except.c (expand_eh_region_end): Likewise. Jump around the nop
+ that we insert, so that we can optimize it away, if it is unused,
+ also so that flow analysis can tell if we fall through to the end
+ of a function or not so that it can know if a function that returns
+ a value, in fact does or not.
+
+Wed May 28 10:50:09 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.md (jump): Handle out of range unconditional jump
+ when not optimizing.
+
+Thu May 22 00:57:07 1997 Jeffrey A Law (law@cygnus.com)
+
+ * reload1.c (reload_cse_record_set): Ignore values for SREG if
+ their mode is narrower than DEST_MODE.
+
+ * pa.h (DFMODE_RETURN_STRING): Define.
+ (SFMODE_RETURN_STRING): Likewise.
+ (ASM_DECLARE_FUNCTION_NAME): Use them.
+
+Wed May 21 23:32:02 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.md (reload_insi): Handle SUBREG properly.
+
+Tue May 20 22:32:13 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (dwarf2out_def_cfa): Set cfa_reg at the top.
+
+Tue May 20 16:57:50 1997 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * cplus-dem.c (do_type): Handle `J'.
+ (demangle_fund_type): Print "complex" for it.
+
+Mon May 19 21:01:53 1997 Jim Wilson <wilson@cygnus.com>
+
+ * m68k.c (output_move_qimode): Add coldfire support.
+ * m68k.h (PUSH_ROUNDING): Add coldfire support.
+ * m68k.md (scc{,0}_di, seq, sne, sgt, sgtu, slt, sltu, sge, sgeu,
+ sle, sleu): Add coldfire support.
+
+Mon May 19 17:53:34 1997 Mike Meissner <meissner@cygnus.com>
+
+ * rs6000.c: (rs6000_pic_func_labelno): New variable.
+ (rs6000_output_load_toc_table): Use it.
+ (output_prolog): Store current value.
+
+Sun May 18 16:32:08 1997 Michael Meissner <meissner@cygnus.com>
+
+ * dbxcoff.h (ASM_OUTPUT_SOURCE_LINE): Use macros
+ ASM_{GENERATE,OUTPUT}_INTERNAL_LABEL to create/output line
+ number label.
+
+Sun May 18 13:55:12 1997 John Vickers (john@rhizik.demon.co.uk)
+
+ * m68k.h (TARGET_SWITCHES): Add new target name, cpu32.
+
+Sun May 18 13:50:10 1997 Pat Rankin <rankin@eql.caltech.edu>
+
+ * cccp.c (VMS_write, VMS_read): Delete.
+ (safe_write): If MAX_WRITE_LEN is defined, limit
+ incremental write attempts to that amount.
+ (safe_read): Analogous situation for MAX_READ_LEN.
+ * cpplib.c (safe_read): Likewise.
+ * vax/xm-vms.h (MAX_WRITE_LEN, MAX_READ_LEN): Define.
+
+ * vax/xm-vms.h (get_dynamic_handler_chain_libfunc): New macro.
+ (protect_cleanup_actions_with_terminate): New macro.
+
+Sun May 18 08:50:25 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m68k/linux.h (ASM_COMMENT_START): Define.
+ * m68k/linux-aout.h (ASM_COMMENT_START): Define.
+
+ * reload1.c (reload_cse_regno_equal_p): Check for value using more
+ than one register on a big endian machine.
+
+Sun May 18 08:39:59 1997 Vince Del Vecchio <vdelvecc@spd.analog.com>
+
+ * loop.c (maybe_eliminate_biv_1): In (set (cc0) <biv>) case,
+ swap compare operands when mult_val < 0 in one additional place.
+
+Sun May 18 08:33:30 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * dwarf2out.c (ASM_COMMENT_START): Add default definition.
+
+ * Makefile.in (maintainer-claean): Delete configure.
+
+Sun May 18 08:31:59 1997 Scott Christley <scottc@net-community.com>
+
+ * configure.in: New file.
+ * Makefile.in: Change to utilize autoconf variables.
+ * configure: Now an output file.
+
+Sun May 18 07:48:31 1997 J.T. Conklin <jtc@netbsd.org>
+
+ * m68k.md (mov[qhs]i,movstrict[qs]i, mulsi3): Use 'Q' constraint
+ for TARGET_5200.
+ * m68k.h (EXTRA_CONSTRAINT): New macro.
+
+ * m68k.h (TARGET_SWITCHES): Add 68020-60.
+ Mask out bits which indicate a particular processor when a different
+ processor is selected.
+ (MASK_68040_ALSO): Remove.
+ (MASK_68040): Change to be a single bit.
+
+ * m68k.h (TARGET_ALIGN_INT, MASK_ALIGN_INT): New macros.
+ (BIGGEST_ALIGNMENT): Determine according to TARGET_ALIGN_INT.
+ (TARGET_SWITCHES): Add align-int and no-align-int.
+
+ * m68k.md (mov[qhs]i}): Add pair of constraints which allow
+ offsetable memory addresses to be moved to the same for TARGET_5200.
+
+ * m68k.c (output_move_strict{hi,qi}): New functions.
+ * m68k.h (output_move_strict{hi,qi}): Declare.
+ * m68k.md (movstrict*): Changed into define_expands.
+ Split insns into m68k and coldfire specific versions with appropriate
+ constraints.
+
+Sun May 18 07:26:40 1997 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * libgcc2.c (atexit): Cast malloc and realloc calls.
+
+Sat May 17 16:26:51 1997 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>
+
+ * final.c (profile_function): Call function_section, not
+ text_section.
+
+Sat May 17 16:01:00 1997 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * cse.c (notreg_cost): New function, extracted from COST macro.
+ (COST): Use notreg_cost.
+
+Sat May 17 15:13:23 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * cse.c (cse_insn): Don't record a SRC that's a MEM and the same
+ as a REG_EQUIV note if DEST is set more than once.
+
+Fri May 16 14:50:57 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (output_move_double): Handle loading a general register
+ from a scaled indexed memory address.
+ * pa.md (movdf, movdi): Allow scaled loads into general registers.
+
+Fri May 16 13:31:08 1997 Mike Stump <mrs@cygnus.com>
+
+ * rs6000.c (rs6000_stack_info): Only do eabi setup for "main",
+ when main is the global main, not some nested routine that
+ happens to be called main.
+
+Thu May 15 17:19:50 1997 Mike Stump <mrs@cygnus.com>
+
+ * except.c (expand_start_all_catch): If the machine needs to
+ perform any actions at the start of an expcetion handler that
+ hasn't already been done, use gen_exception_receiver to emit it.
+ (expand_leftover_cleanups): Likewise.
+ * alpha.md (exception_receiver): Use it.
+ * pa.h (exception_receiver): Use it.
+
+Thu May 15 08:36:59 1997 Jeffrey A Law (law@cygnus.com)
+
+ * dbxout.c (dbxout_function_end): Don't subtract one from
+ the end of function scoping stab.
+
+Wed May 14 23:27:09 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.md (adddi3, subdi3): Remove expanders and patterns.
+
+Wed May 14 18:51:35 1997 Mike Stump <mrs@cygnus.com>
+
+ * function.c (expand_function_end): Make sure we finish off any
+ leftover exception handlers.
+
+Tue May 13 14:07:01 1997 Mike Stump <mrs@cygnus.com>
+
+ * expr.c (expand_builtin_setjmp): Remove setting of
+ current_function_has_nonlocal_goto, as this isn't a goto.
+
+Tue May 13 14:47:40 1997 Richard Earnshaw (rearnsha@cambridge.arm.com)
+
+ * arm.h (CPP_SPEC): Fix typo invoking cpp_endian.
+ * arm/t-semi (LIB2FUNCS_EXTRA): Build fp-bit.c when compiling
+ with -msoft-float.
+ * arm.c: Add prototypes for all static functions.
+ (output_multi_immediate, int_log2): Make static.
+
+ * arm.h (*_SPEC): Remove all references to mle/mbe.
+ * arm/coff.h (MULTILIB_DEFAULTS): Likewise.
+ * arm/t-bare (MULTILIB_OPTIONS): Change options mbe/mle to mbig-endian
+ and mlittle-endian.
+ (MULTILIB_MATCHES): Nothing matches that matters.
+
+Mon May 12 20:42:20 1997 Mike Stump <mrs@cygnus.com>
+
+ * except.c (expand_start_all_catch): If need nonlocal_goto_receiver,
+ add one at the start of exception handler.
+ (expand_leftover_cleanups): Likewise.
+
+Mon May 12 17:36:28 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mips.c (move_operand): Accept any general operand after reload
+ has started.
+
+Fri May 9 14:29:33 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.md (udivmodhi4, divmodhi4): Remove expander, give
+ corresponding pattern [u]divmodhir4 name. Clear MDR register
+ in the udivmodhi4 pattern itself.
+ (clear_mdr): Delete pattern.
+
+Thu May 8 18:20:30 1997 Richard Earnshaw (rearnshaw@cambridge.arm.com)
+
+ * arm/aout.h (ASM_OUTPUT_LONG_DOUBLE): Delete call to
+ arm_increase_location.
+ (ASM_OUTPUT_{DOUBLE,FLOAT,INT,SHORT,CHAR,BYTE,ASCII,SKIP}): Likewise.
+ (ASM_OUTPUT_ALIGN): Delete all code refering to arm_text_location.
+
+ * arm.c (arm_increase_location, get_prologue_size): Delete.
+ (arm_naked_function_p): Add declaration.
+ (arm_pic_register): Define.
+ (all_procs): Delete entries for arm{60,620,70,7d,7di,700i,710c}; add
+ entries for arm{7m,7500fe,8}, strongarm and strongarm110.
+ (arm_override_options): Rework so that configure can properly set
+ the default processor type. Add a warning that PIC code is not yet
+ supported.
+ (legitimate_pic_operand_p, legitimize_pic_address): New functions.
+ (is_pic, arm_finalize_pic): New functions.
+ (arm_adjust_cost): New function.
+ (const_pool_offset, arm_backwards_branch, short_branch): Delete.
+ (arm_insn_not_targeted): Delete.
+ (add_constant): If generating AOF syntax, then handle pic specially.
+ (output_ascii_pseudo_op): Delete calls to arm_increase_location.
+ (function_really_clobbers_lr): Calls followed by a barrier don't
+ clobber the link register.
+ (output_func_prologue): Handle AOF syntax pic code.
+ (output_func_epilogue): Handle cases where lr_save_eliminated is set.
+ Delete call to arm_increase_location.
+ (arm_asm_output_label): Simplify, since we no-longer need to cache the
+ label's address.
+ (aof_pic_entry): New function to keep track of pic symbols.
+ (aof_dump_pic_table): New function.
+
+ * arm.h (TARGET_CPU_arm*, TARGET_CPU_strongarm*, TARGET_CPU_generic):
+ define.
+ (CPP_ARCH_DEFAULT_SPEC): Set up based on setting of TARGET_CPU_DEFAULT.
+ (CPP_SPEC): Split up into sub-rule calls.
+ (CPP_CPU_SPEC): Add default definition.
+ (CPP_APCS_PC_SPEC, CPP_APCS_PC_DEFAULT_SPEC): Add definitions.
+ (CPP_FLOAT_SPEC, CPP_FLOAT_DEFAULT_SPEC): Add definitions.
+ (CPP_ENDIAN_SPEC, CPP_ENDIAN_DEFAULT_SPEC): Add definitions.
+ (CC1_SPEC): Map legacy -m[236] onto -mcpu=.. and -mapcs-{26,32} as
+ appropriate. Similarly for -mbe and -mle to -m{big,little}-endian.
+ (EXTRA_SPECS): Define.
+ (enum processor_type): New types for arm8 and strongarm.
+ (CONDITIONAL_REGISTER_USAGE): Handle flag_pic.
+ (LEGITIMIZE_ADDRESS): Likewise.
+ (ADJUST_COST): Define.
+ (PIC_OFFSET_TABLE_REGNUM): Define.
+ (FINALIZE_PIC): Define.
+ (LEGITIMATE_PIC_OPERAND_P): Define.
+ (OUTPUT_INT_ADDR_CONST): Define.
+ (ASM_OUTPUT_MI_THUNK): Delete calls to arm_increase_location.
+ (MASK_RETURN_ADDR): Use TARGET_APCS_32 not TARGET_6.
+
+ * arm.md (attr cpu): Add new cpu types for arm8 and strongarm.
+ (attr ldsched): New attribute, set if processor has a load_delay slot.
+ (function_unit core): Rework to handle load delay slots.
+ (function_unit loader): New function unit.
+ (movsi): Handle pic.
+ (pic_load_addr): New expand.
+ (*pic_load_addr_based_insn, pic_add_dot_plus_eight): New patterns.
+ (peepholes to cause flow to return to a label after a function call):
+ Delete, these have been disabled for a while now.
+
+ * arm/riscix.h (CPP_SPEC): Rewrite using new sub-components.
+ (SUBTARGET_CPU_DEFAULT): Set to TARGET_CPU_arm2.
+ * arm/riscix1-1.h (CPP_SPEC): Rewrite using new sub-components.
+ (SUBTARGET_CPU_DEFAULT): Set to TARGET_CPU_arm2.
+ * arm/semi.h: (CPP_SPEC): Delete.
+ (PROCESSOR_DEFAULT): Delete.
+ (CPP_APCS_PC_DEFAULT_SPEC): Define.
+ * arm/semiaof.h (CPP_SPEC): Delete.
+ (CPP_APCS_PC_DEFAULT_SPEC): Define.
+ * arm/t-semi (LIBGCC1_TEST): Don't build it.
+ (MULTILIB_{OPTIONS,DIRNAMES,EXCEPTIONS}): Build a suitable set of
+ cross libraries.
+ (LIBGCC): Set to stmp-multilib.
+ (INSTALL_LIBGCC): Set to install-multilib.
+
+Thu May 8 15:20:46 1997 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.c (output_float_compare): For pentiumpro use fcomip
+ followed by a float stack pop for "compare;pop;pop" cases.
+
+Thu May 8 13:20:20 1997 Chris Torek <torek@elf.bsdi.com>
+
+ * fold-const.c (fold, truth_andor): Disable optimization for
+ side effects on RHS.
+
+Wed May 7 15:43:57 1997 Mike Stump <mrs@cygnus.com>
+
+ * except.c (start_dynamic_handler): Fix so we can use __builtin_setjmp,
+ and default to using __builtin_setjmp instead of setjmp.
+ * expr.c (expand_builtin_setjmp): New routine, split out from
+ existing inline code from expand_builtin.
+ (expand_builtin): Split out code into expand_builtin_setjmp.
+ * expr.h (expand_builtin_setjmp): Add declaration.
+ * libgcc2.c (__sjthrow): Default to using __builtin_setjmp instead
+ of setjmp.
+ (__sjpopnthrow): Likewise.
+ * optabs.c (init_optabs): Likewise.
+
+Wed May 7 18:01:24 1997 Samuel Figueroa <Samuel_Figueroa@next.com>
+
+ * rs6000.md (insv): Only combine insert with shift if
+ remaining source bits >= destination field size.
+
+Tue May 6 15:48:52 1997 Jason Merrill <jason@gerbil.cygnus.com>
+
+ * dwarf2out.c (dwarf2out_begin_prologue): Increment
+ current_funcdef_number here.
+ (dwarf2out_end_epilogue): Not here.
+
+Mon May 5 18:52:32 1997 Jeffrey A Law (law@cygnus.com)
+
+ * h8300.c (notice_update_cc): Use CC_SET_ZN and CC_SET_ZNV.
+ (shift_one, shift_two): Set CC_NO_CARRY as needed. Remove
+ references to CC_OVERFLOW_0.
+ (emit_a_shift): Similarly.
+ * h8300.h (CC_OVERFLOW_0): Remove.
+ * h8300.md: Use set_zn and set_znv for cc0 tracking.
+ (bCC): Restore the comparison is CC_OVERFLOW_UNUSABLE is set and
+ the comparison needs the overflow bits.
+
+ * mn10300.c (notice_update_cc): Use CC_SET_ZN and CC_SET_ZNV.
+ * mn10300.h (CC_NO_CARRY): Define.
+ * mn10300.md: Use "set_zn" and "set_znv" to more accurately
+ describe cc0 status.
+
+Fri May 2 17:00:33 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c: Reorganize, moving .debug_frame support to the top
+ of the file, and compile it if INCOMING_RETURN_ADDR_RTX is defined
+ even if DWARF2_DEBUGGING_INFO isn't.
+ (EH_FRAME_SECTION): New macro.
+ (output_call_frame_info): Handle .eh_frame variant.
+ (dwarf2out_def_cfa): Update cfa_*{reg,offset}.
+ (dwarf2out_frame_debug): Move cfa_*{reg,offset} to file scope.
+ (dwarf2out_end_epilogue): Increment current_funcdef_number here.
+ (dwarf2out_decl): Not here.
+ (dwarf2out_frame_init, dwarf2out_frame_finish): New fns.
+ (dwarf2out_init, dwarf2out_finish): Call them.
+ (output_die): Add missing 'case 8:'
+ (dwarf2out_decl): Revert other context_die = NULL change.
+ (add_bound_info): Restore default case.
+
+Fri May 2 15:30:16 1997 Doug Evans <dje@seba.cygnus.com>
+
+ * m32r.h (LIT_NAME_P): New macro.
+ (SMALL_NAME_P): Use it.
+ (ASM_OUTPUT_ALIGNED_COMMON): Don't output to scommon if -msdata=none.
+ * m32r.c (addr24_operand): Handle literals.
+ (m32r_output_function_prologue): Use IMMEDIATE_PREFIX.
+ (m32r_output_function_epilogue): Likewise. Use shorter add insn if
+ able.
+
+Fri May 2 14:40:44 1997 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.h (RS6000_ALIGN): Macro renamed from ALIGN.
+ * rs6000.c (rs6000_stack_info): Use it.
+
+Fri May 2 14:15:54 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * reload1.c (reload_cse_noop_set_p): When checking the values
+ equivalent to sreg, make sure the mode is right.
+
+Fri May 2 12:53:03 1997 Jeffrey A Law (law@cygnus.com)
+
+ * reload1.c (reload_cse_invalidate_regno): Properly set
+ the mode for invalidate_regno_rtx.
+
+Thu May 1 14:57:35 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.md (call_internal_symref): Fix typo.
+
+Thu May 1 14:44:17 1997 Jim Wilson <wilson@cygnus.com>
+
+ * mips.c (mips_asm_file_start): Use new macro TARGET_FILE_SWITCHING.
+ (mips_asm_file_end): Likewise.
+ * mips.h (TARGET_FILE_SWITCHING): Define.
+ (NO_DBX_FUNCTION_END): Define.
+
+Thu May 1 09:08:40 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m68k.c (output_addsi3): Replace "\\;" by "\n\t" in
+ assembler templates.
+
+Thu May 1 09:00:42 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * integrate.c (subst_constants, case SUBREG): Cancel changes once
+ done with result.
+
+Wed Apr 30 19:45:56 1997 Jim Wilson <wilson@cygnus.com>
+
+ * mips.c (override_options): Set mips_split_addresses only if
+ TARGET_SPLIT_ADDRESSES is set.
+ * mips.h (MASK_SPLIT_ADDR, TARGET_SPLIT_ADDRESSES): New macros.
+ (TARGET_SWITCHES): Add -msplit-addresses, -mno-split-addresses.
+ * configure (mips*-*-ecoff*, mips*-*-elf*): Set MASK_SPLIT_ADDR
+ bit in target_cpu_default2.
+
+ * flags.h (current_function_is_thunk): Add extern to declaration.
+
+ * dbxout.c (dbxout_function): Test NO_DBX_FUNCTION_END at run time
+ instead of compile time.
+
+ * unroll.c (set_dominates_use): In second loop, add check for copy_end.
+
+ * mips.md (paradoxical_extendhidi2, paradoxical_extendqidi2): New
+ patterns.
+
+Wed Apr 30 02:23:24 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * output.h (named_section): Add reloc argument.
+ (DECL_READONLY_SECTION): New macro.
+ * varasm.c (named_section): Add reloc argument, pass it to
+ ASM_OUTPUT_SECTION_NAME.
+ (UNIQUE_SECTION, UNIQUE_SECTION_P): Provide defaults.
+ (function_section): Pass reloc argument to named_section.
+ (variable_section, exception_section): Likewise.
+ (output_constant_def_contents): Likewise.
+ (assemble_start_function): Use UNIQUE_SECTION_P. UNIQUE_SECTION is
+ now a statement.
+ (assemble_variable): Likewise.
+ * mips/iris6.h (ASM_OUTPUT_SECTION_NAME): Add reloc arg,
+ use DECL_READONLY_SECTION.
+ * psos.h, ptx4.h, a29k.h, alpha/elf.h, arm/coff.h, h8300.h: Likewise.
+ * i386/go32.h, i386/sco5.h, m68k/coff.h, mips/elf64.h: Likewise.
+ * mips/netbsd.h, pa.h, rs6000/sysv4.h, sh.h, sparc/sysv4.h: Likewise.
+ * config/svr4.h (SELECT_SECTION): Use DECL_READONLY_SECTION.
+ (ASM_OUTPUT_SECTION_NAME): Likewise, add reloc argument.
+ (MAKE_DECL_ONE_ONLY): Just set DECL_WEAK.
+ (UNIQUE_SECTION, UNIQUE_SECTION_P): Define.
+ * i386/cygwin32.h (UNIQUE_SECTION_P): Define.
+ (SUPPORTS_ONE_ONLY): Define.
+ (MAKE_DECL_ONE_ONLY): Lose.
+ (ASM_OUTPUT_SECTION_NAME): Add reloc arg, use DECL_READONLY_SECTION.
+ * i386/winnt.c (i386_pe_unique_section): Add reloc arg,
+ use DECL_READONLY_SECTION.
+
+ * mips/iris6.h (CTORS_SECTION_ASM_OP): Change aligment based on ABI.
+ (DTORS_SECTION_ASM_OP): Likewise.
+
+Tue Apr 29 16:08:07 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa/lib1funcs.asm (divnorm, modnorm, exitdiv): Fix code to
+ negate SImode values.
+
+Tue Apr 29 12:54:14 1997 Mike Stump <mrs@cygnus.com>
+
+ * except.c (expand_eh_region_start_tree): Add DECL argument so we
+ can better track why the region was made for error reporting.
+ * except.h (expand_eh_region_start_tree): Likewise.
+ * tree.h (expand_dhc_cleanup): Likewise.
+ (expand_dcc_cleanup): Likewise.
+ * except.c (expand_eh_region_start_for_decl): New routine.
+ * except.h (expand_eh_region_start_for_decl): Likewise.
+ * stmt.c (expand_decl_cleanup): Add DECL to call of
+ expand_eh_region_start_tree.
+ (expand_dcc_cleanup): Likewise.
+ (expand_dhc_cleanup): Likewise.
+ (expand_start_case): Switches introduce conditional contexts.
+ (expand_start_case_dummy): Likewise.
+ (expand_start_case_dummy): Likewise.
+ (expand_end_case): Likewise.
+
+Tue Apr 29 11:45:09 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (dwarf2out_decl): Undo earlier change.
+ (constant_size): Likewise.
+ (gen_subprogram_die): Handle NULL context_die.
+
+ * mips/iris6.h (ASM_OUTPUT_CONSTRUCTOR): Fix for -mabi=64.
+ (ASM_OUTPUT_DESTRUCTOR): Likewise.
+
+Mon Apr 28 09:10:19 1997 Jeffrey A Law (law@cygnus.com)
+
+ * h8300.c (push_order, pop_order): Add missing initializer entries.
+
+Fri Apr 25 19:39:43 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * h8300.c (output_adds_subs): Check for adding 0.
+
+Fri Apr 25 14:52:31 1997 Jim Wilson <wilson@cygnus.com>
+
+ * configure (i[3456]86-*-freebsdelf*, i[3456]86-*-freebsd*): Use
+ t-freebsd instead of x-freebsd.
+ * i386/t-freebsd: Renamed from x-freebsd.
+
+Fri Apr 25 12:16:20 1997 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * go32.h (DBX_*): Use definitions from config/dbxcoff.h instead.
+
+Fri Apr 25 11:55:54 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * i386/cygwin32.h (MULTIPLE_SYMBOL_SPACES): Define.
+
+Thu Apr 24 18:32:56 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * i386/winnt.c (i386_pe_unique_section): New fn.
+ * i386/cygwin32.h (UNIQUE_SECTION): Define.
+ (MAKE_DECL_ONE_ONLY): Define.
+ (ASM_OUTPUT_SECTION_NAME): Support DECL_ONE_ONLY.
+
+ * c-decl.c (implicitly_declare): Don't set DECL_ARTIFICIAL.
+
+Thu Apr 24 17:11:23 1997 Jim Wilson <wilson@cygnus.com>
+
+ * m68k.h (MACHINE_STATE_SAVE, MACHINE_STATE_RESTORE): Add
+ TARGET_5200 support.
+
+Thu Apr 24 16:39:25 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * stmt.c (pushcase_range): Check for null range first.
+
+Wed Apr 23 23:06:28 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * reload1.c (reload_cse_record_set): Use push_operand to check for
+ changes to the stack pointer.
+
+Wed Apr 23 19:56:01 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * calls.c (expand_call): If we're in a thunk, pass through invisible
+ references instead of making a copy.
+ * flags.h: Add current_function_is_thunk.
+ * function.c: Likewise.
+ (init_function_start): Initialize it.
+ (push_function_context_to): Save it.
+ (pop_function_context_from): Restore it.
+ * function.h (struct function): Add is_thunk.
+
+Wed Apr 23 17:47:25 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.c (secondary_reload_class): Handle more cases where we
+ need secondary reloads.
+ (impossible_plus_operand): Accept anything that involves addition
+ of the stack pointer.
+ * mn10300.md (reload_insi): Always load the stack pointer into
+ the destination (which is always an address register).
+ * mn10300.h (STORE_FLAG_VALUE): Remove definition.
+ * xm-mn10300.h: Declare malloc, realloc, calloc and free.
+
+Wed Apr 23 14:28:30 1997 Mike Stump <mrs@cygnus.com>
+
+ * expr.h (sjthrow_libfunc): Add support for setjmp/longjmp based
+ exception handling.
+ ({sjpopnthrow,terminate,setjmp,longjmp}_libfunc): Likewise.
+ (get_dynamic_handler_chain_libfunc): Likewise.
+ * expr.c (expand_expr, case TRY_CATCH_EXPR): Likewise.
+ (expand_expr, case POPD{C,H}C_EXPR): Likewise.
+ * stmt.c (mark_block_as_eh_region): Likewise.
+ (mark_block_as_not_eh_region): Likewise.
+ (is_eh_region, conditional_contex, expand_start_bindings): Likewise.
+ (expand_end_bindings, expand_{decl,dcc,dhc}_cleanup): Likewise.
+ (expand_cleanups): Likewise.
+ * tree.h (mark_block_as_eh_region): Likewise.
+ (mark_block_as_not_eh_region, is_eh_region): Likewise.
+ conditional_context, expand_dhc_cleanup): Likewise.
+ * except.c (exception_via_longjmp): Likewise.
+ (protect_cleanup_actions_with_terminate): Likewise.
+ (current_function_d{h,c}c, add_partial_entry): Likewise.
+ (get_dynamic_{handler,cleanup}_chain): Likewise.
+ (start_dynamic_{cleanup, handler}): Likewise.
+ (expand_eh_region_start{,_tree}, expand_eh_region_end): Likewise.
+ (emit_throw, expand_leftover_cleanups): Likewise.
+ (expand_{start,end}_all_catch, protect_with_terminate): Likewise.
+ ({start,end}_eh_unwinder, init_eh_for_function): Likewise.
+ ({save,restore}_eh_status, exception_optimize): Likewise.
+ * optabs.c ({sjthrow,sjpopnthrow,terminate,setjmp}_libfunc): Likewise.
+ ({longjmp,get_dynamic_handler_chain}_libfunc): Likewise.
+ (init_optabs): Likewise.
+ * except.h: Likewise.
+ * libgcc2.c (__default_terminate): Likewise.
+ (__terminate, __get_dynamic_handler_chain, __sjthrow): Likewise.
+ (__sjpopnthrow): Likewise.
+ * toplev.c (f_options): Likewise.
+ * tree.def (TRY_CATCH_EXPR, POPDHC_EXPR, POPDCC_EXPR): Likewise.
+ * pa.h (JMP_BUF_SIZE): Define.
+ * sparc.h (JMP_BUF_SIZE): Define.
+
+ * expr.h (cleanups_this_call): Transform uses of cleanups_this_call
+ into uses of the cleanups managed by the block code
+ (expand_start_bindings and friends). Remove defer_cleanups_to and
+ expand_cleanups_to, and use start_cleanup_deferal and
+ end_cleanup_deferal instead. Add exception_region,
+ target_temp_slot_level, conditional_code,
+ last_unconditional_cleanup and cleanup_ptr to struct nesting to
+ facilitate conditional cleanups.
+ * expr.c (cleanups_this_call, init_expr): Likewise.
+ ({save,restore}_expr_status, store_expr): Likewise.
+ (expand_expr, {defer,expand}_cleanups_to): Likewise.
+ (do_jump, case TRUTH_{AND,OR}IF_EXPR): Likewise.
+ (do_jump, case COND_EXPR): Likewise.
+ * stmt.c (struct nesting): Likewise.
+ (expand_return, expand_start_bindings, expand_end_bindings): Likewise.
+ (expand_cleanups, {start,end}_cleanup_deferal): Likewise.
+ * tree.h (start_cleanup_deferal): Likewise.
+ (end_cleanup_deferal): Likewise.
+ * calls.c (expand_call): Likewise.
+ * function.h (struct function): Likewise.
+ * except.c (asynchronous_exceptions): Support
+ -fasynchronous_exceptions.
+ (can_throw): Likewise.
+ * toplev.c (f_options): Likewise.
+
+ * flags.h (flag_short_temps): Remove support for short temps.
+ * calls.c (expand_call): Likewise.
+ * toplev.c (flag_short_temps): Likewise.
+
+ * stmt.c (expand_start_target_temps): Add for convenience.
+ (expand_end_target_temps): Likewise.
+ * except.c (jumpif{,not}_rtx): Likewise.
+
+ * stmt.c: Remove all traces of empty_cleanup_list.
+
+Wed Apr 23 17:26:40 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * reload1.c (reload_cse_mem_conflict_p): Don't assume that a
+ SUBREG can not conflict with a MEM.
+
+Wed Apr 23 09:48:58 1997 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de)
+
+ * 1750a.md (cmphi): Fixed when next CC user is unsigned.
+ (mov[hq]i-[23]): New patterns for mem-indirect moves.
+ (movhf,movtqf): Corrected.
+ * 1750a.c (memop_valid): Memory indirection now valid.
+ (nonindirect_operand): Remove.
+ (print_operand): Fix the 'J' output modifier.
+ * 1750a.h (FRAME_POINTER_REQUIRED): Not required.
+ (INITIAL_FRAME_POINTER_OFFSET,FIX_FRAME_POINTER_ADDRESS): Undefine.
+ (FUNCTION_PROLOGUE,FUNCTION_EPILOGUE): Honor -fomit-frame-pointer.
+ (ELIMINABLE_REGS,CAN_ELIMINATE,INITIAL_ELIMINATION_OFFSET): Defined.
+ (PREFERRED_RELOAD_CLASS): Corrected.
+ (CONST_COSTS,ADDRESS_COST,REGISTER_MOVE_COST,MEMORY_MOVE_COST):
+ Slight adjustments.
+ (ASM_APP_ON,ASM_APP_OFF): Corrected.
+ * ms1750.inc (DUCR.M,DUC.M): Defined.
+
+Wed Apr 23 09:41:35 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * reload.c (push_reload): Fix last arg of call to find_dummy_reload.
+
+Wed Apr 23 09:29:14 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * configure (i[3456]86-next-*, m68k-next-nextstep{2,3}*):
+ Remove out_file and add extra_objs.
+ * config/nextstep.c: Add includes for config.h, stdio.h, and flags.h.
+ * {i386,m68k}/t-next (nextstep.o): New rule.
+ * m68k/next.h: Remove include of machmode.h.
+ * {i386,m68k}/next.c: Files deleted.
+
+Tue Apr 22 20:45:29 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * sparc.h (DBX_CONTIN_LENGTH): Shrink to 1000.
+
+Tue Apr 22 18:21:20 1997 Jim Wilson <wilson@cygnus.com>
+
+ * dwarf2out.c (gen_variable_dir): Add test for DW_AT_declaration to
+ the old_die if statement, and delete assertion for it.
+ (decl_ultimate_origin): Remove last change.
+
+Tue Apr 22 10:22:27 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.c (expand_prologue): End the current sequence before
+ counting the tst insns in the current function. Start a new
+ one before emitting any prologue instructions.
+
+ * mn10300.h (REGISTER_MOVE_COST): Bump up cost of moves in the
+ same class.
+
+ * mn10300.md (untyped_call): New expander.
+
+Mon Apr 21 16:30:21 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * cse.c (fold_rtx, case PLUS): When seeing if negative of constant
+ is around, make sure not dealing with largest negative.
+
+Mon Apr 21 13:57:53 1997 Jim Wilson <wilson@cygnus.com>
+
+ * mips/t-ecoff: Set TARGET_LIBGCC2_CFLAGS instead of LIBGCC2_CFLAGS.
+
+ * m68k.c (output_addsi3): New function. From addsi3 pattern.
+ * m68k.h (output_addsi3): Add declaration.
+ * m68k.md (movqi+2): Add address registers.
+ (movxf+1): Disable for TARGET_5200.
+ (movxf+2): New pattern for TARGET_5200.
+ (addsi3): Add define_expand. Move code to output_addsi3.
+ (addsi3_internal): Renamed from addsi3. Disable for TARGET_5200.
+ (addsi3_5200): New pattern for TARGET_5200.
+
+Sun Apr 20 10:45:35 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * fold-const.c (operand_equal_p): Constants are not equal if there
+ has been an overflow.
+
+ * toplev.c (compile_file): Shorten "branch-probabilities" in
+ output of times.
+
+ * alpha/vms.h (MOD[SD]I3_LIBCALL): Call ots$rem, not ots$mod.
+ (DWARF2_DEBUGGING_INFO): Define.
+
+ * alpha.c (alpha_need_linkage): Call get_identifier.
+
+ * rs6000.c (rs6000_output_load_toc_table): New function.
+ (output_prolog): Call it instead of doing it directly.
+ * rs6000.md (nonlocal_goto_receiver): New pattern.
+
+ * dwarf2out.c: Major cleanup; mostly reformatting.
+ Include expr.h.
+ Undefine inline ifndef __GNUC__; never define to include static.
+ Add "static" to header of all inlined functions.
+ Add declarations for all static functions, with prototypes.
+ (addr_const_to_string): Use HOST_WIDE_INT_PRINT_* macros.
+ (add_AT_*, new_{die,loc_descr,cfi): Don't check for xmalloc
+ returning zero.
+ (modified_type_die): Add missing parm on recursive call.
+ ({reg,based}_loc_descriptor): Add missing arg to call to new_loc_descr.
+ (add_const_value_attribute): Use REAL_VALUE_TYPE for fp calculations.
+ (output_call_frame_info): Add missing arg to output_cfi call.
+ (dwarf2out_def_cfa): Local variable OLD_REG must be unsigned long.
+ * Makefile.in (dwarf2out.o): Includes expr.h.
+
+ * dwarf2out.c: Cast first arg in all calls to bzero to char *.
+ (decl_ultimate_origin): Return NULL if equal to decl.
+ (constant_size): Never return more than 4.
+ (value_format, case 8): New case.
+ (dwarf2out_frame_debug): Use HARD_FRAME_POINTER_REGNUM.
+ (based_loc_descr): Likewise.
+ (add_bound_info): Delete default case.
+ Add cases for CONVERT_EXPR and NON_LVALUE_EXPR; treat like NOP_EXPR.
+ Change NOP_EXPR to to recursive call.
+ (add_type_attribute): Ignore unnamed subtype of integral or FP.
+ (gen_subprogram_die): Use reg_loc_descriptor.
+ (dwarf2out_decl): Ignore nested functions.
+
+ * fix-header.c, protoize.c, gcov.c: Use symbolic codes for exit.
+
+ * final.c (profile_function): Only call ASM_OUTPUT_REG_{PUSH,POP}
+ if defined.
+
+ * expr.c ({move,clear}_by_pieces_1, expand_assignment): Ensure
+ we have unshared rtx before changing flags.
+ (store_{constructor,field}): Likewise.
+ (expand_expr, case COMPONENT_REF): Likewise.
+ (store_expr): Check if TEMP and TARGET are same with rtx_equal_p.
+
+ * emit-rtl.c (change_address, init_emit): Delete forward references.
+ (rtl_obstack, stack_depth, max_stack_depth): Delete extern decls.
+
+Fri Apr 18 18:25:52 1997 Jim Wilson <wilson@cygnus.com>
+
+ * function.c (instantiate_decls): For DECL_INCOMING_RTL, use max
+ of type size and mode size in instantiate_decl call.
+
+ * fixincludes (sys/lc_core.h): Fix OSF1/4.x namespace pollution.
+
+Wed Apr 16 19:36:53 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (add_bound_info): Use a DIE instead of a location
+ expression for variable bounds. Trust a MEM rtx even when
+ optimizing.
+ (DWARF_FRAME_RETURN_COLUMN): Default to FIRST_PSEUDO_REGISTER.
+
+ * expr.c (expand_expr, case RTL_EXPR): If there is no sequence,
+ don't set it to const0_rtx.
+ * tree.c (array_type_nelts): Don't return any SAVE_EXPRs.
+
+Mon Apr 14 18:12:57 1997 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.h (RS6000_ITRUNC, RS6000_UITRUNC): Prepend underscores.
+ (RS6000_MCOUNT): New macro.
+ (ASM_FILE_START): Use RS6000_MCOUNT.
+ * rs6000.c (output_function_profiler): Use RS6000_MCOUNT.
+ * rs6000/aix31.h (RS6000_{ITRUNC,UITRUNC,MCOUNT}): New macros.
+
+Mon Apr 14 14:37:27 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.c (can_use_return_insn): Include outgoing argument
+ area in size computation.
+ (expand_prologue): Likewise. No longer diddle with sequences.
+ Put register saves just before outgoing argument area.
+ (expand_epilogue): Similarly.
+ (impossible_plus_operand): New function.
+ * mn10300.h (FRAME_POINTER_REQUIRED): Never require a frame pointer.
+ (ACCUMULATE_OUTGOING_ARGS, OUTGOING_REG_PARM_STACK_SPACE): Define.
+ (impossible_plus_operand): Declare.
+ * mn10300.md (reload_insi): New expander to handle pathological
+ reload cases.
+ (addsi3): Fix CC status.
+
+ * mn10300.h (FUNCTION_VALUE): Return addresses in $a0.
+ (FUNCTION_VALUE_REGNO_P): Corresponding changes.
+ * mn10300.md (call_value_internal): Allow output to be in an
+ address register.
+
+ * calls.c (emit_library_call): Handle saving of stack slots when
+ ACCUMULATE_OUTGOING_ARGS is defined.
+ (emit_library_call_value): Likewise.
+
+Mon Apr 14 14:48:15 1997 Jim Wilson <wilson@cygnus.com>
+
+ * sh.md (xtrct_left, xtrct_right): New patterns.
+
+ * combine.c (get_last_value_validate): New argument insn.
+ Add check for memory reference clobbered by later store.
+ (record_value_for_reg, get_last_values): Pass in new argument.
+
+Mon Apr 14 14:03:18 1997 Mike Meissner <meissner@cygnus.com>
+
+ * configure (powerpc --with-cpu=x): Add embedded powerpcs and 604e.
+
+ * rs6000.c (rs6000_override_options): Recognize -mcpu=801, -mcpu=823,
+ and -mcpu=604e.
+
+Sun Apr 13 18:43:16 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * reload1.c (invalidate_regno_rtx): New static variable.
+ (reload_cse_invalidate_regno): Check whether any earlier registers
+ have a multi-register value which includes the register we are
+ invalidating.
+ (reload_cse_regs): Initialize invalidate_regno_rtx.
+
+ * reload1.c (reload_cse_record_set): When setting reg_values for a
+ copy from one register to another, use gen_lowpart_common to
+ adjust the value correctly if the mode changes.
+
+Sun Apr 13 17:24:48 1997 Doug Evans <dje@cygnus.com>
+
+ * expr.c (move_block_from_reg): Try using integral mov operation first.
+
+ * calls.c (expand_call): When copying unaligned values into a register,
+ zero out the register first rather than emitting a clobber.
+
+ * integrate.c (copy_rtx_and_substitute): If FRAME_GROWS_DOWNWARD
+ and regno == VIRTUAL_STACK_VARS_REGNUM, round size of stack slot up
+ before calling assign_stack_temp.
+
+Sun Apr 13 15:29:38 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * enquire.c (fake_f_rep): Add missing element name in cast.
+
+Sun Apr 13 15:20:05 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * stor-layout.c (layout_record, PCC_BITFIELD_TYPE_MATTERS):
+ Fix sign bug in last change.
+
+Sun Apr 13 15:03:38 1997 J.T. Conklin <jtc@netbsd.org>
+
+ * m68k.md (movstricthi): Remove extraneous comparisons.
+
+ * configure (*-*-netbsd): tmake_file now t-netbsd; delete xmake_file.
+ * config/t-netbsd: New file.
+ * config/x-netbsd: Removed.
+
+Sun Apr 13 14:51:25 1997 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * cse.c (canon_reg, cse_insn): Don't examine insn_n_dups if
+ recog_memoized fails to find a match.
+
+Sun Apr 13 14:17:26 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * reload1.c (reload_cse_noop_set_p): Add insn parameter. Change
+ all callers. If deleting the instruction, remove any earlier
+ REG_DEAD note for DREG.
+ (reload_cse_simplify_set): If simplifying, remove any earlier
+ REG_DEAD note for the new source register.
+
+Sun Apr 13 14:12:08 1997 Pat Rankin <rankin@eql.caltech.edu>
+
+ * libgcc2 (L_bb, L_exit): Use 0 rather than NULL for null pointers.
+
+Sun Apr 13 12:53:03 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m68k/linux.h (ASM_SPEC): Define.
+ (STRUCT_VALUE_REGNUM, STATIC_CHAIN_REGNUM, INITIALIZE_TRAMPOLINE):
+ Remove definitions, undoing the change of Mar 20 1996.
+
+ * m68k.c (output_move_qimode): Optimize pushing one byte if source
+ operand does not use stack pointer.
+
+ * m68k.md (rotl[shq]i3, rotl[hq]i3+1): Don't directly modify operand.
+
+ * m68k.md (tstdi): Add missing parallel around the pattern.
+
+Sun Apr 13 12:51:00 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c, cpplib.c (do_include): Diagnose #import and
+ #include_next if pedantic and if not in a system header.
+ (do_warning): #warning now causes an error if -pedantic-errors
+ is given; this is needed since #warning isn't ANSI.
+
+ * toplev.c (lang_options): Add -Wundef, -Wno-undef.
+ * c-decl.c (c_decode_option): Ignore -Wundef, -Wno-undef.
+
+ * cccp.c, cexp.y (warn_undef): New variable.
+ * cpplib.h (struct cpp_options): New member warn_undef.
+ (CPP_WARN_UNDEF): New macro.
+
+ * cccp.c (main), cpplib.c (cpp_handle_options): Set warn_undef
+ from -Wundef and -Wno-undef.
+
+ * cppexp.c (cpp_lex) New arg skip_evaluation.
+ (cpp_parse_expr): Pass skip_evaluation to cpp_lex.
+ Abort if cpp_lex returns NAME.
+
+ * cexp.y (exp), cppexp.c (cpp_lex): Optionally warn about undefined
+ identifiers that evaluate to 0.
+
+Sun Apr 13 11:43:16 1997 Joel Sherrill <joel@OARcorp.com>
+
+ * configure (hppa1.1-*-rtems*): New target.
+ * mips/rtems.h: New file.
+
+Sun Apr 13 09:48:26 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * gcov.c (print_usage, open_files): Use FATAL_EXIT_CODE.
+ * collect2.c (fatal_perror, fatal, collect_wait): Likewise.
+
+ * sparc.c (eligible_for_delay_slot): Clean up and make to agree
+ precisely with patterns in MD file.
+ * sparc.md (*return_addsi): Change condition to exclude both ints.
+ (*return_adddi): Likewise.
+ (*return_subsi): New pattern.
+
+ * recog.c (validate_replace_rtx_1, case MINUS): New case.
+
+Sun Apr 13 08:20:24 1997 Thomas Bushnell <thomas@gnu.ai.mit.edu>
+
+ * i386/gnu.h (TARGET_VERSION): Redefine.
+
+Sun Apr 13 08:15:31 1997 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>
+
+ * c-typeck.c (lookup_field): Don't recurse unless FIELD is
+ a RECORD_TYPE or UNION_TYPE.
+
+ * final.c (profile_function): Save the static chain register
+ around the call to the profiler function.
+
+ * loop.c (invariant_p, case REG): Pointers into frame are not
+ invariants if function has nonlocal gotos.
+ * reload1.c (reload): If function has nonlocal label, mark all
+ caller-saved regs as used.
+
+Fri Apr 11 16:49:06 1997 Doug Evans <dje@seba.cygnus.com>
+
+ * m32r.h (REG_ALLOC_ORDER): Restore to original setting.
+
+ * m32r.h (UPPER16_P): Fix calculation.
+ * m32r.c (two_insn_const_operand): New function.
+ (m32r_print_operand): Handle 'X'.
+ * m32r.md (movsi): Tweak.
+ (*movsi_insn): Output hex value of constants too.
+ (movsi define_split): Add.
+ (andsi3,orsi3,xorsi3): Output hex value of constants too.
+
+Thu Apr 10 18:39:33 1997 Jim Wilson <wilson@cygnus.com>
+
+ * sh.md (sne): Modified to use negc instead of xor.
+ (sne+1): New define_split for new sne pattern.
+ * sh.c (output_stack_adjust): Reorganize code for readability.
+ If size is negative, negate and subtract it instead of adding it.
+
+Wed Apr 9 13:51:07 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.c (output_stack_adjust): When splitting an adjustment into two
+ parts, make sure the stack is aligned at all times.
+
+Tue Apr 8 12:34:38 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.h (RETURN_ADDR_RTX): Define.
+
+Mon Apr 7 19:19:57 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.c (count_tst_insns): New function.
+ (expand_prologue): Load zero into data and/or address registers
+ if any are free and the function has optimizable tst insns.
+ (output_tst): If a suitable register is known to have the
+ value zero, use it instead of searching for a suitable register.
+ * mn10300.h (zero_dreg, zero_areg): Declare.
+ (FRAME_POINTER_NEEDED): Frame pointers are not needed if the
+ outgoing argument size is zero.
+ * mn10300.md (movXX): Optimize loading zero into an address
+ register if possible. Optimize loading a DF/DI mode value
+ into an address register from a constant memory address.
+ (addsi3): Provide alternative which doesn't require a matching
+ inout operand.
+ (return): Optimize consecutive return instructions.
+
+Mon Apr 7 17:30:35 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * mips/iris5.h (SUBTARGET_CC1_SPEC): Define.
+ (LINK_SPEC, STARTFILE_SPEC): Support -static.
+ * mips/iris6.h (SUBTARGET_CC1_SPEC): Define.
+ (STARTFILE_SPEC, LINK_SPEC): Support -static.
+ * mips.h: (SUBTARGET_CC1_SPEC): Define.
+ (CC1_SPEC): Add subtarget_cc1_spec.
+ (EXTRA_SPECS): Add subtarget_cc1_spec.
+
+Sun Apr 6 12:24:53 1997 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * arm.md (incscc): Use a match_operand with cc_register to match
+ the condition code register.
+ (decscc, *condbranch, *condbranch_reversed, *mov_scc): Likewise.
+ (*mov_negscc, *mov_notscc, *cond_return): Likewise.
+ (*cond_return_inverted, *ior_scc, *cond_move): Likewise.
+ (insv): New expand.
+ (andsi_notsi_si): Renamed from *andsi_notsi_si.
+ (andsi_not_shiftsi_si): New insn.
+ (*minmax_arithsi): Don't match this insn if operand1 is an
+ eliminable register.
+ ({sin,cos}*): Delete, since the ARM always emulates these its
+ faster to call a library function.
+ (movsicc, *movsicc_insn): Make operand0 an s_register_operand,
+ and operand3 an arm_not_operand. Use cc_register to match the
+ condition code register.
+ (mov[sd]fcc*): Make operand[0,2] s_register_operands, and operand3
+ the nonmemory_operand. Use cc_register to match the condition
+ code register.
+ (*ifcompare_plus_move): Move before *ifcompare_arith_move. Just do
+ a split for the output.
+ (*ifcompare_move_plus): Similarly, but relative
+ to *ifcompare_move_arith.
+ (*if_plus_move, *if_move_plus): New patterns.
+ (*ifcompare_arith_arith): Simplify the alternatives down to just one,
+ and split the insn before output.
+ (*if_arith_arith, *if_arith_move, *if_move_arith): New patterns.
+ (*ifcompare_move_not, *ifcompare_not_move): Simplify and split the
+ insn before output.
+ (*if_move_not, *if_not_move): New patterns.
+ (*ifcompare_shift_move, *ifcompare_move_shift): Simplify and split the
+ insn before output.
+ (*if_shift_move, *if_move_shift): New patterns.
+ (*ifcompare_shift_shift): Simplify and split the insn before output.
+ (*if_shift_shift): New pattern.
+ (*ifcompare_not_arith, *ifcompare_arith_not): Simplify and split the
+ insn before output.
+ (*if_not_arith, *if_arith_not): New patterns.
+ (*ifcompare_neg_move, *ifcompare_move_neg): Simplify and split the
+ insn before output.
+ (*if_neg_move, *if_move_neg): New patterns.
+
+Sat Apr 5 20:17:43 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/sol-ci.asm (_environ): Don't make _envrion a common
+ variable, the lastest assembler doesn't let common variables also
+ be a weak symbol.
+
+Fri Apr 4 18:30:12 1997 Jim Wilson <wilson@cygnus.com>
+
+ * rs6000.md (adddi3): Use non_short_cint_operand instead of
+ non_add_cint_operand.
+
+Thu Apr 3 15:08:39 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.c (can_use_return_insn): Add size of fixed stack space
+ for function calls into the size of the frame.
+ (expand_prologue, expand_epilogue): Likewise.
+ (initial_offset): Corresponding changes..
+ * mn10300.h (OUTGOING_REG_PARM_STACK_SPACE): No longer define.
+ (STACK_POINTER_OFFSET): Define.
+ * mn10300.md (call, call_value expanders): Don't adjust the stack
+ pointer here anymore.
+
+ * mn10300.md (ashlsi3): Remove some alternatives which are no longer
+ needed or desired.
+
+Thu Apr 3 15:06:53 1997 Jim Wilson <wilson@cygnus.com>
+
+ * local-alloc.c (no_conflict_p): Reject sequences with foreign insns.
+
+ * combine.c (move_deaths): Handle partial REG_DEAD note for
+ multi-reg hard register.
+
+ * function.c (expand_function_start): Emit queue after expanding
+ each dynamic parameter type.
+
+ * mips.c (mips_move_2words): Add SIGN_EXTEND support for SYMBOL_REF,
+ LABEL_REF, and CONST operands.
+
+ * dwarf2out.c: Delete comment referring to README.DWARF.
+
+Wed Apr 2 17:21:23 1997 Jim Wilson <wilson@cygnus.com>
+
+ * rs6000.md (ashrdi3_power): Mark alternative 0 as early_clobber
+ output.
+
+ * rs6000.md (abssi3_nopower define_split): Switch operands of MINUS.
+ (nabssi3_nopower define_split): Likewise.
+
+Tue Apr 1 19:30:01 1997 Mike Stump <mrs@cygnus.com>
+
+ * libgcc2.c (find_exception_table): Fix to logic to deal with
+ functions that are in their own section, such as template
+ instantiations, that cause overlapping EH tables.
+
+Tue Apr 1 17:16:22 1997 Jeffrey A Law (law@cygnus.com)
+
+ * Makefile.in (USER_H): Add va-mn10300.h
+
+ * ginclude/stdarg.h: Include va-mn10300.h.
+ * ginclude/varargs.h: Likewise.
+ * ginclude/va-mn10300.h: New file.
+ * mn10300.c (expand_prologue): If current_function_varargs is nonzero,
+ flush d0/d1 back into stack.
+ (mn10300_builtin_saveregs): New function.
+ (function_arg, function_arg_partial_nregs): New functions.
+ (initial_offset): Tweak now that the RP save area is allocated
+ and deallocated around each call again.
+ * mn10300.h (FIRST_PARM_OFFSET): Now 4.
+ (FRAME_POINTER_REQUIRED): Require frame pointer for all non-leaf fcns.
+ (REG_PARM_STACK_SPACE): Now 8 bytes.
+ (FUNCTION_ARG_REGNO_P): Update for new parameter passing conventions.
+ (CUMULATIVE_ARGS, INIT_CUMULATIVE_ARGS): Likewise.
+ (FUNCTION_ARG_ADVANCE, FUNCTION_ARG): Likewise.
+ (FUNCTION_ARG_PARTIAL_NREGS): Likewise.
+ (TRAMPOLINE_TEMPLATE): Don't clobber d0 anymore.
+ (TRAMPOLINE_SIZE, INITIALIZE_TRAMPOLINE): Corresponding changes.
+ (EXPAND_BUILTIN_SAVEREGS): Define.
+ * mn10300.md (call, call_value patterns): Allocate and deallocate
+ stack slot for return pointer around each call.
+
+ * mn10300.h (RTX_COSTS): Refine.
+ (CASE_VALUES_THRESHHOLD, NO_FUNCTION_CSE): Likewise.
+ * mn10300.c (output_tst): New function.
+ * mn10300.md (movdi, movdf): Improve code to load constants into regs.
+ (tst insns): Use output_tst to optimize some cases. Add versions to
+ encourage more zero extensions instead of sign extensions of HImode
+ and QImode values.
+ (divsi3, udivsi3): Remove patterns. Replaced by...
+ (divmodsi4, udivmodsi4): New expanders/patterns.
+ (andsi3): Optimize "and" operations with certain constants.
+
+Tue Apr 1 09:14:29 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.h: (ADJUST_COSTS): Define.
+
+Fri Mar 28 17:46:13 1997 Jim Wilson <wilson@cygnus.com>
+
+ * Makefile.in (LANGUAGES): Add gcov.
+ (OBJS): Add profile.o.
+ (STAGESTUFF): Add gcov.
+ (profile.o, gcov.o, gcov): Add rules to build them.
+ (install-common): Install gcov.
+ * combine.c (distribute_notes): Handle REG_BR_PROB and REG_EXEC_COUNT
+ REG_NOTES.
+ * sparc.h (OVERRIDE_OPTIONS): Check profile_arc_flag.
+ * final.c (LONG_TYPE_SIZE): Define.
+ (count_instrumented_arcs): New variable.
+ (end_final, profile_after_prologue, leaf_function_p): Add support
+ for profile_arc_flag.
+ (add_bb): Only call CC_STATUS_INIT if HAVE_cc0.
+ * flags.h (profile_arc_flag, flag_test_coverage,
+ flag_branch_probabilities): Declare.
+ * function.c (expand_function_end): Output NOTE_REPEATED_LINE_NUMBER
+ for last line of function.
+ * integrate.c (expand_inline_function): Output
+ NOTE_REPEATED_LINE_NUMBER after inlined call.
+ * jump.c (jump_optimize, follow_jumps, mark_jump_label): Disable some
+ optimizations when flag_test_coverage and there is a line number note
+ in the way.
+ (invert_jump): Add REG_BR_PROB when flag_branch_probabililties.
+ * libgcc2.c (__bb_exit_func): Support gcov style output.
+ * reorg.c (mostly_true_jump): Use REG_BR_PROB notes when
+ flag_branch_probabilities.
+ * rtl.c (note_insn_name): Add NOTE_REPEATED_LINE_NUMBER.
+ (reg_note_name): Add REG_BR_PROB and REG_EXEC_COUNT.
+ * rtl.h (enum reg_note): Add REG_BR_PROB and REG_EXEC_COUNT.
+ (REG_BR_PROB_BASE): Define.
+ (NOTE_REPEATED_LINE_NUMBER): Define.
+ * sched.c (update_flow_info): Handle REG_EXEC_COUNT and REG_BR_PROB
+ notes.
+ * toplev.c (branch_prob_dump, profile_arc_flag, flag_test_coverage,
+ flag_branch_probabilities, branch_prob_dump_file, branch_prob_time):
+ New variables.
+ (f_options): Add profile-arcs, test-coverage, and
+ branch-probabilities.
+ (compile_file): Set branch_prob_time. Pass flag_test_coverage to
+ init_emit_once. Handle branch_prob_dump. Call init_branch_prob.
+ Call end_branch_prob. Call output_func_start_profiler.
+ (rest_of_compilation): Handle branch_prob_dump. Call new
+ branch_prob pass.
+ (main): Set branch_prob_dump.
+ * gcov.c, profile.c, gcov-io.h, gcov.texi: New files.
+
+Thu Mar 27 16:52:52 1997 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.h (CPP_CPU_DEFAULT): Define if TARGET_CPU_DEFAULT is not set.
+ * i386.h (STACK_BOUNDARY): Define to always be 32.
+
+ From J"orn Rennecke <amylaar@cygnus.co.uk>
+ * i386.md: (zero_extendhisi2+[12]): Use true_regnum instead of
+ REGNO for operand 0.
+ (zero_extendqisi2+3): Use reg_overlap_mentioned_p instead of REGNO
+ comparison; use true_regnum instead of REGNO for rtx generation.
+
+Wed Mar 26 12:34:21 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * reload1.c (reload): Call reload_cse_regs.
+ (reg_values): New static variable.
+ (reload_cse_invalidate_regno): New static function.
+ (reload_cse_mem_conflict_p): New static function.
+ (reload_cse_invalidate_mem): New static function.
+ (reload_cse_invalidate_rtx): New static function.
+ (reload_cse_regs): New static function.
+ (reload_cse_regno_equal_p): New static function.
+ (reload_cse_noop_set_p): New static function.
+ (reload_cse_simplify_set): New static function.
+ (reload_cse_check_clobbered): New static variable.
+ (reload_cse_check_src): New static variable.
+ (reload_cse_check_clobber): New static function.
+ (reload_cse_record_set): New static function.
+
+Wed Mar 26 07:34:06 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * ginclude/stdarg.h (__va_copy): New definition.
+
+Tue Mar 25 13:43:36 1997 Michael Meissner <meissner@cygnus.com>
+
+ * gcc.c (init_spec): If -v, print out that the default spec values
+ were being used. Fix prototype to reflect no arguments.
+ (set_spec): If specs has not been set, set it up with the default
+ specs.
+ (read_specs): Move to later in the file so that startfile_prefixes
+ has been declared. Process "%include <file>" to include another
+ specs file, aborting if the file can't be found. Process
+ "%include_noerr <file>: to include another specs file, giving no
+ error if the file can't be found. Process "%rename var1 var2" to
+ rename a specs variable. Take new argument that indicates whether
+ we are processing the main file. Only process % commands if this
+ is not the main specs file. Change callers.
+ (main): Do not call init_spec if a specs file was found.
+ (set_spec,read_specs,do_spec_1): If DEBUG_SPECS is defined, print
+ debug information.
+
+Tue Mar 25 14:43:58 1997 Doug Evans <dje@cygnus.com>
+
+ * expr.c (emit_push_insn): Delete emission of CLOBBER
+ when doing partial push, no longer necessary.
+
+ * c-decl.c (grokdeclarator): Pedwarn qualified void function return
+ type.
+
+Tue Mar 25 14:28:15 1997 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * reload.c (find_dummy_reload): New parameter earlyclobber. If set
+ then don't use IN for the reload if it also appears elsewhere in
+ the insn. All callers changed.
+
+Tue Mar 25 13:20:18 1997 J.T. Conklin <jtc@cygnus.com>
+
+ * m68k/lb1sf68.asm (udivsi3): Fix hunk from previous patch that
+ did not apply correctly.
+
+ * m68k.md (tablejump): Use extl to explicitly sign extend
+ index registeron TARGET_5200.
+ * m68k/{apollo68.h,coff.h,linux.h,mot3300.h,pbb.h}
+ (ASM_RETURN_CASE_JUMP): Likewise.
+
+ * m68k.md (mulsi3): Changed into define_expand. Split insn into
+ m68k and coldfire specific versions with appropriate constraints.
+
+ * m68k.md (movqi): Disable use of address registers for
+ TARGET_5200.
+
+ * m68k/lb1sf68.asm (__modsi3, __umodsi3): Use mulsl instruction
+ instead of __mulsi3 function call on the coldfire.
+
+ * m68k.md (bne0_di): Fix typo in last change.
+
+ * m68k.md (xorsi3_5200): Correct constraints.
+
+ * m68k.c (output_move_{si,hi,qi}mode): New functions.
+ * m68k.h (output_move_{si,hi,qi}mode): Declare.
+
+ * m68k.md (move{si,hi,qi,di}): Changed into define_expands. Split
+ insns into m68k and coldfire specific versions with appropriate
+ constraints.
+
+Tue Mar 25 12:18:41 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * Makefile.in (GCC_PASSES): Revert previous change; use cc1$(exeext).
+
+Mon Mar 24 16:12:20 1997 Doug Evans <dje@cygnus.com>
+
+ * m32r/*: New files.
+ * config.sub: Add m32r.
+ * configure: Add m32r.
+ * longlong.h: Add m32r support.
+ * ginclude/{stdarg.h,varargs.h}: Add m32r support.
+ * ginclude/va-m32r.h: New file.
+
+Mon Mar 24 15:53:15 1997 Joel Sherrill <joel@OARcorp.com>
+
+ * rs6000/rtems.h: Change to a near clone of the powerpc-eabi target.
+ * configure (powerpc*-*-rtems): Move before GNU/Linux configuration.
+
+Mon Mar 24 14:26:37 1997 Gavin Koch <gavin@cygnus.com>
+
+ * ginclude/va-mips.h: For little endian, eabi, objects
+ less than __va_reg_size are passed in registers.
+
+Fri Mar 21 00:48:02 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.c (print_operand): Handle 'N'.
+
+ * mn10300.c (expand_epilogue): Correctly handle functions
+ with large frames, but no callee register saves.
+
+ * mn1300.md (movdf, movdi): Handle overlapping moves.
+
+ * pa.c (compute_movstrsi_length): Handle residuals correctly.
+
+Thu Mar 20 13:53:30 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.c (easy_fp_constant): If -mrelocatable, consider all fp
+ constants to be hard.
+
+Mon Mar 20 13:53:30 1997 Jim Wilson <wilson@cygnus.com>
+
+ * rs6000.md (movdf/movsf define_splits): Add SUBREG support.
+
+ * rs6000.c (fp_reg_or_mem_operand): Delete.
+ * rs6000.h (PREDICATE_CODES): Remove fp_reg_or_mem_operand.
+ (fp_reg_or_mem_operand): Delete declaration.
+ * rs6000.md (movsf_hardfloat): Use nonimmediate_operand instead
+ of fp_reg_or_mem_operand.
+
+Thu Mar 20 08:52:27 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.md (cmpsi): Handle comparing a register with
+ itself by adding zero to the reg. Z bit for such an insn is
+ inverted.
+ * mn10300.c (notice_update_cc): Handle CC_INVERT.
+
+ * pa.c (emit_move_sequence): Don't lose for a secondary reload
+ to the SAR register if the input is a MEM with an offset that won't
+ fit in 14bits.
+
+Wed Mar 19 17:10:44 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m68k/linux.h (ASM_OUTPUT_MI_THUNK): Define.
+
+Wed Mar 19 16:59:34 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c, cpplib.c (do_error, do_warning): Fix memory leak.
+
+ * cccp.c (output_line_directive): Do not output negative line
+ numbers when analyzing directives like `#line 0'.
+
+ * cexp.y (parse_number, yylex), cccp.c (rescan), cpplib.c
+ (cpp_get_token): Unless -lang-c89 is specified, allow C9X-style
+ hexadecimal floating-point numbers as preprocessor numbers.
+ * cccp.c (c89): New decl.
+ (main): Set it to 1 if -lang-c89.
+ * cpplib.h (struct cpp_options): New member c89.
+ (CPP_C89): New macro.
+ * cpplib.c (unsafe_chars): `p' is unsafe before `-' or `+', since it
+ might generate a C9X-style hexadecimal floating-point number.
+ (cpp_handle_options): Set c89 option to 1 if -lang-c89.
+
+Tue Mar 18 17:05:57 1997 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.h (STACK_BOUNDARY): Determine according to TARGET_ALIGN_DOUBLE.
+
+ * i386.c (override_options) Make the default alignment 4 for 486,
+ otherwise 2.
+
+ * i386/freebsd-elf.h (CPP_SPEC): Remove TARGET_CPU_DEFAULT reference.
+ * i386/linux{,-aout,-oldld}.h (CPP_SPEC): Likewise.
+
+ * i386/go32.h (DBX_DEBUGGING_INFO, PREFERRED_DEBUGGING_TYPE,
+ NO_STAB_H, ASM_FILE_START, DBX_BLOCKS_FUNCTION_RELATIVE,
+ DBX_FUNCTION_FIRST, DBX_OUTPUT_MAIN_SOURCE_FILE_END,
+ ASM_OUTPUT_SOURCE_LINE): Added to support stabs.
+ (ASM_OUTPUT_SECTION_NAME): Support section attribute.
+
+Tue Mar 18 16:12:28 1997 Jim Wilson <wilson@cygnus.com>
+
+ * final.c (shorten_branches): Split all insns before computing insn
+ lengths.
+ (final_scan_insn, case default): If HAVE_ATTR_length defined, call
+ abort for any insn that has a '#' output template.
+
+ * expr.c (emit_group_load): Call operand_subword instead of creating
+ an explicit SUBREG.
+
+ * reload1.c (reload_reg_free_before_p, case
+ RELOAD_FOR_OPERAND_ADDRESS): Conflicts with RELOAD_FOR_OPADDR_ADDR
+ reloads.
+
+ * configure (alpha-dec-osf[23456789]*): Use install-headers-cpio
+ for osf4.
+
+ * gcc.c (init_spec): Delete parameter. Always initialize extra_specs.
+ (process_command, main): Change all callers.
+
+ * combine.c (if_then_else_cond): Call copy_rtx to prevent sharing.
+
+Tue Mar 18 14:59:12 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * function.c (assign_parms): Add a REG_EQUIV note to the
+ instruction which copies a parameter into a pseudo-register
+ whenever there is an associated stack slot, even if the parameter
+ actually arrived in a register.
+
+Tue Mar 18 14:24:48 1997 Doug Evans <dje@cygnus.com>
+
+ * configure (alpha-dec-osf[23]): Separate osf[23] case.
+ * alpha.h (LIB_SPEC): -lprof1 requires -lpdf for OSF 4.
+ * alpha/osf2or3.h: New file.
+
+Tue Mar 18 11:32:10 1997 Jeffrey A Law (law@cygnus.com)
+
+ * m68k.c (m68k_last_compare_had_fp_operands): New variable.
+ * m68k.h (m68k_last_compare_had_fp_operands): Declare it.
+ * m68k.md (tst*, cmp*): Turn into define_expand/define_insn pairs.
+ Keep track of whether test/compare has fp operands.
+ (seq, sne, sgt, slt, sge, sle): Turn into define_expand/define_insn
+ pairs. Make expanders FAIL if TARGET_68060 and last comparison/test
+ had fp operands.
+
+Tue Mar 18 04:29:29 1997 Richard Earnshaw <rearnsha@armltd.co.uk>
+
+ * arm.md (movhi): Handle generation of large constants during
+ and after reload.
+
+Mon Mar 17 17:30:24 1997 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * gmicro.h (RETURN_POPS_ARGS): Make sure FUNDECL is non-nil
+ before we try to use it.
+ * m68k.h (RETURN_POPS_ARGS): Likewise.
+ * ns32k.h (RETURN_POPS_ARGS): Likewise.
+ * pyr.h (RETURN_POPS_ARGS): Likewise.
+
+Mon Mar 17 17:13:44 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * stor-layout.c (layout_record, PCC_BITFIELD_TYPE_MATTERS):
+ Only add padding if a bit field would otherwise span more units
+ of alignment than its base type.
+
+Mon Mar 17 17:03:55 1997 J.T. Conklin <jtc@cygnus.com>
+
+ * m68k.md (beq0_di, bne0_di, bge0_di, blt0_di): Use cmpw #0
+ instead of tstl when testing address registers on the 68000.
+
+ * m68k/lb1sf68.asm: Fix prologues/epilogues to deal with the lack
+ of predecrement/postincrement addressing modes in the coldfire
+ moveml instruction.
+
+Mon Mar 17 17:00:14 1997 Scott Christley <scottc@net-community.com>
+
+ * Fix long standing bug where first method call for a class could
+ result in a garbled stack or produce an incorrect return value.
+ * objc/sendmsg.c (__objc_block_return): Remove function.
+ (__objc_word_return, __objc_double_return): Remove functions.
+ (__objc_get_forward_imp): New function.
+ (__objc_init_dispatch_tables): Install zero instead of
+ __objc_init_install_dtable.
+ (__objc_init_install_dtable): No longer call the method but
+ allow objc_msg_lookup return it for normal execution.
+ (obj_msg_lookup): Differentiate between when a method isn't
+ implemented and when the dispatch table needs to be installed.
+ Return the IMP when the dispatch table is installed versus
+ having __objc_init_install_dtable call it.
+ (get_imp): Install dispatch table if needed and return IMP
+ from the newly installed dispatch table.
+ (__objc_responds_to): Install dispatch table if needed before
+ checking if method is implemented.
+
+Mon Mar 17 16:29:38 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * tree.c (build_{index,range}_type): Ensure expressions for min
+ and max value are in same obstack as type.
+
+Mon Mar 17 15:44:18 1997 Pat Rankin <rankin@eql.caltech.edu>
+
+ * cccp.c [#if VMS] (O_RDONLY, O_WRONLY): Delete (redundant).
+ (BSTRING): Delete (obsolete; usage occurs prior to definition).
+ (do_include): Handle old VAX C style includes better.
+
+Mon Mar 17 13:46:47 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cexp.y, cppexp.c (parse_number): Invalid integer constants are
+ errors if pedantic.
+ * cexp.y (yylex): Invalid multibyte characters are errors if pedantic.
+ * cppexp.c (cpp_lex): Likewise.
+ * cppexp.c (cpp_parse_escape): Character constants that do not fit are
+ errors if pedantic.
+
+ * c-parse.in (expr_no_commas): Do not store temporary
+ skip_evaluation increments on yacc value stack.
+
+Sun Mar 16 19:54:49 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expr.c (expand_expr, case PLACEHOLDER_EXPR): Refine which
+ object is picked.
+
+Sun Mar 16 15:45:45 1997 Jeffrey A Law (law@cygnus.com)
+
+ * loop.c (strength_reduce): Adjust BENEFIT appropriately if an
+ autoincrement memory reference will eliminate add insns.
+
+Sun Mar 16 08:41:40 1997 Scott Christley <scottc@net-community.com>
+
+ * i386.md (untyped_call): Re-enable code.
+ * objc/sendmsg.c (__objc_block_return): New function.
+ (__objc_word_return, __objc_double_return): New functions.
+ (__objc_init_install_dtable): Call appropriate return function
+ based upon method type.
+ * objc/thr-pthreads.c: Correct include path.
+
+Sat Mar 15 07:58:33 1997 Scott Christley <scottc@net-community.com>
+
+ * objc-act.c (OBJC_VERSION): Increment version.
+ * objc/init.c (OBJC_VERSION): Likewise.
+
+Sat Mar 15 07:58:00 1997 Ovidiu Predescu <ovidiu@net-community.com>
+
+ * Implement +load.
+ * objc/init.c (objc_send_load, __objc_send_load): New functions.
+ (__objc_send_message_in_list): New function.
+ (__objc_force_linking): New function.
+ (__objc_exec_class): Don't call _objc_load_callback here.
+ * objc/linking.m: New file.
+ * objc/sendmsg.c (class_add_method_list): Check for the +load method
+ when adding a methods list to a class.
+ * objc/Makefile (OBJC_O): Add linking.m.
+
+ * Allow methods defined in categories to override methods that are
+ defined in the class implementation.
+ * objc/sendmsg.c (__objc_install_methods_in_dtable): New function.
+ (class_add_method_list): Don't check anymore for duplicate methods.
+
+ * config/nextstep.h (INCLUDE_DEFAULTS): Define to something useful
+ when cross-compiling.
+
+ * The static instances list moved from the objc_module struct to
+ objc_symtab struct, at the end of defs array. This now allows the NeXT
+ gdb to work with binaries generated for the GNU ObjC runtime.
+ * objc-act.c (build_objc_symtab_template): Make sure
+ defs in objc_symtab is a NULL terminated array.
+ (init_def_list): Attach statics to end of def list.
+ (init_objc_symtab): Take statics list into account.
+ (init_module_descriptor, build_module_descriptor): Don't add statics.
+ (generate_static_references): Indicate that statics are used.
+ (finish_objc): Process statics in the beginning.
+ * objc/objc-api.h (objc_module): Eliminate statics variable.
+ * objc/init.c (__objc_exec_class): Access statics from their
+ new place in the defs variable.
+
+Sat Mar 15 07:29:15 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * reload.c: Include expr.h.
+ (find_reloads_address, find_reloads_address_1): New argument INSN.
+ (find_reloads_address_1): Reload inside of p{re,ost}_{in,de}c
+ instead of entire p{re,ost}_{in,de}c where appropriate.
+ * Makefile.in (reload.o): Added expr.h to dependencies list.
+
+Sat Mar 15 07:17:12 1997 Richard Henderson <rth@tamu.edu>
+
+ * reload.h (eliminate_regs): Add STORING arg.
+ * reload1.c (eliminate_regs): Likewise.
+ (eliminate_regs, case SET): Pass that we are storing to recursive call.
+ (eliminate_regs, case SUBREG): If storing and same number of words,
+ use larger mode.
+ * caller-save.c, dbxout.c, dwarfout.c, dwarf2out.c, reload.c, sdbout.c:
+ Change all calls to eliminate_regs.
+
+Fri Mar 14 14:18:49 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * cplus-dem.c: Add prototypes for all static functions.
+ (mystrstr): Make static. Make arguments and result const.
+ (cplus_match): Remove; not used.
+
+Fri Mar 14 10:15:35 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.c (const_costs): Remove unused function.
+ * mn10300.h (CONST_COSTS): Rework to generate better code.
+
+ * mn10300.c (print_operand): Handle 'H' and 'L' output
+ modifers for high/low part of a 64bit value.
+ * mn10300.h (CONST_DOUBLE_OK_FOR_LETTER_P): Handle 'G'
+ (LEGITIMATE_CONSTANT_P): Allow any constant.
+ * mn10300.md (movdi, movdf): Implement.
+ (adddi3, subdi3): New expanders and patterns.
+
+ * mn10300.c (print_operand): Handle 'A' modifier for an
+ address which can't be simple register indirect.
+ * mn10300.h (EXTRA_CONSTRAINT): Handle 'R' for bit ops.
+ * mn10300.md: Add patterns to test, set and clear bitfields.
+
+ * mn10300.c (can_use_return_insn): New function.
+ (expand_epilogue): Emit a RETURN insn if possible.
+ * mn10300.md (return): New pattern.
+
+ * mn10300.h (CONST_OK_FOR_LETTER_P): Handle 'N'.
+ * mn10300.md (andsi3): Catch "and 255,dn" and "and 65535,dn"
+ which were not turned into zero_extend patterns.
+
+ * mn10300.h (GO_IF_LEGITIMATE_ADDRESS): Handle symbolic
+ constant as an index/base too.
+
+ * mn10300.md (movsi): Allow SP to be loaded/saved with
+ reg+d8 addresses.
+
+ * mn10300.md (cmpsi): Allow second operand to be a constant.
+ (subsi3): Likewise.
+
+ * mn10300.md (sign extension patterns): Fix thinko when
+ extending from memory.
+
+ * mn10300.md (tst peepholes): Add peepholes for test/branch
+ based on N bit being set/clear and the data value being tested dies.
+
+Tue Mar 11 17:07:51 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.c (expand_prologue): Rework so that eliminating
+ the frame pointer produces faster/smaller code.
+ (expand_epilogue): Likewise.
+ (initial_offset): New function for argument pointer and frame pointer
+ elimination.
+ * mn10300.h (FIRST_PSEUDO_REGISTER): Bump to 10.
+ (FIXED_REGISTERS): Add argument pointer register, it's a fake fixed
+ register.
+ (CALL_USED_REGISTERS, REG_ALLOC_ORDER): Corresponding changes.
+ (REGNO_REG_CLASS, REG_CLASS_CONTENTS): Likewise.
+ (REG_OK_FOR_BASE_P, REGISTER_NAMES): Likewise.
+ (reg_class, REG_CLASS_NAMES): Delete unwanted DATA_OR_SP_REGS class.
+ (PREFERRED_OUTPUT_RELOAD_CLASS): Define.
+ (FIRST_PARM_OFFSET): No longer include register save area in
+ computation.
+ (STACK_POINTER_REGNUM): Is now register 9.
+ (ARG_POINTER_REGNUM): Is now register 8.
+ (FRAME_POINTER_REQUIRED): Refine.
+ (ELIMINABLE_REGS, INITIAL_ELIMINATION_OFFSET): Define.
+ (CAN_DEUG_WITHOUT_FP): Define.
+ * mn10300.md (return_internal): Break into two patterns.
+
+ * mn10300.h (CONST_OK_FOR_LETTER_P): Handle 'M' too.
+ (REGISTER_MOVE_COST): Fix errors and refine.
+
+ * mn10300.c (notice_update_cc): SET_ZN_C0 insns leave the
+ overflow bit in an unuseable state. Rename CC_SET to CC_TST.
+ * mn10300.md (cc attributes): "set" is gone, replaced by
+ "tst". Update attributes on various insns.
+
+ * mn10300.md: Improve sign and zero extension instructions.
+ (ashlsi3): Improve. Handle address registers too.
+ (add peephole): Combine two consecutive adjustments of a register
+ into a single adjustment.
+
+Tue Mar 11 17:18:40 1997 Brendan Kehoe <brendan@melange.gnu.ai.mit.edu>
+
+ * cplus-dem.c (gnu_special): Call demangled_fund_type for other
+ __t* symbols.
+
+Mon Mar 10 16:10:34 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * emit-rtl.c (subreg_lowpart_p): Return 0 if SUBREG_REG is VOIDmode.
+ * combine.c (simplify_rtx, case SUBREG): Fix direction of test when
+ calling operand_subword; use inline code intead of subreg_lowpart_p.
+
+Fri Mar 7 09:22:28 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.c (expand_{pro,epi}logue): Rework to avoid
+ unnecessary "add" operations.
+ (expand_epilogue): Likewise.
+ * mn10300.h (STARTING_FRAME_OFFSET): Is zero after the last
+ round of prologue/epilogue changes.
+ (FIRST_PARM_OFFSET): Is now 16 (-4 for REG_PARM_STACK_SPACE + 20 for
+ register save area).
+ (REG_PARM_STACK_SPACE): Define as 4 bytes.
+ (OUTGOING_REG_PARM_STACK_SPACE): Define so caller allocates it.
+ * mn10300.md (call{,_value} expander): Don't emit insns to adjust the
+ stack here anymore.
+
+ * mn10300.md (bCC patterns): Just use "bCC target".
+
+Tue Mar 4 13:21:41 1997 Jim Wilson <wilson@cygnus.com>
+
+ * rs6000.md (movsi): Don't emit a USE insn for LABEL_REFs.
+
+Thu Mar 6 16:29:13 1997 Jim Wilson <wilson@cygnus.com>
+
+ * dwarf2out.c (modified_type_die): Initialize item_type to NULL.
+ Move equate_type_number_to_die call before use of sub_die, and move
+ recursive modified_type_die calls on item_type after it.
+
+ * dwarfout.c (root_type_1, write_modifier_bytes_1): New functions.
+ (root_type): Call root_type_1.
+ (write_modifier_bytes): Call write_modifier_bytes_1.
+ (output_type, case POINTER_TYPE): Set TREE_ASM_WRITTEN before
+ recursive call.
+
+Wed Mar 5 14:30:49 1997 Torbjorn Granlund <tege@quiet.matematik.su.se>
+
+ Partially undo Jan 11 changes (nor takes only register ops):
+ * mips.md (*norsi3_const, *nordi3_const): Delete bogus patterns.
+ * mips.c (complemented_arith_operand): Delete function.
+ (print_operand): Don't handle `e' for CONST_INT.
+ * mips.h (PREDICATE_CODES): Delete complemented_arith_operand.
+
+Tue Mar 4 16:38:13 1997 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * i386.c (i386_return_pops_args): Make sure FUNDECL is non-nil
+ before we try to use it.
+ * i386/{isc,next,sco,sco5,scodbx}.h (RETURN_POPS_ARGS): Likewise.
+
+Mon Mar 3 20:17:54 1997 Gavin Koch <gavin@cygnus.com>
+
+ * ginclude/va-mips.h: __mips_single_float should have
+ the same effect on vararg lists as __mips_soft_float.
+
+Mon Mar 3 18:12:01 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000.h (DBX_CONTIN_LENGTH): Undo 2/26 change.
+
+Mon Mar 3 13:08:20 1997 Jeffrey A Law (law@cygnus.com)
+
+ * combine.c (simplify_rtx): Do nothing with (truncate:mode) if
+ mode is a partial integer mode.
+
+Sun Mar 2 17:41:18 1997 Ulrich Drepper <drepper@cygnus.com>
+
+ * ginclude/varargs.h: Add definition of __va_copy.
+ * va-alpha.h, va-clipper.h, va-h8300.h, va-i860.h: Likewise.
+ * va-i960.h, va-m88k.h, va-mips.h, va-pa.h, va-ppc.h: Likewise.
+ * va-sh.h, va-sparc.h, va-spur.h: Likewise.
+
+Sun Mar 2 13:25:49 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-typeck.c (process_init_element): Warn and truncate if upper
+ bound of index is out of range.
+
+Fri Feb 28 16:08:47 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/sol-c0.c (_start): Disable loading up r13 and r2 with the
+ SDA base registers for now.
+
+ * rs6000.md (movsi): Emit a USE insn when putting the
+ label of constants into the TOC, so that the constant is still
+ emitted when expensive optimizations are used.
+
+Thu Feb 27 17:54:42 1997 Karl Heuer <kwzh@gnu.ai.mit.edu>
+
+ * fixinc.ptx: Fix sed expression looking for <sys/types.h> in pwd.h.
+
+Thu Feb 27 12:11:16 1997 Dennis Glatting <dennis.glatting@plaintalk.bellevue.wa.us>
+
+ * fixincludes: Remove more cases of __const__ from math.h on NeXT.
+
+Wed Feb 26 14:52:27 1997 Michael Meissner <meissner@cygnus.com>
+
+ * reload.c (debug_reload): Remove extra argument to fprintf.
+ * rs6000.c (output_toc): Make fprintf calls type correct.
+
+ * rs6000.h (DBX_CONTIN_LENGTH): Define as 4000 to avoid AIX
+ assembler line limit.
+
+Mon Feb 24 17:56:17 1997 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * fixincludes: Fix need of prototypes for C++ in rpc/xdr.h on SunOS4.
+
+Mon Feb 24 17:33:57 1997 Michael Meissner <meissner@cygnus.com>
+
+ * rs6000/xm-sysv4.h (HAVE_STRERROR): Define.
+
+Sun Feb 23 17:18:28 1997 Jim Wilson <wilson@cygnus.com>
+
+ * rs6000.md (floatsidf2_loadaddr): Correct syntax for cau instruction.
+ (load_multiple, store_multiple): Call change_address instead of
+ creating MEM from scratch.
+
+Thu Feb 20 16:39:15 1997 Jim Wilson <wilson@cygnus.com>
+
+ * unroll.c (unroll_loop): Add check for naive loop that ends with
+ conditional branch that does not branch back to loop start.
+
+ * reload1.c (reload): Move assign_stack_local call into main loop.
+
+Thu Feb 20 11:40:46 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.md (zero extension patterns): Turn into define_expand and
+ define_insn pair.
+
+Wed Feb 19 17:05:38 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (emit_move_sequence): Don't copy 0.0 (double precision)
+ directly to memory, go through a reg if reload hasn't started.
+ * pa.md (main movdf pattern): Don't allow 0.0 (double precision)
+ to be copied directly to memory.
+
+ * pa/pa-hpux10.h (MD_EXEC_PREFIX): Define appropriately for hpux10.
+ (MD_STARTFILE_PREFIX): Similarly.
+
+ * pa.h (ASM_OUTPUT_SECTION_NAME): Surround the section name
+ with '$' if not using GAS.
+
+Wed Feb 19 16:43:47 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sched.c (schedule_insns): If there was no first scheduling pass,
+ split instructions after reload.
+ (update_flow_info): Tolerate some idiosyncrasies after reload.
+
+Wed Feb 19 11:13:51 1997 Jeffrey A Law (law@cygnus.com)
+
+ * combine.c (find_split_point): Don't turn a SIGN_EXTEND into
+ a series of shifts if either mode is a partial integer mode.
+
+Mon Feb 17 08:06:02 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * rs6000.c ({,non_}short_cint_operand): Use (unsigned HOST_WIDE_INT).
+ (non_add_cint_operand, includes_rshift_p): Likewise.
+ * rs6000.h (CONST_OK_FOR_LETTER_P): Likewise.
+ (LEGITIMATE_ADDRESS_INTEGER_P, LEGITIMIZE_ADDRESS): Likewise.
+
+Sun Feb 16 07:55:19 1997 J"orn Rennecke (amylaar@cygnus.co.uk)
+
+ * libgcc2.c (__negdi2, __lshrdi3, __ashldi3, __ashrdi3, __ffsdi2):
+ Use ANSI style definition with full prototype.
+ (__muldi3, __udiv_w_sdiv, __udivmoddi4, __divdi3, __moddi3) : Likewise.
+ (__udivmoddi4, __udivdi3, __cmpdi2, __ucmpdi2) : Likewise.
+ (__fixunstfdi, __fixtfdi, __fixunsxfdi, __fixxfdi) : Likewise.
+ (__fixunsdfdi, __fixdfdi, __floatdixf, __floatditf) : Likewise.
+ (__floatdidf, __floatdisf, __fixunsxfsi, __fixunsdfsi) : Likewise.
+ (__gcc_bcmp, __eprintf, gopen, gclose, __bb_init_file) : Likewise.
+ (__bb_init_trace_func, __clear_cache, mprotect) : Likewise.
+ (__enable_execute_stack, cacheflush, exit) : Likewise.
+ (find_exception_table, __find_first_exception_table_match) : Likewise.
+
+Sun Feb 16 07:52:02 1997 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de)
+
+ * 1750a.md (mulqihi3): Corrected.
+ (tst{hf,tqf}): Simplified.
+ (movqi): Removed redundant alternative.
+ (addqi-3,addqi-2,addqi-1): Set/Reset Bit patterns by C. Nettleton.
+ (many patterns): Introduced operand output modifiers d,t,b,B,w.
+ * 1750a.c (print_operand): New operand output modifiers d,t,b,B,w.
+ (simple_memory_operand): Removed.
+ (one_bit_set_p, which_bit): Added from C. Nettleton's m1750 config.
+
+Sun Feb 16 07:43:37 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (special_symbol): Don't treat "L" in "L'...'" as identifier.
+ (check_macro_name, collect_expansion, rescan): Likewise.
+ * cpplib.c (special_symbol, check_macro_name, collect_expansion):
+ Likewise.
+
+ * cexp.y (parse_c_expression): Don't check for null lexptr
+ or *lexptr == 0. If yyparse returns nonzero value, abort.
+
+ * cexp.y (yylex): Use is_space, not is_hor_space, to find keyword end.
+ (is_space): New decl.
+ (is_hor_space): Removed.
+ * cccp.c (is_space): Now external.
+ (is_hor_space): Now static.
+
+Sun Feb 16 04:55:11 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * toplev.c, tree.h (decl_printable_name): Change arguments.
+ * c-common.c (declare_function_name): Reflect above change.
+ * final.c (final_start_function): Likewise.
+ * function.c (init_function_start): Likewise.
+ * toplev.c (decl_name): Likewise.
+ (announce_function): Likewise.
+ (v_message_with_decl): Likewise.
+ * dwarf2out.c (dwarf2_name): New fn, uses decl_printable_name.
+ (add_pubname): Use it.
+ (add_name_and_src_coords_attributes): Use it, add
+ DW_AT_MIPS_linkage_name if appropriate.
+ (output_aranges): Use DW_AT_MIPS_linkage_name if present.
+
+Sat Feb 15 18:45:30 1997 J.T. Conklin <jtc@cygnus.com>
+
+ * m68k.md (cmpsi): Added insn with appropriate constraints for
+ TARGET_5200; changed condition of existing insn to !TARGET_5200.
+
+Sat Feb 15 18:26:50 1997 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * m68k/hp320.h (PRINT_OPERAND_FLOAT): Removed.
+ (ASM_OUTPUT_{FLOAT,DOUBLE,LONG_DOUBLE}_OPERAND): Defined.
+ (PRINT_OPERAND): Turned off: use default.
+ * m68k/news.h (PRINT_OPERAND): Turned off: use default.
+ (ASM_OUTPUT_{FLOAT,DOUBLE,LONG_DOUBLE}_OPERAND): Defined.
+ * m68k/tower-as.h (PRINT_OPERAND): Turned off: use default.
+ (ASM_OUTPUT_{FLOAT,DOUBLE}_OPERAND): Defined.
+ * m68k/crds.h (PRINT_OPERAND): Turned off: use default.
+ (ASM_OUTPUT_{FLOAT,DOUBLE}_OPERAND): Defined.
+ (SGS_NO_LI,STRUCTURE_SIZE_BOUNDARY,IMMEDIATE_PREFIX): Defined.
+ (NEED_PROBE): Defined instead of HAVE_probe and gen_probe.
+ (FUNCTION_{PRO,EPI}LOGUE): Do not access FPA registers.
+ * m68k.c (output_function_prologue): Add CRDS and MOTOROLA probe code.
+ (print_operand): Do not output '.' if CRDS.
+
+ * gcc.c (set_spec): Fix comment-in-comment typo.
+
+Sat Feb 15 17:54:23 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * Makefile.in (COMPILERS): Moved before GCC_PASSES.
+ (GCC_PASSES): Use $(COMPILERS) instead of cc1$(exeext).
+
+Sat Feb 15 17:25:44 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * gcc.c (process_command): Allocate space for terminating null.
+
+Sat Feb 15 17:21:34 1997 Pat Rankin <rankin@eql.caltech.edu>
+
+ * vax.h (FUNCTION_PROLOGUE): Adjust size by STARTING_FRAME_OFFSET.
+ * vax/vms.h (FUNCTION_PROLOGUE): Delete.
+
+Sat Feb 15 08:48:14 1997 Douglas B. Rupp (rupp@gnat.com)
+
+ * configure: Fix setting of CC in no-symlink case.
+
+Sat Feb 15 08:42:17 1997 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de)
+
+ * expmed.c (expand_divmod): Prefer divmod in same mode over div
+ in wider mode.
+
+Sat Feb 15 08:27:50 1997 J"orn Rennecke (amylaar@cygnus.co.uk)
+
+ * fold-const.c (fold): Don't assume a nonexplicit constant cannot
+ equal an explicit one.
+
+ * i386.md (zero_extendqi[hs]i2+3): Ensure operating on REG.
+
+Sat Feb 15 08:11:04 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * configure (i[3456]86-*-solaris2*): Correct tm.h filename in
+ stabs case.
+
+ * a29k.h (STORE_FLAG_VALUE): Write so works on both 32 and 64-bit host.
+
+Fri Feb 14 16:03:37 1997 Robert Lipe <robertl@dgii.com>
+
+ * i386/t-sco5 (libgcc{1,2}-elf.a): correct target dependencies.
+
+Fri Feb 14 16:00:23 1997 H.J. Lu <hjl@gnu.ai.mit.edu>
+
+ * config/svr4.h (DBX_OUTPUT_MAIN_SOURCE_FILE_END): Set
+ current-section variable to text.
+
+Wed Feb 12 16:07:34 1997 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * fixinc.irix: New file.
+ * configure (mips-sgi-irix[56]): Set fixincludes to fixinc.irix.
+
+Wed Feb 12 15:40:20 1997 Jim Wilson <wilson@cygnus.com>
+
+ * Makefile.in (LIBGCC2_DEBUG_CFLAGS): New macro.
+ (LIBGCC2_CFLAGS): Use it.
+
+ * dwarfout.c (output_type): Do early exit only if TYPE_CONTEXT is NULL
+ or if TYPE_CONTEXT is another type (e.g. a nested type).
+
+Tue Feb 11 15:53:51 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.c (calc_live_regs): Exclude RETURN_ADDRESS_POINTER_REGNUM.
+ Need not save MACL/MACH when not live or in leaf function.
+
+Mon Feb 10 14:46:32 1997 Jeffrey A Law (law@cygnus.com)
+
+ * stmt.c (group_case_nodes): Recognize more opportunities to
+ group case nodes.
+
+Sun Feb 9 14:05:48 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * function.c (assign_stack_temp): Clear MEM flags from reuse.
+
+Sat Feb 8 17:37:47 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * local-alloc.c (update_equiv_regs): Fix error in last change.
+
+Fri Feb 7 12:42:34 1997 Mike Stump <mrs@cygnus.com>
+
+ * pa.h (RETURN_ADDR_RTX): Fix to ignore export stubs.
+ * pa.c (return_addr_rtx): Define.
+
+Fri Feb 7 13:56:56 1997 Doug Evans <dje@cygnus.com>
+
+ * cse.c (invalidate_from_clobbers): Delete unnecessary test for
+ (clobber nil).
+
+ * toplev.c (main): Delete redundant settings of flag_no_inline
+ and warn_inline if not optimizating.
+
+Fri Feb 7 10:45:02 1997 Jeffrey A Law (law@cygnus.com)
+
+ * Makefile.in (stmp-multilib-sub): Add missing "else true"
+ clauses to work around make bug on some systems.
+
+Fri Feb 7 08:19:43 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * fold-const.c (const_binop): Don't call size_int if low < 0.
+
+ * function.c (instantiate_virtual_regs_1, case USE, CLOBBER):
+ Fix error in last change.
+
+Thu Feb 6 17:09:17 1997 Mike Stump <mrs@cygnus.com>
+
+ * except.c (find_exception_handler_labels): Initialize label array
+ with zeroes.
+
+Wed Feb 5 22:11:55 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.md (post_ldwm): Fix typos.
+
+Wed Feb 5 15:57:42 1997 Doug Evans <dje@cygnus.com>
+
+ * m68k/vxm68k.h (WCHAR_TYPE,WCHAR_TYPE_SIZE,SIZE_TYPE): Fix.
+ (PTRDIFF_TYPE): Define.
+
+Wed Feb 5 11:19:13 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * reload1.c (alter_reg): Don't ask assign_stack_local to round up
+ to a multiple of BIGGEST_ALIGNMENT, unless a register appears in a
+ paradoxical subreg.
+
+Tue Feb 4 19:29:40 1997 Jim Wilson <wilson@cygnus.com>
+
+ * reload.c (find_reloads_address_1, case POST_INC): Don't use
+ ADDR_TYPE here.
+
+Tue Feb 4 12:33:45 1997 Jeffrey A Law (law@cygnus.com)
+
+ * flow.c (life_analysis): Delete obvious no-op moves
+ which use SUBREGs.
+
+Mon Feb 3 20:00:35 1997 Jim Wilson <wilson@cygnus.com>
+
+ * jump.c (find_cross_jump): Don't allow old-style and volatile asms
+ to match.
+
+Mon Feb 3 15:51:31 1997 Doug Evans <dje@cygnus.com>
+
+ * sparc/sol2.h (ASM_SHORT,ASM_LONG): Set to .uahalf/.uaword.
+ * sparc/sysv4.h (ASM_LONG): Define.
+ (ASM_OUTPUT_{FLOAT,DOUBLE,LONG_DOUBLE}): Use ASM_LONG.
+
+Mon Feb 3 13:01:46 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * reload.h (enum reload_type): Add RELOAD_FOR_INPADDR_ADDRESS and
+ RELOAD_FOR_OUTADDR_ADDRESS.
+ * reload.c (ADDR_TYPE): New macro.
+ (push_secondary_reload): Check for new reload types.
+ (combine_reloads): Likewise.
+ (find_reloads): Likewise. Convert INPADDR_ADDRESS and
+ OUTADDR_ADDRESS to OPADDR_ADDR. Check OPADDR_ADDR when looking
+ for merges.
+ (find_reloads_address): When reloading an address, use the
+ ADDR_TYPE macro to get the type of the new reload.
+ (find_reloads_address_1): Likewise.
+ (reload_when_needed_name): Add new reload types.
+ * reload1.c (reload): Add in_addr_addr and out_addr_addr fields to
+ insn_needs struct. Use them for new reload types, and when
+ computing in_max and out_max.
+ (reg_used_in_inpaddr_addr): New static array.
+ (reg_used_in_outaddr_addr): New static array.
+ (mark_reload_reg_in_use): Handle new reload types.
+ (clear_reload_reg_in_use, reload_reg_free_p): Likewise.
+ (reload_reg_free_before_p, reload_reg_reaches_end_p): Likewise.
+ (reloads_conflict, merge_assigned_reloads): Likewise.
+ (emit_reload_insns): Likewise.
+ (choose_reload_regs): Save arrays for new reload types.
+
+Sun Feb 2 19:43:17 1997 Scott Christley <scottc@net-community.com>
+
+ * objc/selector.c (__sel_register_typed_name): Eliminate compiler
+ warnings with explicit cast.
+
+ * Add condition mutex support to the objc runtime.
+ * objc/thr-mach.c (objc_condition_{,de}allocate): New functions.
+ (objc_condition_{wait,broadcast,signal}): New functions.
+ * objc/thr-pthreads.c (objc_condition_{,de}allocate): New functions.
+ (objc_condition_{wait,broadcast,signal}): New functions.
+ * objc/thr-solaris.c (objc_condition_{,de}allocate): New functions.
+ (objc_condition_{wait,broadcast,signal}): New functions.
+ * objc/thr.h: Prototypes for new functions.
+
+ * objc/init.c (__objc_runtime_mutex): Eliminate leading underscore
+ from name of objc mutex and thread structures.
+ * objc/runtime.h: Likewise.
+ * objc/thr-{decosf1,irix,mach,os2,posix,pthreads,single}.c: Likewise.
+ * objc/thr-{solaris,win32}.c: Likewise.
+ * objc/thr.{c,h}: Likewise.
+
+ * Major reorganization of objc error handling.
+ * objc/Object.m (-error:): Call objc_error function instead of
+ using function pointer.
+ * objc/archive.c: Replace call to abort or __objc_fatal functions
+ with call to objc_error function throughout the complete file.
+ * objc/class.c (objc_get_class): Replace call to abort function
+ with call to objc_error function.
+ * objc/encoding.c (objc_sizeof_type, objc_alignof_type): Replace
+ call to abort function with call to objc_error function.
+ (objc_skip_typespec): Likewise.
+ * objc/init.c (init_check_module_version): Replace call to
+ abort function with call to objc_error function.
+ * objc/misc.c (objc_verror): New function.
+ (objc_fatal): Remove function.
+ (objc_set_error_handler): New function.
+ (_objc_error_handler): New global variable.
+ (__alpha__): Remove unneeded code.
+ (objc_error): Allow user specified error handler function to
+ trap and handle the objc error. Added an error code parameter
+ which indicates the specific error that occurred.
+ (objc_malloc, objc_atomic_malloc): Replace call to objc_fatal
+ function with call to objc_error function.
+ (objc_valloc, objc_realloc, objc_calloc): Likewise.
+ * objc/objc-api.h: Declare error handling functions and typedef
+ for user specified error handler function. Define error codes
+ used by the runtime library.
+ * objc/runtime.h: Remove error handling declarations.
+ * objc/sendmsg.c (__objc_forward): Replace call to abort function
+ with call to objc_error function.
+
+Sun Feb 2 19:42:52 1997 Thomas Baier <baier@ci.tuwien.ac.at>
+
+ * objc/hash.c (hash_delete): Step through the hash nodes
+ versus using hash_next to increase efficiency.
+ * objc/archive.c (__objc_finish_read_root_object): Use hash
+ table instead of list.
+
+Sun Feb 2 08:25:05 1997 Ovidiu Predescu <ovidiu@net-community.com>
+
+ * objc-act.c (encode_aggregate_within): New function.
+ (encode_aggregate): Generates encodings for unions similar
+ to those for structs except surrounded by parenthesis instead
+ of braces.
+
+Sun Feb 2 07:15:54 1997 Mat Hostetter (mat@lcs.mit.edu)
+
+ * c-decl.c (start_function): Fix improper installation of last change.
+
+Sun Feb 2 06:50:55 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m68k.c (output_scc_di): Add missing CC_STATUS_INIT.
+
+Sun Feb 2 06:39:55 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-typeck.c (process_init_element): When popping levels, don't
+ blow up if constructor_max_index not set due to previous error.
+
+ * combine.c (find_split_point, case SET): Fix error in last change.
+
+Sun Feb 2 06:28:56 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (rescan): Insert a space after `.' as well,
+ to prevent accidental token-pasting (e.g. `.x' -> `.10').
+
+Sun Feb 2 06:08:14 1997 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de)
+
+ * 1750a.c (modregno_adjust): Fixed case when reg_renumber invalid.
+
+Sat Feb 1 19:11:08 1997 J.T. Conklin <jtc@rhino.cygnus.com>
+
+ * m68k.md (movqi): Enable use of clr and st insns on TARGET_5200.
+ * m68k.c (output_move_simode_const): Likewise.
+
+Sat Feb 1 18:54:00 1997 Douglas B. Rupp (rupp@gnat.com)
+
+ * gcc.c (process_command): Fix improper use of strncpy.
+
+Fri Jan 31 15:35:08 1997 Mike Stump <mrs@cygnus.com>
+
+ * libgcc2.c: Remove extern for malloc and realloc.
+
+Fri Jan 31 17:08:11 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * local-alloc.c (update_equiv_regs): If register which is equivalent
+ to some value is only used in one place, and we can't substitute value
+ for use, move register assignment to just before use.
+
+Fri Jan 31 15:57:25 1997 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.md (idiv,imul,fpmul): Added new functional units for pentiumpro.
+
+ * i386.c (pentiumpro_cost): Added new cost structure for pentiumpro.
+ (override_options): Set ix86_cost to appropriate cost structure.
+
+Thu Jan 30 09:34:26 1997 J.T. Conklin <jtc@rhino.cygnus.com>
+
+ * m68k.md (stack adjust peepholes): Use lea instead of
+ add.w when adding 16 bit constants on all but TARGET_68040.
+
+Thu Jan 30 08:58:08 1997 Ralf Baechle <ralf@waldorf-gmbh.de>
+
+ * function.c (TRAMPOLINE_ALIGNMENT): Provide default.
+ (expand_function_end): Use TRAMPOLINE_ALIGNMENT instead
+ of FUNCTION_BOUNDARY.
+ * varasm.c (TRAMPOLINE_ALIGNMENT): Provide default.
+ (assemble_trampoline_template): Use TRAMPOLINE_ALIGNMENT instead
+ of FUNCTION_BOUNDARY.
+
+Wed Jan 29 18:16:02 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.h (REG_CLASS_CONTENTS): Add rap to GENERAL_REGS and its
+ superclasses.
+
+ * sh.md (movsi_i, movsi_ie, movhi_i, movhi+1): Use type pcload for
+ immediate operands where appropriate.
+ (movsf_ie+1): Fail when loading anything but a MEM into
+ a floating point reguister.
+
+Wed Jan 29 16:00:31 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * varasm.c (force_const_mem): Set MARK instead of clearing it.
+ (output_constant_pool): Only mark constant pool if -O.
+ Check mark flag unconditionally.
+ (mark_constant_pool): Start by clearing all mark flags.
+
+ * tree.c (copy_node): Clear TREE_ASM_WRITTEN.
+
+ * flow.c (regno_uninitialized): Return 0 if reg is used for args.
+
+Wed Jan 29 15:23:59 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * combine.c (try_combine): Clear reg_n_refs if i2dest is not
+ mentioned in newi2pat.
+
+Tue Jan 28 16:00:23 1997 Stan Cox (coxs@dg-rtp.dg.com)
+
+ From Robert Lipe <robertl@dgii.com>
+ * i386/sco5.h (SCO_DEFAULT_ASM_COFF): Remove bytecode stuff.
+ (ASM_OUTPUT_ASCII): Use .ascii in both ELF and COFF modes.
+ (ASM_OUTPUT_SECTION_NAME): Handle alternate sections for COFF.
+ The OpenServer 5.0.0 assembler gives an error for section
+ names over 6 characters long, so we catch the "obvious" case
+ and shorten it.
+
+ * m88k.h (ASM_OUTPUT_SECTION_NAME): Undefine; fails
+ for exception sections. The 88k ABI specifies 'section'
+ instead of '.section'.
+
+Mon Jan 27 13:32:46 1997 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.c (shl_and_kind): Fix typo.
+ * sh.md (and_shl_scratch): Fix typo for length 8.
+
+Mon Jan 27 08:56:03 1997 Jeffrey A Law (law@cygnus.com)
+
+ * fixincludes (sys/time.h): Fix incorrect forward structure
+ declaration on hpux10.20.
+
+Mon Jan 27 09:05:35 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * combine.c (simplify_rtx): Don't do anything with if_then_else_cond
+ result if both one arm and the input are a comparison.
+ (simplify_{rtx,if_then_else,logical,shift_const}): Don't
+ test STORE_FLAG_VALUE with #if; properly test for just sign bit.
+ (num_sign_bit_copies, if_then_else_cond): Likewise.
+ * expmed.c (emit_store_flag): Properly test for STORE_FLAG_VALUE
+ of just sign bit.
+ * fold-const.c (fold): Don't make COND_EXPR when both expr and
+ one part are comparisons.
+ * a29k.h (STORE_FLAG_VALUE): Make negative.
+
+Fri Jan 24 16:42:26 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * varasm.c (struct pool_constant): Add mark field.
+ (force_const_mem): Clear mark field in new constant pool entry.
+ (output_constant_pool): Call mark_constant_pool.
+ (mark_constant_pool, mark_constants): New static functions.
+
+Thu Jan 23 15:04:17 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * cse.c (COST): Get the right cost for a SUBREG of a register when
+ truncation is free.
+
+Thu Jan 23 11:19:40 1997 Mike Stump <mrs@cygnus.com>
+
+ * Makefile.in (objc-headers): Don't try and install the headers if
+ the objc directory has been removed.
+
+Wed Jan 22 13:26:25 1997 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * i960.c (process_pragma): Call ungetc on the last character
+ that was read by the while loop, to make sure the parser sees it.
+
+Tue Jan 21 17:20:30 1997 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.c (output_toc): Move STRIP_NAME_ENCODING to common
+ code, so the test for vt's works with -mminimal-toc.
+
+Tue Jan 21 16:03:35 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * function.c (mark_all_temps_used): Set KEEP as well.
+
+Tue Jan 21 12:16:15 1997 Doug Evans <dje@seba.cygnus.com>
+
+ * stor-layout.c (layout_record): Correct test for whether field spans
+ its unit of alignment in case where field_size == type_align.
+
+Mon Jan 20 20:27:54 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips.md (probe): Comment out.
+
+Sun Jan 19 20:54:45 1997 John F. Carr <jfc@mit.edu>
+
+ * integrate.c (expand_inline_function): Handle a PARALLEL containing
+ a RETURN the same as a RETURN.
+
+Sun Jan 19 20:35:28 1997 Pat Rankin <rankin@eql.caltech.edu>
+
+ * vmsconfig.com: Change all hardcoded references of "vax" to
+ use variable expansion instead.
+ (arch_indx, arch): New variables.
+
+ * vax.c (not_qsort): Don't declare alloca.
+ * vax/xm-vms.h: Declare alloca here.
+ Do most of the VAX C-specific set up for DEC C.
+ #if DEC C, undefine QSORT_WORKAROUND and qsort.
+ * make-gcc.com, make-cccp.com, make-cc1.com: Support building
+ with GNU C vs VAX C vs DEC C from the DCL command line.
+
+Sun Jan 19 17:20:50 1997 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de)
+
+ * 1750a.md (movh[if]-1): Corrected.
+ (movtqf-1): Deleted.
+ * 1750a.c (add_1_to_mem): Deleted.
+ (output_operand_address): Added output modifier 'A'.
+
+Sun Jan 19 17:17:54 1997 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * m68k.md (ashrdi_const, ashrdi3): Allow 31 as shift count.
+
+ * m68k.h (CONST_OK_FOR_LETTER_P): Recognize 'N', 'O' and 'P'.
+ * m68k.md (rotl[shq]i3, strict_low_part rotl): Allow 'N', 'O'
+ or 'P' operands.
+
+Sun Jan 19 17:09:17 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m68k.md (addsi3): Fix previous change: {add,sub}qw should
+ be {add,sub}ql. For other uses of {add,sub}q don't check for address
+ register and always use {add,sub}ql.
+
+Sun Jan 19 15:05:42 1997 Peter Seebach <seebs@solon.com>
+
+ * c-decl.c (start_decl): Add code for -Wmain.
+ (c_decode_option): Add -fhosted, -ffreestanding, and -Wmain.
+ * toplev.c (lang_options): Likewise.
+ * c-tree.h (warn_main, flag_hosted): New variables.
+
+Sun Jan 19 14:35:41 1997 Alex Garthwaite (alex@samwise.cis.upenn.edu)
+
+ * fixinc.svr4: Fix problems with symlinks to ".".
+
+Sun Jan 19 14:21:46 1997 Craig Burley <burley@gnu.ai.mit.edu>
+
+ * loop.c (check_final_value): Handle insns with no luid's.
+
+Sun Jan 19 08:57:26 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * alpha.md (arg_home): Add CLOBBER of MEM and USE of arg regs.
+ * vms.h (SETUP_INCOMING_VARARGS): Delete duplicate definition.
+
+ * toplev.c (set_float_handler): Set up signal catcher on first call
+ in case a front end has disabled it.
+
+ * cccp.c, cexp.y: #define __attribute__ to be null if
+ compiling with GCC older than 2.7, not 2.6.
+
+ * toplev.c (main): If PREFERRED_DEBUGGING_TYPE used and set
+ to NO_DEBUG, say debugging not supported.
+ * mips/sni-svr4.h (PREFERRED_DEBUGGING_TYPE): Undefine.
+
+ * i386/xm-cygwin32.h (DIR_SEPARATOR): Define.
+
+ * explow.c (convert_memory_address, case SYMBOL_REF):
+ Copy CONSTANT_POOL_ADDRESS_P.
+ * integrate.c (save_constants): Make (address (const ..)) to record
+ both modes.
+ (copy_for_inline, copy_rtx_and_substitute, restore_constants): Use
+ both modes when restoring constant pool entry for ADDRESS.
+
+ * alpha.h (MINIMUM_ATOMIC_ALIGNMENT): New macro.
+
+ * function.c (instantiate_virtual_regs_1, case USE, case CLOBBER):
+ Properly handle case of shared MEM whose replacement is not valid.
+
+Sat Jan 18 14:08:31 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * tree.c (get_unwidened): Don't crash if FIELD_DECL not layed out.
+
+ * varasm.c (const_hash): Treat NON_LVALUE_EXPR like CONVERT_EXPR.
+ (compare_constant_1, copy_constant, bc_assemble_integer): Likewise.
+ (const_hash, compare_constant_1): Use switch, not if-then-else.
+
+Fri Jan 17 17:10:20 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips.h (STACK_POINTER_OFFSET): Don't define.
+
+Thu Jan 16 14:51:03 1997 Bob Manson <manson@charmed.cygnus.com>
+
+ * cplus-dem.c: Fix indenting; note that this file also lives in
+ libiberty.
+ (do_type, case 'M'): Check for a template as well as a class.
+
+Thu Jan 16 15:08:26 1997 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * gcc.c (cross_compile): Change to be a char * like all of the
+ other specs.
+ (process_command): Change how cross_compile is tested.
+ (main): Likewise.
+ (struct spec_list): Merge with the format used by EXTRA_SPECS.
+ Add name length field to speed up repeated calls to strcmp. Add
+ flag to say spec was allocated. Add pointer to char * so that
+ static spec fields can be updated.
+ (extra_specs): Use struct spec_list as type.
+ (static_specs): Static list of predefined specs.
+ (init_specs): New function, initialize the specs list. Link in
+ the default specs and any specs defined via EXTRA_SPECS.
+ (set_spec): No longer special case predefined specs.
+ (process_command,validate_all_switches): Ditto.
+ (process_command): Call init_specs for -dumpspecs.
+ (do_spec_1): Use name length field to avoid calling strncmp when
+ it is going to fail.
+ (main): Call init_spec. Don't handle EXTRA_SPECS here.
+
+Thu Jan 16 17:07:54 1997 Eddie C. Dost <ecd@skynet.be>
+
+ * configure: Add sparc-linux{,aout} support.
+ * ginclude/va-sparc.h: Likewise.
+ * sparc/linux.h: New file.
+ * sparc/linux-aout.h: New file.
+ * sparc/xm-linux.h: New file.
+
+Thu Jan 16 16:19:13 1997 Jim Wilson <wilson@cygnus.com>
+
+ * configure (sparc-*-aout*): Add libgloss.h to tm_file.
+ (sparclite-*-coff*): Change "= to =".
+
+Thu Jan 16 12:53:15 CST 1997 Joel Sherrill <joel@OARcorp.com>
+
+ * rs6000/rtems.h: Change from being sysv4 based to being eabi based.
+
+Thu Jan 16 13:40:51 1997 Jim Wilson <wilson@cygnus.com>
+
+ * mips.h (LINKER_ENDIAN_SPEC): Define.
+ (LINK_SPEC): Add linker_endian_spec.
+ (EXTRA_SPECS): Add linker_endian_spec.
+
+Thu Jan 16 08:02:13 1997 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.md (bCC, inverted bCC): Use bCC .+X instead of bCC 0f.
+
+Wed Jan 15 14:06:28 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * reload.h (reload_address_base_reg_class): Declare.
+ (reload_address_index_reg_class): Declare.
+ * reload1.c (reload_address_base_reg_class): Define.
+ (reload_address_index_reg_class): Define.
+ (init_reload): Initialize reload_address_{base,index}_reg_class.
+ * reload.c (find_reloads_address): Use
+ reload_address_base_reg_class rather than BASE_REG_CLASS. Use
+ reload_address_index_reg_class rather than INDEX_REG_CLASS.
+ (find_reloads_address_1): Likewise.
+
+Tue Jan 14 15:26:33 1997 Ian Lance Taylor <ian@cygnus.com>
+
+ * reload.c (REGNO_MODE_OK_FOR_BASE_P): Define if not defined.
+ (REG_MODE_OK_FOR_BASE_P): Define if not defined.
+ (find_reloads_address): Use REG[NO]_MODE_OK_FOR_BASE_P rather than
+ REG[NO]_OK_FOR_BASE_P.
+ (find_reloads_address_1): Likewise.
+ Add mode parameter; change all callers.
+
+ * reload1.c (eliminate_regs_in_insn): Handle more cases when
+ eliminating the frame pointer to the hard frame pointer.
+
+ * varasm.c (force_const_mem): Copy a CONST_INT rtx like a CONST rtx.
+
+ * varasm.c (assemble_end_function): Call
+ output_after_function_constants.
+ (after_function_constants): New static variable.
+ (output_after_function_constants): New static function.
+ (output_constant_def): Check CONSTANT_AFTER_FUNCTION_P.
+
+Mon Jan 13 16:44:40 1997 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000/aix41.h (CPP_PREDEFINES): Add -D_AIX41.
+
+Sun Jan 12 20:54:01 1997 Jim Wilson <wilson@cygnus.com>
+
+ * libgloss.h (LINK_SPEC): Delete.
+ (STARTFILE_SPEC): Delete spurious newline.
+
+Sat Jan 11 00:13:03 1997 Torbjorn Granlund <tege@quiet.matematik.su.se>
+
+ * mips.md (norsi3, nordi3): Use canonical RTL. Prepend `*' to pattern
+ name. Don't match immediates.
+ (norsi3_const, nordi3_const): New patterns.
+ (anddi3, iordi3, xordi3): Test TARGET_64BIT, not mips_isa
+ in length attribute calculation.
+ * mips.c (complemented_arith_operand): New function.
+ (print_operand): Handle `e' for CONST_INT.
+ * mips.h (PREDICATE_CODES): Add complemented_arith_operand.
+
+Fri Jan 10 14:11:53 1997 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000/aix41.h (SUBTARGET_SWITCHES): Add threads and pe.
+ (CPP_SPEC): Add mpe and mthreads cases.
+ (LIB_SPEC): Add mpe and mthreads cases to variant from rs6000.h.
+ (STARTFILE_SPEC): Add mpe and mthreads support.
+
+Fri Jan 10 07:12:26 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * i386/cygwin32.h (LINK_SPEC): New definition.
+
+ * Makefile.in (FLAGS_TO_PASS): Add STAGE_PREFIX, set by configure.
+ * configure: Initialize exeext.
+ Update STAGE_PREFIX in Makefile.
+
+ * dwarfout.c (dwarfout_line): Push to LINE_SECTION after calling
+ lookup_filename.
+
+Thu Jan 9 12:06:04 1997 Jim Wilson <wilson@cygnus.com>
+
+ * i386.md (addsidi3_2): Add & to operand 0 of alternative 5.
+
+Thu Jan 9 12:06:04 1997 Stan Cox <coxs@dg-rtp.dg.com>
+
+ From Linus Torvalds and Mat Hostetter:
+ * i386.c (i386_sext16_if_const): Added to sign extend HImode constant.
+ (i386_aligned_reg_p): Added to tell if an rtx is aligned.
+ (i386_cc_probably_useless_p): Don't trust cc bits.
+ * i386.h (TARGET_ZERO_EXTEND_WITH_AND): Don't do this for p6.
+ * i386.md (cmpsf_ccfpeq+2): Use SImode test instruction.
+ (movhi+1): Use movz instead of mov on p6.
+ (addsi3): Add 128 by subtracting -128.
+ (zero_extendhisi2): Use SImode move if aligned.
+ ({add,sub,and,ior,xor}hi3): Likewise.
+
+Tue Jan 7 16:58:27 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * c-parse.in (extension): New rule for __extension__.
+ (extdef, unary_expr, decl, component_decl): Use it.
+
+Mon Jan 6 15:44:37 1997 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de)
+
+ * 1750a.c: Now includes regs.h.
+ ({movcnt,mod}_regno_adjust): Corrected typos.
+ * 1750a.md (movhi): Corrected case of moving constant to memory.
+
+Mon Jan 6 08:00:57 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * mips.h: Delete redundant definitions of compiler and library fns.
+
+ * dwarfout.c (type_attribute): Ignore any subtype for now.
+
+ * fold-const.c (operand_equal_p): Rework to consider two
+ expressions that have embedded identical SAVE_EXPRs as
+ equivalent; also handle some more cases.
+
+Sun Jan 5 23:54:34 1997 Jeffrey A Law (law@cygnus.com)
+
+ * pa.md (pic_load_label): Fix test for using just an
+ ldo rather than an addil;ldo sequence to load the label's
+ address.
+
+Sun Jan 5 07:26:47 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (expand_expr, case COMPONENT_REF): Fix error in last
+ change: don't suppress conversion if just EXPAND_SUM.
+
+Sat Jan 4 18:44:01 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * tree.h (struct tree_decl): saved_insns.i is HOST_WIDE_INT.
+
+ * fold-const.c (const_binop): Rework to only make constants in
+ one place; always use size_int if small enough and of sizetype.
+ (size_int): Call force_fit_type.
+ (fold): Avoid ever changing type of input tree.
+
+ * expr.c (get_inner_reference): Fix type error.
+ (expand_expr, case COMPONENT_REF): Don't convert if modifier
+ is EXPAND_CONST_ADDRESS, EXPAND_SUM, or EXPAND_INITIALIZER.
+ * tree.c (staticp, case COMPONENT_REF, BIT_FIELD_REF): Not
+ static if bitfield.
+
+ * expr.c (expand_expr, case COMPONENT_REF): If taking value
+ from a CONSTRUCTOR, must mask/sign-extend if bitfield.
+ (expand_builtin, case BUILT_IN_LONGJMP): Pass type, not IDENTIFIER,
+ to second arg of RETURN_POPS_ARGS.
+
+ * expr.c (expand_expr, case COND_EXPR): Add additional cases
+ to "singleton" cases.
+ * tree.c (integer_pow2): Mask value to width of type.
+ (tree_log2): New function.
+
+ * expmed.c (store_fixed_bit_field): If not SLOW_UNALIGNED_ACCESS,
+ treat everything as maximally aligned.
+
+ * combine.c (find_split_point, case SET): If SET_SRC is NE and
+ STORE_FLAG_VALUE is -1, see if we can convert into NEG of shift.
+ (force_to_mode, case NE): Make condition stricter.
+
+ * calls.c (emit_library_call_value): Remove redundant check for
+ outmode != VOIDmode.
+
+Sat Jan 4 08:12:16 1997 J.T. Conklin <jtc@rhino.cygnus.com>
+
+ * Optimizations from John Vickers (john@rhizik.demon.co.uk):
+ * m68k.c (output_function_{pro,epi}logue): Use addq/subq when
+ adjusting stack pointer by small displacements.
+ * m68k.md (addsi3, addhi3): Use two addqw (or subqw) insns when
+ adding (or subtracting) small integer constants (8 < N <= 16) to
+ both address and data registers.
+
+Sat Jan 4 07:06:07 1997 Kamil Iskra <iskra@student.uci.agh.edu.pl>
+
+ * loop.c (basic_induction_var): Return 0 if SUBREG is not a
+ promoted variable.
+
+Sat Jan 4 06:22:36 1997 Doug Rupp (rupp@gnat.com)
+
+ * alpha.c (vmskrunch): Try to not chop trailing uppercase letters.
+ * alpha/vms.h (ENDFILE_SPEC): Use "gnu", not "gnu_cc".
+
+ * cccp.c (PRINTF_PROTO): Use __printf__ in __attribute__, not printf.
+ * cexp.y (PRINTF_PROTO): Likewise.
+
+Fri Jan 3 09:01:00 1997 Craig Burley <burley@gnu.ai.mit.edu>
+
+ * alpha.md (cmov): Fix operand numbers in case involving DF target,
+ DF comparison, and SF source.
+
+Fri Jan 3 08:19:46 1997 Paul Eggert <eggert@twinsun.com>
+
+ * cpplib.c (macroexpand): Delete any no-reexpansion marker following
+ identifier at beginning of an argu concatenated with what precedes it.
+
+Fri Jan 3 07:59:21 1997 Ken Rose (rose@netcom.com)
+
+ * reorg.c (fill_slots_from_thread): Skip moved insn in all three cases.
+
+Fri Jan 3 07:51:44 1997 Bob Manson <manson@cygnus.com>
+
+ * function.c ({push,pop}_function_context_to): Save and restore
+ current_function_args_info.
+ * function.h (struct function): New field args_info.
+
+Fri Jan 3 06:55:09 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * jump.c (rtx_equal_for_thread_p): Return 0 for floating-point.
+
+ * reload.c (find_reloads): If replaced a PLUS or MULT with a
+ simple operand, start over again.
+
+ * va-alpha.h: Check for __VMS__, not VMS.
+
+Thu Jan 2 08:52:51 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * configure: Finish restoring change of default of objc threads to
+ "single" for Linux-based GNU systems.
+
+Mon Dec 30 17:03:46 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (fmpy_operands): Remove. No longer needed.
+ (combinable_add, combinable_copy, combinable_fmpy): Likewise.
+ (combinable_fadd, combineable_fsub): Likewise.
+ (pa_reorg): Call pa_combine_instructions.
+ (pa_combine_instructions): Combine instructions to make things
+ like fmpyadd and fmpysub.
+ (pa_can_combine_p): Helper function for pa_combine_instructions.
+ * pa.md (pa_combine_type): New attribute. Set it appropriately
+ for various insns.
+ (define_delays): Use a separate define_delay for unconditional
+ branches.
+ (fmpyadd, fmpysub peepholes): Remove, no longer needed.
+ (fmpyadd, fmpysub insns): Add variant with fadd/fsub first,
+ then the fmpy.
+
+Mon Dec 30 14:43:51 1996 Jim Wilson <wilson@cygnus.com>
+
+ * reg-stack.c (subst_stack_regs_pat): Set src_note explicitly, instead
+ of using invalid aggregate initialization.
+
+ * print-tree.c (print_node): Don't try to print nonexistent
+ TYPE_ATTRIBUTES field of a decl node.
+
+Mon Dec 30 10:30:25 1996 Richard Stallman <rms@ethanol.gnu.ai.mit.edu>
+
+ * config.sub: Handle hiuxmpp as system type.
+
+Thu Dec 26 13:33:27 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (init_v4_pic): Explicitly set the length.
+
+Mon Dec 23 19:39:38 1996 Jim Wilson <wilson@cygnus.com>
+
+ * mips.h (FUNCTION_ARG_REGNO_P): Correct for TARGET_SOFT_FLOAT and
+ TARGET_FLOAT64 cases.
+
+ * integrate.c (function_cannot_inline_p): Reject function with
+ PARALLEL result.
+ (expand_inline_function): Abort if function result not handled.
+
+Sat Dec 21 04:02:46 1996 Jason Merrill <jason@gerbil.cygnus.com>
+
+ * mips.c (save_restore_insns): Mark large frame setup insns
+ as frame-related.
+ (mips_expand_prologue): Likewise.
+
+ * dwarf2out.c (dwarf2out_frame_debug): Support MIPS large frames.
+ (add_bound_info): Use default lower bounds.
+ Handle simple variable bounds with a DIE ref.
+ Don't generate a NULL loc descr.
+ (add_subscript_info): Always add lower bound.
+ (gen_formal_parameter_die): Always equate_decl_number_to_die.
+ (gen_variable_die): Likewise. Don't use the old die for automatic
+ variables.
+
+Wed Dec 18 10:23:46 1996 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.c (notice_update_cc): Enable this code.
+ * mn10300.h (CC_OVERFLOW_UNUSABLE): Define.
+ * mn10300.md (tstsi): Use "set_zn_c0" instead of "set" for cc status.
+ (addsi3 pattern): Break "inc" into two different alternatives
+ since "inc dn" sets cc0, but "inc an" does not.
+ (multiply and divide patterns): Fix cc status.
+ (bCC, inverted bCC): Restore any comparison which needs the
+ overflow bits when CC_OVERFLOW_UNUSABLE is set.
+ (zero and sign extensions): Fix cc status.
+ (movm_store): Likewise.
+
+Tue Dec 17 15:02:44 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sched.c (update_flow_info): When add REG_DEAD notes for dest of
+ last insn, add check for global_regs.
+
+Tue Dec 17 11:07:26 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/win-nt.h (HAS_INIT_SECTION): Delete, so that __main is
+ called from main.
+
+Mon Dec 16 15:28:44 1996 Jim Wilson <wilson@cygnus.com>
+
+ * combine.c (nonzero_bits): Ifdef out calls to num_sign_bit_copies.
+ Add dummy define/undef for num_sign_bit_copies.
+
+ * dwarfout.c (location_or_const_value_attribute, case CONCAT): Add.
+
+ * combine.c (simplify_comparison): Use mode_width as shift count
+ only if it is less than or equal to HOST_BITS_PER_WIDE_INT.
+
+Mon Dec 16 10:10:11 1996 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.c (expand_epilogue): Restore registers in the
+ "ret" instruction instead of a separate movm instruction.
+ Support possible stack deallocation in "ret" instruction too.
+ * mn10300.md (return_internal): Use "ret" instead of "rets";
+ restore registers and deallocate stack as needed.
+ (load_movm): Delete unused pattern.
+
+ * mn10300.h (SMALL_REGISTER_CLASSES): Define.
+
+Fri Dec 13 14:46:54 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.md (dect): Rewrite pattern so that it can be combined.
+
+Fri Dec 13 13:14:51 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * varasm.c (output_constant_pool): If ASM_OUTPUT_POOL_EPILOGUE is
+ defined, call it.
+
+Thu Dec 12 20:04:55 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * rtl.h (RTX_FRAME_RELATED_P): New macro.
+ (struct rtx_def): Add frame_related bitfield.
+ * final.c (final_scan_insn): Call dwarf2out_frame_debug.
+ Don't call dwarf2out_begin_function.
+ (final): Initialize dwarf2out_frame_debug.
+ * dwarf2out.c (dwarf2out_begin_function): Remove.
+ (dwarf2out_init): Use INCOMING_RETURN_ADDR_RTX.
+ (DWARF_CIE_DATA_ALIGNMENT): Generalize.
+ (DWARF_FRAME_REGNUM): Don't add 1.
+ (decode_cfi_rtl): Lose.
+ (dwarf2out_def_cfa): Now takes reg and offset directly.
+ (reg_save): Likewise.
+ (dwarf2out_reg_save): Now takes offset.
+ (initial_return_save): Grok INCOMING_RETURN_ADDR_RTX.
+ Replaces dwarf2out_return_save.
+ (dwarf2out_cfi_label): New fn.
+ (add_fde_cfi): Use it.
+ (dwarf2out_frame_debug): New fn.
+ * mips.h (DWARF_FRAME_REGNUM): Tweak r31.
+ (INCOMING_RETURN_ADDR_RTX): Define.
+ * mips.c (mips_expand_prologue): Set RTX_FRAME_RELATED_P as needed.
+ (save_restore_insns): Likewise.
+ * i386.c (ix86_expand_prologue): Likewise.
+ * i386.h (INCOMING_RETURN_ADDR_RTX): Define.
+ (DWARF_FRAME_RETURN_COLUMN): Define.
+
+ * dwarf2out.c (add_AT_long_long): Renamed from add_AT_double fo
+ clarity.
+ (print_die): Adjust.
+ (add_AT_float): New fn.
+ (add_const_value_attribute): Support fp values.
+ (size_of_die): Use blocks for long_long and fp values.
+ (value_format, output_die): Likewise.
+ (output_loc_operands): Don't support DW_OP_const8?.
+
+Thu Dec 12 19:49:09 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * varasm.c (CONSTANT_POOL_BEFORE_FUNCTION): Define if not
+ defined.
+ (assemble_start_function): Check CONSTANT_POOL_BEFORE_FUNCTION
+ to decide whether to call output_constant_pool.
+ (assemble_end_function): Likewise.
+
+ * calls.c: Check SMALL_REGISTER_CLASSES at run time, not just
+ compile time.
+ * combine.c, cse.c, function.c, jump.c, local-alloc.c: Likewise.
+ * loop.c, reload.c, reload1.c: Likewise.
+ * dsp16xx.h (SMALL_REGISTER_CLASSES): Define with value.
+ * h8300.h (SMALL_REGISTER_CLASSES): Likewise.
+ * i386.h (SMALL_REGISTER_CLASSES): Likewise.
+ * pdp11.h (SMALL_REGISTER_CLASSES): Likewise.
+ * sh.h (SMALL_REGISTER_CLASSES): Likewise.
+
+Thu Dec 12 15:25:39 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (sysv call insns): If flag_pic add @plt suffix.
+
+ * rs6000.md (fix_truncdfsi2_store): Fix offsets > 32k.
+
+ * rs6000/t-ppccomm: New file for common parts of embedded and
+ System V target Makefile support.
+
+ * rs6000/t-ppcos: New file for System V OS target Makefile
+ support.
+
+ * rs6000/t-solaris: Delete, merge into rs6000/t-ppcos.
+
+ * rs6000/t-{ppc,ppcgas}: Only keep the multilib specific parts,
+ moving the rest to rs6000/t-ppccomm.
+
+ * configure (powerpc*-*-*): For embedded and System V
+ configurations, add rs6000/t-ppccomm.
+ For GNU/Linux and Solaris, use t-ppcos.
+
+ * ginclude/ppc-asm.h (cr*, f*): Add new macros for register names.
+
+ * rs6000/sol-c0.c (_start): Fix uninitialized data bug.
+
+ * rs6000.md (init_v4_pic): Add @local to call.
+ (icbi,dcbst,sync,isync): Delete PowerPC cache control insns.
+
+ * rs6000/sysv4.h (ASM_SPEC): On explicit -mcall-solaris, pass
+ -msolaris to the assembler.
+
+ * rs6000.c (rs6000_sync_trampoline): Delete.
+ (rs6000_trampoline_template): Aix & System V don't need template now.
+ (rs6000_initialize_trampoline): For System V, call the function
+ __trampoline_setup to set up the trampoline.
+
+ * rs6000.h (TRAMPOLINE_TEMPLATE): Delete here.
+ * rs6000/win-nt.h (TRAMPOLINE_TEMPLATE): Add it here.
+
+ * rs6000/tramp.asm: New file, setup trampolines properly on System
+ V systems, properly flushing the caches.
+
+Thu Dec 12 10:53:10 1996 Jeffrey A Law (law@cygnus.com)
+
+ * reorg.c (fill_slots_from_thread): Don't call eligible_for_delay
+ with an insn with asm operands.
+
+ * expmed.c (emit_store_flag_force): Fix typos/thinkos.
+
+Thu Dec 12 08:09:20 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * i386.c (i386_return_pops_args): Libcalls ignore TARGET_RTD.
+
+Thu Dec 12 07:56:03 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * tree.h (maybe_get_identifier): New declaration.
+
+ * calls.c (emit_library_call): Don't pass VOIDmode to type_for_mode.
+
+ * va-alpha.h: Add definitions for VMS; they differ from Unix.
+
+ * Makefile.in (stamp-objlist): Handle first character of object
+ file being a digit.
+
+ * 1750a.h (function_arg, {movcnt,mod}_regno_adjust): Add decls.
+ (branch_or_jump): Likewise.
+ (FUNCTION_ARG): Remove cast of function_arg result to rtx.
+ * 1750a.md: Remove unneeded casts to char *.
+
+Thu Dec 12 05:55:27 1996 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * arm.c (arm_gen_constant, case [IX]OR): Don't invert constant if
+ loading into temporary.
+
+Wed Dec 11 18:57:21 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * toplev.c (rest_of_compilation): Make sure unwinder RTL is saved.
+
+ * collect2.c (write_c_file): Wrap the ctor/dtor lists and fns
+ with `extern "C" { ... }'.
+
+Wed Dec 11 17:46:48 1996 John F. Carr <jfc@mit.edu>
+
+ * tree.h (tree_decl): Reorder field declarations to reduce size
+ on 64 bit machines.
+
+ * combine.c (try_combine): When splitting an insn, check for the
+ new I2 setting a SUBREG.
+
+Wed Dec 11 17:00:47 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * alpha.c (print_operand): Use HOST_WIDE_INT_PRINT_DEC instead of
+ using "%ld".
+ (output_prolog): Don't print useless comment for VMS.
+
+ * alpha.c (output_prolog): SIZE is now HOST_WIDE_INT.
+ * alpha.md (mov[hq]i unnamed): Split up for TARGET_BYTE_OPS and not.
+
+ * function.c (fixup_var_refs_1, case ZERO_EXTRACT): Don't call
+ fixup_memory_subreg if no longer SUBREG of MEM.
+
+Wed Dec 11 14:10:48 1996 Jeffrey A Law (law@cygnus.com)
+
+ * mn10300.c: New file for Matsushita MN10300 port.
+ * mn10300.h, mn10300.md, t-mn10300, xm-mn10300.h: Likewise.
+ * config.sub: Recognize mn10300 as a basic machine type.
+ * configure: Similarly.
+ * ginclude/stdarg.h: mn10300 is little endian.
+ * ginclude/varargs.h: Likewise.
+
+Wed Dec 11 09:09:10 1996 Nagai Takayuki <nagai@ics.es.osaka-u.ac.jp>
+
+ * libgcc2.c (cacheflush): Add SONY NEWS-OS 4.2 version.
+
+Wed Dec 11 09:01:39 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * calls.c (emit_library_call, emit_library_call_value):
+ Don't pass an identifier node as function type for
+ library functions, but rather build a function type that
+ has a return type with the correct mode.
+ * i386.c (i386_return_pops_args): Don't test for IDENTIFIER_NODE.
+ * i386/isc.h (obsolete RETURN_POPS_ARGS): Test first argument
+ for IDENTIFIER_NODE.
+ * i386/next.h (RETURN_POPS_ARGS): Likewise.
+ * i386/sco.h (RETURN_POPS_ARGS): Likewise.
+ * i386/sco5.h (RETURN_POPS_ARGS): Likewise.
+ * i386/scodbx.h (RETURN_POPS_ARGS): Likewise.
+ * m68k.h (RETURN_POPS_ARGS): Likewise.
+ * ns32k.h (RETURN_POPS_ARGS): Likewise.
+ * pyr.h (RETURN_POPS_ARGS): Likewise.
+ * gmicro.h (RETURN_POPS_ARGS): Likewise; fix typo.
+
+Tue Dec 10 17:36:47 1996 J.T. Conklin <jtc@rhino.cygnus.com>
+
+ * Add optimizations from John Vickers (john@rhizik.demon.co.uk)
+ * m68k.h (TARGET_CPU32): New macro.
+ * m68k.md (add[hs]i3): Only use two addq.w or subq.w instructions
+ when adding or subtracting constants 8 < N < 16 on TARGET_CPU32.
+ Use lea instead of add.w when adding 16 bit constants to address
+ registers on all but TARGET_68040.
+ * m68k.c (output_function_{pro,epi}logue): Use lea instead of add.w
+ when adjusting stack pointer on all but TARGET_68040.
+
+Tue Dec 10 15:55:23 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * optabs.c (emit_unop_insn): Treat ZERO_EXTEND like SIGN_EXTEND.
+
+Tue Dec 10 13:47:24 1996 Joern Rennecke <amylaar@cygnus.co.uk>
+
+ * combine.c (combinable_i3pat): Bring back to sync with can_combine_p.
+
+ * sh.h (ADJUST_INSN_LENGTH): Don't break from loop when LOOP_BEG found.
+ Calculate padding in new variable pad.
+
+Mon Dec 9 18:00:38 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (output_uleb128): Output value in human-readable comment.
+ (output_sleb128): Likewise.
+ (various): Adjust.
+ (output_call_frame_info): Only output info if it's interesting.
+ (add_src_coords_attributes): New fn.
+ (add_name_and_src_coords_attributes): Split out from here.
+ (gen_enumeration_type_die): Add src coordinates.
+ (gen_struct_or_union_type_die): Likewise.
+ (dwarf2out_finish): Call output_call_frame_info for all targets.
+
+Thu Dec 5 11:25:30 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (add_pure_or_virtual_attribute): Only add
+ AT_containing_type if -g2 or higher.
+
+ * dwarf2out.c (gen_struct_or_union_type_die): Make sure that
+ the type for AT_containing_type has been generated.
+ (gen_decl_die): Likewise.
+
+ * dwarf2out.c (type_tag): Check DECL_IGNORED_P.
+ (add_pure_or_virtual_attribute): Check DECL_VINDEX instead.
+ (scope_die_for): Likewise.
+ * dwarfout.c (type_tag): Likewise.
+
+Wed Dec 4 22:51:38 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (decode_cfi_rtl): Support getting a CONST_INT.
+ (dwarf2out_begin_function): Adjust.
+ (reg_save): Divide offset by the alignment.
+ (output_cfi): Support having more than one advance_loc.
+ (output_call_frame_info): Re-initialize current_label.
+ (dwarf2out_begin_prologue): Initialize current_label to NULL.
+ (lookup_cfa, lookup_cfa_1): New fns.
+ (dwarf2out_def_cfa): Call lookup_cfa.
+ (dwarf2out_finish): Don't generate CIE CFIs.
+ (dwarf2out_init): Generate them here.
+ (DWARF_FRAME_RETURN_COLUMN): Use PC_REGNUM.
+
+ (add_pure_or_virtual_attribute): Note virtual context.
+ (gen_formal_parameter_die): Return the die.
+ (gen_formal_types_die): Set AT_artificial on `this'.
+ (gen_subprogram_die): Add AT_accessibility.
+ (gen_variable_die): Likewise.
+ (gen_field_die): Likewise. Don't generate location attribute for
+ union members.
+ (gen_struct_or_union_type_die): Note where our vtable lives.
+ (gen_decl_die): Handle anonymous union fields.
+ (dwarf2out_decl): Always output `bool'.
+
+Mon Dec 2 03:55:15 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * final.c (final_end_function): Don't call dwarf2out_end_function.
+
+ * dwarf2out.c (output_line_info): Emit special opcodes for each line
+ entry, even if the line number doesn't change.
+ (pend_type, output_pending_types_for_scope): New fns.
+ (gen_struct_or_union_type_die): Use them to defer generating member
+ dies if we're in the middle of some other context.
+ (gen_type_die): Still put nested types in the right place.
+ (dwarf2out_decl): Call output_pending_types_for_scope.
+
+ * dwarf2out.c (dw_fde_struct): Replace end_prologue, begin_epilogue
+ with current_label.
+ (DWARF_CIE_INSN_SIZE, DWARF_CIE_SIZE): Remove.
+ (DWARF_CIE_HEADER_SIZE): The size without the initial insns.
+ (size_of_cfi): Revert.
+ (decode_cfi_rtl, add_fde_cfi, dwarf2out_def_cfa, reg_save,
+ dwarf2out_reg_save, dwarf2out_return_save): New fns.
+ (dwarf2out_begin_function): Use them to generate CFIs.
+ (dwarf2out_finish): Use them to generate E CFIs.
+ Don't set next_fde_offset.
+ (calc_fde_sizes): Initialize cie_size.
+ (output_call_frame_info): Don't generate CIE CFIs.
+ (dwarf2out_end_function): Remove.
+
+ * tree.c (maybe_get_identifier): New fn.
+ * varasm.c (assemble_name): Use it instead of get_identifier.
+
+Fri Nov 29 15:13:39 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * jump.c (jump_optimize): Don't move initialization if there is a
+ label between it and the jump for if (foo) bar++ to bar += (foo !=0)
+
+Wed Nov 27 16:21:14 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * Remove change of Oct 4.
+ * i386.h (outer_function_chain): Remove.
+ (current_function_calls_alloca): Remove.
+ (rtx_equal_function_value_matters): Remove.
+ (N_REGS_USED, N_ALLOCATABLE_REGISTERS): Remove.
+ * i386.md (adddi3_1, subdi3_1): Remove.
+ (adddi3, subdi3): Revert.
+ (movsf, movsf_mem, movsf_normal, movdf, movdf_mem, movdf_mem+1):
+ Likewise.
+ (movxf, movxf_mem, movxf_mem+1, addsidi3_1, addsidi3_2): Likewise.
+ (adddi3_1, subsidi3, subdi3_1): Likewise.
+ (addsidi3_1, addsidi3_2, subsidi3): Likewise.
+ (addsidi3_1, addsidi3_2, adddi3, subsidi3): Disable the problem
+ reload alternatives.
+
+Wed Nov 27 16:21:14 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * i386.md (ashldi3_non_const_int, ashrdi3_non_const_int):
+ Use a hidden branch to handle shifts > 32 bit.
+ (lshrdi3_non_const_int): Likewise.
+ (floatdixf2): Don't use unnecessary XFmode operation.
+
+Wed Nov 27 15:23:41 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * varasm.c (assemble_variable): Don't emit DWARF.
+
+ * toplev.c (rest_of_type_compilation): Don't emit DWARF.
+ (main): Just let -gdwarf mean DWARF v1; remove -gdwarf-1.
+
+ * dwarfout.c (decl_class_context): New fn.
+ (output_global_subroutine_die): Fix declaration case.
+ (output_global_variable_die): Likewise.
+ (output_type): Note when we are in a class defn. If we're a nested
+ type and our context hasn't been written, do that. Do early exit
+ for nested types.
+ (output_decl): Output the class context for fns and vars.
+ Don't emit detailed parm info for a fn declaration.
+ Use TYPE_DECL_IS_STUB, is_redundant_typedef.
+ (type_ok_for_scope): Support emitting nested types later.
+ (is_redundant_typedef): New fn.
+ (TYPE_DECL_IS_STUB): New macro.
+ (output_compile_unit_die): Check use_gnu_debug_info_extensions.
+ (output_local_subroutine_die, output_global_subroutine_die,
+ dwarfout_begin_function, dwarfout_end_function, dwarfout_line,
+ generate_macinfo_entry, dwarfout_init, dwarfout_finish): Likewise.
+
+ * dwarf2out.c (decl_class_context): Static.
+ (lookup_type_die): Use TYPE_SYMTAB_POINTER.
+ (equate_type_number_to_die): Likewise.
+ (gen_subprogram_die): If we're in class context, it's a decl.
+ (gen_variable_die): Likewise.
+ (gen_decl_die): Output the containing type.
+ (dwarf2out_init): Lose type_die_table code.
+
+Wed Nov 27 08:30:54 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * Makefile.in (DRIVER_DEFINES): New macro, with the macro
+ definitions for the driver.
+ (gcc.o): Make rule use $(DRIVER_DEFINES).
+ * gcc.c (process_command) [LANG_SPECIFIC_DRIVER]: Call
+ lang_specific_driver, passing along the addr of FATAL for errors
+ along with our ARGC and ARGV.
+
+Wed Nov 27 08:21:13 1996 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * m68k.md (iorsi_zexthi_ashl16): New pattern.
+ (ashrsi_16): New name for old unnamed pattern.
+
+ * objc/misc.c (stdlib.h): Define __USE_FIXED_PROTOTYPES__ before
+ including stdlib.h.
+
+Wed Nov 27 08:17:34 1996 Joern Rennecke <amylaar@cygnus.co.uk>
+
+ * i386.md (decrement_and_branch_until_zero+[3-8]): Add missing
+ CC_STATUS_INIT.
+ (decrement_and_branch_until_zero+[5-8]): Delete redundant assignment.
+
+Wed Nov 27 07:56:27 1996 J.T. Conklin <jtc@rhino.cygnus.com>
+
+ * m68k.md ({and,ior,xor}si3_internal): Removed !TARGET_5200 from
+ conditionals now that entire insn is disabled when !TARGET_5200.
+
+Wed Nov 27 07:52:32 1996 Oliver Kellogg <kellogg@space.otn.dasa.de>
+
+ * 1750a.md (movhi pattern): Fixed MEM to MEM move problem.
+
+Tue Nov 26 14:50:54 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (move_by_pieces): Abort only if length positive at end.
+ * function.c (frame_offset, get_frame_size): Make HOST_WIDE_INT.
+ * function.h (struct function): Make frame_offset be HOST_WIDE_INT.
+ (get_frame_size): Add definition.
+ * reload1.c (reload): Make starting_frame_size be HOST_WIDE_INT.
+
+Mon Nov 25 16:55:14 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (dwarf2out_finish): Don't emit call frame info
+ for non-MIPS targets.
+ (is_redundant_typedef): New fn.
+ (modified_type_die): Refer to typedef DIEs where appropriate.
+ (gen_typedef_die): Support DECL_ORIGINAL_TYPE.
+ (gen_type_die): Likewise. Use is_redundant_typedef.
+ (gen_subprogram_die): Don't force a spec DIE for local class methods.
+
+Mon Nov 25 15:09:12 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * gcc.c (handle_braces): Rework last change.
+
+Mon Nov 25 13:49:51 1996 Jim Wilson <wilson@cygnus.com>
+
+ * configure (build_exeext, exeext): New variables. Use sed to insert
+ build_exeext value into Makefile exeext rule.
+ (*-*-cygwin32): Set exeext.
+ * i386/x-cygwin32 (exeext): Delete.
+ * rs6000/x-cygwin32 (exeext): Delete.
+
+ * dwarf.h (enum dwarf_location_atom): Add OP_MULT.
+ * dwarfout.c (output_mem_loc_descriptor, case MULT): Add.
+ * dwarfout2.c (mem_loc_descriptor, case MULT): Add.
+
+ * dwarfout.c (dwarf_fund_type_name, case FT_unsigned_int64): Fix typo.
+
+Sun Nov 24 21:42:01 1996 J.T. Conklin <jtc@rhino.cygnus.com>
+
+ * m68k.md (andsi3): Changed into define_expand.
+ (andsi3_internal): Rename from old andsi3, changed condition
+ to !TARGET_5200.
+ (andsi2_5200): New insn.
+ (iorsi3): Change into define_expand.
+ (iorsi2_internal): Rename from old iorsi3, changed condition
+ to !TARGET_5200.
+ (iorsi2_5200): New insn.
+ (xorsi3): Change into define_expand.
+ (xorsi2_internal): Rename from old xorsi3, changed condition
+ to !TARGET_5200.
+ (xorsi2_5200): New insn.
+
+Sun Nov 24 21:31:32 1996 John F. Carr <jfc@mit.edu>
+
+ * i386.h (N_ALLOCATABLE_REGISTERS): Remove extra backslash at
+ end of macro definition.
+
+ * cpplib.c (LOCAL_INCLUDE_DIR): Remove default definition.
+ (include_defaults_array): Do not use LOCAL_INCLUDE_DIR or
+ TOOL_INCLUDE_DIR if they are not defined.
+ * cccp.c: Likewise.
+
+ * Makefile.in (cppmain.o): New rule.
+
+Sun Nov 24 19:14:50 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * fold-const.c (merge_ranges): In (+,-) case, if lower bounds are
+ the same the result is always false.
+
+Sun Nov 24 18:48:31 1996 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * c-typeck.c (build_indirect_ref): Don't give warning for
+ dereferencing void * if evaluation is being skipped.
+
+ * c-decl.c (poplevel): Don't call output_inline_function if
+ DECL_SAVED_INSNS is not set.
+
+ * gcc.c (give_switch): Add new arg, INCLUDE_BLANKS.
+ (handle_braces): All callers changed.
+ Add support for new construct: %{S*^}.
+
+Sun Nov 24 18:44:48 1996 Paul Eggert <eggert@twinsun.com>
+
+ * c-parse.in (unary_expr, expr_no_commas): Increment skip_evaluation
+ when analyzing an expression that is known not to be evaluated.
+ (sizeof, alignof): New rules.
+ * c-tree.h (skip_evaluation): New variable.
+ * c-common.c (skip_evaluation): Likewise.
+ (overflow_warning, unsigned_conversion_warning): Don't warn about
+ potential runtime errors when skipping evaluation.
+ * c-typeck.c (build_binary_op): Likewise.
+ (build_conditional_expr): op1 now always nonnull.
+
+Sun Nov 24 17:06:58 1996 Bernd Schmidt (crux@Pool.Informatik.RWTH-Aachen.DE)
+
+ * toplev.c (rest_of_compilation): Call regscan before each
+ jump threading pass.
+
+Sun Nov 24 16:37:18 1996 Dave Love <d.love@dl.ac.uk>
+
+ * configure (objc_thread_file): Set conditionally in each case so
+ may be overridden with `--enable-objcthreads=posix'.
+ Change GNU/Linux default to `single'.
+
+Fri Nov 22 17:53:15 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * varasm.c (assemble_variable): Output DWARF in the third case, too.
+
+ * dwarf2out.c (decls_for_scope): Only add DIEs with no parents to
+ our scope.
+ (gen_subroutine_type_die): Parm types go under the fn type DIE.
+
+ * Makefile.in ($(T)crt{begin,end}.o): Move CRTSTUFF_T_CFLAGS after
+ general flags.
+
+ * mips/t-iris6 (CRTSTUFF_T_CFLAGS): Define.
+ * mips.c (compute_frame_size): Fix fp_save_offset.
+
+ * dwarf2out.c (new_die): If we get a NULL parent, inc limbo_die_count.
+ (decls_for_scope): Decrement limbo_die_count as appropriate.
+ (dwarf2out_finish): Check for good limbo_die_count.
+ (size_of_cfi): If regno too big for DW_CFA_offset, use offset_extended
+ instead.
+ (output_call_frame_info): Add disabled code for specifying ABI.
+ (dwarf2out_begin_function): Note all saved regs.
+
+ * dwarf2out.c (gen_subprogram_die): Have a DIE for each fn at
+ toplevel.
+ (scope_die_for): Only use the NULL for fns and tags.
+
+Tue Nov 21 15:53:51 1996 Joern Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.c (output_stack_adjust): New argument TEMP. Changed all callers.
+ If the adjust cannot be done with one, but can be done with two
+ CONST_OK_FOR_I constants, do it that way.
+
+Thu Nov 21 14:25:55 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * fixincludes: Include <stdio.h> in <assert.h> even if not C++ if
+ stderr needs to be defined.
+
+Wed Nov 20 15:38:13 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * toplev.c (rest_of_type_compilation): Do output function-scope tags
+ for DWARF 2.
+ * c-decl.c (pushtag): Set TYPE_CONTEXT on the tag.
+ * toplev.c, varasm.c: s/dwarf2out_file_scope_decl/dwarf2out_decl/g.
+ * dwarf2out.c (add_prototyped_attribute): Use a value of 1.
+ (gen_subprogram_die): Support AT_static_link.
+ (dwarf2out_decl): Rename from dwarf2out_file_scope_decl.
+ Give nested fns and tags a die_parent of NULL.
+ (decls_for_scope): Fix the die_parent for nested fns and tags.
+ (scope_die_for): If we get a context of NULL, just return it.
+
+Tue Nov 19 18:21:11 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (gen_subprogram_die): Support block extern decls.
+ (gen_variable_die): Likewise.
+ (gen_decl_die): Emit block extern function decls.
+
+ * c-decl.c (implicitly_declare): Set DECL_ARTIFICIAL.
+
+Tue Nov 19 16:50:32 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * configure (powerpc*-{sysv,elf,eabi{,aix,sim}}): Set
+ extra_headers to ppc-asm.h.
+ (powerpc*-{linux,solaris,rtems,vxworks}): Likewise.
+ (powerpc*-{winnt,pe,cygwin32}): Likewise.
+
+ * rs6000/t-{ppc,ppcgas,solaris,winnt} (EXTRA_HEADERS): Don't set here.
+
+Mon Nov 18 14:51:46 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (DWARF_CIE_INSN_SIZE): New macro.
+ (DWARF_CIE_HEADER_SIZE): Use it.
+ (DWARF_FRAME_RETURN_COLUMN, DWARF_FRAME_REGNUM): New macros.
+ (output_call_frame_info, dwarf2out_begin_function): Use them.
+ For the MIPS, output the first CFA insn in the CIE.
+ * dwarf2.h (enum dwarf_call_reg_usage): Lose.
+ (dwarf_macinfo_record_type): Fix spelling.
+ * mips/mips.h (DWARF_FRAME_REGNUM, DWARF_FRAME_RETURN_COLUMN): Define.
+
+ * dwarf2out.c (base_type_die): Just generate the DIEs as needed,
+ rather than building up some table.
+ (init_base_type_table): Lose.
+ (add_subscript_info): Use add_type_attribute. Don't give an upper
+ bound for an array of unknown size.
+ (gen_unspecified_parameters_die): Remove DWARF-1 kludge.
+ (dwarf2out_init): Lose call to init_base_type_table.
+ (is_c_family, is_fortran): New fns.
+ (gen_compile_unit_die): Recognize GNU F77.
+ (gen_array_type_die): Use AT_declaration for an array of unknown size.
+ (modified_type_die): Take TYPE_MAIN_VARIANT before passing it
+ to build_type_variant, so we ignore named variants.
+ (dwarf2out_file_scope_decl): Don't generate DIEs for built-in structs,
+ either; they will be emitted if they are used.
+ From wilson:
+ (gen_array_type_die): Force the element type out first on IRIX 6.
+
+Sun Nov 17 20:23:11 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (get_inner_reference): Fix error in previous change.
+
+Sat Nov 16 06:08:27 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * emit-rtl.c (operand_subword): Avoid confusion if sizeof (float)
+ is less than a full word.
+
+ * alpha.h (MASK_BYTE_OPS): Now define as 1024.
+ * alpha/vms.h (TARGET_DEFAULT): Use symbolic values.
+
+ * expr.c (get_inner_reference): Add new arg PALIGNMENT and compute it.
+ (expand_assignment, do_jump): Pass new arg to get_inner_reference.
+ (expand_expr, case COMPONENT_REF): Likewise.
+ * fold-const.c (optimize_bit_field_compare, decode_field_reference):
+ Likewise.
+ * tree.h (get_inner_reference): Add new arg.
+
+ * Add support for Alpha/VMS, mostly from
+ Klaus Kaempf (kkaempf@progis.de)
+ * configure (alpha-dec-vms*): New target.
+ * alpha.c (override_options): Handle VAX format floating-point.
+ (print_operand, case ',', '-'): New cases.
+ (alpha_builtin_saveregs): Handle VMS convention.
+ (alpha_sa_{mask,size}, alpha_pv_save_size, alpha_using_fp):
+ New versions for VMS.
+ (output_{pro,epi}logue, function_arg): Likewise.
+ (direct_return): Never true on VMS.
+ (check_float_value): Return 0 for VMS.
+ (vmskrunch, alpha_{need,write}_linkage): New function.
+ * alpha.h ({MASK,TARGET}_{OPEN_VMS,FLOAT_VAX}): New macros.
+ (TARGET_SWITCHES): Add float-vax and float-ieee.
+ ({FUNCTION,LIBCALL}_VALUE, FUNCTION_VALUE_REGNO_P): R1 and R33
+ are also return registers.
+ (ASM_OUTPUT_DOUBLE): Support both floating-point formats.
+ (PRINT_OPERAND_FUNCT_VALID_P): Add ',' and '-'.
+ * alpha.md ({div,mod}[sd]i3): Only for VMS.
+ (fp operations): Add modifiers for multiple floating-point formats.
+ (call patterns): Handle new calling sequence for VMS.
+ (tablejump): Make new pattern for VMS.
+ (nonlocal_goto_receiver, arg_home): New patterns.
+ * alpha/t-vms, alpha/vms.h, alpha/xm-vms.h: New files.
+
+Fri Nov 15 17:38:20 1996 Doug Evans <dje@seba.cygnus.com>
+
+ * sdbout.c (current_file): New global.
+ (PUT_SDB_SRC_FILE): New PUT_SDB_FOO macro.
+ (sdbout_init): Initialize current_file ifdef MIPS_DEBUGGING_INFO.
+ (sdbout_{start_new,resume_previous}_source_file): New functions.
+ * toplev.c (debug_{start,end}_source_file): Call them if SDB_DEBUG.
+ * mips.h (PUT_SDB_SRC_FILE): Define.
+
+Fri Nov 15 16:11:25 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarfout.c (dwarfout_line): Don't emit line number info for
+ functions outside of .text.
+
+Fri Nov 15 15:52:42 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386/386bsd.h (COMMENT_BEGIN): Delete.
+ * i386/freebsd.h (COMMENT_BEGIN): Likewise.
+ * i386/netbsd.h (COMMENT_BEGIN): Likewise.
+ * i386/unix.h (COMMENT_BEGIN): Likewise.
+
+Fri Nov 15 13:22:42 1996 Jim Wilson <wilson@cygnus.com>
+
+ * fold-const.c (unextend): Rewrite type conversions to avoid overflow.
+
+Fri Nov 15 12:11:28 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * combine.c (try_combine): Properly copy an rtvec.
+ * emit-rtl.c (gen_rtvec_vv): New function.
+ (copy_rtx_if_shared): Call it.
+ * integrate.c (copy_for_inline): Likewise.
+ * reload1.c (eliminate_regs): Likewise.
+ * rtl.h (gen_rtvec_vv): Declare.
+ * genattrtab.c (simplify_cond): Make TESTS an array of rtunions.
+ * genextract.c (main): Use loop, not bcopy, to set recog_operands
+ from an rtvec.
+ * rtl.c (rtvec_alloc): Clear rtwint instead of rtvec.
+
+ * machmode.h (HOST_PTR_PRINTF): Handle char * wider than long.
+ (HOST_WIDE_INT_PRINT_{DEC,UNSIGNED,HEX,DOUBLE_HEX}): New macros.
+ * final.c (asm_fprintf): Use "ll" prefix for a long long HOST_WIDE_INT.
+ (output_{asm_insn,addr_const}): Use HOST_WIDE_INT_PRINT_*.
+ * print-tree.c (print_node{,_brief}, case INTEGER_CST): Likewise.
+ * print-rtl.c (print_rtx, case 'w'): Use HOST_WIDE_INT_PRINT_DEC.
+
+ * unroll.c (iteration_info): Fix code so that it knows iteration_var
+ is a HOST_WIDE_INT, not a long.
+
+ * fold-const.c (operand_equal_p): Do comparison with REAL_VALUES_EQUAL.
+ (make_range): Properly decide when to get TREE_TYPE of arg0.
+ Handle EXP being an INTEGER_CST at end.
+ (fold_range_test): Handle return of 0 from make_range.
+ (fold, case TRUTH_AND_EXPR): Handle first arg of 0.
+ (fold, case TRUTH_OR_EXPR): Handle first arg of 1.
+
+ * c-common.c (decl_attributes, case A_ALIAS): Add missing parens.
+
+Fri Nov 15 06:37:54 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * fold-const.c (range_binop): Set SNG1 to zero if ARG1 is a
+ not a lower or upper bound.
+
+Thu Nov 14 23:08:25 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * flags.h (debug_info_type): Add DWARF2_DEBUG.
+ * toplev.c (main): Support DWARF2_DEBUG. Add -gdwarf-1, -gdwarf-2
+ options. Check debug level after choosing type.
+ (debug_{start,end}_source_file, debug_{define,undef}): New functions.
+ (compile_file): Support dwarf2 separately from dwarf1.
+ (rest_of_type_compilation, rest_of_compilation): Likewise.
+ * final.c (final_start_function): Likewise.
+ (final_end_function, final_scan_insn, output_source_line): Likewise.
+ * varasm.c (assemble_variable): Likewise.
+ * dwarfout.c: Don't check DWARF_VERSION.
+ * dwarf2out.c: s/dwarfout/dwarf2out/g. Check DWARF2_DEBUGGING_INFO.
+ * c-lex.c (check_newline): Use debug_* instead of calling *out
+ functions directly.
+ * svr4.h (DWARF2_DEBUGGING_INFO): Define.
+ * mips/iris6.h (PREFERRED_DEBUGGING_TYPE): DWARF2_DEBUG.
+ (DWARF2_DEBUGGING_INFO): Define instead of DWARF_DEBUGGING_INFO.
+ (LINK_SPEC): Pass -w through.
+ * mips.h (PREFERRED_DEBUGGING_TYPE): Don't check `len'.
+
+Thu Nov 14 17:25:47 1996 Jeffrey A Law (law@cygnus.com)
+
+ * h8300.c (dosize): Don't clobber static chain reg if needed by
+ current function.
+
+Wed Nov 13 17:05:19 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * Makefile.in (stage?-start): Keep a copy of EXTRA_MULTILIB_PARTS
+ in the build directory.
+
+Tue Nov 12 23:17:17 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (print_operand, case 'Y'): Fix comparisons to handle
+ NaNs properly in all cases.
+
+Tue Nov 12 18:47:24 1996 Jim Wilson <wilson@cygnus.com>
+
+ * expr.c (emit_group_store): For REG case, call gen_lowpart if
+ modes are different.
+
+Tue Nov 12 18:24:40 1996 Doug Rupp (rupp@gnat.com)
+
+ * gcc.c (exit): If VMS, define as __posix_exit.
+ (option_map): Add define-macro and undefine-macro.
+
+Tue Nov 12 17:55:10 1996 Torbjorn Granlund <tege@tege.pdc.kth.se>
+
+ * alpha.c (input_operand): If TARGET_BYTE_OPS accept HImode and QImode.
+ * alpha.h (MASK_BYTE_OPS): New define.
+ (TARGET_BYTE_OPS): New define.
+ (TARGET_SWITCHES): Handle -mbyte.
+ (LOAD_EXTEND_OP): When MODE is not SImode, return ZERO_EXTEND.
+ * alpha.md (zero_extendqidi2): Handle TARGET_BYTE_OPS.
+ (zero_extend{hidi,qisi,hisi}2): Likewise.
+ (extendqisi2): Use extendqidi2x if TARGET_BYTE_OPS.
+ (extendqidi2): Likewise.
+ (extendqidi2x): New pattern.
+ (extendhisi2): Use extendhidi2x if TARGET_BYTE_OPS.
+ (extendhidi2): Likewise.
+ (extendhidi2x): New pattern.
+ (movhi): Handle TARGET_BYTE_OPS.
+ (movhi matcher): Output ldwu and stw.
+ (movqi): Handle TARGET_BYTE_OPS.
+ (movqi matcher): Output ldbu and stb.
+
+Tue Nov 12 16:53:37 1996 Rob Savoye <rob@chinadoll.cygnus.com>
+
+ * configure (hppa1.1-pro*, i960-*-coff*,m68k-*-aout*): Add libgloss.h.
+ (m68k-*-coff*, mips*-*-elf*, sparc*-*-aout*, sparc*-*-coff*): Likewise.
+ * config/libgloss.h: New file.
+
+Tue Nov 12 16:21:45 1996 Joern Rennecke <amylaar@cygnus.com>
+
+ * jump.c (jump_optimize): Fix bug in Sep 23 change.
+
+Tue Nov 12 16:15:31 1996 Andrew Cagney (cagney@tpgi.com.au)
+
+ * global.c (prune_references): Add missing symmetic CONFLICTP call.
+
+Tue Nov 12 14:34:40 1996 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * m68k.c (output_function_{pro,epi}logue): Save and restore
+ fp-registers only if TARGET_68881.
+
+ * m68k/mot3300.h (ASM_OUTPUT_INTERNAL_LABEL): Prefix labels with "L%".
+ (ASM_GENERATE_INTERNAL_LABEL, ASM_OUTPUT_CASE_LABEL): Likewise.
+ (ASM_OUTPUT_ADDR_VEC_ELT, ASM_OUTPUT_ADDR_DIFF_ELT): Likewise.
+
+ * m68k/mot3300.h (TARGET_DEFAULT): Use MASK_68040_ALSO, not MASK_68040.
+ * m68k/next.h, m68k/ccur-GAS.h (TARGET_DEFAULT): Likewise.
+
+ * fixproto (std_files): Add sys/socket.h.
+
+ * m68k.md (movqi): Emit 'st' for INTVAL & 255 == 255, not INTVAL == -1.
+ (seq,sne,sgt,sgtu,slt,sltu,sge,sgeu,sle,sleu): Allow "m" as operand 0.
+
+Tue Nov 12 14:17:45 1996 Paul Eggert <eggert@twinsun.com>
+
+ * c-decl.c (grokdeclarator): Generate a warning if -Wimplicit,
+ unless a warning was already generated by -Wreturn-type.
+
+Tue Nov 12 14:11:02 1996 Pat Rankin <rankin@eql.caltech.edu>
+
+ * Make qsort callback routines conform to the ANSI/ISO standard.
+ * c-decl.c (field_decl_cmp): Use `const void *' arguments.
+ * global.c (allocno_compare): Likewise.
+ * reload1.c (hard_reg_use_compare, compare_spill_regs): Likewise.
+ (reload_reg_class_lower): Likewise.
+ * stupid.c (stupid_reg_compare): Likewise.
+ * local-alloc.c (qty_compare_1, qty_sugg_compare_1): Likewise.
+ (QTY_CMP_PRI, QTY_CMP_SUGG): New macros.
+ (qty_compare_1, qty_sugg_compare_1): Use them.
+
+Tue Nov 12 13:20:25 1996 Jim Wilson <wilson@cygnus.com>
+
+ * fold-const.c (merge_ranges): In (+,-) case, treat subset specially
+ if lower bounds are the same.
+
+Tue Nov 12 13:10:01 1996 J.T. Conklin <jtc@cygnus.com>
+
+ * m68k.md (addsi3): If TARGET_5200, use the lea insn to add small
+ constants to address registers.
+ (negsi2): Change into define_expand.
+ (negsi2_internal): Rename from old negsi2, changed condition
+ to !TARGET_5200.
+ (negsi2_5200): New insn.
+ (one_cmplsi2): Change into define_expand.
+ (one_cmplsi2_internal): Rename from old one_cmplsi2, changed
+ condition to !TARGET_5200.
+ (one_cmplsi2_5200): New insn.
+ (negdi2_5200): Corrected constraints.
+ (one_cmpldi2): Changed condition to !TARGET_5200.
+
+ * m68k.c (m68k_align_loops_string, m68k_align_jumps_string): New vars.
+ (m68k_align_funcs_string, m68k_align_loops): Likewise.
+ (m68k_align_jumps, m68k_align_funcs): Likewise.
+ (override_options): New function.
+ * m68k.h (TARGET_OPTIONS): Added alignment options.
+ (MAX_CODE_ALIGN, ASM_OUTPUT_LOOP_ALIGN, ASM_OUTPUT_ALIGN_CODE):
+ New macros.
+ (FUNCTION_BOUNDARY): Use value derrived from m68k_align_funcs
+ instead of constant.
+
+ * m68k.c (output_function_{pro,epi}logue): Fix typo in last change.
+
+Tue Nov 12 09:26:51 1996 Torbjorn Granlund <tege@wombat.gnu.ai.mit.edu>
+
+ * i386.md (parallel inc/dec and branch-if-zero/nonzero): Use `+' in
+ constraint.
+
+Mon Nov 11 15:12:22 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * libgcc2.c: Also define WEAK_ALIAS if ASM_OUTPUT_WEAK_ALIAS.
+ * mips/iris6.h (ASM_OUTPUT_WEAK_ALIAS): Define.
+ * varasm.c (assemble_alias): Use ASM_OUTPUT_WEAK_ALIAS.
+
+ * dwarf2out.c (TYPE_USED_FOR_FUNCTION): Lose.
+ (gen_compile_unit_die): Only append -g with -g2 or better.
+ (scope_die_for): Don't emit any type info with -g1.
+ (gen_subprogram_die): Likewise.
+ (gen_decl_die): Likewise.
+ (dwarfout_file_scope_decl): Likewise.
+ (dwarfout_init): Likewise.
+
+ * mips/iris6.h (TYPE_ASM_OP): Define.
+ (SIZE_ASM_OP): Define.
+ (ASM_WEAKEN_LABEL): Define.
+ (BSS_SECTION_ASM_OP): Define.
+ (ASM_OUTPUT_ALIGNED_LOCAL): Don't use ASM_DECLARE_OBJECT_NAME.
+ (ASM_OUTPUT_ALIGNED_BSS): Define.
+ (ASM_DECLARE_OBJECT_NAME): Redefine to emit .size directive.
+ (ASM_FINISH_DECLARE_OBJECT): Define.
+ (ASM_OUTPUT_DEF): Don't define.
+
+Fri Nov 8 20:38:51 1996 Jim Wilson <wilson@cygnus.com>
+
+ * function.c (expand_function_end): Handle BLKmode structures returned
+ in registers.
+
+Fri Nov 8 20:27:07 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * stor-layout.c (layout_record): Check for VAR_DECL instead
+ of TREE_STATIC.
+
+ * varasm.c (assemble_variable): Do write out DWARF for
+ record-scope variables.
+ * toplev.c (rest_of_type_compilation): Do write out DWARF for
+ record-scope types.
+
+ * dwarf2out.c (gen_enumeration_type_die): Set TREE_ASM_WRITTEN on a
+ complete enum type.
+ (gen_struct_or_union_type_die): Don't recurse between nested classes.
+ (gen_type_die): Write out nested classes by writing out their context.
+
+Fri Nov 8 17:40:27 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * emit-rtl.c (change_address): If MEMREF isn't changing,
+ return the old one.
+
+ * expr.c (expand_assignment): Remove bogus resetting of alignment
+ to inner alignment.
+ (expand_expr, case COMPONENT_REF): Likewise.
+
+Fri Nov 8 16:31:31 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * reg-stack.c (compare_for_stack_reg, subst_stack_regs_pat):
+ Add support for float conditional move.
+
+Thu Nov 7 07:46:07 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * stor-layout.c (layout_record): Treat constant size as variable if
+ it overflows.
+ * fold-const.c (const_binop, case *_DIV_EXPR): Don't do special
+ sizetype case if a constant overflows.
+ (size_binop): Use integer_{zero,one}p instead of explicit test.
+ * tree.c (integer_{zero,one,all_ones,pow2}p, real_{zero,one,two}p):
+ Return 0 if TREE_CONSTANT_OVERFLOW.
+
+Wed Nov 6 17:53:33 1996 Torbjorn Granlund <tege@wombat.gnu.ai.mit.edu>
+
+ * i386.md (parallel inc and branch-if-zero/nonzero): Add two
+ new pattern variants. Change incrementing pattern to use incl/jnz.
+
+Wed Nov 6 09:46:10 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.c (override_options): Set defaults for -march and -mcpu.
+ (output_float_compare): Use cc_status.flags to mark if this
+ comparison can be done with fcomi.
+ (output_fp_cc0_set): A conditional move may be in a PARALLEL.
+
+ * i386.h (CC_FCOMI): Define
+
+ * i386.md (sgt,sgtu,sge,sle,bgt,blt,bge,ble): Use CC_FCOMI
+ (movsicc_1,movhicc_1): Use correct size suffix.
+ (movsfcc_1,movdfcc_1): Cleanup default move case.
+
+Wed Nov 6 09:46:10 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * i386.h (HARD_REGNO_MODE_OK): If long double isn't XFmode, can't
+ allow XFmode.
+
+Tue Nov 5 22:49:56 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.md (define_split for and_shl_scratch):
+ Use rtx_equal_p on the operands to find out which alternative is used.
+ * sh.c (gen_shl_and): Try to generate shorter constant for and.
+
+Mon Nov 4 19:13:52 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c: Clean up unused variables.
+ Use ASM_{GENERATE,OUTPUT}_INTERNAL_LABEL, shorten label names.
+ (loc_descriptor): Use reg_loc_descriptor.
+ (TYPE_DECL_IS_STUB): New macro.
+ (gen_decl_die): Use it.
+ (dwarfout_file_scope_decl): Use it.
+
+Mon Nov 4 10:23:46 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * ginclude/va-ppc.h (__va_regsave_t,va_start,va_end): Wrap macro
+ and structures inside #ifndef __VA_PPC_H__ to allow reinclusion.
+
+ * rs6000.h (LEGITIMATE_SMALL_DATA_P): Don't allow -fpic or TARGET_TOC.
+ (LEGITIMATE_LO_SUM_ADDRESS_P, LEGITIMIZE_ADDRESS): Likewise.
+
+ * rs6000.md (movsi): Don't call elf_{high,low} if -fpic.
+
+ * rs6000/cygwin32.h (STARTFILE_SPEC): Eliminate empty %{}.
+
+Sun Nov 3 15:56:35 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sysv4.h (TARGET_TOC): Plain -fpic does not require a TOC.
+ ({MINIMAL_TOC,CONST}_SECTION_ASM_OP): -fpic should be treated like
+ -mrelocatable in these cases.
+ (ASM_OUTPUT_INT, ASM_OUTPUT_SECTION_NAME): Likewise.
+ (ASM_OUTPUT_ALIGNED_LOCAL): Use sdata_section, not sbss_section.
+
+Fri Nov 1 19:57:13 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (based_loc_descr): Use DBX_REGISTER_NUMBER. The
+ "frame base" is just the frame or stack reg without an offset.
+ (gen_subprogram_die): Likewise.
+ (dwarfout_begin_function): Use DBX_REGISTER_NUMBER.
+
+Fri Nov 1 09:50:05 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * fold-const.c (make_range): Don't merge unsigned case with range
+ containing upper bound; instead merge just with zero and convert
+ a range with no upper bound to opposite one with no lower bound.
+ (merge_ranges): In (+,-) case, don't treat subset specially if
+ the upper bounds are the same; fix typo in others case here.
+
+Thu Oct 31 20:12:13 1996 Jeffrey A Law (law@cygnus.com)
+
+ * fold-const.c (make_range, case PLUS_EXPR): Correct
+ normalization of an unsigned range that wraps around zero.
+
+Thu Oct 31 21:06:37 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * mips/t-iris6 (EXTRA_MULTILIB_PARTS): Define.
+ (EXTRA_PARTS): Don't define.
+
+ * dwarf2out.c (gen_struct_or_union_type_die): Use AT_specification
+ for nested types defined outside their containing class. Lose
+ is_complete.
+ (gen_enumeration_type_die): Lose is_complete.
+ (gen_type_die): Lose is_complete.
+ (add_name_and_src_coords_attributes): Tweak.
+ (gen_subroutine_type_die): Use scope_die_for.
+ (gen_ptr_to_mbr_type_die): Likewise.
+ (gen_subprogram_die): Support AT_artificial.
+ (gen_variable_die): Likewise.
+ (dwarfout_file_scope_decl): Lose finalizing.
+
+Thu Oct 31 18:43:18 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * pa.c (emit_move_sequence): Refine previous change.
+
+Thu Oct 31 13:25:32 1996 Jim Wilson <wilson@cygnus.com>
+
+ * crtstuff.c: Put HAS_INIT_SECTION ifdefs around Irix6 support.
+
+ * tree.c (decl_function_context): Handle QUAL_UNION_TYPE.
+
+ * calls.c (expand_call): Disable special handling for const calls
+ that return a PARALLEL rtx.
+ * expr.c (expand_expr, case CONSTRUCTOR): Don't use a PARALLEL
+ target.
+
+Thu Oct 31 11:45:00 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/t-{ppcgas,ppc,solaris} (EXTRA_MULTILIB_PARTS): Add
+ {e,s}crt{i,n,0}.o.
+ ({stmp,install}-crt): Delete, no longer used.
+ ({,INSTALL_}LIBGCC): Remove {stmp,install}-crt rule.
+
+Thu Oct 31 02:49:58 1996 Torbjorn Granlund <tege@nada.kth.se>
+
+ * i386.md (parallel inc and branch-if-zero/nonzero):
+ Check for -1, not zero.
+
+Wed Oct 30 15:50:49 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * fold-const.c (range_binop): Strip NOPs from result and
+ verify it's an INTEGER_CST.
+ (make_range, case BIT_NOT_EXPR): Fix typo in constant for PLUS_EXPR.
+
+ * stor-layout.c (layout_record): Use HOST_WIDE_INT for size.
+
+ * stmt.c (expand_asm_operands): Disallow matching constraints
+ on output and validate the numbers on inputs.
+
+Tue Oct 29 16:21:59 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * gcc.c (process_command,main): Process -specs=file and -specs
+ file after reading the main specs file to allow the user to
+ override the default.
+ (DEFAULT_WORD_SWITCH_TAKES_ARG): Add specs to list.
+ (option_map): Likewise.
+
+Tue Oct 29 15:49:18 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * Makefile.in (stmp-multilib): Pass $flags to s-m-sub in
+ MULTILIB_CFLAGS.
+ (stmp-multilib-sub): Build EXTRA_MULTILIB_PARTS.
+ ($(T)crt*.o): Add $(T), lose stamp-crt rule, use MULTILIB_CFLAGS.
+ (install-multilib): Install EXTRA_MULTILIB_PARTS.
+
+Mon Oct 28 20:09:39 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.md (shl_sext_ext): Don't accept simple left/right shift variant.
+ * sh.c (EXT_SHIFT_SIGNED): New macro.
+ (shl_sext_kind, gen_shl_sext): try left shift - sign extend -
+ left shift - arithmetic right shift in case 2.
+
+Mon Oct 28 14:55:42 1996 Jim Wilson <wilson@cygnus.com>
+
+ * configure (sh-*-*): Set float_format to sh.
+ * config/float-sh.h: New file.
+
+Mon Oct 28 14:26:08 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips/mips.h (RTX_COSTS): Add cases for SIGN_EXTEND and ZERO_EXTEND.
+
+ * m68k/lb1sf68.asm: Change # to IMM in udivsi3 __mcf5200__.
+
+ * combine.c (simplify_rtx): Add some optimizations for TRUNCATE.
+ (expand_compound_operation): Add some optimizations for ZERO_EXTEND.
+
+Mon Oct 28 14:11:20 1996 Gavin Koch <gavin@cygnus.com>
+
+ * varasm.c (make_decl_rtl,assemble_variable):
+ Allow named sections for uninitialized variables.
+
+Mon Oct 28 13:08:51 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * pa.c (emit_move_sequence): If reload in progress, replace
+ reference to pseudo with reference to corresponding MEM.
+
+ * c-typeck.c ({un,}signed_type): If can't do anything, call
+ signed_or_unsigned_type.
+ (signed_or_unsigned_type): If already right signedness, return.
+
+Mon Oct 28 13:05:26 1996 Stephen Williams (steve@icarus.com)
+
+ * i960.h: Add specification for -Jx types.
+ * i960/t-960bare: Include multilib support for Jx types.
+
+Mon Oct 28 10:06:00 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/t-{ppc{,gas},solaris} (install-crt): Depend on
+ installdirs, not install-dir.
+
+ * rs6000/sysv4.h (TARGET_TOC): -fpic does not use a TOC area.
+
+Mon Oct 28 09:07:42 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * reload1.c (delete_output_reload): Don't use delete_insn
+ when deleting all stores into a replaced pseudo.
+
+ * sh.md (movsf_ieq, movsf_ie): Merged the former into the latter.
+ Changed matching define_split appropriately.
+ (movsf): Changed appropriately.
+ (reload_insf) Define.
+ * sh.h (SECONDARY_INPUT_RELOAD_CLASS): Define.
+
+Mon Oct 28 08:38:23 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * dsp16xx.h (ASM_OUTPUT_BYTE): Adjust definition to actual type of
+ VALUE, which is HOST_WIDE_INT.
+
+Mon Oct 28 07:36:07 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * ginclude/stddef.h: Make sure file is processed if some of the
+ known __need_* macros is defined.
+
+Sun Oct 27 21:37:59 1996 J.T. Conklin <jtc@cygnus.com>
+
+ * m68k.c (output_function_prologue): Adjust SP then use movmel with
+ plain address indirect mode for TARGET_5200.
+ (output_function_epilogue): Disable moveml and use several movel's
+ instead for TARGET_5200.
+ (output_function_{pro,epi}logue): Use lea instruction to adjust
+ stack pointer for short displacements for TARGET_5200.
+
+Sun Oct 27 15:27:45 1996 Jeffrey A Law (law@cygnus.com)
+
+ * fold-const.c (merge_ranges): Fix thinko/typo.
+
+Sat Oct 26 22:07:04 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * expr.c (convert_modes): Before returning a const_double for a
+ large unsigned value, zero extend an integer value if necessary.
+
+Sat Oct 26 15:24:55 1996 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * m68k/x-mot3300 (XCFLAGS): Disable native assembler's jump
+ optimization for expr.o and cp/decl.o.
+
+Sat Oct 26 14:04:09 1996 Ben Harris <bjh21@cam.ac.uk>
+
+ * m68k.c (output_function_prologue): Add REGISTER_PREFIX to stack
+ probe instruction.
+
+Sat Oct 26 13:59:05 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * explow.c (allocate_dynamic_stack_space): Delete reference to
+ nonexistent macro ALLOCATE_OUTGOING_ARGS.
+
+ * next.h (CPP_PREDEFINES): Add -D_NEXT_SOURCE.
+
+Sat Oct 26 13:50:49 1996 Mark Mitchell (mitchell@centerline.com)
+
+ * configure (i486-ncr-sysv4*): Use i386/sysv4gdb if stabs and gas.
+
+Sat Oct 26 12:20:35 1996 John F. Carr <jfc@mit.edu>
+
+ * configure: Support --with-cpu=* for SPARC. Or target default
+ values instead of adding them.
+ * sparc.c (cpu_default): Add entries for v8 and supersparc.
+ * sparc.h: Define TARGET_CPU values for v8 and supersparc.
+
+Sat Oct 26 11:38:01 1996 Kamil Iskra <iskra@student.uci.agh.edu.pl>
+
+ * collect2.c (dump_file): Call fclose for opened files.
+
+Sat Oct 26 11:29:29 1996 J"orn Rennecke (amylaar@cygnus.co.uk)
+
+ * jump.c (jump_optimize): Fix second error in last change.
+
+ * svr3.h: Fix typo which makes comment text be non-comment.
+
+Fri Oct 25 16:18:39 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/t-winnt (LIBGCC1): Don't build libgcc1.
+ (EXTRA_PARTS): Build crti.o, crtn.o.
+ (stmp-crt): Remove old multilib support.
+
+Thu Oct 24 15:09:14 1996 Jim Wilson <wilson@cygnus.com>
+
+ * fold-const.c (make_range, case PLUS_EXPR): Normalize an unsigned
+ range that wraps around 0.
+
+Thu Oct 24 14:37:17 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips.md: Change predicates for 64 bit arithmetic operations
+ so that they accept sign extended registers as operands.
+ (extendsidi2): Accept hi or lo as input.
+ * mips.c (movdi_operand, se_register_operand,
+ se_reg_or_0_operand, se_uns_arith_operand, se_arith_operand,
+ se_nonmemory_operand, se_nonimmediate_operand): New functions.
+ (mips_move_2words): Handle a SIGN_EXTEND source.
+ (print_operand): Handle a SIGN_EXTEND operand.
+ (mips_secondary_reload_class): Handle a SIGN_EXTEND rtx.
+ * mips.h: Declare new mips.c functions.
+ (PREDICATE_CODES): Add new functions.
+
+Thu Oct 24 07:41:14 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * fold-const.c (make_range, comparison cases): When making range
+ for unsigned to merge in, use full range.
+
+ * stor-layout.c (GET_MODE_ALIGNMENT): Delete definition; duplicate.
+
+Thu Oct 24 07:28:53 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * reload1.c (emit_reload_insns): Check for second_reloadreg
+ in SECONDARY_OUTPUT_RELOAD_CLASS / PRESERVE_DEATH_INFO_REGNO_P case.
+
+Wed Oct 23 14:27:43 1996 Mike Stump <mrs@cygnus.com>
+
+ * crtstuff.c (__do_global_dtors_aux): Allow finalization code to
+ be run more than once.
+ * libgcc2.c (__do_global_dtors): Ditto.
+
+Wed Oct 23 20:42:23 1996 Joern Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.c (dump_table): handle SFmode and DFmode.
+ (broken_move): handle simple PARALLEL.
+ (machine_dependent_reorg, pc-relative move generation): Likewise.
+ * sh.h (CONST_DOUBLE_OK_FOR_LETTER_P): always true for 'F' .
+ (LEGITIMATE_CONSTANT_P): accept SFmode and DFmode.
+ * sh.md (movdf_k, movsf_i, movsf_ie): new alternative for
+ pc-relative load.
+ (movsf_ieq): new define_insn with matching define_split.
+ (movsf): use it where appropriate.
+ (consttable_sf, consttable_df): new define_insns.
+
+Wed Oct 23 17:48:32 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * svr4.h (MAKE_DECL_ONE_ONLY): Fix typo in use of macro parameter.
+
+Wed Oct 23 17:46:13 1996 Pat Rankin <rankin@eql.caltech.edu>
+
+ * cexp.y (yylex): Cast string literal to U_CHAR* for lookup() call.
+
+Wed Oct 23 14:50:04 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * stmt.c (expand_return): Expand cleanups. Make sure we get pseudo
+ and provide target in non-BLKmode case. Get proper return type of fn.
+
+Wed Oct 23 14:16:06 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * reload.c (find_reloads): Handle any unary operator.
+ * recog.c (constrain_operands): Likewise.
+
+ * mips.md: Remove extendsidi2 define_expand.
+ Rename extendsidi2_internal define_insn to extendsidi2, and add a
+ register to register case.
+
+Wed Oct 23 14:08:31 1996 Jim Wilson <wilson@cygnus.com>
+
+ * a29k.c (a29k_makes_calls): New global variable.
+ (compute_regstack_size, a29k_compute_reg_names): New functions.
+ (output_prolog): Much code moved to two new functions.
+ Use a29k_makes_calls instead of makes_calls.
+ * a29k.h (ASM_DECLARE_FUNCTION_NAME): Call a29k_compute_reg_names.
+
+ * calls.c (expand_call): In target code, move PARALLEL case above
+ target != case.
+
+ * mips.c (block_move_load_store, block_move_sequence): Delete.
+ (block_move_loop): New parameter orig_dest. Call change_address to
+ create new MEM instead of gen_rtx.
+ (expand_block_move): New local orig_dest. Pass it to block_move_loop.
+ Call change_address to create new MEM instead of gen_rtx.
+
+Wed Oct 23 10:30:32 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * loop.c (combine_givs): When combining a DEST_REG giv with its
+ only use, always set the benefit of the combined giv to that of
+ the DEST_REG giv.
+
+ * emit-rtl (gen_lowpart_common): When converting a floating
+ point value into an integer, use WORD as (first) word.
+
+ * combine.c (can_combine_p): When SMALL_REGISTER_CLASSES is defined,
+ avoid substituting a return register into I3.
+
+ * optabs.c (emit_libcall_block): Before adding an REG_EQUAL note,
+ check that it will really apply to a single instruction.
+ (expand_binop, expand_fix): Likewise.
+
+Wed Oct 23 10:20:52 1996 Stephen L Moshier (moshier@world.std.com)
+
+ * real.c (exact_real_inverse): New function, if REAL_ARITHMETIC.
+ * fold-const.c (exact_real_inverse): Likewise, if no REAL_ARITHMETIC.
+ (fold, case RDIV_EXPR): Turn divide by constant into multiplication
+ by the reciprocal, if optimizing and result is exact.
+ * real.h (exact_real_inverse): Declare.
+
+Wed Oct 23 00:12:52 1996 Torbjorn Granlund <tege@nada.kth.se>
+
+ * expr.h (emit_store_flag_force): Declare.
+
+Tue Oct 22 18:32:20 1996 Jim Wilson <wilson@cygnus.com>
+
+ * unroll.c (unroll_loop): Always reject loops with unbalanced blocks.
+
+Tue Oct 22 18:27:06 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * config/fp-bit.c (float_to_usi): Correct thinko: avoid negative shift.
+ (df_to_sf): Remember any discarded nonzero bits in the low order
+ guard bit.
+
+ * ginclude/va-mips.h: Add support for -mips1 and -msoft-float when
+ using -mabi=eabi.
+ * mips/abi64.h (SETUP_INCOMING_VARARGS): When MIPS EABI, handle
+ TARGET_SINGLE_FLOAT or ! TARGET_FLOAT64 correctly when saving
+ floating point registers to the stack.
+ * mips/mips.c (mips_function_value): If TARGET_SINGLE_FLOAT, use
+ GP_RETURN for floating point types larger than 4 bytes.
+
+Tue Oct 22 09:43:49 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * rs6000/cygwin32.h (LIB_SPEC): Add -lkernel32 all of the time,
+ and {user,gdi,comdlg}32 if -mwindows.
+
+Tue Oct 22 05:24:05 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (scope_die_for): Don't skip lexical blocks.
+ (gen_lexical_block_die): Call push_decl_scope.
+ (gen_subprogram_die): Never refer to the function symbol.
+ (dwarfout_begin_prologue): Likewise.
+
+Mon Oct 21 20:22:49 1996 Torbjorn Granlund <tege@nada.kth.se>
+
+ * expmed.c (emit_store_flag_force): New function.
+ * optabs.c (expand_binop): Use it.
+
+ * expr.c (do_store_flag): Don't check if target is 0 in code
+ emitting store flag as compare-branch.
+
+Mon Oct 21 17:58:33 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips.c (override_options): Correct typo (MASK_64BIT should
+ have been TARGET_64BIT).
+
+Mon Oct 21 13:58:54 1996 Jim Wilson <wilson@cygnus.com>
+
+ * unroll.c (loop_comparison_code): New static variable.
+ (unroll_loop): Add check for loop_comparison_code
+ (loop_iterations): Set loop_comparison_code.
+
+ * sh.c (gen_shl_sext): Add missing parameter to shl_sext_kind call.
+
+ * mips.h (INITIAL_FRAME_POINTER_OFFSET): Delete.
+
+ * loop.c (strength_reduce): Add check for ! bl->reversed to
+ auto_inc_opt code.
+
+Mon Oct 21 12:28:15 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * jump.c (jump_optimize): Fix bug in Oct. 14 change.
+
+Mon Oct 21 07:59:16 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (store_expr): Disable optimization of using convert
+ if exp's type is a subtype.
+
+ * c-typeck.c (build_array_ref): If -Wchar-subscripts, also warn
+ in case when pointer is being indexed.
+
+Mon Oct 21 07:39:31 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * jump.c (jump_optimize): Use emit_store_flag even if branches
+ are cheap, if the store is even cheaper.
+
+Sun Oct 20 20:01:09 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * reload1.c (reload_reg_free_p, reloads_conflict): RELOAD_OTHER
+ and RELOAD_FOR_OTHER_ADDRESS conflict.
+
+ * i386.md (ffs[sh]i2): Add missing CC_STATUS_INIT.
+
+Fri Oct 18 13:32:13 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (float conversion insns): Generate correct code
+ if the bit 15 of rs6000_fpmem_offset is non-zero.
+
+Thu Oct 17 23:22:03 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarfout.c (data_member_location_attribute): Support binfos.
+ (output_inheritance_die): New fn.
+ (output_type): Use it.
+
+ * dwarf2out.c (value_format): Split out from...
+ (output_value_format): Here.
+ (build_abbrev_table): Use value_format.
+ (size_of_locs): New fn.
+ (size_of_die): Don't assume a loc needs a 2-byte length.
+ (value_format, output_die): Likewise.
+
+Thu Oct 17 14:46:14 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips.c (override_options): In 64 bit EABI mode, set TARGET_LONG64.
+
+Thu Oct 17 11:34:51 1996 Bob Manson <manson@cygnus.com>
+
+ * expr.c (do_jump): Conditionalize cleanups for the COND_EXPR case,
+ similarly to the way TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR are
+ handled.
+
+Thu Oct 17 01:20:16 1996 Jim Wilson <wilson@cygnus.com>
+
+ * m68k.h (MASK_68040_ALSO): New macro.
+ (TARGET_SWITCHES): Option -m68020-40 includes MASK_68040_ALSO.
+
+Wed Oct 16 16:25:38 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (scope_die_for): Also support decls, add asserts.
+ (modified_type_die): Modified types all go under comp_unit_die.
+ (add_type_attribute): Just pass context_die through.
+ (various): Revert useless lookup_type_die change.
+ (gen_subprogram_die): Use scope_die_for. Call push_decl_scope.
+ (gen_inlined_subroutine_die): Call push_decl_scope.
+ (gen_struct_or_union_type_die): Likewise.
+ (gen_decl_die): Don't call push_decl_scope.
+
+ * mips/iris6.h (*_SPEC): Replace enumeration of !mabi= with !mabi*.
+ (ASM_OUTPUT_{CON,DE}STRUCTOR): Enable.
+ (STARTFILE_SPEC): Support -mips4, -shared.
+ (ENDFILE_SPEC): Likewise.
+ (LIB_SPEC): Support -shared, avoid warning 84.
+ (LIBGCC_SPEC): Define.
+ (LINK_SPEC): Support -shared, remove -woff 84.
+ * mips/t-iris6 (EXTRA_PARTS): Add crtstuff.
+ * crtstuff.c: Support Irix 6.
+ * configure: Don't use collect2 for Irix 6.
+ * libgcc2.c (__main): Don't use any of this stuff if HAS_INIT_SECTION.
+
+Wed Oct 16 11:46:37 1996 Mike Stump <mrs@cygnus.com>
+
+ * elxsi.h (CHECK_FLOAT_VALUE): Removed.
+
+Wed Oct 16 14:19:38 1996 Jim Wilson <wilson@cygnus.com>
+
+ * iris6.h (CPP_PREDEFINES): Add -D_LONGLONG.
+ (CPP_SPECS): Remove -D_LONGLONG.
+
+Wed Oct 16 03:34:42 1996 Torbjorn Granlund <tege@nada.kth.se>
+
+ * i386.md (parallel inc/dec and branch-if-zero/nonzero): New patterns.
+
+Tue Oct 15 22:28:11 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips.h (enum mips_abi_type): Add ABI_EABI.
+ (CPP_SPEC): Define __mips_soft_float if -msoft-float, and
+ __mips_eabi if -mabi=eabi.
+ (INITIAL_ELIMINATION_OFFSET, CUMULATIVE_ARGS,
+ GO_IF_LEGITIMATE_ADDRESS, CONSTANT_ADDRESS_P, LEGITIMATE_CONSTANT,
+ LEGITIMIZE_ADDRESS): Add support for MIPS EABI.
+ * mips/abi64.h (STACK_BOUNDARY, MIPS_STACK_ALIGN,
+ FUNCTION_ARG_PADDING, RETURN_IN_MEMORY, SETUP_INCOMING_VARARGS):
+ Add support for MIPS EABI.
+ (FUNCTION_ARG_PASS_BY_REFERENCE): Define.
+ (FUNCTION_ARG_CALLEE_COPIES): Define.
+ * mips.c (mips_const_double_ok, function_arg_advance,
+ function_arg, function_arg_partial_nregs, override_options,
+ compute_frame_size): Add support for MIPS EABI.
+ (function_arg_pass_by_reference): New function.
+ * ginclude/va-mips.h: Add support for MIPS EABI.
+
+Tue Oct 15 19:10:08 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * toplev.c (rest_of_type_compilation): Don't write out
+ DWARF for function-scope types yet.
+ (compile_file): Do send vars with no RTL to the DWARF code.
+
+Tue Oct 15 17:54:43 1996 Doug Evans <dje@cygnus.com>
+
+ * loop.c (strength_reduce): Avoid taking PATTERN of a label.
+
+Tue Oct 15 16:52:33 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips/iris6.h: (SUBTARGET_CPP_SIZE_SPEC): Define.
+ (SUBTARGET_CPP_SPEC): Remove definitions of __SIZE_TYPE__ and
+ __PTRDIFF_TYPE__, now in SUBTARGET_CPP_SIZE_SPEC.
+
+Tue Oct 15 11:19:17 1996 Lee Iverson <leei@Canada.AI.SRI.COM>
+
+ * mips.h (CPP_SPEC): Restore -D_LANGUAGE_C for Objective C.
+
+Mon Oct 14 18:03:35 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (gen_decl_die): Do generate dies for classes with -g1.
+ (dwarfout_file_scope_decl): Likewise.
+
+Mon Oct 14 16:31:44 1996 Joern Rennecke <amylaar@cygnus.co.uk>
+
+ * jump.c (jump_optimize): Check for if (...) { x = a; goto l; } x = b;
+
+Mon Oct 14 14:19:49 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (modified_type_die): Don't bother with AT_address_class.
+ (add_data_member_location_attribute): Handle getting a binfo.
+ (add_location_or_const_value_attribute): Handle a decl with no RTL.
+ (add_pure_or_virtual_attribute): Add AT_vtable_elem_location.
+ (add_name_and_src_coords_attributes): Only use DECL_ASSEMBLER_NAME
+ for staticp things.
+ (gen_subprogram_die): Set up AT_inline for abstract decls.
+ (gen_inheritance_die): New fn.
+ (gen_member_die): Also emit info for base classes.
+
+Sat Oct 12 00:07:00 1996 Doug Evans <dje@cygnus.com>
+
+ * fold-const.c (make_range): Handle NULL operand 0 like in BIND_EXPRs.
+
+Fri Oct 11 15:42:22 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * toplev.c (rest_of_compilation): If we did a
+ save_for_inline_copying, reset DECL_ABSTRACT_ORIGIN for the
+ function when we're done.
+
+ * toplev.c (main): DWARF works with C++ now.
+
+ * dwarf2out.c (gen_subprogram_die): Disable MIPS_AT_has_inline
+ support for now.
+
+Fri Oct 11 14:31:10 1996 Torbjorn Granlund <tege@nada.kth.se>
+
+ * dwarfout.c: (output_bound_representation): Fix typo in prototype.
+
+Fri Oct 11 12:19:21 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips.h ({,SUBTARGET_}MIPS_AS_ASM_SPEC): Define.
+ ({GAS,TARGET,SUBTARGET}_ASM_SPEC): Define.
+ (SUBTARGET_ASM_{OPTIMIZING,DEBUGGING}_SPEC): Define.
+ (ASM_SPEC): Rewrite to use above specs.
+ (SUBTARGET_CPP{,_SIZE}_SPEC): Define.
+ (CPP_SPEC): Use above specs. Don't define _LANGUAGE_C if C++ or
+ Objective C.
+ ({,SUBTARGET_}EXTRA_SPECS): Define.
+ * mips/dec-bsd.h ({CPP,ASM}_SPEC): Don't define.
+ * mips/dec-osf1.h (CPP_SPEC): Don't define.
+ (SUBTARGET_CPP_SIZE_SPEC): Define.
+ * mips/elf64.h (CPP_SPEC): Don't define.
+ (SUBTARGET_CPP_SPEC): Define.
+ * mips/gnu.h (TARGET_DEFAULT): Define.
+ (ASM_SPEC): Don't define.
+ * mips/iris3.h (CPP_SPEC): Don't define.
+ (SUBTARGET_CPP_SPEC): Define.
+ * mips/iris4loser.h (ASM_SPEC): Don't define.
+ (SUBTARGET_MIPS_AS_ASM_SPEC): Define.
+ (SUBTARGET_ASM_OPTIMIZING_SPEC): Define.
+ * mips/iris5.h (CPP_SPEC): Don't define.
+ (SUBTARGET_CPP_SPEC): Define.
+ * mips/iris6.h ({CPP,ASM}_SPEC): Don't define.
+ (SUBTARGET_{CPP,ASM,MIPS_AS_ASM,ASM_DEBUGGING}_SPEC): Define.
+ * mips/netbsd.h ({CPP,ASM}_SPEC): Don't define.
+ (SUBTARGET_CPP_SPEC): Define.
+ * mips/osfrose.h ({CPP,ASM,ASM_FINAL}_SPEC): Don't define.
+ (SUBTARGET_CPP{,_SIZE}_SPEC): Define.
+ * mips/sni-svr4.h (CPP_SPEC): Don't define.
+ (SUBTARGET_CPP_SIZE_SPEC): Define.
+
+Thu Oct 10 17:58:49 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * mips/iris6.h (ASM_OUTPUT_SECTION_NAME): Define.
+ (DWARF_OFFSET_SIZE): Define.
+
+ * dwarf2out.c (most everywhere): Support SGI/MIPS -mabi=64 by fixing
+ code which assumed pointers are 4 bytes long, parameterizing many
+ sizes on DWARF_OFFSET_SIZE and using DELTA instead of DELTA4,
+ DATA instead of DATA4, FORM_ref instead of FORM_ref4.
+ (DWARF_ROUND, UNALIGNED_DOUBLE_INT_ASM_OP): New macros.
+ (UNALIGNED_WORD_ASM_OP, ASM_OUTPUT_DWARF_DELTA): Likewise.
+ (ASM_OUTPUT_DWARF_DATA, DW_FORM_data, DW_FORM_ref): New macros.
+ (gen_variable_die): Only equate_decl_number_to_die if
+ decl is TREE_STATIC.
+ (get_AT): Fix thinko.
+
+ * dwarf2out.c (constant_size): New fn.
+ (size_of_die): Use it instead of assuming 4 bytes.
+ (output_value_format, output_die): Likewise.
+ (build_abbrev_table): Need new abbrev if size of constant differs.
+ (dwarf_attr_name): Add new SGI/MIPS extensions.
+ (gen_subprogram_die): Support DW_AT_MIPS_has_inlines.
+ (gen_inlined_subroutine_die): Likewise.
+
+Thu Oct 10 16:38:58 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips.md (mov[sd]fcc): Use register_operand, not reg_or_0_operand,
+ for source predicates.
+
+Thu Oct 10 15:19:38 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (floatsidf2_load): For large stack frames, do not
+ generate an illegal memory reference.
+ (movdi, movdf define_splits): Fix code so that it works for either
+ big or little endian hosts generating code for either big or
+ little endian targets.
+
+ (from Jim Wilson)
+ * rs6000.c (rs6000_save_toc_p): Delete global variable.
+ (rs6000_{save,restore}_machine_status): Do not save/restore it.
+ (rs6000_init_expanders): Do not initialize it.
+ (rs6000_stack_info): Always create TOC save space.
+
+ * rs6000.md (NT indirect call insns): Do not set
+ rs6000_save_toc_p.
+
+ * rs6000.h (rs6000_save_toc_p): Delete declaration.
+
+Wed Oct 9 18:06:54 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips.h (EMPTY_FIELD_BOUNDARY): Define as 32.
+ * mips/abi64.h (EMPTY_FIELD_BOUNDARY): Don't define.
+
+ * mips/abi64.h (TARGET_DEFAULT, TARGET_LONG64, CPP_PREDEFINES,
+ CPP_SPEC): Move from here...
+ * mips/iris6.h: ...to here.
+
+Wed Oct 9 16:43:51 1996 Jim Wilson <wilson@cygnus.com>
+
+ * configure (i[3456]86-dg-dgux): Use install-headers-cpio.
+
+ * expr.c (store_constructor): Delete unnecessary increment.
+
+Wed Oct 9 16:29:22 1996 Gavin Koch <gavin@cetus.cygnus.com>
+
+ * cccp.c (do_include): Treat ENOTDIR like ENOENT when an open fails.
+
+Wed Oct 9 16:26:57 1996 Paul Eggert <eggert@twinsun.com>
+
+ * gcc.c (default_compilers): -ansi no longer implies -$ to cpp.
+ * c-lex.c (yylex): Treat `$' just like `_', except issue a
+ diagnostic if !dollars_in_ident or if pedantic.
+ * c-decl.c (dollars_in_ident): DOLLARS_IN_IDENTIFIERS is now Boolean.
+ (c_decode_option): -fdollars-in-identifiers is now independent
+ of -ansi, of -traditional, and of DOLLARS_IN_IDENTIFIERS.
+ * cexp.y (initialize_random_junk): Ignore DOLLARS_IN_IDENTIFIERS.
+ * cccp.c (dollars_in_ident): Remove; replaced by is_idchar['$'].
+ (main): Initialize is_idchar and is_idstart directly when given -$.
+ Ignore DOLLARS_IN_IDENTIFIERS.
+ (rescan): Diagnose $ in identifier if pedantic.
+ (initialize_char_syntax): Assume $ is allowed in identifier;
+ `main' will change this if -$ is given.
+ * cpplib.h (DOLLARS_IN_IDENTIFIERS): Remove.
+ * cpplib.c (cpp_options_init): Ignore DOLLARS_IN_IDENTIFIERS.
+ (parse_name): Diagnose $ in identifier if pedantic.
+ (cpp_handle_options): -traditional no longer messes with
+ dollars_in_ident.
+ * i386/dgux.h, m68k/apollo68.h (DOLLARS_IN_IDENTIFIERS): Remove.
+ * m88k.h, mips.h, nextstep.h, pa.h (DOLLARS_IN_IDENTIFIERS): Remove.
+ * vax/ultrix.h, vax/vms.h (DOLLARS_IN_IDENTIFIERS): Remove.
+ * convex.h (OVERRIDE_OPTIONS): Don't need to set
+ dollars_in_ident any more, since -ansi doesn't change it.
+
+Wed Oct 9 07:35:47 1996 Doug Evans <dje@cygnus.com>
+
+ * Allow prefix attributes in more places.
+ * c-parse.in: Update number of shift/reduce conflicts.
+ ({typed_declspecs,reserved_declspecs,declmods}_no_prefix_attr): New.
+ (current_declspecs): Initialize to NULL_TREE.
+ (fndef): Pass current_declspecs, not $1, to start_function.
+ (old_style_parm_decls): Renamed from xdecls.
+ (datadecl, declmods): Add references to new rules.
+ (setspecs): Call split_specs_attrs.
+ (absdcl1): Remove case with setattrs.
+ * c-common.c (split_specs_attrs): New function.
+
+Wed Oct 9 05:48:43 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * sdbout.c: Include defaults.h.
+ * Makefile.in (sdbout.o): Make dependency list match included files.
+
+ * fold-const.c (range_test): Function deleted.
+ (range_binop, make_range, build_range_check): New functions.
+ (merge_ranges, fold_range_test): Likewise.
+ (fold_truthop): No longer call range_test.
+ (fold, case TRUTH_{AND,OR}{,IF}_EXPR): Call fold_range_test.
+
+Tue Oct 8 22:03:32 1996 Torbjorn Granlund <tege@nada.kth.se>
+
+ * configure: Set cpu_type for pyramid.
+
+Tue Oct 8 21:54:04 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * final.c (final_start_function): Call dwarfout_begin_prologue.
+
+ * dwarf2out.c (pubname_*, arange_*): New data for .debug_pubnames
+ and .debug_aranges sections.
+ (add_pubname): New fn.
+ (size_of_pubnames): Reimplement.
+ (output_pubnames): Likewise.
+ (add_arange): New fn.
+ (size_of_aranges): Include function sections.
+ (output_aranges): Likewise.
+ (gen_variable_die): Call add_pubname.
+ (add_name_and_src_coords_attributes): Use DECL_ASSEMBLER_NAME for now.
+ (decl_start_label): Renamed from function_start_label.
+ (gen_subprogram_die): If weak or one_only, use a local label for
+ AT_low_pc. Call add_pubname and add_arange.
+ (dwarfout_begin_prologue): New fn. Start up FDE here.
+ (dwarfout_begin_function): Not here.
+ (get_AT): Split out. Look in specification and abstract_origin DIEs.
+ (get_AT_low_pc, get_AT_string, get_AT_flag, get_AT_unsigned,
+ get_AT_hi_pc): Use it.
+ (dwarfout_finish): Variables can produce pubnames, too.
+
+Tue Oct 8 19:35:40 1996 Torbjorn Granlund <tege@nada.kth.se>
+
+ * m88k/dgux.h (CPP_SPEC): Avoid newline in the string.
+
+ * final.c (final): Update insn_current_address before calling
+ final_scan_insn.
+
+Tue Oct 8 17:52:02 1996 Jim Wilson <wilson@cygnus.com>
+
+ * unroll.c (unroll_loops): Set local_regno only if set_dominates_use
+ returns true.
+ (set_dominates_use): New function.
+
+Tue Oct 8 16:01:37 1996 Doug Evans <dje@cygnus.com>
+
+ * c-typeck.c (decl_constant_value): Delete test for ! TREE_PUBLIC.
+
+Tue Oct 8 10:36:44 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (hppa_legitimize_address): Remove test code accidentally left
+ in during last change.
+
+Mon Oct 7 19:55:02 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sched.c (schedule_block): Before scheduling, add code to make all
+ call used regs not fixed or global live when we see a CALL_INSN.
+ During scheduling, change existing code to use same test.
+
+ * varasm.c (bss_section): Delete unused parameters.
+
+Mon Oct 7 16:24:21 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2.h: Add new SGI/MIPS attributes.
+
+ * dwarf2out.c (*_separate_line_info_*): Parallel line number
+ information for functions defined in sections other than .text.
+ (size_of_line_info): Support it.
+ (output_line_info, dwarfout_line): Likewise.
+ (gen_compile_unit_die): Don't add high/low_pc or stmt_list
+ attributes here.
+ (dwarfout_finish): Add them here if appropriate.
+ (remove_AT): Free removed attribute properly.
+ (gen_type_die): Don't assume a nested type is complete.
+ (dwarfout_finish): Don't emit line info if it would be empty.
+
+ * dwarfout.c (output_block): Don't emit a DIE for a body block.
+ (output_decls_for_scope): Don't increment next_block_number for the
+ outer block.
+ (output_decl): Start from the outer block, not
+ the first inner block since there can be more than one in C++.
+ (type_tag): Handle C++ TYPE_NAME.
+ (output_type): Fix handling of TYPE_METHODS.
+ (output_decl): Don't output a DIE for artificial typedefs.
+
+Mon Oct 7 15:47:29 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (movdi define_splits): Fix previous change to work
+ on both little and big endian hosts.
+
+Sun Oct 6 16:52:34 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa.h (combinable_fsub): Don't return without a value.
+
+Sun Oct 6 14:05:39 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (mov{df,di} define_splits): Use split_double to
+ properly split CONST_DOUBLEs.
+ (movdi): Likewise.
+
+Sat Oct 5 08:43:14 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * i386/cygwin32.h (LIB_SPEC): Add support for -mwindows.
+ Always pass -lkernel32.
+ (LIBGCC_SPEC): Don't delete.
+ (STARTFILE_SPEC): Remove always-true conditionalization.
+ (LONG_DOUBLE_TYPE_SIZE): Use default.
+
+Fri Oct 4 17:22:53 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * toplev.c (rest_of_type_compilation): Don't emit DWARF for member
+ types of a type we haven't emitted yet.
+ (compile_file): Still emit DWARF for pending tagged types.
+
+ * final.c (final_scan_insn): Do emit DWARF labels for level 1 blocks.
+
+ * dwarf2out.c (gen_subprogram_die): Start from the outer block, not
+ the first inner block since there can be more than one in C++.
+ (gen_lexical_block_die): Keep track of the block depth.
+ (gen_block_die): Don't emit a DIE for a body block.
+ (gen_inlined_subroutine_die): Don't emit anything for an
+ abstract instance.
+ (decls_for_scope): Don't increment next_block_number for the
+ outer block.
+
+Fri Oct 4 15:27:55 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.h (PRESERVE_DEATH_INFO_REGNO_P): Define.
+
+ * sh.c (sfunc_uses_reg): New function.
+ (noncall_uses_reg, machine_dependent_reorg, final_prescan_insn):
+ Handle special functions like function calls for purposes of relaxing.
+ (noncall_uses_reg): Added some missing cases of registers
+ being used in non-call instructions.
+
+Fri Oct 4 10:51:40 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c: Tear out backchaining brain damage.
+ (remove_AT, remove_children): New functions.
+ (modified_type_die): Call gen_type_die instead of backchaining.
+ (gen_subprogram_die): Don't generate a new specification DIE for
+ member functions defined in the class; use the declaration DIE instead.
+ (gen_struct_or_union_type_die): Support DW_AT_declaration.
+ (gen_type_die): Don't set TREE_ASM_WRITTEN on incomplete structs.
+ (gen_decl_die): Revert previous change; it's much simpler to emit
+ the class from rest_of_type_compilation.
+
+Fri Oct 4 09:54:21 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * Make sure we have enough registers for the insns we recognize.
+ * i386.h (flag_omit_frame_pointer, outer_function_chain): Declare.
+ (current_function_calls_alloca): Likewise
+ (rtx_equal_function_value_matters): Likewise
+ (N_REGS_USED, N_ALLOCATABLE_REGISTERS): Define.
+
+ * i386.md (adddi3_1, subdi3_1): Insns renamed from adddi3 and subdi3;
+ added missing earlyclobbers.
+ (adddi3_1): Removed duplicates from commutativity.
+ (adddi3, subdi3): New define_expands.
+ (movsf, movsf_mem, movsf_normal, movdf, movdf_mem , movdf_mem+1): Take
+ number of used vs. available registers into account.
+ (movxf, movxf_mem, movxf_mem+1, addsidi3_1, addsidi3_2): Likewise.
+ (adddi3_1, subsidi3, subdi3_1): Likewise.
+ (addsidi3_1, addsidi3_2, subsidi3): Need no generate function.
+
+ * i386.c (asm_output_function_prefix): Don't use
+ ASM_DECLARE_FUNCTION_NAME if it is not defined.
+
+Fri Oct 4 07:01:55 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * stor-layout.c (layout_decl): Don't turn off DECL_BIT_FIELD
+ if DECL's alignment is less than its type.
+
+Thu Oct 3 19:42:30 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * toplev.c (rest_of_type_compilation): Also do this for DWARF.
+ (compile_file): Don't try to write out DWARF for vars with no RTL.
+
+Thu Oct 3 18:31:28 1996 Doug Evans <dje@cygnus.com>
+
+ * ginclude/{stdarg.h,varargs.h}: Use #include "", not #include <>.
+
+Wed Oct 2 17:29:53 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * fixincludes: Add a hack to the big sed script to work around a
+ bug in the sed implementation on HP/UX 10.20.
+
+Wed Oct 2 16:53:56 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (modified_type_die): Don't generate redundant DIEs.
+ (gen_{array,pointer,reference,ptr_to_mbr}_type_die): Likewise.
+ (gen_{subroutine,string,set}_type_die): Likewise.
+
+ * dwarf2out.c: Undo text_end_label, add_src_coords changes.
+ (addr_const_to_string): Fix typos.
+ (decl_class_context, get_AT_unsigned): New functions.
+ (gen_subprogram_die): Only emit src coords info for a specification
+ if they changed.
+ (gen_variable_die): Support DW_AT_declaration and DW_AT_specification.
+ (gen_decl_die): Avoid generating redundant DIEs for member functions
+ and variables.
+
+Wed Oct 2 11:22:50 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa.h (EXTRA_CONSTRAINT): Loosen conditions for match of
+ 'Q' and 'T' while reload is running.
+ * pa.c (hppa_legitimize_address): Rework to generate more
+ indexed and scaled indexed addressing.
+ * pa.md (scaled indexed store): Add define_splits to undo
+ pessimizations created by hppa_legitimize_address for integer stores.
+
+ * pa.c (remove_useless_addtr_insns): New function.
+ (pa_reorg): Delete code to remove useless add,tr insns.
+ Instead call remove_useless_addtr_insns.
+ (output_function_prologue): Call remove_useless_addtr_insns
+ to catch any add,tr insns created by reorg.
+
+ * pa.c (secondary_reload_class): Remove duplicate/useless code.
+
+ * pa.h (PARSE_LDD_OUTPUT): Handle output from hpux10.20 "chatr".
+
+Tue Oct 1 17:23:32 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dwarf2out.c (text_end_label): New static.
+ (size_of_line_info): The final entry is smaller.
+ (output_aranges): Use TEXT_SECTION instead of TEXT_BEGIN_LABEL and
+ text_end_label instead of TEXT_END_LABEL.
+ (gen_compile_unit_die): Likewise.
+ (output_line_info): Likewise. Use a fixed advance for the last entry.
+ (dwarfout_init): Don't output starting labels.
+ (dwarfout_finish): Set up text_end_label. Don't output ending labels.
+
+ (add_pure_or_virtual_attribute): Don't say pure virtual for now.
+ (type_tag): Handle C++ TYPE_NAME.
+ (gen_formal_parameter_die): Support DW_AT_artificial.
+ (gen_formal_types_die): Do emit the type for 'this'.
+ (gen_member_die): Fix handling of TYPE_METHODS.
+ (gen_decl_die): Do output a DIE for member function declarations.
+ Don't output a DIE for artificial typedefs.
+
+ (add_member_attribute): Remove, not in DWARF-II.
+ (gen_array_type_die): Remove ref to add_member_attribute.
+ (gen_set_type_die, gen_entry_point_die, gen_enumeration_type_die,
+ gen_subprogram_die, gen_variable_die, gen_field_die,
+ gen_pointer_type_die, gen_reference_type_die, gen_ptr_to_mbr_type_die,
+ gen_string_type_die, gen_struct_or_union_type_die,
+ gen_subroutine_type_die, gen_typedef_die): Likewise.
+
+ (get_AT_flag): New fn.
+ (add_src_coords_attributes): Split out...
+ (add_name_and_src_coords_attributes): From here.
+ (gen_subprogram_die): Support DW_AT_declaration and
+ DW_AT_specification.
+
+ (gen_compile_unit_die): Don't emit full pathname for source file;
+ comment claimed that SGI required it, but they don't emit it either.
+ Append -g to producer rather than replacing it.
+
+Tue Oct 1 14:19:23 1996 Jim Wilson <wilson@cygnus.com>
+
+ * gcc.c (used_arg): When call xmalloc for mswitches, pass 1 if
+ n_switches is zero.
+
+Mon Sep 30 17:46:26 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.c (gen_shl_and, gen_shl_sext): Use gen_lowpart to
+ generate rtx in the appropriate mode for zero/sign-extension.
+ Don't generate a zero bit shift.
+ (gen_shl_sext) Directly use gen_ashift instead of gen_ashrsi3.
+
+Mon Sep 30 17:17:56 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * fixinc.svr4: In math.h, redefine exception to __math_exception
+ for C++, to avoid conflict with <exception>.
+ * fixincludes: Likewise.
+ Fix check for class in math.h to not match fp_class.
+
+Mon Sep 30 17:15:19 1996 Jim Wilson <wilson@cygnus.com>
+
+ * iris6.h (ASM_SPEC): Add -w.
+ (STARTFILE_SPEC): Add mips3 to n32 pathnames.
+ Add -L/usr/lib32/mips for n32 cases.
+ (ENDFILE_SPEC): Add mips3 to n32 pathnames.
+
+Mon Sep 30 13:20:31 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * genopinit.c (gen_insn): Look through the modes in reverse order,
+ to avoid stopping early on CC when EXTRA_CC_MODES is used.
+
+ * fixincludes: Add extern "C" to <sys/mman.h> on HP/UX.
+
+Sun Sep 29 12:39:18 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * c-typeck.c (pointer_diff): Do not do default conversions when
+ doing the minus expression, in case restype is a short type.
+
+Sun Sep 29 11:22:10 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * tree.c (build_complex): Add new argument, TYPE.
+ * tree.h (build_complex): Likewise.
+ * c-lex.c (yylex): Add new arg, TYPE, to call to build_complex.
+ * fold-const.c (const_binop): Likewise.
+ (fold, case CONJ_EXPR, COMPLEX_EXPR): Likewise.
+ * varasm.c (copy_constant, case COMPLEX_CST): Likewise.
+ * expr.c (expand_expr, case COMPONENT_REF): Don't try to directly
+ load a complex.
+ * recog.c (register_operand): Don't reject subreg of complex mode.
+ * emit-rtl.c (mark_user_reg): New function.
+ * function.c (assign_parms): Use it.
+ * stmt.c (expand_decl): Likewise, and simplify code.
+
+ * tree.c (contains_placeholder): Return 1 for PLACEHOLDER_EXPR.
+
+ * expr.c (store_expr): memset/bzero gets ptr_mode, not Pmode.
+
+ * stmt.c (expand_asm_operands): Fix errors in previous patches.
+
+ * x-linux: Simplify, but ensure headers aren't changed.
+
+ * getpwd.c: No longer include direct.h for _WIN32.
+
+ * configure (i[3456]86-*-isc*): Remove bogus echo.
+ (m68k-apple-aux*): a-ux.h renamed from aux.h.
+ (CC): Escape "$" char in "no-symlink" case for bash/cygwin32 bug.
+
+ * Makefile.in (installdirs): Renamed from install-dir.
+ Create $(prefix) and $(exec_prefix) if doesn't exist.
+ (install-float): Reflect new name for installdirs.
+ (install-{common,info,man,libgcc,multilib,libobjc}): Likewise.
+ (install-{include-dir,assert-h,collect2}): Likewise.
+
+ * reload1.c (gen_reload): Handle SUBREG in PLUS specially too.
+ Change calls to emit_move_insn to recursive calls.
+
+ * stmt.c (fixup_gotos): When running undefined labels, if no cleanup
+ actions for this block, don't clear BEFORE_JUMP.
+
+Fri Sep 27 13:48:21 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * c-decl.c (init_decl_processing): Create short int types before
+ creating size_t in case a machine description needs to use
+ unsigned short for size_t.
+
+Fri Sep 27 12:28:54 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * gcc.c (do_spec_1): Allow -A in %[Spec].
+
+ * i386.h (CPP_CPU_SPEC): New. Added for defining the submodel.
+
+ * i386.c (asm_output_function_prefix, function_prologue,
+ ix86_expand_prologue): Make the routine that sets the GOT (when pic
+ is enabled) a function, to assist debugging.
+
+ * i386.md (gen_prologue_get_pc): Call the function created above.
+ (divdf3): Added.
+
+ * i386/dgux.h (CPP_PREDEFINES, CPP_SPEC): Reference CPP_CPU_SPEC.
+ Use svr4 assembler directive .backalign instead of .align.
+ (align to x bytes if it takes no more than y bytes to do so.)
+
+ * i386/{aix386ng.h,dgux.h} (CPP_SPEC): Use %[cpp_cpu].
+ * i386/{freebsd-elf,gas,isc,linux-aout}.h: Likewise.
+ * i386/{linux-oldld,linux,osfelf,osfrose,sco,sco4}.h: Likewise.
+ * i386/{sco4dbx,sco5,sol2,sysv3}.h: Likewise.
+
+Thu Sep 26 17:58:34 1996 Torbjorn Granlund <tege@matematik.su.se>
+
+ * m68k.md (mulsidi3 matcher): Change predicate const_int_operand
+ to const_sint32_operand. Get rid of bogus range condition.
+
+Thu Sep 26 17:12:00 1996 Jim Wilson <wilson@cygnus.com>
+
+ * Makefile.in (stmp-int-hdrs): Don't cd to srcdir before copying
+ header files to objdir.
+
+Wed Sep 25 21:22:57 1996 Jeffrey A Law (law@cygnus.com)
+
+ * h8300.h (FIRST_PSEUDO_REGISTER, ARG_POINTER_REGNUM): Bump up by one.
+ (FIXED_REGISTERS): Add entry for MAC register.
+ (CALL_USED_REGISTERS, REG_ALLOC_ORDER): Likewise.
+ (HARD_REGNO_NREGS): Handle MAC register.
+ (HARD_REGNO_MODE_OK, REGNO_OK_FOR_BASE_P, REGISTER_NAMES): Likewise.
+ (enum reg_class): New MAC_REGS register class.
+ (REG_CLASS_CONTENTS, REGNO_REG_CLASS): Corresponding changes.
+ (REG_CLASS_FROM_LETTER): Likewise.
+ (REGISTER_MOVE_COST): Make copies to/from MAC register expenseive.
+ (CONDITIONAL_REGISTER_USAGE): Define.
+ * h8300.md (movsi_h8300hs): Renamed from movsi_h8300h.
+ Handle moves to/from the MAC register.
+ (mac): Two new patterns to use the mac instruction.
+
+ * h8300.c (notice_update_cc): Fix CC_SET case.
+ (restore_compare_p): Remove unused function.
+ * h8300.md: Handle "set" vs "set_zn_c0" correctly.
+ (bCC patterns): No longer need to call restore_compare_p.
+
+ * h8300.c (get_shift_alg): Fix HImode ASHIFTRT by 13 or 14 bits.
+
+Wed Sep 25 18:52:19 1996 Joern Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.md (insv): New pattern.
+
+Wed Sep 25 16:47:26 1996 Doug Evans <dje@seba.cygnus.com>
+
+ * sparc/t-sunos41 (MULTILIB_{OPTIONS,DIRNAMES,MATCHES}): Create
+ multilib versions of -fpic and -fPIC.
+ (TARGET_LIBGCC2_CFLAGS): Comment out.
+
+ * sparc.c (print_operand): Handle new codes H/L.
+ * sparc.md (lo_sum_di_sp32): Add little endian support.
+ (adddi3_sp32,subdi3_sp32,mulsidi3_sp32,const_mulsidi3): Likewise.
+ (umulsidi3_sp32,const_umulsidi3,smacdi,umacdi,anddi3_sp32): Likewise.
+ (iordi3_sp32,xordi3_sp32,negdi2_sp32): Likewise.
+
+Wed Sep 25 15:32:35 1996 Jim Wilson <wilson@cygnus.com>
+
+ * expmed.c (store_bit_field): Don't make flag_force_mem disable insv
+ for memory operands.
+
+ * function.c (instantiate_decl): Always store addr back into x.
+
+Tue Sep 24 19:37:00 1996 Jim Wilson <wilson@cygnus.com>
+
+ * reload.c (push_secondary_reload): Do strip paradoxical SUBREG
+ even if reload_class is CLASS_CANNOT_CHANGE_SIZE. Change reload_mode
+ to mode in SECONDARY_MEMORY_NEEDED and get_secondary_mem calls.
+
+ * reload1.c (emit_reload_insns): For output part of RELOAD_OTHER,
+ emit after RELOAD_FOR_OUTPUT, in reverse order of reload number,
+ but not separately.
+
+Tue Sep 24 18:13:07 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * expr.c (emit_group_load): Allow target to be smaller than source.
+
+Tue Sep 24 17:40:39 1996 Doug Evans <dje@cygnus.com>
+
+ * m68k/a-ux.h: Renamed from aux.h because of MSDOS.
+
+Tue Sep 24 08:33:53 1996 David S. Miller (davem@caip.rutgers.edu)
+
+ * tree.c (copy_node): Fix error in last change.
+
+Tue Sep 24 08:29:03 1996 James G. Smith <jsmith@cygnus.co.uk>
+
+ * gcc.c (used_arg): Fix multilib_matches parsing to not corrupt
+ entry parameter.
+
+Tue Sep 24 08:22:18 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * loop.c (get_condition): Use rtx_equal_p to compare rtx.
+
+Tue Sep 24 08:14:01 1996 Christian Iseli <Christian.Iseli@lslsun.epfl.ch>
+
+ * integrate.c (expand_inline_function): Avoid creating paradoxical
+ subreg wider than BITS_PER_WORD as inlined function result.
+
+Tue Sep 24 08:00:15 1996 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c (struct directive, directive_table, handle_directive):
+ pass_thru now 1 for #define and 2 for #pragma.
+ (handle_directive): When deciding whether to suppress comment at end
+ of directive, ignore tabs and spaces after comment. Remove redundant
+ limit test. With -dD -C, copy comment when isolating definition.
+ (skip_to_end_of_comment): With -C, don't copy newline at end
+ of C++ comment.
+
+ * fixinc.ptx, fixinc.svr4, fixincludes: Insert newlines just before
+ end of 'sed' command strings if last 'sed' command is 'a' or 'i'.
+
+Tue Sep 24 07:28:58 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * toplev.c (PREFERRED_DEBUGGING_TYPE): If no debugging formats are
+ supported, set to NO_DEBUG.
+ (main): Don't do setting of PREFERRED_DEBUGGING_TYPE here.
+
+Mon Sep 23 22:45:15 1996 Sean McNeil <sean@mcneil.com>
+
+ * rs6000/vxppc.h, sparc/vxsim.h: New files.
+ * configure (powerpc-*-vxworks*, sparc-*-vxsim*): New targets.
+ * objc/objc.h (BOOL): Define BOOL as int for VxWorks.
+
+Mon Sep 23 21:23:27 1996 Klaus K"ampf (kkaempf@progis.de)
+
+ * explow.c (promote_mode, case REFERENCE_TYPE): New case.
+
+Mon Sep 23 21:15:43 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * c-decl.c (finish_struct): Check PCC_BITFIELD_TYPE_MATTERS value.
+
+ * dbxout.c (dbxout_symbol): Fix forgotten case in last change:
+ check DECL_ARTIFICIAL also when using the short cut way.
+
+Mon Sep 23 15:55:24 1996 David S. Miller (davem@caip.rutgers.edu)
+
+ * tree.c (copy_node): Abort if don't know size of node.
+
+ * tree.c (build1): Clean up initialization of OBSTACK.
+
+Mon Sep 23 15:35:33 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * Makefile.in (stmp-multilib): Depend on $(LANG_LIB2FUNCS).
+
+ * dbxout.c (dbxout_function): Don't check DECL_SECTION_NAME before
+ calling dbxout_function_end.
+
+Mon Sep 23 14:41:12 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * combine.c (can_combine_p): Even if SMALL_REGISTER_CLASSES,
+ know lifetime not extended if all_adjacent set.
+
+ * stmt.c (expand_asm_operands): Handle '+' constraint.
+ * cse.c (fold_rtx): Fold inside ASM_OPERANDS.
+
+ * expr.c (expand_increment): If postincrement for MEM can't use add
+ directly, load address in reg and enqueue increment and store of reg.
+
+ * loop.c (check_dbra_loop): Don't assume label must be second part of
+ if_then_else in condjump.
+
+ * jump.c (jump_optimize): In no-nop move deletion, don't test
+ PRESERVE_DEATH_INFO_REGNO_P; instead test if optimization is performed.
+ Check for REG_UNUSED note on to-be deleted insn before searching for
+ preceding instruction to delete note from.
+ If PRESERVE_DEATH_INFO_REGNO_P is true for SREG, replace INSN with USE.
+
+ * reload1.c (reload): Initialize the previous_offset fields
+ in reg_eliminate before calling setup_save_areas.
+
+ * reload1.c (emit_reload_insns): Declare and set this_reload_insn.
+
+ * expr.c (var_rtx): New function.
+ (expand_expr, case COND_EXPR): Also use target if same as singleton.
+
+Mon Sep 23 14:22:34 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * recog.c (constrain_operands): Don't test clobbered constraints.
+
+ * reload1.c (emit_reload_insns): For output part of RELOAD_OTHER,
+ put in front of anything previous for that output, but not separately.
+
+Sun Sep 22 21:06:46 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-common.c (decl_attribtes, case A_SECTION): Allow for static
+ local variable.
+
+Sun Sep 22 11:30:27 1996 Christian Iseli (christian.iseli@di.epfl.ch)
+
+ * expr.c (convert_move): Replace explicit checks for FP extend ops
+ with use of can_extend_p.
+ Add missing tests for FP trunc operations.
+
+Sun Sep 22 11:20:02 1996 Pat Rankin <rankin@eql.caltech.edu>
+
+ * dwarfout.c (DWARF_VERSION): Define as 1 if not already defined.
+ * dwarf2out.c (DWARF_VERSION): Likewise.
+
+Sun Sep 22 11:12:20 1996 Joern Rennecke <amylaar@cygnus.co.uk>
+
+ * c-decl.c (pushdecl): Check new declaration actually conflicts before
+ warning about implicit external vs. static declarations.
+
+ * loop.c (combine_givs): Improve combining DEST_REG giv with only use.
+
+Sun Sep 22 10:50:03 1996 Scott Christley <scottc@net-community.com>
+
+ * Create consistent mechanism for memory allocation and release
+ so that garbage collection routines can be easily subsititued
+ for the ANSI standard malloc, realloc, free, etc.
+ * objc/archive.c: Replace use of __objc_xmalloc and free
+ with objc_malloc and objc_free.
+ * objc/hash.c: Replace use of __objc_xcalloc and free
+ with objc_calloc and objc_free.
+ * objc/init.c: Replace use of free with objc_free.
+ * objc/misc.c (objc_malloc): Renamed from __objc_xmalloc.
+ (objc_realloc): Renamed from __objc_realloc.
+ (objc_atomic_malloc, objc_valloc): New functions.
+ (objc_calloc): Renamed from __objc_calloc.
+ (objc_free): New function.
+ * objc/objc-api.h (_objc_malloc): New function pointer.
+ (_objc_atomic_malloc, _objc_valloc): Likewise.
+ (_objc_realloc, _objc_calloc, _objc_free): Likewise
+ * objc/objc-list.h: Replace use of __obj_xmalloc and free
+ with objc_malloc and objc_free.
+ * objc/objects.c: Likewise.
+ * objc/sarray.c: Replace use of __objc_xmalloc and free
+ with objc_malloc and objc_free.
+ * objc/sarray.h (__objc_xmalloc, __objc_xrealloc): Delete.
+ * objc/selector.c: Replace use of __objc_xcalloc, __objc_xrealloc,
+ and __objc_xmalloc with objc_calloc, objc_realloc, and objc_malloc.
+ * objc/thr-decosf1.c: Replace use of __objc_xmalloc and free
+ with objc_malloc and objc_free.
+ * objc/thr-irix.c, objc/thr-mach.c, objc/thr-os2.c: Likewise.
+ * objc/thr-posix.c, objc/thr-pthreads, objc/thr-single: Likewise.
+ * objc/thr-solaris.c, objc/thr-win32.c, objc/thr.c: Likewise.
+
+Sun Sep 22 05:26:01 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * configure: Set up LANG_LIB2FUNCS and LANG_EXTRA_HEADERS.
+ * Makefile.in (libgcc2.a): Include LANG_LIB2FUNCS.
+ (USER_H): Add LANG_EXTRA_HEADERS.
+ (LANG_LIB2FUNCS): New macro.
+ (LANG_EXTRA_HEADERS): New macro.
+ (stmp-int-hdrs): Don't hardwire ginclude.
+ (stamp-objlist): Don't depend on Makefile.
+
+Sat Sep 21 18:00:10 1996 Stephen L Moshier (moshier@world.std.com)
+
+ * alpha.md (alpha_swapped_comparison_operator pattern): Fix asm
+ operand typo in last change.
+
+Sat Sep 21 07:11:51 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * defaults.h (ASM_OUTPUT_LABELREF): Provide default definition
+ if not already defined.
+ * 1750a.h (USER_LABEL_PREFIX): Define instead of ASM_OUTPUT_LABELREF.
+ * a29k.h, alpha.h, convex.h, dsp16xx.h, elxsi.h, fx80.h: Likewise.
+ * gmicro.h, h8300.h, i386/sun386.h, i860.h, i960.h, ns32k.h: Likewise.
+ * pdp11.h, pyr.h, romp.h, sh.h, sparc.h, spur.h, tahoe.h: Likewise.
+ * vax.h, we32k.h: Likewise.
+ * i386/att.h (USER_LABEL_PREFIX): Redefine, not ASM_OUTPUT_LABELREF.
+ * i386/bsd.h, i386/lynx.h, i386/sco5.h, i860/fx2800.h: Likewise.
+ * m68k/3b1.h, m68k/mot3300.h, m68k/tower-as.h, m68k/tower.h: Likewise.
+ * ptx4.h, sparc/pbd.h, svr3.h, svr4.h: Likewise.
+ * i386/osfrose.h, m88k.h (USER_LABEL_PREFIX): Redefine.
+ * nextstep.h (USER_LABEL_PREFIX): Redefine.
+ (ASM_OUTPUT_LABELREF) Use USER_LABEL_PREFIX.
+ * arm/aout.h, mips.h (ASM_OUTPUT_LABELREF): Delete.
+ * rs6000/lynx.h (USER_LABEL_PREFIX): Undefine.
+ * rs6000.h, rs6000/win-nt.h (USER_LABEL_PREFIX): Define.
+
+Thu Sep 19 00:05:53 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * configure: Move i[3456]86-*-gnu* case after linux and don't
+ treat linux-gnu like other gnu systems.
+
+Wed Sep 18 20:51:09 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * cplus-dem.c (demangle_template): Fix handling of address args.
+ (gnu_special): Handle type_info stuff.
+
+Wed Sep 18 17:57:55 1996 Patrik Lantto (patrik@opq.se)
+
+ * jump.c (jump_optimize): Insert conditional move after jump
+ insn instead of before.
+
+Wed Sep 18 17:33:36 1996 Richard Henderson <rth@tamu.edu>
+
+ * alpha.h (PREDICATE_CODES): Add alpha_swapped_comparison_operator.
+ * alpha.c (alpha_swapped_comparison_operator): New function.
+ (print_operand): Support unsigned codes for %D, %c, and %d.
+ * alpha.md: Add pattern for b%c with swapped comparisons with 0.
+ Delete three unnamed cmp patterns that are strict subsets of it.
+
+ * alpha.c (alpha_emit_set_long_const): Save one instruction
+ when -O2 and high word == low word.
+
+Tue Sep 17 22:46:15 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * i386/unix.h (ASM_OUTPUT_MI_THUNK): Handle functions
+ returning an aggregate.
+
+ * varasm.c (supports_one_only): New function.
+ (make_decl_one_only): Likewise.
+ * svr4.h (MAKE_DECL_ONE_ONLY): Define.
+ * tree.h (DECL_ONE_ONLY): New macro.
+
+ * varasm.c (assemble_variable): Fix setting of
+ first_global_object_name.
+ (assemble_start_function): Likewise.
+
+Tue Sep 17 19:42:39 1996 Doug Evans <dje@wabamun.cygnus.com>
+
+ * i386/t-cygwin32 (winnt.o): Compile properly.
+
+Tue Sep 17 15:47:20 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * Add support for R5000, and finish MIPS4 support.
+ * mips.h (enum processor_type): Add PROCESSOR_R5000.
+ (gen_conditional_move): Declare.
+ (CONDITIONAL_REGISTER_USAGE): Mark ST_REGS as fixed if not
+ HARD_FLOAT, or if mips_isa < 4.
+ (FIRST_PSEUDO_REGISTER): Change to 76.
+ (FIXED_REGISTERS): Add condition code registers.
+ (CALL_USED_REGISTERS): Likewise.
+ (ST_REG_LAST): Change to 74.
+ (RAP_REG_NUM): Change to 75.
+ (ST_REG_P): Look for any condition code register.
+ (REG_CLASS_CONTENTS): Update for new condition code registers.
+ (RTX_COSTS): Add cases for R5000.
+ (REGISTER_MOVE_COST): Add cases for condition code registers.
+ (PREDICATE_CODES): Add "const_float_1_operand".
+ (EXTRA_CC_{MODES,NAME}, SELECT_CC_MODE): Remove.
+ (REGISTER_NAMES): Add entries for new condition code registers.
+ (DEBUG_REGISTER_NAMES): Likewise.
+ (ADDITIONAL_REGISTER_NAMES): Remove FPSW_REGNUM.
+ * mips.md (cpu attribute): Add R5000.
+ (function units): Add cases for the R5000.
+ ({madd,msub,nmadd,nmsub}.d): Only available if TARGET_DOUBLE_FLOAT.
+ (recip.d, recip.s, rsqrt.d, rsqrt.s): New define_insn patterns.
+ (movcc): New pattern to move condition code values.
+ (reload_incc, reload_out_cc): New define_expand patterns.
+ (lwxc1, ldxc1, swxc1, sdxc1): Several new define_insn patterns.
+ (various): Replace CC_FP with CC.
+ (branch_fp_ne, branch_fp_eq): Match any condition code register.
+ (branch_fp_ne_rev, branch_fp_eq_rev): Remove.
+ (seq_df, slt_df, sle_df): Match any condition code register.
+ (sgt_df, sge_df, seq_sf, slt_sf, sle_sf, sgt_sf, sge_sf): Likewise.
+ (sne_df, sne_sf): Remove.
+ (FP conditional moves): Match any condition code register.
+ Require TARGET_HARD_FLOAT and, if appropriate, TARGET_DOUBLE_FLOAT.
+ (movsicc): Just call gen_conditional_move.
+ (movdicc, movsfcc, movdfcc): New define_expand patterns.
+ * mips.c (mips_reg_names): Add condition code registers.
+ (mips_sw_reg_names, mips_regno_to_class): Likewise.
+ (const_float_1_operand): New function.
+ (mips_move_1word): Treat CCmode as SImode. Handle move from
+ ST_REG to GR_REG if mips_isa >= 4. Only permit move from GR_REG
+ to ST_REG is mips_isa < 4.
+ (gen_conditional_branch): Rewrite. Just use CCmode, not extra
+ condition modes.
+ (gen_conditional_move): New function.
+ (override_options): Recognize vr5000. Look for just CCmode, not
+ extra condition modes. If mips_isa >= 4, permit CCmode in GR_REGS
+ and FP_REGS.
+ (print_operand): Handle %Z.
+ (mips_secondary_reload_class): Require a data register to copy a
+ value out of a condition code register. Require a floating point
+ register to copy a value into a condition code register.
+
+Tue Sep 17 15:10:29 1996 Joern Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.md: New define_splits to recombine output from LEGITIMIZE_ADDRESS.
+ * sh.h (LEGITIMIZE_ADDRESS): Typo fixes (x -> X).
+
+Mon Sep 16 23:00:35 1996 Jim Wilson <wilson@cygnus.com>
+
+ * configure (build_broken_install): Renamed from host_broken_install.
+ Set from build not host.
+ (build_install_headers): Renamed from host_install_headers. Set from
+ build not host.
+
+Mon Sep 16 22:38:55 1996 Stu Grossman (grossman@critters.cygnus.com)
+
+ * configure (m68k-*-coff*): Use dbx debug format by default.
+ * gcc.c (link_command_spec): Move -T to end of link command line.
+ * m68k/m68kemb.h (LINK_SPEC, SUBTARTGET_SWITCHES): Delete.
+ (LIB_SPEC): Define to just -lc.
+ (STARTFILE_SPEC): Define to empty.
+
+Mon Sep 16 13:12:27 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.c (ext_shift_insns, ext_shift_amounts): New arrays.
+ (gen_ashift_hi, gen_shifty_hi_op, shl_and_kind): New functions.
+ (rtx_equal_function_value_matters): Declare.
+ (shl_and_length, shl_and_src_length, gen_shl_and): New functions.
+ (shl_sext_kind, shl_sext_length, gen_shl_sext): Likewise.
+ * sh.md (ashlhi3_k, lshrhi3_m): New patterns.
+ (lshrhi3, shl_sext_ext, shl_sext_sub):
+ New insn patterns with matching define_split.
+ (and_shl_scratch): Likewise, but also with unnamed variants.
+
+Sat Sep 14 17:05:07 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * gcc.c (convert_filename): Don't start looking for '.' until
+ after last directory separator.
+
+ * i386.md (clrstrsi): Correct check for constant size.
+
+ * Based on code by sac@cygnus.com.
+ * i386/cygwin32.h (CHECK_STACK_LIMIT): Make consistent with MD file.
+ * i386.c ({function,ix86_expand}_prologue): Use __alloca to allocate
+ stack if desired and beyond CHECK_STACK_LIMIT in size.
+ * i386.h ({MASK,TARGET}_STACK_PROBE): New macros.
+ (TARGET_SWITCHES): Add -mstack-arg-probe.
+ * i386.md (allocate_stack{,_worker}): New patterns.
+
+Fri Sep 13 18:23:18 1996 Joel Sherrill <joel@OARcorp.com>
+
+ * sparc/lb1spc.asm (.div, .rem): Fixed typo so sign is returned
+ correctly. TOPBITS was 2 and should have been 4.
+
+Thu Sep 12 21:51:56 1996 Jim Wilson <wilson@cygnus.com>
+
+ * mips.md (call_value_multiple_internal0): Change from define_insn to
+ define_expand.
+
+Thu Sep 12 19:22:14 1996 Doug Evans <dje@seba.cygnus.com>
+
+ * sparc.md (move_pic_label_si): Operand one is label_ref now.
+ * sparc.c (emit_move_sequence): Pass label_ref to
+ gen_move_pic_label_si to not lose flags.
+
+Wed Sep 11 12:10:08 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * Makefile.in (GCC_PASSES): Add $(exeext) to names.
+ (FLAGS_TO_PASS): Add CLIB.
+ (c-pragma.o): Add dependencies on except.h, function.h, defaults.h.
+
+Tue Sep 10 22:25:03 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * configure (i[3456]86-*-cygwin32): Use xm-cygwin32.h and xm-i386.h.
+ Set fixincludes to Makefile.in and objc_thread_file to win32.
+ * i386/xm-cywin32.h: Don't include xm-i386.h.
+ * i386/x-cygwin32, rs6000/x-cygwin32 (STMP_FIXPROTO, exeext): New defs.
+
+ * gcc.c (HAVE_EXECUTABLE_SUFFIX): New macro.
+ (convert_filename): New function.
+ (process_command, case 'o'): Call it.
+ (process_command, default case): Likewise; delete old code.
+
+Tue Sep 10 21:08:43 1996 Torbjorn Granlund <tege@albert.gnu.ai.mit.edu>
+
+ * i386.md (decrement_and_branch_until_zero matcher): Fix typo.
+
+Tue Sep 10 19:04:19 1996 Jim Wilson <wilson@cygnus.com>
+
+ * mips.c (mips_move_2words): Rewrite 32 bit shifts as 16 bit shifts.
+
+Tue Sep 10 10:39:07 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa/pa-gas.h (DBX_DEBUGGING_INFO): Remove all #define
+ and #undef statements related to debugging information.
+ * pa/pa-hpux.h, pa-hpux7.h: Likewise
+ * pa.c (override_options): Disable "-g" and issue a warning
+ if it's used when !TARGET_GAS.
+
+Mon Sep 9 17:57:49 1996 Doug Evans <dje@wabamun.cygnus.com>
+
+ * sparc.h ({MASK,TARGET}_FPU_SET): Define.
+ (TARGET_SWITCHES): Record if -m{,no-}fpu passed.
+ * sparc.c (sparc_override_options): Don't clobber explicit
+ -m{,no-}fpu setting with cpu default.
+
+Mon Sep 9 15:57:57 1996 Joel Sherrill <joel@OARcorp.com>
+
+ * configure (mips64orion-*-rtems*): New target.
+ * mips/rtems64.h: New file.
+
+Sat Sep 7 22:07:53 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (store_field): If storing a record on big endian targets,
+ set up so we store the high-order bits.
+ (expand_expr, case COMPONENT_REF): Likewise for loads.
+
+Thu Sep 5 14:59:47 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.h (LEGITIMIZE_ADDRESS): Define nonempty.
+
+Thu Sep 5 10:43:36 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa.md (mov{si,di,sf}): Handle 'R' constraints as needed.
+
+Wed Sep 4 17:13:28 1996 Bob Manson <manson@charmed.cygnus.com>
+
+ * except.c: (add_partial_entry): New routine.
+ (expand_start_try_stmts): Moved from cp/except.c.
+ (expand_start_all_catch): Move functionality of expand_end_try_stmts
+ here.
+
+Wed Sep 4 12:30:02 1996 Mike Stump <mrs@cygnus.com>
+
+ * except.c (emit_unwinder): Ensure CLOBBER and USE insns come last,
+ if present.
+
+Tue Sep 3 12:01:43 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * configure (sh-*-elf*): New target.
+ * sh/elf.h: New file.
+
+Fri Aug 30 17:52:26 1996 Jim Wilson <wilson@cygnus.com>
+
+ * dwarf2out.c (gen_formal_types_die): Delete extra argument from
+ gen_type_die call.
+
+Fri Aug 30 15:40:40 1996 James G. Smith <jsmith@cygnus.co.uk>
+
+ * mips/elf64.h: Allow MULTILIB_DEFAULTS to be defined
+ before this file is included.
+
+Fri Aug 30 15:00:06 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.md: (movsicc,movhicc): Allow reload from memory.
+
+ * i386.c (override_options): Don't thread the prologue if profiling.
+
+Fri Aug 30 15:00:06 1996 James Hawtin <cgjwh@sunrise.co.uk>
+
+ * i386/t-sol2 (gcrt1.o): Added for profiling Solaris 2
+ * i386/sol2.h (STARTFILE_SPEC): New.
+ * i386/gmon-sol2.c, i386/sol2-gc1.asm: New files.
+
+Thu Aug 29 22:08:03 1996 Jim Wilson <wilson@cygnus.com>
+
+ * except.c (add_eh_table_entry): Multiply realloc size by sizeof int.
+
+Thu Aug 29 15:15:31 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa.md (fcmp patterns): Don't try to eliminate useless add,tr
+ insns here.
+ * pa.c (pa_reorg): Do elimination of useless add,tr insns here instead.
+ (print_operand, case 'y'): Remove this code.
+
+Wed Aug 28 16:19:34 1996 Doug Evans <dje@cygnus.com>
+
+ * toplev.c (print_single_switch): Ultrix fprintf returns 0 for success.
+
+ * toplev.c (main): Rewrite -g parsing.
+
+Mon Aug 26 16:15:49 1996 Fred Fish <fnf@cygnus.com>
+
+ * Makefile.in (objc-parse.y): Fix typo in name of temp file.
+
+Mon Aug 26 14:08:37 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * function.c (mark_all_temps_used): Fix error in last change.
+
+Sun Aug 25 22:27:19 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * function.c (mark_all_temps_used): New function.
+
+Fri Aug 23 11:34:57 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sysv4.h (SUBTARGET_OVERRIDE_OPTIONS): Fixes to make -fPIC
+ really the same as -mrelocatable.
+ (ASM_SPEC): Pass -K PIC to the assembler if -fpic/-fPIC.
+
+ * rs6000/sol2.h (ASM_CPU_SPEC): Remove passing -K PIC to the
+ assembler if -fpic/-fPIC.
+
+ * bi-{arity,opcode,opname}.c (fancy_abort): Define, so that
+ -Dabort=fancy_abort works again.
+
+Thu Aug 22 11:39:34 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/t-ppcgas ({stmp,install}-crt): Only build and install the
+ eabi ecrt[in].o object files in eabi multilib directories, only
+ build and install the solaris scrt[in0].o object files in solaris
+ directories.
+ (MULTILIB_MATCHES): Remove matches for solaris, linux to other
+ switches.
+
+Tue Aug 20 18:49:55 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sysv4.h (ASM_OUTPUT_SECTION_NAME): If -mrelocatable or
+ -mrelocatable-lib, don't make read-only sections.
+
+Mon Aug 19 18:42:13 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc.h ({MASK,TARGET}_LITTLE_ENDIAN): Define.
+ (LIBGCC2_WORDS_BIG_ENDIAN): Add little endian support.
+ * sparc/sp64-elf.h ({CPP,ASM,LINK}_SPEC): Add little endian support.
+ (SUBTARGET_SWITCHES): Recognize -m{big,little}-endian.
+ ({BYTES,WORDS}_BIG_ENDIAN): Likewise.
+ * sparc/splet.h (SUBTARGET_SWITCHES): Recognize -m{big,little}-endian.
+ ({CPP,ASM,LINK}_SPEC): Add little endian support.
+ ({BYTES,WORDS}_BIG_ENDIAN): Likewise.
+ * sparc/t-splet (MULTILIB_{OPTIONS,DIRNAMES}): Likewise.
+
+ * sparc/lynx-ng.h (CPP_SPEC): Use %(cpp_cpu).
+
+Sat Aug 17 15:23:39 1996 Geoffrey Noer <noer@cygnus.com>
+
+ * i386/cygwin32.h (CPP_PREDEFINES): Define _WIN32, not WIN32.
+ Define only __CYGWIN32__, not CYGWIN32 or __CYGWIN32.
+ * rs6000/cygwin32.h (CPP_PREDEFINES): Likewise.
+ * cccp.c (absolute_filename): Drive specifiers make the pathname
+ absolute in cygwin32.
+ * choose-temp.c: Delete !defined(_WIN32) condition when including
+ sys/file.h (NO_SYS_FILE_H is still used).
+ * gcc.c: Change ifndef _WIN32 to ifndef NO_SYS_FILE_H when deciding
+ whether to include sys/file.h.
+ (execute): -pipe is supported for cygwin32.
+ * getopt.c: Change win32 test from WIN32 to _WIN32.
+ * pexecute.c: Update test for win32 (&& ! cygwin32).
+ * protoize.c: Likewise.
+ (kill): Delete decl.
+ * toplev.c: Update test for win32 (&& ! cygwin32).
+ * ginclude/stdarg.h: Change __WIN32__ to _WIN32.
+ * ginclude/varargs.h: Likewise.
+ * ginclude/va-ppc.h: Likewise.
+
+Fri Aug 16 16:02:09 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.c (rs6000_got_register): Make sure pic_offset_table_rtx
+ allocated, even if current_function_uses_pic_offset_table set.
+
+Fri Aug 16 15:56:04 1996 J. Kean Johnston <hug@netcom.com>
+
+ * i386/sco5.h (CLASS_LIKELY_SPILLED_P): Deleted.
+ (STARTFILE_SPEC): Insert crtbegin.o in correct place, and correct
+ versions of values-X?.o.
+ (SWITCH_TAKES_ARG): Extend DEFAULT_SWITCH_TAKES_ARG, not replace.
+ (CPP_SPEC): Add -Di386, and correctly include extra directories.
+ Define HAVE_ATEXIT in ELF mode for global destructors.
+
+Thu Aug 15 16:42:44 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc.c (label_ref_operand): New function.
+ (emit_move_sequence): Pass label_ref to gen_move_label_di to not
+ lose flags.
+ * sparc.md (move_label_di): Operand one is label_ref now.
+ * genattrtab.c (write_test_expr): Allow label_ref in match_dup.
+
+ * sys-protos.h (gethostid): Make return type `int' ifdef __alpha__.
+ * gen-protos.c: Delete support for SYS_PROTO_OVERRIDES.
+ * alpha.h (SYS_PROTO_OVERRIDES): Delete.
+
+Thu Aug 15 17:36:09 1996 Mike Stump <mrs@cygnus.com>
+
+ * libgcc2.c (__throw): New routine.
+ (__eh_pc): New data object for exception handling.
+
+ * except.c (eh_saved_pc): New object so we can call
+ assemble_external.
+ (expand_internal_throw_indirect): Call assemble_external for __eh_pc.
+ (end_eh_unwinder): Likewise.
+ (init_eh): Initialize eh_saved_pc.
+
+Thu Aug 15 13:02:42 1996 Mike Stump <mrs@cygnus.com>
+
+ * arm.h (RETURN_ADDR_RTX): Define.
+
+ * expr.c (expand_builtin_return_addr): Fix order of parameters.
+
+Wed Aug 14 19:48:00 1996 Torbjorn Granlund <tege@spiff.gnu.ai.mit.edu>
+
+ * stmt.c (expand_return): In code for doing scc with jumps,
+ stick to default handling if we have corresponding scc pattern.
+
+Wed Aug 14 10:31:28 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (override_options): Treat TARGET_FAST_INDIRECT_CALLS
+ just like TARGET_NO_SPACE_REGS.
+ (output_millicode_call): Likewise.
+ * pa.h (TARGET_FAST_INDIRECT_CALLS): Define.
+ (TARGET_SWITCHES): Add "fast-indirect-calls".
+ * pa.md (TARGET_FAST_INDIRECT_CALLS): Treat just like
+ TARGET_NO_SPACE_REGS in various call/millicode call patterns.
+
+ * pa.c (print_operand): Use the right comparison operator
+ for reversed EQ and NE comparisons.
+
+ * pa.h (OUTPUT_MI_THUNK): Define.
+
+Wed Aug 14 11:40:49 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * ginclude/va-ppc.h: Add Windows NT support.
+ * ginclude/{varargs,stdarg}.h: For PowerPC Windows NT, include
+ va-ppc.h, instead of using the default handling.
+
+Tue Aug 13 18:30:10 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * fixincludes: Remove duplicate volatile from sig_atomic_t in AIX
+ sys/signal.h
+
+Tue Aug 13 16:51:37 1996 Jim Wilson <wilson@cygnus.com>
+
+ * i960-coff.h (LIB_SPEC): Undef.
+
+ * sh.h (PROFILE_BEFORE_PROLOGUE): Define.
+
+Tue Aug 13 11:36:02 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * gcc.c (set_spec,process_command): Dump and load the compiler
+ version number in the specs file.
+
+ * rs6000.c (output_toc): Fix last change, so that it doesn't use
+ an uninitialized variable if -mminimal-toc.
+ (output_prolog): Increment probe_labelno after last use.
+
+ * rs6000/t-ppcgas (MULTILIB_*): Build far fewer multilib
+ libraries. Build all libraries with -mrelocatable-lib and
+ -mno-eabi. Build special GNU/Linux and Solaris libraries.
+ * rs6000/eabi{,aix,le}.h (MULTILIB_DEFAULTS): Adapt to changes in
+ t-ppcgas.
+ * rs6000/(linux,sol2,sysv4,sysv4le).h (MULTILIB_DEFAULTS): Likewise.
+
+Tue Aug 13 11:36:02 1996 Jeffrey A Law (law@cygnus.com)
+
+ * rs6000.c (handle_mac_pragma): Initialize "psize".
+
+Mon Aug 12 18:14:35 1996 Jim Wilson <wilson@cygnus.com>
+
+ * gcc.c (used_arg): Initialize cnt to zero.
+
+Mon Aug 12 14:03:16 1996 Jim Wilson <wilson@cygnus.com>
+
+ From Mike Stump:
+ * sh.c (regno_reg_class): Change entry 23 from NO_REGS to GENERAL_REGS.
+ (initial_elimination_offset): New variable live_regs_mask. Add
+ code to handle RETURN_ADDRESS_POINTER_REGNUM.
+ * sh.h (RAP_REG, RETURN_ADDRESS_POINTER_REGNUM): Define.
+ (ELIMINABLE_REGS): Add RETURN_ADDRESS_POINTER_REGNUM support.
+ (RETURN_ADDR_RTX): Define.
+ (REGISTER_NAMES): Add rap.
+
+ * iris5.h (DOLLARS_IN_IDENTIFIERS): Undefine.
+
+ * m68kemb.h (LIB_SPEC): Always emit -lc.
+
+Mon Aug 12 12:30:25 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.c (rs6000_got_register): Test variable
+ current_function_uses_pic_offset_table to see whether or not a GOT
+ register has been created already.
+
+ * Makefile.in (multilib.h): Move to stamp-mlib.
+ (stamp-mlib): Use move-if-change to conditionally update
+ multilib.h. Pass MULTILIB_EXTRA_OPTS to genmultilib.
+ (STAGESTUFF): Add stamp-mlib.
+ (mostlyclean): Delete tmp-mlib.h.
+
+ * genmultilib: Take fifth argument for options to all multilib builds.
+ Restructure output so we pass synonym switches and extra arguments
+ separately, and not exponentially slow down genmultilib.
+
+ * gcc.c (toplevel): Rearrange multilib support so we support passing
+ synonyms separately from normal switches. Add support for passing
+ additional switches for all multilib builds. Dump and restore value
+ of MULTILIB_DEFAULTS.
+ (setspec, process_command, main): Likewise.
+ (used_arg,default_arg,print_multilib_info): Likewise.
+
+Mon Aug 12 07:46:47 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (expand_builtin, case BUILT_IN_SETJMP): Add test
+ and call for nonlocal_goto_receiver pattern.
+ * stmt.c (expand_end_bindings): Likewise.
+
+ * stmt.c (expand_asm_operands): Fix off-by-one error when
+ scanning constraints.
+
+Sun Aug 11 22:48:02 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * expr.c (store_expr): Handle COND_EXPR cleanups like expand_expr.
+
+Sun Aug 11 22:42:36 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * optabs.c (expand_abs): When OP0 and TARGET are the same
+ pseudo register, it is safe to use TARGET.
+
+ * local-alloc.c (reg_equiv_replace): New variable.
+ (update_equiv_regs): Set reg_equiv_replacement for all REG_EQUIV
+ notes encountered or generated.
+
+Sun Aug 11 22:27:14 1996 Scott Christley <scottc@net-community.com>
+
+ * objc/hash.c (hash_is_key_in_hash): Function somehow got lost.
+
+Sun Aug 11 21:43:15 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * ginclude/stddef.h (__need_wint_t): Move #undef to right place.
+
+Sun Aug 11 17:46:22 1996 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * c-decl.c (finish_struct): If pedantic, also warn if struct/union
+ has no named members.
+
+Sun Aug 11 17:32:52 1996 Joel Sherrill <joel@OARcorp.com>
+
+ * i386/rtems.h: Renamed from i386/i386-rtems.h
+ * i960/rtems.h: Renamed from i960/i960-rtems.h
+ * m68k/rtems.h: Renamed from m68k/m68k-rtems.h
+ * rs6000/rtems.h: Renamed from rs6000/powerpc-rtems.h
+ * sparc/rtems.h: Renamed from sparc/sparc-rtems.h
+ * config/t-rtems: New file.
+ * configure (i386-*-rtems*): Added t-rtems to tmake_file.
+ Renamed i386/i386-rtems.h to i386/rtems.h.
+ (i960-*-rtems*): Added t-rtems to tmake_file.
+ Renamed i960/i960-rtems.h to i960/rtems.h.
+ Added original tm.h file and dbxcoff.h.
+ (m68k-*-rtems*): Added t-rtems to tmake_file.
+ Renamed m68k/m68k-rtems.h to m68k/rtems.h.
+ (powerpc-*-rtems*): Added t-rtems to tmake_file.
+ Renamed rs6000/powerpc-rtems.h to rs6000/rtems.h.
+ (sparc-*-rtems*): Added t-rtems to tmake_file.
+ Renamed sparc/sparc-rtems.h to sparc/rtems.h.
+
+Fri Aug 9 16:05:13 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.md: (untyped_call) Avoid SIGFPE.
+
+ * i386.c (output_float_compare): Don't try to initialize
+ aggregate local variable; use assignment statements instead.
+
+ * i386.h (RTX_COSTS): rtx_cost should pass two parameters.
+
+ * i386/go32.h (ASM_OUTPUT_SECTION_NAME): New.
+
+Fri Aug 9 16:00:11 1996 Jim Wilson <wilson@cygnus.com>
+
+ * winnt.c (gen_stdcall_suffix): Round parameter size to PARM_BOUNDARY.
+
+Thu Aug 8 17:42:35 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.c (output_toc): If we are emitting a reference to a
+ vtable, don't put in the section name, just use the symbol.
+
+Wed Aug 7 19:03:36 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sh.md (casesi_jump): New pattern.
+ (casesi): Generate RTL to match it.
+
+Wed Aug 7 14:10:07 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * ginclude/stddef.h (NULL): Use __null for G++.
+
+Tue Aug 6 17:37:53 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sysv4.h (STACK_BOUNDARY): Always define as 64.
+ (ABI_STACK_BOUNDARY): Define as 64/128 based on the -mno-eabi
+ switch.
+
+ * rs6000.c (rs6000_stack_info): Use ABI_STACK_BOUNDARY, not
+ STACK_BOUNDARY. Define ABI_STACK_BOUNDARY as STACK_BOUNDARY #ifndef.
+
+Tue Aug 6 14:29:43 1996 Doug Evans <dje@fallis.cygnus.com>
+
+ * gen-protos.c (overrides): New static local.
+ (add_hash,parse_fn_proto): New static functions.
+ (main): Add prototypes from SYS_PROTO_OVERRIDES to hash table before
+ parsing sys-protos.h. Reserve entry 0 in std_protos.
+ * alpha.h (SYS_PROTO_OVERRIDES): Define.
+
+Mon Aug 5 16:53:36 1996 Doug Evans <dje@fallis.cygnus.com>
+
+ * sparc/t-splet (MULTILIB_OPTIONS): Add mbroken-saverestore.
+ (MULTILIB_DIRNAMES): Add brknsave.
+
+ * stor-layout.c (layout_record): Correct overflow test for 0 sized
+ fields.
+
+Mon Aug 5 16:12:19 1996 Jim Wilson <wilson@cygnus.com>
+
+ * alpha.c (alpha_output_filename): When emitting stabs, don't
+ disable them if using GNU as.
+ (alpha_output_lineno): Likewise, when not using GNU as.
+
+ * sh.c (arith_reg_operand): Reject SUBREG of an invalid hard reg.
+
+ * sparc/lite.h (aoutos.h): Don't include it.
+ * configure (sparclite-*-aout*): Add aoutos.h to tm_file.
+
+Sat Aug 3 23:13:55 1996 Jeffrey A Law (law@cygnus.com)
+
+ * combine.c (rtx_equal_for_field_assignment_p): Check for
+ get_last_value returning (CLOBBER (CONST_INT 0)).
+
+Sat Aug 3 20:19:14 1996 Jim Wilson <wilson@cygnus.com>
+
+ * i960.md (subsi3+1): Handle case where first operand is constant
+ but second operand is not.
+
+ * m68k/vxm68k.h (WCHAR_TYPE_SIZE): Undef, then define to 16.
+
+Fri Aug 2 15:46:19 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa/pa-hpux.h (LINK_SPEC): Don't link in PA1.1 specific
+ libraries when creating shared libraries.
+ * pa/pa-hpux9.h, pa/pa-hpux10.h: Likewise.
+
+Fri Aug 2 13:36:42 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.c (output_float_compare): fcomi should be followed by the
+ correct conditional jump instead of fcom/pfstsw/and/jne
+ (override_options): Added -mbranch-cost to set BRANCH_COST.
+
+ * i386.md (sgt+1,slt+1,sge+1,sle+1,bgt+1,blt+1,bge+1,ble+1,bleu+4)
+ Added TARGET_CMOVE check for fcomi.
+ (movsicc_1+1,movhicc_1+1): Added to handle the general case.
+
+ * i386.h (i386_branch_cost, i386_branch_cost_string): Added.
+
+Fri Aug 2 11:53:55 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * sparc/vxsparc.h (CPP_PREDEFINES): Add `-DCPU=SPARC'.
+
+Thu Aug 1 23:56:01 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa.h (ASM_OUTPUT_INT): Remove all hacks for exception table.
+
+Thu Aug 1 10:08:14 1996 Torbjorn Granlund <tege@spiff.gnu.ai.mit.edu>
+
+ * m68k.h (RTX_COSTS, case PLUS): Get operand order right.
+
+Wed Jul 31 15:06:46 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc.md (negtf2,abstf2): Fix v9 case.
+
+Wed Jul 31 09:49:25 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa.h (ASM_OUTPUT_INT): Use an 'E%' prefix for items in
+ the exception table if TARGET_GAS && ! TARGET_PORTABLE_RUNTIME.
+
+Tue Jul 30 15:37:31 1996 Jim Wilson <wilson@cygnus.com>
+
+ * i386/cygwin32.h (dbxcoff.h): Include.
+ (DBX_DEBUGGING_INFO, SDB_DEBUGGING_INFO, PREFERRED_DEBUGGING_TYPE):
+ Move definitions before include of dbxcoff.h.
+ (ASM_OUTPUT_SOURCE_LINE, DBX_OUTPUT_MAIN_SOURCE_FILE_END): Delete.
+ (DBX_BLOCKS_FUNCTION_RELATIVE, DBX_FUNCTION_FIRST): Delete.
+
+Tue Jul 30 15:03:53 1996 Torbjorn Granlund <tege@spiff.gnu.ai.mit.edu>
+
+ * i960.md (eq reg (const_int 0)): New pattern.
+
+Tue Jul 30 11:15:44 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa.h (RETURN_ADDR_RTX): Offset is -20 from the frame, not +20!
+
+Mon Jul 29 12:16:17 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa.h (GO_IF_LEGITIMATE_ADDRESS): Fix thinko in last change.
+
+Fri Jul 26 18:19:47 1996 Doug Evans <dje@cygnus.com>
+
+ * dwarfout.c (output_bound_representation): Fix typo.
+
+Thu Jul 25 16:00:10 1996 Mike Stump <mrs@cygnus.com>
+
+ * expr.c (do_jump, case TRUTH_ORIF_EXPR): Ensure end of an
+ exception region comes after its start.
+ (do_jump, case TRUTH_ANDIF_EXPR): Likewise.
+
+Thu Jul 25 13:36:42 1996 Stan Cox <coxs@equinox>
+
+ * i386.c (output_float_compare): Added support for Pentium Pro
+ fcomi instruction which sets EFLAGS instead of FPU Status Word.
+
+Wed Jul 24 21:48:08 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * cse.c (canon_hash, cse_insn): MEM is not unchanging if it is
+ in the frame (since the temp slot might be reused).
+
+Wed Jul 24 17:34:06 1996 J"orn Rennecke (amylaar@cygnus.com)
+
+ * sh.md (branch_true, branch_false, inverse_branch_true): Express
+ tests of the T bit as comparisons against zero, rather than one.
+ (inverse_branch_false, beq, bne, bgt, blt, ble, bge, bgtu): Likewise.
+ (bltu, bgeu, bleu, casesi): Likewise.
+
+Wed Jul 24 15:58:06 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.md: (mov{sf,df,xf}cc{,_1}): New patterns for P6 FP cmove.
+ * i386.c (put_condition_code, print_operand, output_fp_cc0_set):
+ Support fcmov suffixes.
+
+Wed Jul 24 10:53:38 1996 Jeffrey A Law (law@cygnus.com)
+
+ * pa.c (move_operand): Relax "mode" test. Allow scaled
+ indexed addressing modes.
+ (output_fp_move_double): Tweak output strings to work with updated
+ 'F' and 'M' output modifiers.
+ (print_operand): Collapse 'F' and 'M' into a single hunk of code.
+ For auto-increment modes output "s,ma" and "s,mb".
+ For scaled indexing modes output "x,s"
+ For other addresses, output nothing for 'M' and "s" for 'F'.
+ * pa.h (EXTRA_CONSTRAINT): Don't accept scaled indexed addresses
+ for 'Q' and 'T'. Do accept scaled indexed addresses for 'R'.
+ (GO_IF_LEGITIMATE_ADDRESS): Accept scaled indexed addresses
+ for SFmode and DFmode.
+ * pa.md: Remove all scaled indexed load patterns.
+ (movsi patterns): Accept scaled indexed addresses in some
+ cases. Update output strings for updated 'M' and 'F' output modifiers.
+ (movhi, movqi, movsf, movdf, movdi patterns): Likewise.
+
+Tue Jul 23 23:10:41 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * tree.h (struct tree_int_cst): Add field for TREE_CST_RTL.
+ * varasm.c (decode_addr_const, output_constant_def): AllowINTEGER_CST.
+
+Tue Jul 23 16:42:09 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sh.c (reg_unused_after): Handle JUMP_INSN inside a sequence.
+
+Tue Jul 23 16:33:25 1996 Mike Stump <mrs@cygnus.com>
+
+ * Make exception handling work better when optimizations are on.
+ * except.c, except.h: New files.
+ * Makefile.in (OBJS): Add except.o.
+ (except.o): Add.
+ (stmt.o, final.o): Add except.h.
+ * rtl.c (note_insn_name): Add NOTE_INSN_EH_REGION_{BEG,END}.
+ * rtl.h: Likewise.
+ * arm.h (MASK_RETURN_ADDR): Define.
+ * pa.h (MASK_RETURN_ADDR, RETURN_ADDR_RTX): New macros.
+ * sparc.h (DOESNT_NEED_UNWINDER): Define if not doing a flat function.
+ * mips.h (RETURN_ADDR_RTX): Improve.
+ * vax.h (RETURN_ADDR_RTX): Improve.
+ * toplev.c (rest_of_compilation): Use find_handler_labels.
+ (main, interim_eh{,_hook}): Remove interim_eh_hook support.
+ (flag_exceptions): New flag; also add to table.
+ (compile_file): Emit the exception table in the backend now.
+ * final.c (final_scan_insn): Support ASM_OUTPUT_EH_REGION_{BEG,END}.
+ (final_scan_insn): Redo handler labels, implement
+ NOTE_INSN_EH_REGION_BEG and NOTE_INSN_EH_REGION_END and use them
+ instead of CODE_LABELs.
+ (final): Add call to check_handler_labels.
+ * libgcc2.c (L_eh): Add support for EH_TABLE_LOOKUP.
+ * sparc.md (return): Add a reference to the return address register.
+ * flow.c (find_basic_blocks): Add support for handler_labels.
+ * loop.c (find_and_verify_loops): Likewise.
+ * jump.c (jump_optimize): Likewise.
+ Add call to check_handler_labels. Add call to exception_optimize.
+ * sched.c (sched_analyze): Smuggle exception region notes around.
+ (unlink_notes, reemit_notes, schedule_block): Likewise.
+ (sched_analyze): Add extra element since we remove two at a time.
+ * integrate.c (save_for_inline_copying): Add support for exception
+ regions.
+ (expand_inline_function): Likewise.
+ (function_cannot_inline_p): Don't inline functions that have EH
+ regions before NOTE_INSN_FUNCTION_BEG.
+ (finish_inline): Use FIRST_FUNCTION_INSN, not NEXT_INSN.
+ * function.c (expand_start_all_catch): New function.
+ * function.h: Add exception handling support information.
+ * expr.c (expand_expr, {defer,expand}_cleanups_to, do_jump): Transform
+ interim_eh_hook into calls to expand_ehregion_{start,end}.
+ * stmt.c (expand_{decl_cleanup,cleanups}): Likewise.
+ (init_stmt_for_function): Call init_eh.
+ (save_stmt_status): Call save_eh_status.
+ (restore_stmt_status): Call restore_eh_status.
+ * expr.h (throw_libfunc): Add.
+ * optabs.c (throw_libfunc): Initialize.
+ * print-rtl.c (print_rtx): Add support for exception regions.
+ * rs6000.c (EXCEPTION_SECTION): Define.
+ * output.h (exception_section): Declare.
+ * varasm.c (exception_section): Define.
+ * i386.c, i960.c, rs6000.c: Include except.h for function.h.
+ * c-pragma.c, emit-rtl.c, expr.c, final.c, flow.c: Include except.h.
+ * function.c, integrate.c, jump.c, loop.c, objc-act.c: Likewise.
+ * stmt.c, stor-layout.c, toplev.c, tree.c, varasm.c: Likewise.
+
+Tue Jul 23 12:32:54 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.c (rs6000_replace_regno): Set pic_offset_table_rtx so
+ that other phases will use the PIC register instead of the
+ placeholder.
+
+ * rs6000.md (movsi_got*): Eliminate -fPIC code, keep -fpic code.
+ (movsi): Only call movsi_got if -fpic, not -fPIC.
+
+ * sysv4.h (OVERRIDE_OPTIONS): Improve error messages. Always set
+ -msdata=data by default, even if -fpic/-fPIC/-mrelocatable. Treat
+ -fPIC the same as -mrelocatable-lib and vica versa.
+
+ * t-ppcgas: (MULTILIB_*): Use -mreloctable-lib, instead of
+ -mrelocatable. Map Solaris into mcall-sysv-noeabi case. Build
+ -mrelocatable-lib libraries under non-eabi case. When linking, if
+ -fpic, -fPIC, or -shared, link in the -mrelocatable-lib libraries.
+
+Mon Jul 22 19:34:20 1996 Jim Wilson <wilson@cygnus.com>
+
+ * iris6.h (ASM_SPEC): Change {% to %{.
+
+ * dwarf2out.c (output_call_frame_info): Change FDE CIE offset to
+ be section name rather than 0.
+ (gen_subprogram_die): Only emit DW_AT_external if origin is NULL.
+ Only call equate_decl_number_to_die if origin is NULL.
+ (dwarfout_begin_function): In code that computes offset of frame
+ pointer, change 4 to UNITS_PER_WORD.
+
+ * combine.c (undo_all): Clear previous_undos field.
+
+Mon Jul 22 19:10:45 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * configure: Don't change target_alias to target in Makefile.
+
+Sat Jul 20 09:28:38 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * dwarfout.c (output_bound_representation): Treat default case
+ as variable bounds, then look inside for SAVE_EXPR.
+
+ * mips.h (INITIALIZE_TRAMPOLINE): Use `_flush_cache'; flush data
+ cache too.
+
+Sat Jul 20 09:24:13 1996 Marco Walther (Marco.Walther@mch.sni.de).
+
+ * configure (mips-sni-sysv4): New target.
+ * mips/sni-gas.h, mips/sni-svr4.h, mips/x-sni-svr4: New files.
+
+Fri Jul 19 17:44:13 1996 Stan Coxs <coxs@dg-rtp.dg.com>
+
+ * i386.md: (leave): Clobbers esp and ebp.
+
+ * i386.h: (TARGET_USE_Q_REG): Support inline strlen on PentiumPro
+
+Fri Jul 19 15:56:18 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * m68k/t-m68kbare (MULTILIB_OPTIONS): Add m5200.
+ (MULTILIB_EXCEPTIONS): Define.
+ * m68k/lb1sf68.asm: Add MCF5200 support.
+ * m68k.md (adddi_sexthishl32): Set condition to !TARGET_5200.
+ (subdi_sexthishl32, ashrdi3, ashrhi3): Likewise.
+ (negdi2): Change into define_expand.
+ (negdi2_internal): Rename from old negdi2; condition now !TARGET_5200.
+ (negdi2_5200): New insn.
+ * m68k.c (output_function_prologue): Don't use add.w if TARGET_5200.
+ (output_function_epilogue): Likewise.
+
+ * m68k.md (movqi): Remove complex cases which move between address reg
+ and memory; rely on secondary reloads instead.
+
+Fri Jul 19 12:22:50 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * fixproto (std_files): Add utime.h.
+
+Fri Jul 19 10:59:46 1996 Jeffrey A Law (law@cygnus.com)
+
+ * m68k/m68kemb.h: Remove '\' at EOF.
+
+Fri Jul 19 09:59:00 1996 Joel Sherrill <joel@OARcorp.com>
+
+ * m68k/coff.h (STARTFILE_SPEC): Add #undef before definition.
+
+Fri Jul 19 09:44:45 1996 J.T. Conklin <jtc@rtl.cygnus.com>
+
+ * m68k.h (LEGITIMATE_INDEX_P): Coldfire does not have scale
+ by 8 addressing modes.
+
+ * m68k-none.h: Use MASK_* macros instead of explicit constants.
+
+Fri Jul 19 09:08:53 1996 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * m68k.md (negdi2): Undo last change: don't apply neg to address regs.
+
+Fri Jul 19 09:03:01 1996 Robert Wilhelm (rwilhelm@Physik.TU-Muenchen.DE)
+
+ * toplev.c (main): Correct typo in error message.
+
+Thu Jul 18 20:29:33 1996 Jim Wilson <wilson@cygnus.com>
+
+ * Makefile.in (OBJS): Add dwarf2out.o.
+ (dwarf2out.o): New rule.
+ * dwarf2.h, dwarf2out.c: New files.
+ * dwarfout.c: Check DWARF_VERSION macro.
+
+ * mips/iris6.h (DWARF_DEBUGGING_INFO, PREFERRED_DEBUGGING_TYPE):
+ Move after header files are included.
+ (iris5.h): Include instead of iris5gas.h.
+ (MACHINE_TYPE): Change 5.x to 6.x.
+ (DEBUG_SECTION, LINE_SECTION): Add debug_ to name, fix attributes.
+ (SFNAMES_SECTION, SRCINFO_SECTION, MACINFO_SECTION, PUBNAMES_SECTION,
+ ARANGES_SECTION): Fix attributes.
+ (DWARF_VERSION, MIPS_DEBUGGING_INFO, ASM_DECLARE_FUNCTION_NAME,
+ ASM_DECLARE_FUNCTION_SIZE, FUNCTION_NAME_ALREADY_DECLARED,
+ FRAME_SECTION, ABBREV_SECTION): Define.
+ (DBX_DEBUGGING_INFO, SDB_DEBUGGING_INFO, MIPS_DEBUGGING_INFO,
+ DWARF_DEBUGGING_INFO, PREFERRED_DEBUGGING_INFO): Delete undefs at
+ end of file.
+ * mips.c (function_{pro,epi}logue): Use FUNCTION_NAME_ALREADY_DECLARED.
+
+Thu Jul 18 19:24:19 1996 David Mosberger-Tang <davidm@azstarnet.com>
+
+ * alpha/elf.h (INT_ASM_OP): Change from ".long" to ".quad".
+
+Thu Jul 18 19:20:58 1996 Ulrich Drepper <drepper@myware.rz.uni-karlsruhe.de>
+
+ * stddef.h: Undefine __need_wint_t.
+
+Thu Jul 18 19:06:35 1996 J.T. Conklin <jtc@hippo.cygnus.com>
+
+ * longlong.h (mc680x0): Define umul_ppmm, udiv_qrnnd, sdiv_qrnnd
+ for the '020, '030, '040, and '332. Define count_leading_zeros
+ for the '020, '030, '040, and '060.
+
+ * m68k.md: Add TARGET_5200 to conditions which determine whether
+ the extbl instruction is emitted.
+ (mulsi3): Enable pattern with TARGET_5200.
+
+ * m68k.md (add patterns): Don't use two addqw instructions when
+ adding small (8 < N <= 16) integers to address registers on 68040.
+
+Thu Jul 18 18:06:15 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * configure: Write target_alias in Makefile.
+ (i[3456]86-*-sco3.2v4*): Set truncate_target.
+ * Makefile.in (target_alias): New and used for all current uses
+ of `target'.
+
+Thu Jul 18 17:46:02 1996 Dave Love <d.love@dl.ac.uk>
+
+ * gcc.c (default_compilers): Extra Fortran extensions.
+
+Wed Jul 17 10:28:10 1996 Torbjorn Granlund <tege@spiff.gnu.ai.mit.edu>
+
+ * expmed.c (expand_mult_highpart): Revert last change.
+
+Tue Jul 16 12:51:59 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc/sparc-rtems.h: #include "sparc/sparc-aout.h" -> sparc/aout.h.
+
+Mon Jul 15 14:42:06 1996 Jim Wilson <wilson@cygnus.com>
+
+ * mips/iris6.h (LINK_SPEC): Add -woff 84.
+
+Fri Jul 12 17:34:01 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/eabi.asm (__eabi): Convert pointers in the Global Offset
+ Table if -mrelocatable. Move loops into separate subroutines for
+ ease of debugging. Reorganize code somewhat.
+
+ * rs6000/rs6000.c (small_data_operand): Allow small data under
+ Solaris.
+
+ * rs6000/sol-c0.c (_start): Initialize r13 to point to the small
+ data operand.
+
+ * rs6000/sol-c{i,n}.asm (_init, _fini): Enable shared library
+ support.
+
+ * rs6000/sysv4.h (SUBTARGET_OVERRIDE_OPTIONS): Default to
+ -msdata=data, even if -fpic or -mrelocatable. Allow -mrelocatable
+ and -mno-eabi.
+ (CPP_SYSV_SPEC): If -fpic, define __PIC__ and __pic__ to 1. If
+ -fPIC, define them to 2.
+ (CPP_ENDIAN_SPEC): Push definition of macros for specific endian
+ targets to new specs.
+ (CPP_ENDIAN_DEFAULT_SPEC): Define to use CPP_ENDIAN_BIG_SPEC.
+ (CPP_ENDIAN_{LITTLE,BIG,SOLARIS}_SPEC): New specs for little
+ endian mode, big endian mode, and Solaris, which can't define
+ _LITTLE_ENDIAN. Define __LITTLE_ENDIAN__ in all cases for little
+ endian systems. Define __BIG_ENDIAN__ in all cases for big endian
+ systems.
+ (SUBTARGET_EXTRA_SPECS): Add new specs.
+
+ * rs6000/{eabile,sysv4le}.h (CPP_ENDIAN_DEFAULT_SPEC): Define to
+ use CPP_ENDIAN_LITTLE_SPEC.
+
+ * rs6000/sol2.h (CPP_ENDIAN_LITTLE_SPEC): Define as
+ CPP_ENDIAN_SOLARIS_SPEC so that _LITTLE_ENDIAN is not define.
+
+Fri Jul 12 17:34:01 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.c (function_arg): Add IBM AIX XL compiler broken FP arg
+ passing compatibility mode.
+ * rs6000.h (TARGET_XL_CALL): Define default.
+ * aix3newas.h (TARGET_XL_CALL, SUBTARGET_SWITCHES): Define.
+ * aix41.h (TARGET_XL_CALL, SUBTARGET_SWITCHES): Define.
+
+Fri Jul 12 15:04:43 1996 Doug Evans <dje@cygnus.com>
+
+ * arm.h (ASM_OUTPUT_MI_THUNK): Handle fns returning structures.
+
+ * ptx4.h ({ASM,LINK}_SPEC): %{V} %{v:%{!V:-V}} -> %{v:-V}.
+ * svr4.h ({ASM,LINK}_SPEC): Likewise.
+ * dsp16xx/dsp16xx.h ({ASM,LINK}_SPEC): Likewise.
+ * i386/dgux.h (LINK_SPEC): Likewise.
+ * i386/sol2.h (LINK_SPEC): Likewise.
+ * m88k/dgux.h ({LINK,ASM_CPU}_SPEC): Likewise.
+ * sparc/sol2.h ({ASM,LINK}_SPEC): Likewise.
+ * sparc/sp64-elf.h ({ASM,LINK}_SPEC): Likewise.
+ * sparc/sysv4.h (ASM_SPEC): Likewise.
+
+Thu Jul 11 17:29:33 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.h (GOT_TOC_REGNUM): New macro for r2, which is used as a
+ marker for the GOT/TOC register to be allocated later.
+ (MACHINE_DEPENDENT_REORG): Call rs6000_reorg.
+ (rs6000_reorg): Add declaration.
+
+ * rs6000.c (rs6000_got_register): Return REG 2, not a pseudo
+ register in order to work with inlined functions.
+ (rs6000_replace_regno): New function to replace a register with a
+ new pseudo register.
+ (rs6000_finalize_pic): Loop through all insns, replacing any
+ GOT_TOC_REGNUM registers with new pseudo register, and adding
+ initialization of GOT register if it was created.
+ (rs6000_reorg): New function to check whether the GOT_TOC register
+ marker was removed.
+
+Thu Jul 11 10:12:50 1996 Jeffrey A Law (law@cygnus.com)
+
+ * h8300.h (OK_FOR_U): If generating H8/S code, accept
+ SYMBOL_REF and SYMBOL_REF + CONST_INT.
+
+ * h8300.c ({shift,rotate}_one): Emit tabs between opcode and
+ operands to be consistent with the rest of the compiler.
+ (shift_two, rotate_two): Define.
+ (get_shift_alg): Accept new argument "assembler2_p" for
+ rotate/shift by two insns. All callers changed. Rework
+ to generate more efficient code on the H8/300, H8/300H, and H8/S.
+ Try to simplify somewhat.
+ (emit_a_shift): Use shift-by-two insns when they're available.
+ Emit tabs between opcode and operands to be consistent with
+ the rest of the compiler.
+
+Wed Jul 10 19:32:17 1996 Jim Wilson <wilson@cygnus.com>
+
+ * mips/iris6.h (ASM_SPEC): Correct typos in Jun 18 change.
+
+Wed Jul 10 18:56:38 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * sh.c (machine_dependent_reorg): When looking for instruction that
+ sets register in LOG_LINKS, skip link if REG_NOTE_KIND is not zero.
+
+Wed Jul 10 15:02:18 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.c (rs6000_got_register): New function to return a pseudo
+ register to hold the pic register. Abort if reload is in progress
+ or done.
+ (num_insns_constant): Allow SFmode and DFmode.
+
+ * rs6000.h (CONST_DOUBLE_OK_FOR_LETTER_P): Redo 'G' so that it
+ means a constant that takes exactly two insns.
+ (rs6000_got_register): Add declaration.
+
+ * rs6000.md (movsi_got): Move setup of pic register to
+ rs6000_got_register.
+ (movsf): If -msoft-float, don't force constants to memory.
+ (mov{sf,df} insns): If soft floating point, allow any constant to
+ be loaded. Add define_splits that allow the 604 to use both
+ integer units for loading constants. Make sure insn length is
+ correct.
+
+Tue Jul 9 17:05:10 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.c (easy_fp_constant): All FP constants are considered
+ hard for -fpic and hardware floating point, so that the GOT
+ register is created.
+
+Tue Jul 9 15:21:27 1996 Jim Wilson <wilson@cygnus.com>
+
+ * x-iris6 (FIXPROTO_DEFINES): Add -D_SGI_SOURCE.
+
+Mon Jul 8 18:00:33 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sh.h (enum reg_class): Add new class GENERAL_FP_REGS.
+ (REG_CLASS_NAMES, REG_CLASS_CONTENTS): Likewise.
+
+ * cse.c (note_mem_written): Varying structure memory access with
+ AND address can alias scalars.
+ * sched.c ({true,anti,output}_dependence): Likewise.
+
+ * sh.c (calc_live_regs): For pragma_interrupt case, exclude call
+ clobbered regs that are fixed, explicitly add MACH_REG and MACL_REG.
+
+ * calls.c (expand_call): For assign_stack_temp call in PARALLEL case,
+ get mode from type instead of using BLKmode.
+ * function.c (aggregate_value_p): If hard_function_value returns
+ a non-REG, then return 0.
+
+ * mips.c (function_arg): Add explicit checks for FIELD_DECLs.
+ (mips_function_value): Add explicit checks for FIELD_DECLs, and save
+ them in the array FIELDS. When returning structure with 1 float field,
+ enclose it in a PARALLEL and set the PARALLEL mode correctly.
+ * mips.md (call_value): Call gen_call_value_multiple_internal0
+ only if there are multiple return values. Strip the PARALLEL off
+ if there there is only one return value.
+
+Mon Jul 8 16:27:33 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * First cut at support for the H8/S.
+ * h8300.c (h8300_init_once): Handle the H8/S (treat it
+ like the H8/300H).
+ (dosize, adds_subs_operand, one_insn_adds_subs_operand): Likewise.
+ (output_adds_subs, const_costs, print_operand): Likewise.
+ (output_simode_bld, h8300_adjust_insn_length): Likewise.
+ (push_order, pop_order): Reverse.
+ (function_prologue): Try to use ldm.l and stm.l insns
+ on the H8/S. Minor cleanups.
+ (function_epilogue): Likewise.
+ (asm_file_start): Emit ".h8300s" when compiling for the H8/S.
+ * h8300/h8300.h (CPP_SPEC): Handle the H8/S.
+ (TARGET_H8300S): New target.
+ (TARGET_SWITCHES): Add "-ms" and "-mno-s".
+ (BITS_PER_WORD): Handle the H8/S (treat it like the H8/300H).
+ (UNITS_PER_WORD, POINTER_SIZE, PARM_BOUNDARY): Likewise.
+ (BIGGEST_ALIGNMENT, BIGGEST_FIELD_ALIGNMENT): Likewise.
+ (INITIALIZE_TRAMPOLINE, MOVE_MAX, Pmode): Likewise.
+ * h8300.md: Handle H8/S just like H8/300H
+ throughout the entire file.
+ * t-h8300 (MULTILIB_OPTIONS): Build "-ms" libraries too.
+ (MULTILIB_DIRNAMES): Put H8/S libraries in "h8300s" directory.
+ * h8300/lib1funcs.asm: Emit ".h8300s" pseudo-op when generating
+ h8300s object files. Otherwise treat the H8/S just like the H8/300H.
+ * ginclude/stdarg.h: Handle the H8/S.
+ * ginclude/varargs.h: Likewise.
+
+Mon Jul 8 14:50:58 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc/sol2.h (LINK_SPEC): Don't pass `-z text' if
+ -shared -mimpure-text.
+
+Sun Jul 7 18:03:46 1996 Torbjorn Granlund <tege@noisy.tmg.se>
+
+ * m68k/lb1sf68.asm (__udivsi3): Use faster tstw instead of btst.
+
+Thu Jul 4 11:44:39 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (get_inner_reference): Delete using alternate mode for
+ bitfield; we don't make bitfields anymore if not needed.
+
+Wed Jul 3 18:23:17 1996 Stephen L Moshier (moshier@world.std.com)
+
+ * c-common.c (record_function_format): Define as static.
+
+ * collect2.c (at SUNOS4_SHARED_LIBRARIES): Fix reference to unistd.h.
+
+Wed Jul 3 17:35:20 1996 Gavin Koch <gavin@cygnus.com>
+
+ * c-typeck.c (default_conversion): Add bitfield promotions.
+
+Wed Jul 3 17:09:22 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * gcc.c (default_compilers): Add null entries for languages we
+ heard of.
+ (main): If found one of those entries, say compiler not installed.
+
+Wed Jul 3 12:52:53 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.c (fmpy_operands): Define.
+ (combinable_{fmpy,add,fsub}): New function.
+ * pa.md (parallel_addb, parallel_movb): New patterns.
+ (fmpyadd, fmpysub): New patterns.
+
+ * pa.c (fmpy{add,sub}operands): Tighten checks. Allow SFmode.
+
+Tue Jul 2 18:57:15 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.c (ireg_or_int5_operand): New function.
+ (output_parallel_movb, output_parallel_addb): Likewise.
+ (combinable_copy, combinable_add, following_call): Likewise.
+ (pa_adjust_insn_length): Handle parallel unconditional branches.
+ (output_movb): Handle case were destination is %sar.
+ * pa.h: Declare new functions.
+ * pa.md (parallel_branch): New "type" attribute.
+ (delay slot descriptions): Don't allow "parallel_branches" in
+ delay slots. Fill "parallel_branches" like "branch" insns.
+ (movb patterns): Handle %sar as destination register.
+
+ * expr.c (compare): If function pointers need canonicalization
+ before comparisons, canonicalize them.
+ (do_store_flag): Do not use an sCC insn for a function pointer
+ comparison if function pointers need canonicalization before
+ comparing.
+
+Tue Jul 2 17:56:37 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sysv4.h ({START,END}FILE_LINUX_SPEC): If -mnewlib is not
+ used, use the crtbegin/crtend that 2.7.2 used.
+
+Sat Jun 29 07:10:02 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.h (INIT_EXPANDERS): Define, call rs6000_init_expanders.
+ (RS6000_VARARGS_OFFSET): fpmem area no longer next to outgoing
+ argument area.
+ (STARTING_FRAME_OFFSET, STACK_DYNAMIC_OFFSET): Likewise.
+ (frame_pointer_needed): Add external declaration.
+ (rs6000_{save,restore}_machine_status): Ditto.
+ (rs6000_init_expanders): Likewise.
+
+ * rs6000.c (rs6000_{save,restore}_machine_status): New functions
+ to save and restore the globals needed on a per function basis.
+ (rs6000_init_expanders): Initialize globals needed on a per
+ function basis, and set up so the above save/restore functions are
+ called when processing nested functions.
+ (output_epilog): Don't initialize per function globals here.
+ (rs6000_stack_info): Change where fpmem save area is to below local
+ variables, and not just below the outgoing argument area.
+
+ * rs6000.md (floatsidf2*, fix_truncdfsi2*): Rewrite conversion
+ routines to track new location of the fpmem save area. Allocate a
+ new base register temp for the routines in case the stack frame is
+ more than 32k in size.
+
+Sat Jun 29 05:44:37 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * explow.c (convert_memory_address, case PLUS): Fix error in
+ last change.
+
+Fri Jun 28 23:30:48 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * reload1.c (choose_reload_regs): Properly mark spill registers
+ as in use for inherited reloads.
+
+Fri Jun 28 18:37:20 1996 Stephen L Moshier <moshier@world.std.com>
+
+ * objc/sarray.c (ifdef __alpha__): Don't declare `free'.
+ * objc/thr-decosf1.c (objc_thread_id): Use pthread_getunique_np
+ to obtain a thread ID value.
+ (objc_mutex_allocate): Cast mutex->owner to _objc_thread_t.
+ (objc_mutex_{deallocate,unlock}): Likewise.
+ (objc_mutex_{try,un,}lock): Declare thread_id as _objc_thread_t.
+
+ * real.c (asctoeg): `0.0eX' is zero, regardless of the exponent X.
+
+Fri Jun 28 18:33:13 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * vax.md (rotl): Remove extraneous `$'.
+
+ * combine.c (previous_num_undos): Deleted variable.
+ (MAX_UNDO): Deleted macro.
+ (struct undo): New field, next.
+ (struct undobuf): Deleted num_undos and undo.
+ New fields undos, frees, and previous_undos.
+ (SUBST, SUBST_INT): Rework to allocate memory and chain undo entries.
+ (combine_instructions): Initialize undobuf.{undos,previous_undos},
+ not undobuf.num_undo and previous_num_undos.
+ (try_combine): Likewise.
+ (undo_all, gen_rtx_combine): Rework to use new data structures.
+
+Fri Jun 28 16:48:25 1996 Scott Christley <scottc@net-community.com>
+
+ * objc/sendmsg.c (__objc_block_forward): New function.
+ (get_imp, objc_msg_lookup): Use different forwarding function
+ when the returning a floating point value.
+
+Fri Jun 28 16:25:25 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * configure: Allow multiple makefile frags.
+ (i[3456]86-*-linux*oldld*): Add i386/t-crtstuff as target frag.
+ (i[3456]86-*-linux*aout*, i[3456]86-*-linux*): Likewise.
+ (m68k-*-linux*aout*): Add t-linux-aout as target frag.
+ (m68k-*-linux*): Add t-linux as target frag.
+ * Makefile.in (Makefile): xmake_file and tmake_file now already
+ contain the $(srcdir)/config prefix.
+
+ * config/t-linux (BOOT_CFLAGS): Removed, no longer necessary.
+ (CRTSTUFF_T_CFLAGS): Don't define.
+ (CRTSTUFF_T_CFLAGS_S): Define this instead.
+ * config/t-linux-aout (BOOT_CFLAGS): Removed.
+ * m68k/t-linux: Remove variables now in t-linux.
+
+Fri Jun 28 15:06:05 1996 John F. Carr <jfc@mit.edu>
+
+ * alpha.c (alpha_emit_conditional_move): Emit correct code when
+ incoming comparison code is NE.
+
+Fri Jun 28 14:35:45 1996 J.T. Conklin <jtc@hippo.cygnus.com>
+
+ * c-decl.c (init_decl_processing): Register __builtin_memset
+ and memset as builtin functions.
+ * expr.c (expand_builtin, case BUILTIN_MEMSET): Open code memset
+ where val == 0.
+
+Fri Jun 28 14:10:03 1996 Richard Henderson <rth@tamu.edu>
+
+ * alpha/linux.h (FUNCTION_PROFILER): _mcount has non-standard linkage.
+ * alpha/elf.h (LINK_SPEC): Bring emulation name into sync
+ with Cygnus snapshot.
+
+ * alpha.h ({MASK,TARGET}_BUILD_CONSTANTS): New macros.
+ (TARGET_SWITCHES): New target option build-constants.
+ * alpha.c (alpha_emit_set_long_const): New function.
+ * alpha.md (movdi): Call it.
+ * expmed.c (expand_mult_highpart): Use op1 not wide_op1 in
+ expansion of mul_highpart.
+
+ * alpha.c (output_{pro,epi}log): Flag_inhibit_size_directive
+ should supress .ent, .end, and accompanying directives.
+ (alpha_output_lineno): Fix polarity on GAS test.
+ * alpha.h (NO_DBX_FUNCTION_END): New macro.
+ * dbxout.c (dbxout_function): Respect NO_DBX_FUNCTION_END.
+ * alpha/elf.h: New file.
+ * alpha/linux.h (INITIALIZE_TRAMPOLINE): New definition.
+ * alpha/xm-linux.h (HAVE_STRERROR): Define.
+ * configure (alpha*-linux*ecoff*): New target, was alpha-*-linux*.
+ (alpha-*-linux*): Use elf.h.
+ * crtstuff.c (init_dummy): Only i386-linux (at most)
+ needs ___brk_addr hack.
+
+Thu Jun 27 20:23:30 1996 Jon Buller (jonb@metronet.com)
+
+ * ns32k.c (split_di): New; from i386.c.
+ * ns32k.md (adddi3, subdi3, negdi3): New patterns.
+
+Thu Jun 27 19:42:50 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * combine.c (force_to_mode, case NE): Fix typo and logical error.
+ (simplify_comparison): Don't swap args if op1 is CONST_INT.
+
+Thu Jun 27 18:49:35 1996 Jim Wilson <wilson@cygnus.com>
+
+ * expmed.c (extract_bit_field): Check TRULY_NOOP_TRUNCATION before
+ making a SUBREG of a REG.
+
+Thu Jun 27 11:03:59 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * mips.h (CC1_SPEC): Put spaces between the -mips* cases.
+ * mips/osfrose.h (CC1_SPEC): Likewise.
+
+ * sh.c (output_branch): Don't call ADJUST_INSN_LENGTH if insn is
+ inside sequence.
+
+Wed Jun 26 19:09:43 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.h (CMP_PSI): Delete.
+ (FUNCTION_POINTER_COMPARISON_MODE): Likewise.
+ * pa.md (cmppsi): Delete expander.
+ (canonicalize_funcptr_for_compare): Renamed from plabel_dereference,
+ turned into an expander + anonymous pattern.
+
+Tue Jun 25 22:36:11 1996 Doug Evans <dje@seba.cygnus.com>
+
+ * gcc.c (PEXECUTE_VERBOSE): Define.
+ (execute): Pass PEXECUTE_VERBOSE to pexecute if -v.
+
+Tue Jun 25 12:23:54 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.h (FINALIZE_PIC): Define to call rs6000_finalize_pic.
+ (rs6000_finalize_pic): Add declaration.
+ (svr4_traceback): Delete unused declaration.
+
+ * rs6000.md (movsi_got): Don't emit gen_init_v4_pic insn.
+ (V.4 call insns): Do not use @plt for PIC calls.
+
+ * rs6000.c (print_operand_address): Handle LABEL_REF just like
+ SYMBOL_REF.
+ (rs6000_finalize_pic): Define, emit the gen_init_v4_pic insn
+ before all other insns if needed for V.4 PIC calls.
+
+ * eabi-ci.asm (_GLOBAL_OFFSET_TABLE_): Do not provide a default
+ definition, since it interferes with the linker generated version.
+
+Tue Jun 25 01:17:50 1996 Jeffrey A. Law <law@cygnsu.com>
+
+ * h8300.c (function_prologue): Update "monitor" prologues.
+ (function_epilogue): Similarly.
+
+ * pa.h (PARSE_LDD_OUTPUT): Handle dynamic libraries that are
+ loaded "statically".
+
+Mon Jun 24 19:48:36 1996 Joel Sherrill <joel@merlin.gcs.redstone.army.mil>
+
+ * configure ({i386,i960,m68k,powerpc,sparc}-rtems): New targets.
+ * i386/go32-rtems.h, i386/i386-rtems.h: New files.
+ * i960/i960-rtems.h: New file.
+ * m68k/m68k-rtems.h: New file.
+ * rs6000/powerpc-rtems.h: New file.
+ * sparc/sparc-rtems.h: New file.
+
+Mon Jun 24 23:09:22 1996 Paul Eggert <eggert@twinsun.com>
+
+ * cccp.c: (create_definition): Diagnose `#define #' only once.
+
+Mon Jun 24 11:42:58 1996 Jim Wilson <wilson@cygnus.com>
+
+ * i386/cygwin32.h, rs6000/cygwin32.h (CPP_PREDEFINES): For consistency,
+ change to define WIN32, WINNT, and CYGWIN32.
+
+Mon Jun 24 10:46:50 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (floatsidf2*): Move the xor of the argument into the
+ define_insn, since it confuses inline function expands.
+
+Fri Jun 21 20:40:17 1996 Jim Wilson <wilson@cygnus.com>
+
+ * mips.md (call_internal1, call_value_internal1): Delete obsolete code.
+ (call_internal2, call_value_internal2, call_value_multiple_internal2):
+ Delete obsolete code. Explicitly load SYMBOL_REF into register.
+ (call_value): Change Pmode to SImode in gen_call_value_internal0 call.
+
+Thu Jun 20 12:20:33 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * configure (*-aix*): If building a cross compiler, use t-xnewas
+ instead of t-newas.
+
+ * rs6000.c (num_insns_constant_wide): Fix typo if HOST_WIDE_INT
+ has more than 32 bits.
+
+Wed Jun 19 17:50:33 1996 Richard Henderson <richard@atheist.tamu.edu>
+
+ * combine.c (move_deaths): New parameter maybe_kill_insn.
+ Don't move note if reg killed by maybe_kill_insn.
+ (try_combine): Pass new arg to move_deaths.
+
+Wed Jun 19 10:44:47 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * toplev.c (flag_keep_static_consts): Define.
+ (f_options): Add "keep-static-consts" entry.
+ (compile_file): Check it in addition to !optimize for emitting
+ static const variables.
+
+Tue Jun 18 23:37:20 1996 Doug Evans <dje@cygnus.com>
+
+ * i386/cygwin32.h (ASM_OUTPUT_SOURCE_LINE): Local symbols begin with L.
+
+Tue Jun 18 12:00:11 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * varasm.c (asm_output_aligned_bss): Don't emit a skip of size 0.
+
+Tue Jun 18 06:24:28 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * integrate.c (expand_inline_function): Add missing call to
+ force_operand when getting structure_value_addr into reg.
+
+ * alpha.c (override_options): Allow EV4/5 or 21064/21164 for cpu.
+ Clean up handling of floating-point options.
+ * alpha.h (TARGET_SWITCHES): Have all -mieee options turn
+ on MASK_IEEE_CONFORMANT.
+ (TARGET_DEFAULT): Use symbolic value.
+ * alpha.md: When not involving named pattern, update condition
+ to include alpha_tp != ALPHA_TP_INSN.
+ Don't do float_extend as part of other pattern when ALPHA_TP_INSN.
+ (extendsfsd2): Split into two patterns, depending on
+ value of alpha_tp.
+
+ * mips/iris6.h (ASM_SPEC): Treat -o32 as -32 and -n64 same as -64.
+ * mips.c (override_options): Likewise.
+
+ * genattrtab.c (fatal): Declare A1 and A2 as char *.
+
+ * function.c (find_temp_slot_from_address): Check for overlap
+ from BASE_OFFSET if X is PLUS of virtual_stack_vars_rtx and const.
+
+ * flow.c (flow_analysis): Fix typo in last change.
+
+ * expr.c (expand_builtin, case BUILT_IN_{SET,LONG}JMP): Properly
+ handle case when ptr_mode != Pmode.
+
+ * combine.c (try_combine): Don't use split if dest of new I2
+ is used between I2 and I3.
+
+ * c-typeck.c (pointer_int_sum): Convert integer to both signedness
+ and precision of sizetype.
+ * explow.c (convert_memory_address, case PLUS, MULT): Don't commute
+ operation with extension if not adding small integer.
+
+ * Makefile.in (BOOT_LANGUAGES): New variable.
+ (bootstrap): Use it to select languages for stage1.
+ * configure (extra_host_objs): New variable.
+ Separate files needed for target and host and concatenate list.
+ (extra_gcc_objs): Use setting for host, not target.
+ (objc_thread_file): Start with it as null, then don't include "thr-".
+ Print name of file after others and in same format.
+ (alpha-*-winnt*, i[3456]86-*-winnt): oldnames.o is in extra_host_objs.
+ (all_boot_languages): New variable.
+ Set from boot_language variable in config-lang.in.
+ Defines value of BOOT_LANGUAGES in Makefile.
+ (Makefile): Set target to the canonical form of target.
+
+Mon Jun 17 22:37:07 1996 Mike Meissner <meissner@rtl.cygnus.com>
+
+ * rs6000/win-nt.h (ASM_DECLARE_FUNCTION_NAME): Put function
+ descriptor in .reldata, not .text.
+
+Mon Jun 17 16:05:34 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * ginclude/stddef.h (wint_t): Don't wrap with #ifndef __cplusplus.
+
+Mon Jun 17 15:03:20 1996 Jim Wilson <wilson@cygnus.com>
+
+ * mips.c (mips_split_addresses): New variable.
+ (simple_memory_operand): Add comment about mode check. Add check
+ for LO_SUM.
+ (call_insn_operand): OP is now an addresses instead of a MEM.
+ (move_operand, mips_check_split): New functions.
+ (mips_count_memory_refs): Add check for LO_SUM.
+ (mips_move_1word): Add HIGH support.
+ (mips_address_cost): Delete check for HIGH.
+ (output_block_move): Handle LO_SUM addresses.
+ (override_options): Set mips_split_addresses.
+ (print_operand_address): Add LO_SUM support.
+ * mips.h (mips_split_addresses, mips_check_split, move_operand):
+ New declarations
+ (GO_IF_LEGITIMATE_ADDRESS): Reject constant addresses when
+ mips_split_addresses is TRUE. Add LO_SUM support.
+ (LEGITIMIZE_ADDRESS): Add LO_SUM support.
+ (PREDICATE_CODES): Modify call_insn_operand support. Add
+ move_operand.
+ * mips.md (memory): Change r4100/r4300 support.
+ (imuldiv): Add r4300 support.
+ (high, low): New patterns.
+ (movsi, movdi): Add LO_SUM support.
+ (movsi_internal1, movsi_internal2): Use move_operand instead of
+ general_operand.
+ (movstrsi_internal, movstrsi_internal2): Delete R constraint.
+ (call, call_value): Pass address instead of MEM to call_insn_operand.
+ Call gen_call_{value_}internal0 instead of internal1.
+ (call_internal0, call_value_internal0, call_multiple_internal0):
+ New patterns.
+ (call_internal1, call_internal2, call_value_internal1,
+ call_value_internal2, call_value_multiple_internal2): Add explicit
+ MEM before target address.
+
+Sun Jun 16 23:05:16 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * configure (hppa*-hp-hpux10*): Use new pa-hpux10 configuration file.
+ (hppa*-hp-hpux*): Use hpux9 configuration files by default.
+ * pa/pa-hpux10.h: New file.
+ * pa/pa-ghpux9.h: Deleted. No longer used.
+
+Sat Jun 15 04:35:51 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
+
+ * i386/gnu.h (LINK_SPEC): Remove -rpath /lib/ option.
+ Ignore -ibcs option.
+
+Thu Jun 13 14:49:41 1996 Jim Wilson <wilson@cygnus.com>
+
+ * gen-protos.c (main): Change argv[i] to argv[0][i].
+
+Thu Jun 13 10:46:24 1996 Doug Evans <dje@cygnus.com>
+
+ * gcc.c (pfatal_pexecute): Delete code to check errno < sys_nerr.
+
+Wed Jun 12 21:47:10 1996 Eliot Dresselhaus <dresselh@rft30.nas.nasa.gov>
+
+ * alpha.c (alpha_cpu, alpha_cpu_string): New variables.
+ (override_options): Process -mcpu= value.
+ (alpha_adjust_cost): Handle adjustments for EV5.
+ * alpha.h (enum processor_type): New enum.
+ (alpha_cpu, alpha_cpu_string): New declarations.
+ (target_options): Add "cpu=".
+ (RTX_COSTS): Adjust values for EV5.
+ * alpha.md: Add scheduling rules for EV5.
+
+Tue Jun 11 17:51:03 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-common.c (check_format_info): Change text of message about use
+ of `0' with precision.
+
+Tue Jun 11 15:14:10 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.h (TARGET_SCHEDULE_PROLOGUE): New. Allows prologue to
+ be emitted as asm or rtl.
+
+ * i386.c (function_prologue): Emit prologue as asm.
+ (override_options): Don't emit rtl for prologue if -fpic.
+
+Tue Jun 11 14:41:01 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/eabi.asm (__eabi): Fix normal code so that it properly
+ loads up r2/r13 if needed again.
+
+ * rs6000/sysv4.h (CPP_ENDIAN_SPEC): Call cpp_endian_default, not
+ cpp_endian_default_spec.
+
+Mon Jun 10 15:10:56 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * local-alloc.c (update_equiv_regs): Ignore insns that read or
+ write registers that are likely to be spilled.
+
+ * pa.h (cmp_type): Add CMP_PSI.
+ (FUNCTION_POINTER_COMPARISON_MODE): Define.
+ * pa.md (cmppsi): New expander.
+ (plabel_dereference): New pattern
+
+Mon Jun 10 14:56:14 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sol2.h (SKIP_ASM_OP): Delete, Solaris accepts .space,
+ like rest of PowerPC V4 ports.
+
+ * rs6000/sysv4.h (ASM_OUTPUT_ALIGNED_LOCAL): Emit .lcomm if not
+ using the .sbss area. If using the .sbss area, put out
+ appropriate .size directive.
+
+Mon Jun 10 14:53:38 1996 Doug Evans <dje@cygnus.com>
+
+ * Move fork/exec/wait handling into file of its own.
+ * pexecute.c: New file.
+ * Makefile.in (pexecute.o): Add rule.
+ (xgcc): Link in pexecute.o.
+ (protoize,unprotoize): Likewise.
+ * gcc.c (_WIN32): Don't include process.h or declare spawnv{,p}.
+ (pexecute,pwait): Add prototypes.
+ (PEXECUTE_{FIRST,LAST,SEARCH}): Define.
+ (execv,execvp): Delete decls.
+ (perror_exec): Delete.
+ (pfatal_pexecute): New function.
+ (pexecute support): Delete.
+ (execute): -pipe not supported if _WIN32 or OS2.
+ Update call to pexecute. Fatal error if pexecute fails. Call pwait.
+ * protoize.c: Include gansidecl.h.
+ (my_execvp): Delete.
+ (choose_temp_base,pexecute,pwait): Declare.
+ (PEXECUTE_{FIRST,LAST,SEARCH}): Define.
+ (execvp): Delete decl.
+ (usage): Fix typo.
+ (gen_aux_info_file): Rewrite to use pexecute/pwait.
+
+ * gcc.c (do_spec_1): Allow leading text in version string.
+ Delete support for default minor number = 0.
+
+Mon Jun 10 11:49:53 1996 Scott Christley <scottc@net-community.com>
+
+ * objc/Makefile (libobjc.a): Don't delete the library.
+
+ * objc/thr.h (objc_set_thread_callback): New function.
+ (objc_thread_callback): Typedef for the hook function.
+ * objc/thr.c (__objc_thread_detach_function): Clear thread storage.
+ Call the thread hook function when first becoming multi-threaded.
+ (objc_set_thread_callback): New function.
+
+ * objc/selector.c (__sel_register_typed_name): Additional parameter
+ that indicates whether name and type parameters are constant or not.
+ * objc/runtime.h (__sel_register_typed_name): Likewise.
+ * objc/init.c (__sel_register_typed_name): Likewise.
+
+ * objc/init.c (__objc_init_protocols): Need to unlock mutex.
+
+Mon Jun 10 11:44:44 1996 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * sparc/t-sol2 (gmon.o): Depend on stmp-int-hdrs.
+ (crt1.o, crti.o, crtn.o, gcrt1.o): Depend on $(GCC_PASSES).
+
+Mon Jun 10 11:29:46 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * flow.c (flow_analysis, find_basic_blocks): Ignore
+ nonlocal_label_list for CALL_INSN that has a REG_RETVAL.
+
+ * c-common.c (decl_attributes, case A_T_UNION): Don't look at fields
+ of union if there aren't any.
+
+Sat Jun 8 22:13:33 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.c (ix86_expand_prologue): Keep pic register load ahead
+ of reference which may use a pic register.
+
+Sat Jun 8 22:13:33 1996 Jim Wilson <wilson@cygnus.com>
+
+ * i386.md (strlensi_unroll4, strlensi_unroll5): Use + not =& for
+ constraint for input/output operand 2.
+
+Sat Jun 8 22:13:33 1996 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * i386.h (CONST_COSTS): Even integer constants have a cost.
+ (RTX_COSTS): Take costs of subexpressions into account.
+ If a multiply is actually a shift, use the cost of the shift.
+ * i386/unix.h (SHIFT_DOUBLE_OMITS_COUNT): New macro.
+ * i386/{gas, next, seq-gas}.h (SHIFT_DOUBLE_OMITS_COUNT): Redefine
+ as zero.
+ * i386.c (print_operand): new letter 's'.
+
+Sat Jun 8 15:13:33 1996 Jim Wilson <wilson@cygnus.com>
+
+ * mips.c (override_options): Add vr4100 and vr4300 support.
+ * mips.h (enum processor_type): Likewise.
+ (MASK_4300_MUL_FIX, TARGET_4300_MUL_FIX): New macros.
+ (TARGET_SWITCHES): Add -mfix4300 option.
+ * mips.md (cpu, memory, imuldiv, adder, mult, divide): Add
+ vr4100 and vr4300 support.
+ (muldf3, mulsf3): Add vr4300 support.
+ (muldf3_internal, muldf_r4300, mulsf3_internal, mulsf_r4300): New
+ patterns.
+
+Sat Jun 8 14:35:23 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * toplev.c (main): Re-enable -gxcoff+.
+
+Sat Jun 8 14:20:14 1996 J.T. Conklin <jtc@rtl.cygnus.com>
+
+ * m68k/lb1sf68.asm (__{eq,ne,gt,lt,ge,le}{df,sf}2): Removed
+ extraneous comments, constants, labels, etc.
+
+ * m68k/altos3068.h (TARGET_DEFAULT): Use MASK_* macros
+ instead of explicit constants in definitions or conditionals.
+ * m68k/{apollo68, aux, ccur-GAS, dpx2, hp320, hp3bsd}.h: Likewise.
+ * m68k/{hp3bsd44, isi-nfp, isi, linux-aout, linux}.h): Likewise.
+ * m68k/{lynx-ng, lynx, m68k-none, m68k-psos, m68kv4}.h): Likewise.
+ * m68k/{mot3300, netbsd, news, next, pbb, plexus, sun2o4}.h): Likewise.
+ * m68k/{sun3, sun3n, tower}.h): Likewise.
+
+Sat Jun 8 13:55:23 1996 Matthias Pfaller (leo@marco.de)
+
+ * ns32k.md (define_insns for ffs[qhs]i2): Deleted.
+ (define_expand for ffssi2): New pattern.
+
+Sat Jun 8 13:44:14 1996 Stephen L Moshier (moshier@world.std.com)
+
+ * reload.c (find_equiv_reg): Set need_stable_sp if GOAL is the
+ stack pointer.
+
+Sat Jun 8 13:36:05 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * function.c (fixup_var_refs_1, case SIGN_EXTEND): Handle
+ paradoxical SUBREGs as first operand.
+ (fixup_var_regs_1, case SET): Handle paradoxical SUBREGs as
+ first operand of a ZERO_EXTRACT in SET_DEST.
+
+ * c-common.c (enum attrs): Add A_FORMAT_ARG.
+ (init_attribute): Initialize it.
+ (decl_attributes, case A_FORMAT): Clean up error messages.
+ (decl_attributes, case A_FORMAT_ARG): New case.
+ (struct international_format_info): New structure and typedef.
+ (international_format_list): New variable.
+ (record_international_format): New function.
+ (init_format_info): Call it for gettext, dcgettext, and dcgettext.
+ (check_format_info): See if format arg is call to
+ internationalization function.
+
+Fri Jun 7 20:04:40 1996 Jim Wilson <wilson@cygnus.com>
+
+ * gcc.c (MULTILIB_SELECT): Delete definition.
+ (multilib_select): Delete static initializer.
+ (multilib_obstack, multilib_raw): New global variables.
+ (multilib.h): Include inside multilib_raw definition.
+ (main): Set multilib_select from multilib_raw.
+ * genmultilib: Change output to be a sequence of short strings
+ separated by commas rather than a single long macro definition.
+
+ * cse.c (simplify_binary_operation, case MULT): Check for case
+ where width is larger than HOST_BITS_PER_WIDE_INT, and upper most
+ bit is set. We can not generate a simple shift in this case.
+
+ * gsyms.h (enum sdb_type): Add T_LNGDBL if EXTENDED_SDB_BASIC_TYPES.
+ (enum sdb_masks): Add EXTENDED_SDB_BASIC_TYPES masks.
+ * sdbout.c (gsyms.h): Include if CROSS_COMPILE is defined.
+ (plain_type_1): Use TYPE_PRECISION instead of TYPE_SIZE.
+ Add check for LONG_DOUBLE_TYPE_SIZE if EXTENDED_SDB_BASIC_TYPES.
+ * i960.h (EXTENDED_SDB_BASIC_TYPES): Define.
+ (PUT_SDB_TYPE): Delete now unnecessary shifting and masking.
+
+ * i960.h (i960_output_move_{double,quad}): Declare.
+
+Fri Jun 7 19:22:09 1996 Scott Christley <scottc@net-community.com>
+
+ * Makefile.in (OBJC_THREAD_FILE): New variable.
+ * configure (objc_thread_file): Set new variable to appropriate
+ values based upon target operating system; default is `thr-single'.
+ * objc/Makefile (OBJC_THREAD_FILE): Add target and dependency.
+ (thr.o): Remove OS specific thread files as dependencies.
+ * objc/thr-decosf1.c: Now compiles as a separate source file, so
+ include appropriate Objective-C headers.
+ * objc/thr-{mach,os2,posix,irix,single,solaris,win32}.c: Likewise.
+ * objc/thr.c: Remove inclusion of source files.
+ * objc/thr.h (__objc_thread_exit_status): Declare global variable.
+ * objc/thr-pthreads.c: New file.
+
+Fri Jun 7 19:04:04 1996 J.T. Conklin <jtc@rtl.cygnus.com>
+
+ * m68k.h (TARGET_SWITCHES): Treat -m68302 like -m68000 and -m68332
+ like -m68020; remove -mno-68302 and -mno-68332.
+
+Fri Jun 7 12:06:12 1996 Per Bothner <bothner@deneb.cygnus.com>
+
+ * expr.c (safe_from_p): Allow Chill-style variable-sized arrays.
+
+Thu Jun 6 23:11:11 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.c (h8300_monitor_function_p): New function.
+ (h8300_os_task_function_p): Likewise.
+ (os_task, monitor): Variables to note if the current
+ function is an os_task or monitor.
+ (function_prologue): Set monitor and/or os_task as needed. Handle
+ os_task and monitor functions.
+ (function_epilogue): Clear monitor and os_task. Handle os_task and
+ monitor functions.
+ (h8300_valid_machine_decl_attribute): Accept "OS_Task" and
+ "monitor".
+
+Thu Jun 6 20:01:54 1996 Per Bothner <bothner@cygnus.com>
+
+ * gen-protos.c (progname): New variable (needed by cppalloc.c).
+ (main): Set progname.
+
+ * cpplib.h (struct parse_file): Removed.
+ (CPP_FATAL_LIMIT, CPP_FATAL_ERRORS, CPP_OUT_BUFFER): New macros.
+ * cpphash.c (cpp_lookup): Change struct parse_file -> cpp_reader.
+
+ * cpplib.c (init_parse_option): Renamed to cpp_options_init.
+ (push_parse_file): Renamed to ...
+ (cpp_start_read): Change to return 1 on success, 0 on failure.
+ (init_parse_file): Renamed to cpp_reader_init.
+ * cppmain.c (main): Use CPP_SET_WRITTEN and cpp_fatal.
+ Use renamed function names, and return protocols.
+ * fix-header.c (read_scan_file): Likewise.
+
+ * cpperror.c (cpp_message): Generalize for "fatal" errors.
+ (cpp_fatal): New function (just calls cpp_message).
+ * cpplib.c (cpp_start_read, cpp_handle_options, cpp_finish,
+ parse_goto_mark, parse_move_mark): Use cpp_fatal rather than fatal.
+
+ * fix-header.c (check_macro_names): Fix struct parse_file->cpp_reader.
+ * cpplib.c (newline_fix): Remove unused function.
+
+Thu Jun 6 19:47:26 1996 Jim Wilson <wilson@cygnus.com>
+
+ Changes to support parameters and return values in multiple
+ non-contiguous locations.
+ * calls.c (expand_call): Handle NIL in PARALLEL. Handle PARALLEL
+ parameter in REG. Handle PARALLEL return value in VALREG.
+ (emit_library_call, emit_library_call_value): Abort for PARALLEL.
+ (store_one_arg): Delete code for handling EXPR_LIST.
+ * expr.c (emit_group_load, emit_group_store): New functions.
+ (use_group_regs): New function.
+ (emit_push_insn): Handle PARALLEL parameter in REG.
+ (expand_assignment): Handle PARALLEL to_rtx.
+ (store_expr): Handle PARALLEL target.
+ * expr.h (emit_group_load, emit_group_store, use_group_regs): New
+ declarations.
+ * function.c (assign_parms): Handle PARALLEL parameter in ENTRY_PARM.
+ * stmt.c (expand_value_return): Handle PARALLEL return_reg.
+
+ * mips/abi64.h (TYPE_DEPENDENT_REG): Delete.
+ * mips.c (function_arg): Return PARALLEL for structure with
+ aligned double fields.
+ (type_dependent_reg): Delete.
+ (mips_function_value): Return PARALLEL for structure
+ with two floating point fields.
+ * mips/mips.md (call_value): Handle PARALLEL in operands[0].
+ (call_value_multiple_internal2): New pattern.
+ * pa.h (FUNCTION_ARG): General PARALLEL instead of EXPR_LIST.
+ * rs6000.c (init_cumulative_args): Change EXPR_LIST to PARALLEL
+ in comments.
+ (function_arg): Generate PARALLEL instead of EXPR_LIST.
+
+Thu Jun 6 18:21:27 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * function.c (assign_parms): Tighten up code that makes REG_EQUIV
+ notes for parms.
+
+ * fold-const.c (fold): Don't do anything with evaluated SAVE_EXPR.
+
+Thu Jun 6 17:54:07 1996 J.T. Conklin <jtc@cygnus.com>
+
+ * m68k.h (TARGET_SWITCHES): Group all floating point options.
+ When an fp option is selected, unset bits used for other mutually
+ exclusive fp options.
+ (OVERRIDE_OPTIONS): Remove special case for SUPPORT_SUN_FPA;
+ bits used for 68881 and SKY are now cleared by TARGET_SWITCHES.
+
+ * m68k.md (movsi_const0, movhi): Favor clr with TARGET_5200.
+ (add[qhs]3): Don't use two addqw/subqw insns to add small integers to
+ an address register with TARGET_68060.
+ (stack push peephole): Use moveq.l with TARGET_5200 (when appropriate).
+
+ * m68k.h (MASK_5200, TARGET_5200): New macros.
+ (TARGET_SWITCHES): Add "m5200".
+ (LEGITIMATE_INDEX_P): Add TARGET_5200 to conditional expression.
+ * m68k.c (const_method): Do not synthesize long constants
+ with byte or word operations with TARGET_5200.
+ * m68k.md: Disable byte and word arithmetic, rotate, integer
+ divide, dbcc, etc. insns for TARGET_5200.
+ * m68k-none.h: (CPU_FPU_SPEC, CPP_SPEC, ASM_SPEC): Support m5200.
+
+Thu Jun 6 17:32:32 1996 Paul Eggert <eggert@twinsun.com>
+
+ * fixproto (subdirs): Work around Solaris 2.5
+ /usr/xpgr/bin/sed problem with \+\+.
+
+Thu Jun 6 15:06:27 1996 Jim Wilson <wilson@cygnus.com>
+
+ * c-decl.c (grokdeclarator): Call pop_obstacks after creating
+ TYPE_DECL.
+
+ * loop.c (strength_reduce): If HAVE_cc0 defined, disable auto_inc_opt
+ if it would put an insn between a cc0 setter/user pair.
+
+Thu Jun 6 13:06:54 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sysv4.h (LIBGCC2_WORDS_BIG_ENDIAN): If __sun__ is
+ defined, treat that as little endian.
+
+Wed Jun 5 20:04:53 1996 Jim Wilson <wilson@cygnus.com>
+
+ * i960.h (ROUND_TYPE_ALIGN): Add check for TYPE_PACKED.
+
+ * sh.h (SHORT_IMMEDIATES_SIGN_EXTEND): Define.
+ * sh.md (branch_true): Add comment about T-bit compares.
+
+Tue Jun 4 23:08:34 1996 Per Bothner <bothner@deneb.cygnus.com>
+
+ * cpplib.h, cpplib.c: Remove support for !STATIC_BUFFERS.
+ * cpplib.h: Use unsigned char rather than U_CHAR.
+ * cpplib.h (cpp_reader): Add destructor #ifdef __cplusplus.
+ (cpp_cleanup): New prototype.
+ * cpplib.c (special_symbol, do_once, do_include, cpp_get_token):
+ Compare cpp_buffer against CPP_NULL_BUFFER, not NULL.
+
+ * cpplib.c (dump_special_to_buffer): New function.
+ (initialize_builtins): Use it.
+
+Wed Jun 5 19:10:22 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa/pa.h (TEXT_SPACE_P): Fix thinko in last change.
+
+Wed Jun 5 16:25:51 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.h (ASM_DEFAULT_SPEC): Default to "", not -mpwr.
+
+ * sysv4.h (SUBTARGET_SWITCHES): Add -mshlib.
+ (LINK_PATH_SPEC): Add -compat-bsd support from Solaris.
+ (LINK_SPEC): Eliminate %{b} and %{G}, since they conflict with GCC
+ switches. Defer shared library support to LINK_SHLIB_SPEC. Defer
+ target selection to LINK_TARGET_SPEC.
+ (LINK_SHLIB_SPEC): Provide two different versions, depending on
+ whether shared libraries are default or not. Make shared
+ libraries not default until linker is fixed.
+ (LINK_OS_*_SPEC): New specs for OS specific linker switches.
+ (SUBTARGET_EXTRA_SPECS): Add new specs.
+
+ * {sol2,sysv4}.h (LINK_SPEC): Move Solaris link into general link spec.
+
+ * {sysv4,sysv4le,eabile}.h (LINK_TARGET_SPEC): Only pass -oformat
+ to the linker if the user is changing the default endian format.
+
+ * {sol2,linux,eabisim,eabilesim}.h (LINK_OS_DEFAULT_SPEC): Define
+ to use the appropriate OS link spec.
+
+Wed Jun 5 16:35:10 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * ginclude/stddef.h: Fix typo: TYPE_ptrdiff_t to _TYPE_ptrdiff_t.
+
+Wed Jun 5 15:52:57 1996 Per Bothner <bothner@kalessin.cygnus.com>
+
+ * varasm.c (output_constructor): Handle RANGE_EXPR in array index.
+
+Wed Jun 5 13:45:54 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * sparc.md (*call_{address,symbolic}_struct_value_sp32): Allow
+ operand 2 to be const0_rtx.
+
+Tue Jun 4 16:43:44 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * varasm.c (make_decl_rtl): Don't update DECL_ASSEMBLER_NAME for
+ local statics.
+
+ * c-decl.c (start_decl): Always set DECL_COMMON on statics.
+ * varasm.c (assemble_variable): Only treat vars with DECL_COMMON
+ as common.
+
+Tue Jun 4 14:55:49 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.c (reloc_needed): New function.
+ * pa.h (TEXT_SPACE_P): Variables/constants with initializers
+ requiring relocs never live in the text space.
+
+Tue Jun 4 14:10:46 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * sh.c (fp_zero_operand): Do not accept minus zero.
+
+ * sh.h (ASM_OUTPUT_LOOP_ALIGN): Define.
+ (ASM_OUTPUT_ALIGN_CODE): Define.
+ (ADJUST_INSN_LENGTH): Add in bytes that may be added by
+ alignment.
+ * sh.c (output_branch): Run ADJUST_INSN_LENGTH in reverse to get
+ correct length. Just call abort rather than returning "bad".
+ (find_barrier): Adjust limits for possible alignment.
+
+Tue Jun 4 09:35:05 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/t-solaris: New target config file for PowerPC Solaris
+ without gas.
+
+ * rs6000/t-ppc: Eliminate all multilib varients except for
+ software floating point.
+
+ * configure (powerpcle-*-solaris*): If not --with-gnu-as, use
+ t-solaris, not t-ppc.
+
+ * rs6000/sol2.h (MULTILIB_DEFAULTS): Add correct defaults for
+ Solaris.
+
+ * rs6000/sysv4.h (ASM_OUTPUT_SECTION_NAME): Clone from svr4.h, omit
+ @progbits, since Solaris assembler doesn't like it.
+ (LIB_SOLARIS_SPEC): If -msolaris-cclib, add libabi.a.
+ ({START,END}FILE_SOLARIS_SPEC): If -msolaris-cclib, use explicit
+ pathnames for the Solaris compiler start/end files.
+ (ASM_SPEC): Pass -mno-regnames to the assembler.
+
+Mon Jun 3 19:40:10 1996 Jim Wilson <wilson@cygnus.com>
+
+ * mips/abi64.h (CPP_SPEC): Make -mabi=n32 the default.
+ * mips/iris6.h (MIPS_ISA_DEFAULT, MIPS_ABI_DEFAULT, MULTILIB_DEFAULTS,
+ ASM_SPEC, STARTFILE_SPEC, ENDFILE_SPEC, LINK_SPEC): Likewise.
+ * mips.md (tablejump_internal4+1): Fix typo in condition.
+ * mips/x-iris6 (CC, OLDCC): Define to be `cc -32'.
+
+Mon Jun 3 07:57:35 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * tree.def ([LR]SHIFT_EXPR): Remove `a' from printed names.
+
+ * sparc.md (call): Mask unimp operand to 12 bits, just like Sun.
+
+ * expr.c (store_field): Fix typo in last change; update TARGET addr.
+
+ * c-decl.c (start_struct): Set TYPE_PACKED from flag_pack_struct.
+ (start_enum): Likewise but from flag_short_enums.
+ (finish_enum): Test TYPE_PACKED, not flag_short_enums.
+ * stor-layout.c (layout_decl): Test DECL_PACKED and TYPE_PACKED
+ instead of flag_pack_struct.
+ (layout_record): Likewise.
+
+Sun Jun 2 19:41:14 1996 Jim Wilson <wilson@cygnus.com>
+
+ * mips.md (tablejump_internal3, tablejump_internal4): New patterns.
+ (tablejump): Use them for PIC code.
+
+Fri May 31 17:26:53 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.c (ix86_expand_epilogue): Don't generate references to an
+ exposed vacated stack.
+ * i386.md (epilogue_set_stack_ptr): New.
+
+Fri May 31 15:07:49 1996 Jim Wilson <wilson@cygnus.com>
+
+ * mips/abi64.h: Add -mabi=n32 support.
+ (ABI_64BIT): Delete.
+ (TARGET_LONG64, CPP_SPEC, STACK_BOUNDARY, MIPS_STACK_ALIGN,
+ GP_ARG_LAST, FP_ARG_LAST, SUBTARGET_CONDITIONAL_REGISTER_USAGE,
+ MAX_ARGS_IN_REGISTER, FUNCTION_ARG_PADDING, RETURN_IN_MEMORY,
+ SETUP_INCOMING_VARARGS): Modify.
+ (REG_PARM_STACK_SPACE): Ifdef out.
+ (TARGET_DEFAULT, SUBTARGET_TARGET_OPTIONS): Define.
+ * mips/iris6.h: Add -mabi=n32 support.
+ (TARGET_DEFAULT, ASM_OUTPUT_INTERNAL_LABEL,
+ ASM_GENERATE_INTERNAL_LABEL): Delete.
+ (MULTILIB_DEFAULTS, ASM_SPEC, EXTRA_SECTION_FUNCTIONS,
+ ASM_OUTPUT_ALIGNED_LOCAL, STARTFILE_SPEC, ENDFILE_SPEC, LINK_SPEC):
+ Modify.
+ (MIPS_ABI_DEFAULT, LOCAL_LABEL_PREFIX): Define.
+ * mips.c: Add -mabi=n32 support.
+ (mips_const_double_ok, mips_move_1word, mips_move_2words,
+ function_arg, override_options, mips_asm_file_start,
+ compute_frame_size, save_restore_insns, function_prologue,
+ mips_expand_prologue, function_epilogue, mips_function_value): Modify.
+ (mips_abi, mips_abi_string): Define
+ * mips.h: Add -mabi=n32 support.
+ (ABI_64BIT): Delete.
+ (TARGET_OPTIONS, INITIAL_ELIMINATION_OFFSET, GO_IF_LEGITIMATE_ADDRESS,
+ CONSTANT_ADDRESS_P, LEGITIMATE_CONSTANT_P, LEGITIMIZE_ADDRESS,
+ ASM_OUTPUT_ADDR_DIFF_ELT): Modify.
+ (enum mips_abi_type, SUBTARGET_TARGET_OPTIONS): Define.
+ (mips_abi, mips_abi_string): Declare.
+ * mips.md (jump, tablejump_internal1, tablejump_internal2): Add
+ -mabi=n32 support.
+ * mips/t-iris6 (MULTILIB_OPTIONS): Add -mabi=n32 support.
+ * mips/xm-irix6.h (HOST_BITS_PER_LONG): Use _MIPS_SZLONG not 64.
+ * ginclude/va-mips.h (va_start): Add -mabi=n32 support.
+
+Fri May 31 14:45:30 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sysv4.h (SUBTARGET_SWITCHES): Add -msolaris-cclib to use
+ the Sun compiler's crt files instead of ours.
+ ({START,END}FILE_SOLARIS_SPEC): If -msolaris-cclib, use the Sun
+ compiler's crt files instead of ours.
+ (SUBTARGET_OVERRIDE_OPTIONS): Don't set -msdata=data for Solaris.
+ (SBSS_SECTION_ASM_OP): For Solaris, don't use @nobits.
+ (CPP_OS_SOLARIS_SPEC): Remove -Asystem(unix) and -Asystem(svr4).
+
+ * rs6000/t-ppc{,gas} (MULTILIB*): Add Solaris specific multilibs.
+
+ * rs6000/eabi{,le}sim.h (*_DEFAULT_SPEC): Rather than using
+ duplicate definitions, just use %(...) so that there is only one
+ place in the specs file where the switches are defined.
+ * rs6000/{linux,sol2}.h (*_DEFAULT_SPEC): Ditto.
+
+ * rs6000/sol2.h (CPP_PREDEFINES): Use the standard one in sysv4.h.
+ (RS6000_ABI_NAME): Default is solaris.
+ (ASM_OUTPUT_ALIGNED_LOCAL): Don't redefine.
+
+ * rs6000/sol-c{i.asm,n.asm,c0.c}: Provide more things that Solaris
+ needs for program startup.
+
+Thu May 30 21:57:34 1996 Mike Stump <mrs@cygnus.com>
+
+ * tree.def (OFFSET_REF): Remove.
+ * expr.c (expand_expr, case OFFSET_REF): Likewise.
+ * tree.c (substitute_in_expr): Remove OFFSET_REF code.
+
+Wed May 29 14:54:44 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/eabi.asm (__eabi): If not -mrelocatable, don't assemble
+ relocatable functions, so that it can be assembled with the
+ Solaris assembler.
+
+ * rs6000/sysv4.h (CPP_SYSV_SPEC): Define _RELOCATABLE if
+ -mrelocatable-lib as well as -mrelocatable.
+
+ * rs6000.c (rs6000_file_start): New function to print some more
+ information to the asm file.
+ * rs6000/{sysv4,win-nt,rs6000}.h (ASM_FILE_START): Call it.
+
+Tue May 28 15:21:24 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.h (FIRST_PSEUDO_REGISTER): Bump to 77.
+ ({FIXED,CALL_USED}_REGISTERS): Add support for fpmem pseudo register.
+ (REG_ALLOC_ORDER, HARD_REGNO_{NREGS,MODE_OK}): Likewise.
+ (REGISTER_MOVE_COST, reg_class, REG_CLASS_{NAMES,CONTENTS}): Likewise.
+ (REGNO_REG_CLASS, PREFERRED_RELOAD_CLASS): Likewise.
+ (CLASS_{MAX_NREGS,CANNOT_CHANGE_SIZE,MAX_NREGS}): Likewise.
+ (rs6000_stack, {,DEBUG_}REGISTER_NAMES): Ditto.
+ (FPMEM_{REGNO_P,REGNUM}): New macros for fpmem register.
+ (rs6000_fpmem_{offset,size}): New global variables.
+ (RS6000_VARARGS_OFFSET): Fpmem temporary storage is located
+ between outgoing arg area and varargs save area.
+ (STARTING_FRAME_OFFSET, STACK_DYNAMIC_OFFSET): Likewise.
+ (PREDICATE_CODES): Add fpmem_operand.
+ ({count_register,fpmem}_operand): Add declarations.
+
+ * rs6000.c ({rs6000,alt}_reg_names): Add support for fpmem 'register'.
+ (rs6000_fpmem_{offset,size}): New global variables.
+ (fpmem_operand): Return true for fpmem registers.
+ (gpc_reg_operand): The fpmem register is not general purpose.
+ (includes_rshift_p): Add casts to silence warnings from Solaris
+ PowerPC host compiler.
+ (print_operand): Add 'v' operand type for the upper 16 bits of
+ signed constants, to placate the Solaris assembler.
+ ({rs6000,debug}_stack_info): Add support for fpmem 'register'.
+ (output_epilog): Likewise.
+
+ * rs6000.md (addsi3,movsi,movsf,movdi): Use %v for constants with
+ the upper 16 bits, to get the sign correct for PowerPC Solaris.
+ (float{,uns}sidf2,fix_truncdfsi2): Rewrite to use 'register' 76
+ for the memory location used to convert between float and integer.
+
+ * sysv4.h (ASM_OUTPUT_{CON,DE}STRUCTOR): Use code laid down in
+ .init and .fini for making constructors and destructors under
+ Solaris.
+ (ASM_SPEC): Do not pass -u to the assembler.
+ (CC1_SPEC): -mrelocatable implies -meabi.
+
+ * sol2.h (RS6000_ABI_NAME): Default ABI is Solaris, not System V.4.
+ (ASM_OUTPUT_ALIGNED_LOCAL): Don't define Solaris specific method.
+
+Mon May 27 06:39:13 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (expand_builtin, case BUILT_IN_{LONG,SET}JMP):
+ Convert block address from ptr_mode to Pmode.
+
+Sun May 26 20:05:43 1996 Doug Evans <dje@cygnus.com>
+
+ * gcc.c (MSDOS pexecute): Call xmalloc, not malloc.
+
+Sun May 26 08:31:54 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * configure (vax-*-{sysv}): tm_file and xm_file now list.
+ (vax-*-ultrix): tm_file is now list.
+ (we32k-att-sysv*): xm_file now list.
+ * vax/xm-netbsd.h: Deleted.
+ * vax/netbsd.h: No longer include vax.h and config/netbsd.h.
+ * vax/ultrix.h, vax/vaxv.h: No longer include vax.h.
+ * vax/xm-vaxv.h: No longer include xm-vax.h.
+ * xm-we32k.h: No longer include xm-svr3.h.
+
+ * configure: Separately set target_cpu_default for two
+ case statements and then combine if both set.
+ (alpha-*-winnt3): tm_file and xm_file are now list.
+ Set target_cpu_default to 64.
+ * winnt/config-nt.bat: Make .h files properly for Alpha.
+ * alpha.h (WINDOWS_NT): No longer defined and used.
+ (MASK_WINDOWS_NT, TARGET_WINDOWS_NT): New macros.
+ (ASM_OUTPUT_ADDR_DIFF_ELT): Use TARGET_WINDOWS_NT.
+ * alpha.c (output_prolog): Test TARGET_WINDOWS_NT, not WINDOWS_NT.
+ * alpha.md: Likewise.
+ * alpha/config-nt.sed: Properly set tm_file and {build,host}_xm_file.
+ * alpha/win-nt.h: Don't include alpha.h
+ (WINDOWS_NT): No longer define.
+ * alpha/xm-winnt.h: Don't include xm-alpha.h and winnt/xm-winnt.h.
+
+Fri May 24 12:34:22 1996 Doug Evans <dje@seba.cygnus.com>
+
+ * configure (cpu_type): Add case for arm.
+ (sparclet-*-aout*): Delete extra_headers.
+
+ * varasm.c (asm_output_bss): New argument DECL.
+ Use ASM_DECLARE_OBJECT_NAME if defined.
+ (asm_output_aligned_bss): Likewise.
+ (assemble_variable): Pass DECL to ASM_OUTPUT{,_ALIGNED}_BSS.
+ * arm/aout.h (ASM_OUTPUT_ALIGNED_BSS): Update.
+ * h8300.h (ASM_OUTPUT_BSS): Update.
+ * i386/linux.h (ASM_OUTPUT_ALIGNED_BSS): Update.
+ * i386/sysv4.h (ASM_OUTPUT_ALIGNED_BSS): Update.
+ * m68k/coff.h (ASM_OUTPUT_ALIGNED_BSS): Update.
+ * m68k/linux.h (ASM_OUTPUT_ALIGNED_BSS): Update.
+ * m68k/m68k-aout.h (ASM_OUTPUT_BSS): Update.
+ * rs6000/sysv4.h (ASM_OUTPUT_ALIGNED_BSS): Update.
+ * rs6000/win-nt.h (ASM_OUTPUT_ALIGNED_BSS): Update.
+ * sparc/sysv4.h (ASM_OUTPUT_ALIGNED_BSS): Update.
+
+Thu May 23 19:55:52 1996 Jim Wilson <wilson@cygnus.com>
+
+ * combine.c (set_nonzero_bits_and_sign_copies): Set reg_sign_bit_copies
+ to one not zero to indicate value is unknown.
+
+Thu May 23 18:39:24 1996 J.T. Conklin <jtc@rtl.cygnus.com>
+
+ * config/netbsd.h (SWITCH_TAKES_ARG): Add -R.
+ (LINK_SPEC): Add %{R*}.
+
+ * m68k/lb1sf68.asm: Construct exception masks at compile time
+ instead of or'ing in bits at run time.
+
+Thu May 23 15:53:06 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * sh.md: Add new instruction types fp and fpdiv. Set new
+ instruction types where appropriate. Add function unit fp.
+ Claim that store instructions use function unit memory.
+
+Thu May 23 00:36:19 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.h (CONSTANT_ADDRESS_P): Don't accept CONST or HIGH on H8/300H.
+ * h8300.md: Use "m" rather than "o" constraint everywhere appropriate.
+ Cleanup use of "i" and "n" constraints.
+
+Wed May 22 17:43:37 1996 Jim Wilson <wilson@cygnus.com>
+
+ * fixincludes (pthread.h): Add extern to __page_size* declarations
+ for AIX 4.1.x.
+
+ * combine.c (nonzero_bits): Don't assume arg pointer has same
+ alignment as stack pointer.
+
+Wed May 22 16:09:05 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sysv4.h (LINK_START_DEFAULT_SPEC): Spell macro correctly.
+ (LIB_DEFAULT_SPEC): Provide default version.
+
+Wed May 22 11:23:57 1996 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * i386.md (return_pop_internal): new pattern.
+ (pop): disable emitting of bogus move instruction.
+ * i386.c (ix86_expand_epilogue): use gen_return_pop_internal to
+ simultanously return and pop args; removed stray semicolon.
+ * config/linux-aout.h, config/linux.h (SET_ASM_OP): Added for
+ __attribute__ ((alias ())) support.
+
+Wed May 22 08:06:42 1996 Richard Kenner <kenner@vlsi1.ultra.nyu.edu.edu>
+
+ * combine.c (init_reg_last_arrays, setup_incoming_promotions):
+ Correct prototypes.
+
+Tue May 21 13:42:17 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.md (div and mode patterns): Rewrite.
+
+ * pa.c (basereg_operand): Never accept a CONST_INT.
+
+Tue May 21 12:26:40 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * pa/pa-hpux9.h, pa-osf.h (LINK_SPEC): Provide version for Snake.
+
+Tue May 21 07:20:48 1996 Pat Rankin <rankin@eql.caltech.edu>
+
+ * vax.h (TARGET_NAME): Define unless already defined.
+ (TARGET_VERSION): Print TARGET_NAME.
+ * vax/vms.h (TARGET_NAME): Always redefine.
+ (TARGET_VERSION): Delete; retain vax.h definition.
+
+Mon May 20 14:00:44 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sh.c (output_file_start): Delete misplaced semicolon.
+
+Mon May 20 11:58:15 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * reorg.c (relax_delay_slots): Call update_block before
+ redirecting a branch past a redundant insn.
+
+Sun May 19 16:40:53 1996 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * Makefile.in (libobjc.a, sublibobjc.a): 'specs' added to
+ dependencies.
+
+Sun May 19 12:25:48 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * configure: Add new switch to provide default for cpu_type;
+ delete numerous settings of it in main switch.
+ (hppa): Reflect rerrangements below; use new configure features.
+ * pa/pa-gas.h, pa/pa-pro-end.h: New files.
+ * pa/pa1.h, pa/pa1-osf.h, pa/pa1-ghpux.h, pa/pa1-oldas.h: Deleted.
+ * pa/pa1-ghpux9.h, pa/pa1-hpux9.h, pa/pa1-hpux.h: Deleted.
+ * pa/pa1-ghiux.h, pa/pa1-hiux.h, pa/pa-ghpux.h: Deleted.
+ * pa/pa-gux7.h, pa/pa-ghiux.h: Deleted.
+ * pa/pa-hiux.h: No longer include pa-hpux.h.
+ * pa/pa-hpux.h: No longer include pa.h.
+ (TARGET_DEFAULT): Unset before setting.
+ (LINK_SPEC): Provide option for pa1.
+ * pa/pa-hpux7.h: No longer include pa.h.
+ (HP_FP_ARG_DESCRIPTOR_REVERSED): Don't define here.
+ * pa/pa-hpux9.h, pa/pa-oldas.h: No longer include pa-hpux.h.
+ (TARGET_DEFAULT): Don't need to set here.
+ * pa/pa-osf.h: No longer include pa.h.
+ (TARGET_DEFAULT): Don't define; identical to default.
+ * pa/pa-pro.h: No longer include pa.h.
+ Move definitions after include to new file pa-pro-end.h.
+ * pa.h (TARGET_SWITCHES): Include TARGET_CPU_DEFAULT.
+ (TARGET_CPU_DEFAULT): Provide default value.
+ (CPP_SPEC): Test TARGET_CPU_DEFAULT too.
+
+ * Makefile.in (function.o): Includes bc-emit.h.
+ (reg-stack.o): Includes insn-flags.h.
+ * expr.h (function_value): Deleted; no such function.
+ (bc_build_calldesc, bc_runtime_type_code): New declarations.
+ * c-decl.c: Add prototypes for all static functions.
+ * c-iterate.c: Likewise.
+ * dbxout.c: Likewise.
+ (adspath): Delete; never used and has numerous parse errors.
+ * dwarfout.c: If not GNUC, make `inline' null; otherwise, leave alone.
+ Add `static' to inline functions.
+ Add prototypes for static function.
+ * expr.c (bc_runtime_type_code): Delete redundant declaration.
+ * function.c: Include bc-emit.h.
+ ({save,restore}_machine_status): Add prototype for args.
+ (bc_runtime_type_code, bc_build_calldesc): Delete redundant decls.
+ (bc_emit_trampoline, bc_end_function): Likewise.
+ * reg-stack.c: Include insn-flags.h.
+ Add prototypes for static functions.
+ (gen_jump, gen_movdf, gen_movxf): Delete redundant declarations.
+ (find_regno_note, emit_jump_insn_before, emit_label_after): Likewise.
+ (swap_rtx_condition): Now static.
+ * sdbout.c: Add prototypes for static functions.
+ (sdbout_parms, sdbout_reg_parms): Delete extra parm to plain_type.
+
+Sun May 19 11:50:10 1996 John Carr <jfc@mit.edu>
+
+ * alpha.c (alpha_emit_conditional_move): Compare to 0 in correct mode.
+
+Sat May 18 20:17:27 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sh.c (prepare_move_operands): If source is r0, and dest is reg+reg
+ MEM, then copy source to a pseudo-reg.
+ * sh.md (untyped_call): New pattern.
+
+ * unroll.c (copy_loop_body): When update split DEST_ADDR giv,
+ check to make sure it was split.
+ (find_splittable_givs): Fix reversed test of verify_addresses result.
+
+Sat May 18 10:26:04 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * tree.c (unsave_expr_now): Avoid use of NULL_RTX since no rtl.h.
+
+ * configure: Set cpu_default, tm_file, and xm_file early.
+ Remove redundant settings of those, tmake_file, and xmake_file.
+ Use ${tm_file} and ${xm_file} to refer to the main files.
+ Sort some entries for consistency and reformat some others.
+ (rs6000, powerpc): Remove bogus test on host == target.
+ (alpha-*-linux): xm-linux.h no longer includes xm-alpha.
+ (alpha-*-osf*): Remove redundant setting of target_cpu_default.
+ (*-convex-*): Use target_cpu_default instead of separate .h files.
+ (clipper-intergraph-clix*): clix.h no longer includes any files.
+ (i860, i960, pdp11): Reflect removal of includes listed below.
+ * alpha/xm-linux.h: No longer include xm-alpha.h.
+ * clipper/clix.h: No longer include clipper.h and svr3.h.
+ * convex.h: Provide a default for TARGET_DEFAULT.
+ Take "or" of TARGET_DEFAULT and TARGET_CPU_DEFAULT everywhere.
+ * convex/convex{1,2,32,34,38}.h: Deleted.
+ * i860/bsd-gas.h: No longer include bsd.h.
+ * i860/bsd.h: No longer include i860.h.
+ * i860/fx2800.h: No longer include i860/sysv4.h.
+ (OUTPUT_TDESC): No longer define.
+ (ASM_FILE_END): Move redefinition to here.
+ * i860/mach.h: No longer include i860.h.
+ * i860/paragon.h, i860/sysv3.h: No longer include i860.h and svr3.h.
+ * i860/sysv4.h: No longer include i860.h and svr4.h.
+ (ASM_FILE_END): Delete redefinition from here.
+ * i860/xm-fx2800.h: No longer include xm-i860.h.
+ * i860/xm-paragon.h, i860/xm-sysv{3,4}.h: Deleted.
+ * i960/i960-coff.h: No longer include i960.h and dbxcoff.h.
+ * i960/vx960-coff.h: No longer include i960-coff.h.
+ * i960/vx960.h: No longer include i960.h.
+ * pdp11/2bsd.h: No longer include pdp11.h.
+
+ * i370/i370.h: Renamed from mvs.h.
+ * i370/i370.c: Renamed from mvs370.c.
+ * i370/t-i370: Renamed from t-mvs.
+ * i370/xm-i370.h: Renamed from xm-mvs.h.
+ * configure (i370-*-mvs*): Use default names for all files.
+
+ * c-parse.in: Update number of shift/reduce conflicts for objc.
+
+Sat May 18 08:20:17 1996 Dennis Glatting (dennisg@plaintalk.bellevue.wa.us)
+
+ * m68k/next.h (FINALIZE_TRAMPOLINE): Add missing backslashes.
+
+Fri May 17 19:57:20 1996 Pat Rankin <rankin@eql.caltech.edu>
+
+ * vax/xm-vms.h (dbxout_resume_previous_source_file): New macro.
+
+Fri May 17 14:20:13 1996 Mike Stump <mrs@cygnus.com>
+
+ * expr.c (expand_expr, cond TARGET_EXPR): Make TARGET_EXPRs
+ redoable for UNSAVE_EXPR.
+ * stmt.c (expand_decl_cleanup): Wrap the cleanup in an UNSAVE_EXPR
+ to that we can redo it.
+ * tree.c (unsave_expr_now): Handle TARGET_EXPRs fully now.
+ * tree.def (TARGET_EXPR): Add a fourth field so that TARGET_EXPRs
+ are redoable.
+
+ * expr.c (expand_expr, cond UNSAVE_EXPR): Move from the C++
+ frontend to the backend where it belongs.
+ * tree.c (unsave_expr{,_now}): Likewise.
+ * tree.def (UNSAVE_EXPR): Likewise.
+ * tree.h (unsave_expr{,_now}): Likewise.
+
+Fri May 17 15:04:40 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (lshrsi3 insns): Add special case code for shifting by
+ 0 to avoid bad code generated with no optimization.
+
+Fri May 17 13:50:55 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * i386/unix.h (ASM_OUTPUT_MI_THUNK): Define.
+ * i386/{att.h,bsd.h,sun386.h} (ASM_OUTPUT_MI_THUNK): Delete.
+
+Fri May 17 13:34:28 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * fp-bit.c (_fpdiv_parts): Correct sign handling when
+ dividing zero or infinity by something.
+
+Fri May 17 12:36:36 1996 Doug Evans <dje@seba.cygnus.com>
+
+ Standardize option output in assembler files.
+ * Makefile.in (toplev.o): Pass -DTARGET_NAME.
+ * arm/aout.h (ASM_OUTPUT_OPTIONS): Delete.
+ (ASM_FILE_START): Delete option output support.
+ * arm.c (output_option, output_options, m_options): Delete.
+ * m88k.c (output_file_start): Delete option output support.
+ * m88k.h (ASM_COMMENT_START): Define.
+ * mips.c (target_switches, print_options): Delete.
+ (mips_asm_file_start): Put output of -G,Cpu,ISA here.
+ * mips.h (ASM_COMMENT_START): Change from "\t\t#" to " #".
+ * rs6000.c (output_option, m_options, output_options): Delete.
+ * rs6000.h (ASM_OUTPUT_OPTIONS): Delete.
+ (ASM_COMMENT_START): Define.
+ (ASM_FILE_START): Delete option output support.
+ * rs6000/sysv4.h (ASM_FILE_START): Likewise.
+ * rs6000/win-nt.h (ASM_FILE_START): Likewise. Delete duplicate.
+ * sh.c (output_option, m_options, output_options): Delete.
+ (output_file_start): Delete option output support.
+ * sh.h (ASM_FILE_START): Likewise.
+ (ASM_COMMENT_START): Define.
+ * dwarfout.c (*): flag_verbose_asm renamed to flag_debug_asm.
+ * flags.h (flag_debug_asm): Declare.
+ * toplev.c (print_version): New function.
+ (print_single_switch): New arguments pos, max, indent, sep, term.
+ (print_switch_values): New arguments pos, max, indent, sep, term.
+ Update call to print_single_switch. Output options passed and
+ options enabled.
+ (MAX_LINE): New macro.
+ (flag_debug_asm): Define.
+ (compile_file): Output options to assembler file.
+ (main): Recognize -dA. Call print_version. Update call to
+ print_switch_values.
+ (line_position): Deleted.
+
+Fri May 17 10:50:44 1996 Stan Cox (coxs@dg-rtp.dg.com)
+
+ * i386.c (function_prologue, ix86_expand_prologue,
+ function_epilogue, ix86_expand_epilogue): Generate prologue and
+ epilogue as RTL (prior to scheduling) instead of emitting asm.
+ (override_options): If only -march is given, make it the default -mcpu.
+ * i386.h (FUNCTION_BEGIN_EPILOGUE): Renamed from FUNCTION_EPILOGUE.
+ * i386.md (return, return_internal, prologue, prologue_set_got,
+ prologue_get_pc, epilogue, leave, pop): New patterns for emitting
+ asm from prologue and epilogue RTL.
+ * m88k/t-dgux (T_CFLAGS): Delete.
+ * m88k/x-dgux (X_CFLAGS): New.
+
+Fri May 17 09:54:23 1996 Jim Meyering (meyering@asic.sc.ti.com)
+
+ * Makefile.in (stamp-crt{,S}): Use -o to avoid conflicts if
+ both of these are built in parallel.
+
+Fri May 17 08:55:19 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expmed.c (store_split_bit_field): Don't assume the alignment
+ of VALUE is the same as the record.
+
+ * configure: Write #define TARGET_CPU_DEFAULT into tm.h
+ instead of defining MAYBE_TARGET_DEFAULT in Makefile.
+ (alpha-*-linux): Set target_cpu_default to 4 and xmake_file to none.
+ (alpha-*-osf*): Set target_cpu_default to 4 if --gas.
+ * Makefile.in (gcc.o, toplev.o, $(out_object_file)):
+ Remove MAYBE_TARGET_DEFAULT.
+
+ * combine.c (insn_cuid): New function.
+ (INSN_CUID): Sometimes call it.
+
+Fri May 17 08:12:37 1996 Scott Christley <scottc@net-community.com>
+
+ * objc/sendmsg.c (objc_get_uninstalled_dtable): New function.
+ * objc/objc-api.h (objc_get_uninstalled_dtable): New declaration.
+
+ * objc/thr-os2.c, objc/thr-posix.c, objc/thr-mach.c: New files.
+ * objc/THREADS.MACH: New file.
+
+ * objc/sendmsg.c (nil_method): Deleted from here.
+ * objc/nil_method.c: New file.
+ * Makefile (OBJC_O): Add dependency for nil_method.c.
+
+ * objc/hash.c (hash_is_key_in_hash): New function.
+ * objc/hash.h: Include objc/objc.h here instead of in objc/hash.c
+ to get BOOL typedef.
+
+Fri May 17 08:01:48 1996 Doug Rupp (rupp@gnat.com)
+
+ * msdos/configur.bat: If Ada subdirectory present, adjust Makefile.
+
+Fri May 17 07:40:04 1996 Ulrich Drepper (drepper@cygnus.com)
+
+ * stddef.h: If need_wint_t defined, nothing in this file is needed.
+ (_WINT_T, __WINT__TYPE__, wint_t): Define under certain circumstances.
+
+Thu May 16 18:53:25 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * fold-const.c (fold, case EQ_EXPR): When folding VAR++ = CONST,
+ mask the new const if VAR is a bitfield reference; also for VAR--.
+
+Thu May 16 18:29:03 1996 Doug Evans <dje@seba.cygnus.com>
+
+ * varasm.c (function_section): Delete flag_function_sections support.
+ (assemble_start_function): Put it here. Use UNIQUE_SECTION if defined.
+
+Wed May 15 13:35:11 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.{h,c,md} (rs6000_pic_register): Delete all uses, use
+ pic_offset_table_rtx instead.
+
+ * rs6000.md (move_to_float): Rewrite so that it uses the register
+ allocator to allocate the stack temp, instead of calling
+ rs6000_stack_temp.
+ (fix_truncdfsi2): Likewise.
+
+ * rs6000.c (rs6000_stack_temp): Delete, no longer used.
+
+Wed May 15 10:39:27 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.h (DBX_OUTPUT_MAIN_SOURCE_FILE_END): Define.
+
+Sat May 11 07:42:59 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (store_field): Support BLKmode bitfield if aligned on
+ byte boundary using emit_block_move.
+ (expand_expr, case COMPONENT_REF): Likewise.
+
+Fri May 10 18:33:39 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * configure (alpha-*-linux): Reverse order in tm_file list.
+ Delete xmake_file.
+ * alpha/x-linux: Deleted.
+ * alpha/linux.h (ASM_FINAL_SPEC): Add #undef.
+ * alpha/xm-linux.h: Remove bogus trailing #endif.
+
+ * loop.c (maybe_eliminate_biv_1): Disable all but two cases
+ of biv elimination with givs and restrict those two cases to
+ an ADD_VAL that is an address.
+
+ * flow.c (mark_set_1, mark_used_regs): Clean up usages
+ of ALL_NEEDED; change to SOME_NOT_NEEDED and set properly.
+
+Fri May 10 11:37:38 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * toplev.c (compile_file): Don't warn about artificial functions
+ declared static and not defined.
+
+Thu May 9 22:03:28 1996 Doug Evans <dje@cygnus.com>
+
+ * varasm.c (assemble_start_function): ASM_DECLARE_FUNCTION_NAME
+ needn't consider bytecodes.
+ (assemble_variable): ASM_DECLARE_OBJECT_NAME needn't
+ consider bytecodes.
+ * toplev.c (rest_of_decl_compilation): Likewise with
+ ASM_FINISH_DECLARE_OBJECT.
+ * arm/aof.h (ASM_DECLARE_{FUNCTION,OBJECT}_NAME): Delete bytecode
+ support.
+ * vax/vms.h (ASM_DECLARE_OBJECT_NAME): Likewise.
+
+Thu May 9 19:36:13 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sh.h (SET_ASM_OP): Define.
+
+Thu May 9 13:31:58 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sysv4.h (SUBTARGET_{SWITCHES,OPTIONS}): Add support for
+ finer grain control on -msdata, so that eabi people can specify to
+ compile sdata code to only use r13 instead of r2/r13. Make
+ -mrelocatable-lib turn off -msdata, just like -m relocatable does.
+ (SUBTARGET_OVERRIDE_OPTIONS): Ditto.
+ (ENCODE_SECTION_INFO): Move to rs6000.c.
+ (ASM_SPEC): -msdata=eabi sets -memb also.
+ (CC1_SPEC): -mno-sdata gets converted to -msdata=none.
+
+ * rs6000.c (rs6000_sdata{,_name}): Add support for finer grain
+ control on -msdata.
+ (output_options, small_data_operand, print_operand): Likewise.
+ (rs6000_select_section): Likewise.
+ (rs6000_encode_section_info): Move here from sysv4.h, section
+ names are stored as STRING nodes, not IDENTIFIER.
+
+Wed May 8 21:04:49 1996 Doug Evans <dje@cygnus.com>
+
+ * function.c (aggregate_value_p): Return 1 if TREE_ADDRESSABLE.
+ * pa.h (RETURN_IN_MEMORY): No longer test for TREE_ADDRESSABLE.
+
+Tue May 7 13:42:57 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.c: Include obstack.h.
+ (bit_memory_operand): New function.
+ (print_operand): Append ":16" to a memory reference to
+ the tiny data area.
+ (h8300_tiny_data_p): New function.
+ (h8300_valid_machine_decl_attribute): Accept "tiny_data". Fix typo.
+ (h8300_encode_label): New function.
+ (h8300_adjust_insn_length): References to the tiny data section
+ are two bytes shorter than normal accesses on the H8/300H.
+ * h8300.h (OK_FOR_U): Fix thinko.
+ (ENCODE_SECTION_INFO): Encode info for tiny data variables.
+ (STRIP_NAME_ENCODING): Define.
+ * h8300.md (movqi insn): Fix length for a constant load.
+ (movstrictqi, movhi, movstricthi): Likewise.
+ (memory btst patterns): Add register to the constraints to keep
+ reload happy.
+
+ * h8300.h (OK_FOR_U): (const (plus (symbol_ref) (const_int)))
+ is valid U operand if SYMBOL_REF_FLAG is set on SYMBOL_REF.
+ * h8300.md (memory btst patterns): New patterns.
+
+ * h8300.c (h8300_eightbit_data_p): Renamed from h8300_tiny_data_p.
+ (h8300_eightbit_data_p): Check for the "eightbit_data"
+ attribute instead of "tiny_data".
+ (h8300_valid_machine_decl_attribute): Likewise.
+ * h8300.h (ENCODE_SECTION_INFO): Call h8300_eightbit_data_p
+ instead of h8300_tiny_data_p.
+
+ * h8300.h (READONLY_DATA_SECTION): Define.
+ (EXTRA_SECTIONS): Add in_readonly_data.
+ (READONLY_DATA_SECTION_ASM_OP): Define.
+ (EXTRA_SECTION_FUNCTINOS): Add readonly_data.
+
+Tue May 7 09:26:24 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * varasm.c (make_decl_rtl): Update DECL_ASSEMBLER_NAME for local
+ statics. Remove reference to flag_no_common.
+
+Mon May 6 21:38:36 1996 Paul Eggert <eggert@twinsun.com>
+
+ * cpplib.c (skip_comment, handle_directive): Don't use uninit vars.
+
+Mon May 6 18:47:36 1996 Doug Evans <dje@cygnus.com>
+
+ * dbxout.c (dbxout_function): When deciding to call dbxout_function_end
+ change test from flag_function_sections to DECL_SECTION_NAME != NULL.
+
+ * varasm.c (named_section): Accept any decl.
+
+Mon May 6 16:41:08 1996 Stan Cox (coxs@dg-rtp.dg.com)
+
+ * final.c (final_scan_insn): Modify conditional moves whose cc is
+ nonstandard.
+
+ * c-common.c (decl_attributes): Chain multiple attributes correctly.
+
+Mon May 6 15:41:43 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * stmt.c (expand_decl): Don't deduce alignment of SIZE from
+ DECL_ALIGN; use TYPE_ALIGN instead.
+
+ * function.c (assign_parms): Set RTX_UNCHANGING_P in stack_parm
+ if parm is read-only.
+
+ * c-common.c (truthvalue_conversion, case ADDR_EXPR): Don't
+ treat address of external decl as always nonzero.
+
+Mon May 6 11:33:57 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * c-decl.c (start_decl): Check -fno-common here.
+ * varasm.c (assemble_variable): Instead of here.
+ * final.c (end_final): Likewise.
+ * c-common.c (init_attributes, decl_attributes): Add A_COMMON.
+
+Mon May 6 11:12:39 1996 Mike Stump <mrs@cygnus.com>
+
+ * expr.c (expand_increment): Add third parameter to know when to
+ ignore the result value.
+ (store_constructor): Likewise
+ (expand_expr, case {PRE,POST}{INC,DEC}REMENT_EXPR): Likewise.
+ * tree.c (stabilize_reference): Always ignore the first operand of
+ COMPOUND_EXPRs.
+
+Mon May 6 13:14:45 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sh.c (gen_shifty_op): Truncate VALUE to avoid out of bounds array
+ access.
+
+ * expr.c (expand_expr, case INDIRECT_REF): Delete obsolete code
+ to special case a SAVE_EXPR operand.
+
+Mon May 6 10:00:12 1996 Pat Rankin <rankin@eql.caltech.edu>
+
+ * vax.h (ASM_OUTPUT_MI_THUNK): Define.
+
+Mon May 6 09:49:10 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * m68k/linux.h: Use the new trampoline definition.
+ (TRAMPOLINE_TEMPLATE, TRAMPOLINE_SIZE): Deleted.
+ (INITIALIZE_TRAMPOLINE): Changed.
+ (FINALIZE_TRAMPOLINE, CLEAR_INSN_CACHE): New.
+
+Mon May 6 09:43:55 1996 Patrick J. LoPresti (patl@lcs.mit.edu)
+
+ * rtlanal.c (rtx_addr_varies_p): Scan operands of type `E'.
+
+Mon May 6 09:04:40 1996 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * x-linux{,-aout} (BOOT_CFLAGS, STMP_FIXPROTO, STMP_FIXPROTO): Deleted.
+ * config/t-linux (BOOT_CFLAGS, STMP_FIXPROTO, STMP_FIXPROTO): New,
+ moved from x-linux.
+ * t-linux-aout: New file.
+ * configure (i[3456]86-*-linux*oldld*, i[3456]86-*-linux*aout*):
+ Set tmake_file to t-linux-aout.
+
+Sun May 5 22:13:22 1996 H.J. Lu (hjl@gnu.ai.mit.edu)
+
+ * Makefile.in (gxx_include_dir): Change to $(prefix)/include/g++.
+ (old_gxx_include_dir): New - defined as $(libdir)/g++-include.
+ (cccp.o, cpplib.o): Also pass OLD_GPLUSPLUS_INCLUDE_DIR (set
+ from $(old_gxx_include_dir)).
+ * cccp.c (include_defaults_array): For C++, also search
+ OLD_GPLUSPLUS_INCLUDE_DIR.
+ * cpplib.c (default_include): Likewise.
+ * configure: Remove no-longer-needed support for --gxx-include-dir.
+
+Sun May 5 21:59:53 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * c-lex.c (check_newline): Fix #pragma parsing; issue error message
+ for directive that starts with `p' but isn't `pragma'.
+
+Sun May 5 13:13:40 1996 Jeremy Bettis <jeremy@hksys.com>
+
+ * objc/hash.c (hash_value_for_key): Prevent endless loop when 0 was
+ stored in a hashtable.
+
+Sun May 5 13:09:54 1996 Satoshi Adachi (adachi@wisdom.aa.ap.titech.ac.jp)
+
+ * m68k/newsgas.h (SET_ASM_OP, ASM_WEAKEN_LABEL): Define.
+
+Sun May 5 12:48:08 1996 Stephen L Moshier (moshier@world.std.com)
+
+ * tree.c (build_real_from_int_cst): Remove spurious test for
+ REAL_IS_NOT_DOUBLE.
+
+Sat May 4 12:17:58 1996 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * arm.h (ASM_OUTPUT_MI_THUNK): Moved here from aout.h. Rewrite to be
+ independent of the selected assembler, and to use optimal number of
+ instructions.
+ * arm/aout.h (ASM_OUTPUT_MI_THUNK): Delete.
+
+ * arm/aout.h (ASM_OUTPUT_OPTIONS): Define.
+ (ASM_FILE_START): Call ASM_OUTPUT_OPTIONS.
+ (BSS_SECTION_OP): Define.
+ (ASM_OUTPUT_ALIGN): Don't output anything if byte alignment is wanted.
+ (ASM_OUTPUT_ALIGNED_BSS): Define.
+ * arm.h (target_cpu_name): Delete.
+ (TARGET_SWITCHES): Delete "be" and "le".
+ (TARGET_OPTIONS): Delete "cpu-", add "tune=".
+ (struct arm_cpu_select): New struct.
+ (PROCESSOR_DEFAULT, TARGET_CPU_DEFAULT): Define.
+ (EXTRA_CC_MODES, EXTRA_CC_NAMES): Add CC_Cmode.
+ (CANONICALIZE_COMPARISON): Define.
+ * arm.c (arm_select): Declare and initialize.
+ (all_procs): Add arm7100.
+ (arm_override_options): Parse arm_select structure to determine
+ selected architecture and tuning parameters.
+ (output_option, output_options): New functions.
+ (arm_canonicalize_comparison): New function.
+ (arm_gen_movstrqi): Don't add a writeback of the index registers for
+ the last instructions.
+ (arm_select_cc_mode): Detect case where mode is carry out of unsigned
+ arithmetic.
+ (output_lcomm_directive): Use bss_section (), and use alignment
+ rather than rounding.
+ (get_arm_condition_code): Handle CC_Cmode.
+ (final_prescan_insn): Avoid boundary case where we would occasionally
+ inline MAX_INSNS_SKIPPED+1 insns. Allow call_insns to be inlined in
+ APCS_32 mode if they are the last insn in the block.
+ * arm.md (*addsi3_compareneg): Delete potentially unsafe insn.
+ (*addsi3_compare_op[12]): New insns.
+ (*compare_addsi2_op[01]): New insns.
+ (*addsi3_carryin, *addsi3_carryin_alt[12]): New insns.
+ (*cmp_ite1): Use arm_add_operand instead of arm_rhs_operand.
+ * semi.h (PROCESSOR_DEFAULT): Default to PROCESSOR_ARM6.
+
+Fri May 3 10:52:11 1996 1996 Stan Cox (coxs@dg-rtp.dg.com)
+
+ * i386.md (movesicc, movehicc) Pentium Pro conditional move insns.
+
+ * i386.h (TARGET_PENTIUMPRO, TARGET_CMOVE, BRANCH_COST,
+ ASM_OUTPUT_FUNCTION_PREFIX): New macros for conditional move.
+
+ * i386.c (asm_output_function_prefix, function_prologue): Setup
+ pic on Pentium Pro so a return will match the call.
+ (print_operand, put_condition_code): Output conditional move suffixes.
+
+Fri May 3 10:52:11 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * i386/{att.h,gas.h,bsd.h,sub386.h} (ASM_OUTPUT_MI_THUNK): Define.
+
+Wed May 1 17:54:51 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc.h (ASM_OUTPUT_MI_THUNK): Fix for sparc64, optimize.
+
+Wed May 1 13:28:32 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * i386/linux.h (ASM_OUTPUT_ALIGNED_BSS): Define.
+ * i386/sysv4.h: Likewise.
+ * sparc/sysv4.h: Likewise.
+
+Wed May 1 01:44:47 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.c (h8300_adjust_insn_length): Adjust the cost of
+ shifts by small constant values.
+ * h8300.md: Remove names from many patterns which don't need them.
+ (compare insns): Don't underestimate lengths.
+ (andqi3 expander): Remove constrains.
+ (andhi3): Don't underestimate length.
+ (andsi3): Don't underestimate length. Improve code when upper
+ or lower half of destination is being cleared.
+ (indirect_jump_h8300, indirect_jump_h8300h): Simplify.
+ (shift insns): Remove useless "I" constraint.
+
+ * h8300.md (bcs type): Remove "bcs" type attribute and all references.
+ (bcs insns): Delete. No longer needed.
+ (setcc from bitfield): Rewrite to use zero_extract. Provide
+ QImode, HImode and SImode variants.
+
+Tue Apr 30 18:13:09 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * svr4.h (SELECT_SECTION): If RELOC is true, put it in data.
+
+Tue Apr 30 17:26:30 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * fold-const.c (fold): Don't call convert to recreate tree nodes
+ we already have.
+
+Tue Apr 30 16:52:41 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.c (one_insn_adds_subs_operand): New function.
+ (h8300_adjust_insn_length): New function.
+ * h8300.h (ADJUST_INSN_LENGTH): Define.
+ * h8300.md: Remove obsolete comments.
+ (move patterns): Tweak constraints.
+ (tst patterns): Use "register_operand" for predicate.
+ (adds pattern): Use one_insn_adds_subs_operand to get length
+ computation correct.
+ (subs pattern): Similarly.
+ (movstrhi): Remove unused expander.
+ (fancy*, pxor, and-not patterns): Remove. No longer needed.
+
+Tue Apr 30 13:35:06 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/sol-c0.c (_start): Temporarily display calling
+ __do_global_ctors, since the Solaris linker doesn't handle the
+ relocations properly.
+
+Mon Apr 29 13:03:12 1996 Doug Evans <dje@cyguns.com>
+
+ * sparc/vxsparc.h: sparc-aout.h renamed to aout.h.
+
+Mon Apr 29 00:35:15 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.c (names_small): Remove "BAD" postfix from %r7 byte registers.
+ (rtx_equal_function_value_matters): Remove extra declaration.
+ (output_simode_bld): New function.
+ * h8300.h (NO_FUNCTION_CSE): Do define this.
+ (reg_class): Remove LONG_REGS, SP_REG, SP_AND_G_REGS.
+ (REG_CLASS_{NAMES,CONTENTS,FROM_LETTER}): Corresponding changes.
+ (REGNO_REG_CLASS): Corresponding changes.
+ (output_simode_bld): Declare.
+ * h8300.md: Nuke comments for stuff which has been fixed.
+ (all patterns): Remove references to register class "a" (SP_REGS)
+ which no longer exists.
+ (many patterns): Accept auto-inc auto-dec addresses in more cases.
+ (zero_extendqisi2): New pattern for the H8/300.
+ (zero_extendhisi2): Only use zero_extendhisi2_h8300 when not
+ optimizing.
+ (extendhisi2): Only use extendhisi2_h8300 when not optimizing.
+ (extendqisi2): New pattern for the H8/300.
+ (bitfield related patterns): Completely rewrite.
+ (fancy_bclr, fancy_btst): Deleted.
+ (addhi3 pattern for h8300): Handle case where we can't make matching
+ constraints (works around hard to fix reload problem).
+ (stack_pointer_manip): Delete.
+ (and not patterns): New combiner patterns.
+
+ * pa.h (DBX_OUTPUT_MAIN_SOURCE_FILE_END): Make sure the
+ final $CODE$ subspace is in the $TEXT$ space.
+
+Sun Apr 28 14:52:21 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * svr4.h (ASM_OUTPUT_SECTION_NAME): If no decl is specified,
+ make the section read/write data.
+
+Sat Apr 27 10:28:59 1996 Michael Meissner <meissner@wogglebug.tiac.net>
+
+ * rs6000/t-ppcgas (MULTILIB_EXCEPTIONS): Don't allow -mrelocatable
+ and -mcall-sysv-noeabi.
+
+ * rs6000/sysv.h (SUBTARGET_OVERRIDE_OPTIONS): The -mcall-aix
+ option sets -meabi. Don't allow -mrelocatable without -meabi.
+
+Fri Apr 26 16:10:46 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc.md (*smacsi,*smacdi,*umacdi): Fix constraint on
+ operand 0.
+
+Fri Apr 26 14:36:33 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * i960/t-{960bare,vxworks960} (MULTILIB*): Add
+ soft-float multilib support.
+
+Fri Apr 26 06:38:56 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * stor-layout.c (layout_decl): Turn off DECL_BIT_FIELD for BLKmode
+ that's properly aligned and a multiple of a byte.
+
+Thu Apr 25 22:43:19 1996 Doug Evans <dje@cygnus.com>
+
+ * i386/gas.h (ASM_OUTPUT_ALIGN): #if 0 out again.
+ Undoes change of Apr. 9.
+ * i386/go32.h (ASM_OUTPUT_ALIGN): Define.
+
+Thu Apr 25 14:05:33 1996 Richard Kenner (kennervlsi1.ultra.nyu.edu)
+
+ * calls.c (expand_call): In inlining case, if BEFORE_CALLS is
+ zero, start looking at first insn (one more place).
+
+ * expr.c (expand_builtin, case BUILT_IN_SETJMP): CLOBBER the
+ static chain after label at setjmp point.
+
+Thu Apr 25 09:02:24 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.c (print_operand{,_address}): Correct compile error if
+ TARGET_EABI is not defined. Also, just call small_data_operand,
+ without testing the ABI.
+ (rs6000_select_section): Ditto.
+
+ * rs6000/sysv4.h (CC1_SPEC): For -mcall-solaris, don't pass
+ -mno-main-init.
+
+Wed Apr 24 18:26:48 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * collect2.c (handler): Delete export_file when we get a signal.
+
+Wed Apr 24 14:54:44 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa/pa1-ghpux.h (LINK_SPEC): Define. Link in PA1.1 libraries
+ by default.
+ * pa/{pa1-ghpux9.h, pa1-hpux.h, pa1-hpux9.h}: Likewise.
+
+Wed Apr 24 11:12:06 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * configure (powerpc{,le}-*-eabi*): Use t-ppc{,gas}, instead of
+ t-eabi{,gas}.
+ (powerpc-*-linux,powerpcle-*-solaris): Add definitions.
+ (MULTILIB_DIRNAMES): Pick shorter names for the multilib
+ directories.
+ (MULTILIB_*): Do not build -msdata versions of the library. Build
+ both system V and eabi versions of the libraries.
+
+ * rs6000/t-ppc{,gas} (MULTILIB*): Don't build -msdata versions of
+ the libraries. Split -mcall-sysv libraries into
+ -mcall-sysv-{eabi,noeabi} varients.
+ (LIB2FUNCS_EXTRA): Add eabi.S, eabi-ctors.c.
+ (eabi.S): Use eabi.S, not eabi.s for eabi.asm.
+ (crt files): Add support for Solaris crt files.
+
+ * rs6000/sol{2.h,-c0.c,-ci.asm,-cn.asm}: New files for Solaris.
+
+ * rs6000/linux.h: New file for Linux-based GNU system support.
+
+ * rs6000/eabi-ci.asm (ppc-asm.h): Include.
+ (.got section): Correct attribute.
+
+ * rs6000/eabi-c{i,n}.asm (.init,.finit): Add support for System V
+ style .init/.fini sections, that constructors and destructors
+ place a bl <func> in the appropriate section.
+
+ * rs6000/eabi-ctors.c (__do_global_{c,d}tors): Call __init, and
+ __fini to handle constructors/destructors in the .init, .fini
+ sections.
+
+ * rs6000/{eabi,sysv}.h: Move most eabi configuration stuff from
+ eabi.h to sysv.h.
+
+ * rs6000/sysv.h (TARGET_*): Convert -mcall-xxx from switch into option.
+ Add -mcall-{solaris,linux,sysv-eabi,sysv-noeabi} options.
+ Add -m{,no-}eabi options to control whether we adhere to
+ the System V spec or the EABI spec. Add -m{,no-}regnames to
+ control whether registers are printed out as %r0 instead of 0.
+ (SUBTARGET_OVERRIDE_OPTIONS): Add support for new -mcall options.
+ (FP_ARG_MAX_REG): Use new macros for ABI conformance.
+ (RS6000_REG_SAVE): Likewise.
+ (STACK_BOUNDARY,BIGGEST_ALIGNMENT): If eabi, align to 8 byte
+ boundary, otherwise 16 byte.
+ (EXTRA_SECTIONS): Add .init, .fini sections.
+ (*_SPEC): Reorganize so that the different targets all have sub
+ specs that go in the specs file. Add support for linux and
+ Solaris targets.
+
+ * rs6000/{sysv4,eabi}*.h (*_SPECS): Only override the default
+ spec, all other specs moved to sysv4.h.
+ (RS6000_ABI_NAME): Use RS6000_ABI_NAME to set the default ABI
+ name, not TARGET_DEFAULTS.
+
+ * rs6000/xm-sysv4.h (alloca): Properly declare alloca if compiler
+ is not GCC.
+ (DONT_DECLARE_SYS_SIGLIST): Define.
+
+ * rs6000.c (rs6000_abi_name): New global for getting the results
+ of -mcall-xxx.
+ (rs6000_reg_names): New global for holding the normal register names.
+ (alt_reg_names): Alternate register names for -mregnames.
+ (rs6000_override_options): If -mregnames, copy alt_reg_names into
+ rs6000_reg_names.
+ (input_operand): Recognize ABI_SOLARIS.
+ (small_data_operand, init_cumulative_args): Likewise.
+ (function_arg{,_boundary,_advance,_partial_nregs}): Likewise.
+ (function_arg_pass_by_reference, setup_incoming_varargs): Likewise.
+ ({rs6000,debug}_stack_info, output_{prolog,epilog}): Likewise.
+ (print_operand): %$ prints '.' on Solaris, '$' elsewhere.
+ (print_operand{,_address}): If not eabi, use @sdarel for small
+ data references.
+ (rs6000_stack_info): Only emit __eabi call if TARGET_EABI.
+
+ * rs6000.h (*_SPECS): Move the System V specs to svr4.h.
+ (ABI_SOLARIS): New ABI, mostly like System V.
+ (EXTRA_CONSTRAINT): Use ABI_SOLARIS like ABI_V4.
+ (RETURN_ADDRESS_OFFSET, (LEGITIMATE_SMALL_DATA_P): Likewise.
+ (RETURN_IN_MEMORY): On Solaris, small structures are returned in regs.
+ (REGISTER_NAMES): Use rs6000_reg_names array, instead of string
+ literals.
+ (DEBUG_REGISTER_NAMES): Define.
+ (ADDITIONAL_REGISTER_NAMES): Add sp, toc aliases.
+ (PRINT_OPERAND_PUNCT_VALID_P): Recognize $ as a punctuation char.
+
+ * rs6000.md (got & call patterns): Use ABI_SOLARIS to mean the
+ same as ABI_V4.
+ (branch patterns): Use %$ for the current location, not just $.
+
+ * va-ppc.h: Add Solaris support.
+
+Tue Apr 23 20:02:13 1996 Doug Evans <dje@cygnus.com>
+
+ * sparc.c (output_function_prologue): In -mbroken-saverestore
+ case, %sp = %fp - size.
+ * sparc/t-splet (TARGET_LIBGCC2_CFLAGS): Delete.
+ * sparc.md (isa attribute): Add sparclet.
+ (*smacsi,*smacdi,*umacdi): Use match_operand, not match_dup
+ for third arg.
+ (*mulsidi3_sp32,const_mulsidi3,*umulsidi3_sp32,const_umulsidi3): Use
+ smuld,umuld for sparclet.
+
+Tue Apr 23 16:28:28 1996 Michael Meissner <meissner@wombat.gnu.ai.mit.edu>
+
+ * m68k/m68kemb.h: Add {LINK,STARTFILE,LIB,SUBTARGET}_SPEC, so
+ gcc will use libgloss for supported target boards {idp,mvme,bcc}.
+
+Tue Apr 23 16:00:28 1996 Per Bothner <bothner@cygnus.com>
+
+ * expr.c (store_constructor): Fix test for missing array elements.
+
+Tue Apr 23 11:21:09 1996 Stephen L Moshier (moshier@world.std.com)
+
+ * i386/sco5.h (BSS_SECTION_ASM_OP): Use `data' directive.
+ (ASM_OUTPUT_ALIGNED_LOCAL): Generate an `lcomm' directive.
+ (TARGET_DEFAULT): Include TARGET_IEEE_FP.
+ (CPP_PREDEFINES): Include Di386.
+
+Mon Apr 22 12:00:46 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * rs6000.h (BIGGEST_FIELD_ALIGNMENT): Delete.
+ (ADJUST_FIELD_ALIGN, ROUND_TYPE_ALIGN): Define.
+ * sysv4.h (BIGGEST_FIELD_ALIGNMENT): Delete.
+ (ADJUST_FIELD_ALIGN, ROUND_TYPE_ALIGN): Undefine.
+ * win-nt.h (ADJUST_FIELD_ALIGN, ROUND_TYPE_ALIGN): Undefine.
+
+Sun Apr 21 17:52:36 1996 Jim Wilson <wilson@cygnus.com>
+
+ * m68k/coff.h (ASM_OUTPUT_SECTION): Test DECL before
+ dereferencing it.
+
+ * cse.c (cse_process_notes): Handle SUBREG like ZERO_EXTEND.
+
+Sun Apr 21 12:57:12 1996 Doug Evans <dje@cygnus.com>
+
+ * arm/aout.h (ASM_OUTPUT_MI_THUNK): Define.
+
+Sun Apr 21 09:50:09 1996 Stephen L Moshier (moshier@world.std.com)
+
+ * choose-temp.c: Include sys/types.h before sys/file.h for sco3.2v5.
+
+Sun Apr 21 08:42:13 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * alpha.c (check_float_value): Cast args of bcopy to avoid warnings.
+
+Sat Apr 20 21:22:21 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * stor-layout.c (layout_record): Use ADJUST_FIELD_ALIGN to modify
+ alignment of fields within records.
+
+Sat Apr 20 19:55:33 1996 Niels Moller <nisse@lysator.liu.se>
+
+ * c-parse.in (typespec): Made <SomeProtocol> equivalent
+ to (id <SomeProtocol>).
+ (non_empty_protocolrefs): New nonterminal.
+
+Sat Apr 20 08:34:02 1996 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * stmt.c (check_for_full_enumeration_handling): Call case_tree2list
+ before checking for case expressions not corresponding to enumerators.
+ (mark_seen_cases): If SPARSENESS == 2, exploit AVL order.
+ Else, convert tree to list.
+ Set xlo to -1 if SPARSENESS == 1 search failed.
+ (expand_end_case): Avoid calling case_tree2list on list.
+
+Fri Apr 19 16:54:57 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000/win-nt.h (BIGGEST_FIELD_ALIGNMENT): Set to 64, not
+ 32 that AIX uses.
+
+Fri Apr 19 16:40:38 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * i386.md (movqi): Handle QImode values in %si and %di.
+
+Thu Apr 18 20:56:56 1996 Jim Wilson <wilson@cygnus.com>
+
+ * sh.md (lshrsi3): Change gen_ashlsi3_d to gen_lshrsi3_d.
+
+Thu Apr 18 15:49:28 1996 Per Bothner <bothner@cygnus.com>
+
+ * sparc.h (ASM_OUTPUT_MI_THUNK): Define.
+
+Thu Apr 18 15:19:26 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.md: Remove "type" attribute from all patterns except those
+ which have varying length branches. Eliminate obsolete "type"
+ attributes. Add "length" and "cc" attributes to insns without them;
+ fix some length computations. Remove patterns which are commented out.
+
+ * h8300.md (zero extension expanders and insns): Simplify, fix various
+ length problems, provide optimized versions for the h8300 and h8300h.
+ (sign extension expanders and insns): Likewise. Make them
+ nearly identical to zero_extension patterns and insns.
+
+Wed Apr 17 18:50:16 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * pa.h (SELECT_SECTION): Define. Never place a something
+ into the read-only data section if it requires a reloc.
+
+ * pa.md (rotlsi3): Delete unnecessary and incorrect pattern.
+
+Wed Apr 17 17:15:40 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.md (movdi): Never FAIL, even if operand[1] is not a
+ general operand, due to being in volatile memory.
+
+Wed Apr 17 15:20:10 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
+
+ * c-lex.c (check_newline): Rewrite to use tokens.
+ (handle_sysv_pragma): Take a token instead of a character.
+ * i960.c (process_pragma): Take the IDENTIFIER_POINTER tree
+ node instead of a character.
+ * sh.c (handle_pragma): Likewise.
+ * config/nextstep.c (handle_pragma): Likewise.
+ * h8300.c (handle_pragma): Likewise.
+ * i960.h (HANDLE_PRAGMA): Expect/pass 2nd arg of NODE, not CH.
+ * sh.h (HANDLE_PRAGMA): Likewise.
+ * config/nextstep.h (HANDLE_PRAGMA): Likewise.
+ * h8300.h (HANDLE_PRAGMA): Likewise.
+
+Wed Apr 17 14:28:43 1996 Doug Evans <dje@cygnus.com>
+
+ * choose-temp.c: Don't include sys/file.h ifdef NO_SYS_FILE_H.
+ #include <stdio.h>.
+ (choose_temp_base): Make tmp,usrtmp, static locals.
+
+Wed Apr 17 08:41:02 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * alpha.c (alpha_emit_conditional_move): Fix some bugs in previous
+ change and do some cleanup.
+
+Tue Apr 16 18:53:05 1996 Jim Wilson <wilson@cygnus.com>
+
+ * reload.c (push_reload): Add extra reload for inside of SUBREG if
+ it is CONSTANT_P.
+
+ * expr.c (do_store_flag): Rewrite last change to avoid compiler
+ warnings.
+
+ * reload.c (push_reload): When reuse an old reload, set the modes
+ to be the larger of the old and new modes.
+
+ * i960/t-960bare (xp-bit.c): Fix typo in source file name.
+
+Tue Apr 16 18:09:16 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.md (andhi3): If 2nd operand is a CONST_INT that meets 'J'
+ constraint, then only two bytes are needed for this insn. Improve
+ code generated for the h8300h when both operands are registers.
+ (iorhi3, xorhi3): Likewise. Rework to be nearly identical to andhi3.
+ (andsi3): If 2nd operand is a CONST_INT that meets the 'J'
+ constraint, then only two bytes are need for this insn.
+ Improve code generated for the h8300h regardless of the
+ type of the 2nd operand. Make this pattern work on the h8300 too.
+ (iorsi3, xorsi3): Likewise. Rework to be nearly identical to andsi3.
+ (iorqi3_internal): Make this pattern look more like andqi3_internal.
+ (one_cmplhi2, one_cmplsi2): Fix length computation for H8300H.
+
+Tue Apr 16 17:43:25 1996 J"orn Rennecke (amylaar@meolyon.hanse.de)
+
+ * i386.md (addsidi3_2): Handle non-MEM overlap case.
+
+Tue Apr 16 16:59:49 1996 Richard Henderson <rth@tamu.edu>
+
+ * function.c (expand_function_end): Allow TRAMPOLINE_TEMPLATE
+ to be omitted on systems for which it is not cost effective.
+ * varasm.c (assemble_trampoline_template): No such function
+ if no TRAMPOLINE_TEMPLATE.
+ * m68k.h: Greatly simplify the run-time trampoline code:
+ (TRAMPOLINE_TEMPLATE, TRANSFER_FROM_TRAMPOLINE): Delete define.
+ (TRAMPOLINE_SIZE, INITIALIZE_TRAMPOLINE): Changed.
+ (TRAMPOLINE_ALIGN): No point aligning to cache line.
+ (FINISH_INIT_TRAMPOLINE): New define.
+ * m68k/next.h: Instead of redefining INITIALIZE_TRAMPOLINE,
+ make use of the new FINISH_INIT_TRAMPOLINE.
+ * m68k/{m68k.h,next.h,aux.h} (FINISH_INIT_TRAMPOLINE):
+ Rename to FINALIZE_TRAMPOLINE.
+ * m68k/{linux.h,m68kv4.h}: Override trampoline macros.
+
+Tue Apr 16 16:02:50 1996 David Edelsohn <edelsohn@mhpcc.edu>
+
+ * combine.c (make_field_assignment): Allow XOR in final case.
+
+Tue Apr 16 11:33:53 1996 J.T. Conklin <jtc@rtl.cygnus.com>
+
+ * m68k.h (TARGET_SWITCHES): Don't remove MASK_68060 with -msoft-float.
+
+ * m68k.h (MULL_COST, MULW_COST, RTX_COSTS): Add costs for TARGET_68060.
+ * m68k.md (ashlsi_16, lshrsi_16): Disable pattern for TARGET_68060;
+ this special case is not faster for that cpu.
+
+Tue Apr 16 10:54:55 1996 Eliot Dresselhaus <dresselh@rft30.nas.nasa.gov>
+
+ * alpha.c (alpha_emit_conditional_move): New function.
+ * alpha.h (alpha_emit_conditional_move): Declare it.
+ * alpha.md (cmov* define_expands): Use it.
+
+Tue Apr 16 09:06:17 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * function.h (struct function): New field returns_pointer.
+ * function.c (push_function_context_{to,from}): Save and restore
+ current_function_returns_pointer.
+
+ * config/svr4.h (ENDFILE_SPEC): Add missing `%s'.
+
+ * configure (m68k-*-linux*aout*): Set tmake_file to m68k/t-linux-aout.
+ (m68k-*-linux*): Set extra_parts.
+ * m68k/t-linux (INSTALL_ASSERT_H): New definition.
+ (CRTSTUFF_T_CFLAGS_S, TARGET_LIBGCC2_CFLAGS): New definitions.
+ * m68k/t-linux-aout: New file.
+ * m68k/linux.h (LIB_SPEC): Deleted.
+ (BSS_SECTION_ASM_OP, ASM_OUTPUT_ALIGNED_BSS): Define.
+
+ * m68k.h (TRAMPOLINE_ALIGNMENT): Specify alignment in bits, not bytes.
+
+Tue Apr 16 08:53:17 1996 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * final.c (final_scan_insn): Allow removal of redundant test and
+ compare instructions that use clobbers.
+
+Tue Apr 16 06:22:00 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-decl.c (clear_limbo_values): New function.
+ (pushdecl): Call it for function body blocks.
+
+ * objc/thr-decosf1.c (_objc_thread_id): Correct return type from
+ int to _objc_thread_id.
+
+ * expr.c (expand_builtin, case BUILT_IN_LONGJMP): Make a decl
+ for __dummy, so we can call make_function_rtl on it.
+
+ * expr.c (expand_assignment): Don't pre-evaluate RHS if a CALL_EXPR
+ with a variable-size return.
+
+Mon Apr 15 17:38:45 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * fixincludes: Fix undefined VOIDFUNCPTR in VxWorks 5.2 <time.h>.
+
+Mon Apr 15 15:12:16 1996 Jim Wilson <wilson@cygnus.com>
+
+ * expr.c (do_store_flag): Before calling exact_log2, remove any
+ sign extension bits.
+
+ * reload1.c (emit_reload_insns): Call reload_reg_reaches_end_p for
+ every reg of multi-reg spill register. Invalidate old info for multi
+ reg spill registers when only part survives to the end.
+
+Mon Apr 15 14:49:12 1996 Mike Stump <mrs@cygnus.com>
+
+ * function.c (preserve_temp_slots): Only preserve temporaries that
+ happen to be at the current level.
+
+Mon Apr 15 14:08:12 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * gansidecl.h: New file.
+ * choose-temp.c: New file.
+ * Makefile.in (xgcc): Depend on and link in choose-temp.o.
+ (collect2): Likewise.
+ (choose-temp.o): Add rule for.
+ * collect2.c: #include "gansidecl.h".
+ (const,PROTO): Delete.
+ (P_tmpdir): Delete.
+ (choose_temp_base): Declare as extern, delete internal copy.
+ (main): Update call to choose_temp_base.
+ * cpphash.c: #include "gansidecl.h".
+ (NULL,const,volatile): Delete.
+ * demangle.h: #include "gansidecl.h".
+ (PROTO,PTR,const): Delete.
+ * expr.h (const): Delete.
+ * fix-header.c: #include "gansidecl.h".
+ (const): Delete.
+ * gcc.c: #include "gansidecl.h".
+ (PROTO,VPROTO,PVPROTO,VPROTO,VA_START,NULL): Delete.
+ (GENERIC_PTR,NULL_PTR,P_tmpdir): Delete.
+ (choose_temp_base): Declare as extern, delete internal copy.
+ (concat): Rewrite to take a variable number of arguments.
+ (choose_temp_base_try,concat[346]): Delete.
+ (translate_options,set_spec,process_command,do_spec_1,
+ is_directory,main): Always use concat, not concat[346]. Pass
+ NULL_PTR as trailing arg to concat.
+ * genattr.c (main): Delete printing of "#define PROTO".
+ * machmode.h: #include "gansidecl.h".
+ (PROTO): Delete.
+ (HAVE_MACHINE_MODES): Move definition to standard place.
+ * recog.h: #include "gansidecl.h".
+ (PROTO,const): Delete.
+ * rtl.h: #include "gansidecl.h".
+ (PROTO,VPROTO,PVPROTO,VPROTO,VA_START,STDIO_PROTO): Delete.
+ (NULL,GENERIC_PTR,NULL_PTR): Delete.
+ * tree.h: Likewise.
+
+Mon Apr 15 08:49:20 1996 Tom May (ftom@netcom.com)
+
+ * cse.c (invalidate_skipped_set): Ignore CLOBBER after calling
+ note_mem_written, not before.
+
+Mon Apr 15 08:22:03 1996 Philippe De Muyter <phdm@info.ucl.ac.be>
+
+ * m68k.md (tstdi): Optimized for "d" case.
+ (movqi): Allow moving "i" into "a".
+ (zero_extendsidi2): Alternatives merged.
+ (extendplussidi): Fixed when operands 0 and 1 share a register.
+ (adddi_sexthishl32): Constraints reordered for better reload.
+ (adddi3,subdi_sexthishl32,subdi3,negdi2): Likewise.
+ (ashldi_sexthi): Accept "m" as operand 0.
+ (ashldi_const32): Alternatives merged.
+ (ashift patterns): Output "lsl" instead of "asl".
+ (beq0_di): If condition codes already set, output only branch insn.
+ (bne0_di,bge0_di,blt0_di): Likewise.
+ * m68k.c (notice_update_cc, case ASHIFT{,RT}, LSHIFTRT, ROTATE{,RT}):
+ Don't set CC_NO_OVERFLOW.
+ * m68k.h (TARGET_SWITCHES): Fix typo in "c68000" entry.
+
+Mon Apr 15 08:06:17 1996 Stephen L Moshier (moshier@world.std.com)
+
+ * real.c (eadd1): Check for overflow on X plus X.
+
+Mon Apr 15 08:02:24 1996 J.T. Conklin <jtc@cygnus.com>
+
+ * i386/netbsd.h (HAVE_SYSV_PRAGMA): Removed definition.
+ * config/netbsd.h (HAVE_SYSV_PRAGMA): Define.
+ (SET_ASM_OP): Define.
+
+Mon Apr 15 07:28:54 1996 Fila Kolodny <fila@ibi.com>
+
+ * configure: Add definition for host= into Makefile.
+ * build-make (CC): Pass -b $(host), not target.
+
+Mon Apr 15 05:12:39 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (bc_expand_increment): Change declaration to return void.
+
+ * toplev.c (max_label_num_after_reload): New variable.
+ (rest_of_compilation): Set it.
+ * reorg.c (find_dead_or_set_registers): Only kill spill regs after
+ label made before jump2.
+
+ * combine.c (expand_field_assignment): Take SUBREG_WORD into
+ account when have STRICT_LOW_PART.
+ (make_extraction): Make a STRICT_LOW_PART at any low-order word.
+
+Mon Apr 15 03:43:11 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * flags.h (flag_function_sections): Declare.
+ * toplev.c (flag_function_sections): Define.
+ (compile_file): Add warnings when -ffunction-sections is
+ used with -g, or profiling. Disable -ffunction-sections
+ when profiling is used. Add warning when -ffunction-sections
+ is used on a target that doesn't support it.
+ * varasm.c (named_section): Make a copy of the section name
+ in case the original is in temporary storage.
+ (function_section): Set DECL_SECTION_NAME for each function
+ if flag_function_sections is on and the target supports it.
+ * dbxout.c (dbxout_function_end): New function.
+ (dbxout_function): Call dbxout_function_end if using extensions
+ and flag_function_sections is on.
+ * sparc/sysv4.h (ASM_OUTPUT_SECTION_NAME): Prefix a function
+ section's name with ".text%" when -ffunction-sections.
+
+Sun Apr 14 19:37:43 1996 Doug Evans <dje@cygnus.com>
+
+ * toplev.c (main): Delete redundant test for -p used with -fbytecode.
+
+Sun Apr 14 19:01:59 1996 John F. Carr <jfc@mit.edu>
+
+ * c-decl.c (finish_enum): Don't crash if no type can represent all
+ enumeration values.
+
+Sun Apr 14 18:56:40 1996 J.T. Conklin <jtc@rtl.cygnus.com>
+
+ * m68k.md (ftruncdf2): Enable for m68060 systems.
+
+Sun Apr 14 18:49:30 1996 David L. Reese (david.reese@east.sun.com)
+
+ * fold-const.c (range_test): Don't convert hi_cst or lo_cst
+ to unsigned when folding signed range tests.
+
+Sun Apr 14 08:56:27 1996 Stephen L Moshier <moshier@world.std.com>
+
+ * real.h (ereal_from_{int,uint}): Add new arg, MODE.
+ (REAL_VALUE_FROM{,_UNSIGNED}_INT): New arg, MODE.
+ * real.c (ereal_from_{int,uint}): New arg, MODE.
+ * cse.c (simplify_unary_operation): Add new arg to REAL_VALUE_FROM_INT.
+ * fold-const.c (fold_convert): Likewise.
+ * tree.c (real_value_from_int_cst): New arg, TYPE.
+ Pass mode to REAL_VALUE_FROM_INT.
+ (build_real_from_int_cst): Properly deal with truncation.
+
+Sun Apr 14 08:21:29 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * combine.c (try_combine): When substituting in output of I2,
+ ensure dest isn't clobbered in I2.
+
+ * combine.c (combine_instructions): In initial scan of insns,
+ handle a REG_INC note's affect on sign bit copies and nonzero bits.
+ (set_nonzero_bits_and_sign_copies): Treat a zero SET arg as a CLOBBER.
+
+Sun Apr 14 07:52:28 1996 Manor Askenazi <manor@santafe.edu>
+
+ * objc/encoding.c (objc_skip_typespec): Don't abort for _C_UNDEF.
+
+Sat Apr 13 20:35:36 1996 Richard Henderson (richard@atheist.tamu.edu)
+
+ * configure (m68k-apple-aux*): Rework to take advantange
+ of list of tm.h files and support all four gas/gld options.
+ * m68k/auxas.h, m68k/auxgas.h, m68k/auxgld.h, m68k/auxld.h: New files.
+ * m68k/auxstd.h, m68k/auxgnu.h: Deleted.
+
+Sat Apr 13 20:18:11 1996 Stephen L Moshier <moshier@world.std.com>
+
+ * alpha.c (check_float_value): New function.
+ * alpha.h (CHECK_FLOAT_VALUE): Define.
+ (ASM_OUTPUT_FLOAT): Print the value in hex.
+
+Sat Apr 13 15:08:45 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * configure: New target arm{,el}-*-coff*.
+ (cpu_default): Sort alphabetically.
+ * arm/coff.h: New file.
+ * arm/t-bare: New file.
+ * arm/arm.c (use_return_insn): Don't use return for naked functions.
+ (arm_valid_machine_decl_attribute): New function.
+ (arm_naked_function_p): New function.
+ (output_func_prologue): Naked functions don't have prologues.
+ (arm_expand_prologue): Likewise.
+ (output_func_epilogue): Likewise with epilogues.
+
+Sat Apr 13 11:31:32 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.c (adds_subs_operand): Fix thinko in last change.
+
+ * h8300.md (subhi3): Turn into a define_expand.
+ (subhi3 using adds_subs): New pattern.
+ (H8300 subhi): Derived from old subhi pattern. Simplified.
+ (H8300H subhi): Likewise.
+ (subsi using adds_subs): New pattern. Only used on H8300H.
+ (subsi_h8300): Allow "a" registers as destination.
+ (subsi_h8300h): Allow "a" registers as destination. Simplify.
+
+ * h8300.md (bcs_qiqi, bcs_hihi, bs_hiqi): Fix thinkos
+ in last change.
+
+Sat Apr 13 08:59:48 1996 Fila Kolodny <fila@ibi.com>
+
+ * i370/mvs.h (ASM_DECLARE_FUNCTION_NAME): Don't write anything to
+ asm file, because everything is handled in FUNCTION_PROLOGUE.
+
+Sat Apr 13 07:55:38 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * alpha.c (alpha_emit_set_const_1): Renamed from
+ alpha_emit_set_const and static.
+ Remove change of Nov 26; again use normal mechanism for SImode.
+ (alpha_emit_set_const): New function.
+
+Fri Apr 12 18:19:39 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.c (adds_subs_operand, output_adds_subs): New functions.
+ * h8300.md (addhi3): Turn into a define_expand.
+ (addhi3 using adds_subs): New pattern.
+ (H8300 addhi): Derived from old addhi pattern. Simplified.
+ (H8300H addhi): Likewise.
+ (addsi using adds_subs): New pattern. Only used on H8300H.
+ (addsi_h8300): Allow "a" registers as destination.
+ (addsi_h8300h): Simplify. Allow "a" registers as destination.
+
+ * h8300.md (bcs): New attribute type.
+ (default_length): Compute correct length for bcs insns.
+ (bcs_qiqi, bcs_hihi, bs_hiqi): Use new type and update
+ to account for correct length computation.
+
+ * h8300.md (movhi_internal): Demand at least one operand to be reg.
+ (movsi_h8300{{,h}): Optimize loading certain constants.
+
+ * h8300.h (NO_FUNCTION_CSE): Comment out.
+ (FUNCTION_ARG_REGNO_P): Properly define for TARGET_QUICKCALL.
+ (RETURN_IN_MEMORY): Don't return small structs in regs.
+
+ * h8300.c (const_costs): -4 and 4 are cheap on the h8300h.
+ (notice_update_cc): Remove references to "value2" field.
+
+ * h8300.c (dosize): Remove unused "fped" argument. All callers
+ changed. Handle add/sub of 5-8 bytes efficiently on the h8300h.
+
+ * h8300.c (print_operand): Handle new 'R' case for accessing
+ the 8-bit area. Make code for 'Y' fall into code for 'R' when
+ operand is not a register. Update some comments.
+ (h8300_tiny_data_p): New function.
+ (h8300_valid_machine_decl_attribute): Handle "tiny_data" attribute.
+ * h8300.h (OK_FOR_U): Handle memory references into 8-bit area.
+ (ENCODE_SECTION_INFO): Mark SYMBOL_REFs which refer to 8-bit area.
+ * h8300.md (many patterns): Use 'R' rather than 'X' for
+ operands that may be memory accesses into the 8-bit area.
+ (btst pattern): New pattern to set the cc0 (zbit) based on
+ data in the 8-bit area.
+
+ * h8300.md (one_cmplsi2): Fix length computation for h8300h.
+
+Fri Apr 12 14:34:39 1996 Doug Evans <dje@cygnus.com>
+
+ * arm.md (*ldmsi,*stmsi): Use (mem (match_operand ...))
+ to avoid using indirect_operand (reload problems).
+ * arm/semi.h (CPP_PREDEFINES): Define __semi__ instead of semi.
+ * arm/aout.h (ASM_GENERATE_INTERNAL_LABEL): Use LOCAL_LABEL_PREFIX.
+ (ASM_OUTPUT_ADDR_{VEC,DIFF_ELT}): Likewise.
+
+Fri Apr 12 09:43:30 1996 Jason Merrill <jason@yorick.cygnus.com>
+
+ * dbxout.c (dbxout_typedefs): Don't emit incomplete types yet.
+ (dbxout_symbol): Use DECL_ARTIFICIAL to recognize C++ implicit
+ typedefs.
+
+Thu Apr 11 21:56:26 1996 Doug Evans <dje@cygnus.com>
+
+ * i386/t-winnt (winnt.o): Rewrite based on .c.o rule.
+ (oldnames.o,spawnv.o): Add rules for.
+
+Thu Apr 11 07:25:06 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * calls.c (expand_call): In inlining case, if BEFORE_CALLS is
+ zero, start looking at first insn.
+
+ * expr.c (preexpand_calls, case CALL_EXPR): Rework to properly
+ avoid expanding functions returning variable size objects.
+
+ * integrate.c (expand_inline_function): When comparing types
+ of formal and actual, use TYPE_MAIN_VARIANT.
+
+Thu Apr 11 00:48:29 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300/lib1funcs.asm (modnorm): New function(s). Like divnorm,
+ but gets the sign bit right for modulo operations.
+ (__modhi3, modsi3): Use modnorm.
+
+ * h8300.c (dosize): On h8300h, do 4 byte adjusts using adds and subs.
+ * h8300.h (LONG_LONG_TYPE_SIZE): Always make this 32bits.
+ Reverses change from Apr 2, 1996.
+
+Wed Apr 10 18:39:52 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * sparc.h (ASM_OUTPUT_INTERNAL_LABELREF): Delete.
+ (FUNCTION_PROFILER): Use ASM_GENERATE_INTERNAL_LABEL instead.
+
+ * sparc.c (sparc_override_options): 90c701 renamed to tsc701.
+ (eligible_for_epilogue_delay_slot): Don't allow anything if
+ -mbroken-saverestore.
+ (output_function_prologue): Only use trivial save's if
+ -mbroken-saverestore.
+ * sparc.h (CPP_SPEC): Handle -mcpu={sparclet,tsc701}.
+ (ASM_SPEC): Likewise.
+ ({MASK,TARGET}_BROKEN_SAVERESTORE): Define.
+ (enum processor_type): 90C701 renamed to TSC701.
+ * sparc.md (attr cpu): 90c701 renamed to tsc701.
+ * sparc/splet.h (SUBTARGET_SWITCHES): Recognize -mbroken-saverestore.
+
+Wed Apr 10 17:56:02 1996 Stan Cox <coxs@dg-rtp.dg.com>
+
+ * m88k/dgux.h (EXTRA_SPECS): Define.
+ (ASM_SPEC,CPP_SPEC,STARTFILE_SPEC): Use EXTRA_SPECS.
+ * m88k/dguxbcs.h (ASM_SPEC,CPP_SPEC,STARTFILE_SPEC): Use EXTRA_SPECS.
+ * m88k/m88k.c (output_ascii) Output literal HT.
+
+Wed Apr 10 17:28:37 1996 James Carlson (carlson@xylogics.com)
+
+ * configure: Work around AIX bug when defining SUBDIRS.
+
+Wed Apr 10 17:22:42 1996 Paul Eggert <eggert@twinsun.com>
+
+ * cexp.y (parse_number): Don't reject long long constants unless
+ pedantic.
+
+Wed Apr 10 17:19:56 1996 Stephen L. Moshier (moshier@world.std.com)
+
+ * real.c (e64toe): Properly distinguish between NaN and infinity
+ bit patterns for real-words-big-endian targets.
+
+Wed Apr 10 17:17:26 1996 Richard Earnshaw (rearnsha@armltd.co.uk)
+
+ * real.c (endian): Add two explicit casts.
+ (e64toe): Support ARM extended precision fp format.
+ Check negative infinities properly for NaNs.
+ (toe64): Support ARM extended precision fp format.
+
+Tue Apr 9 12:53:31 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * i386/gas.h (ASM_OUTPUT_ALIGN): Define and use .balign.
+
+Tue Apr 9 12:48:45 1996 Stephen L Moshier (moshier@world.std.com)
+
+ * sparc.c (fp_zero_operand): Exclude -0.0.
+
+Tue Apr 9 07:11:24 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * alpha.c: Fix typo in last change.
+
+ * tree.c (substitute_in_expr): Don't return new expression if
+ nothing changed.
+ (substitute_in_type): Deleted, not used.
+ * tree.h (substitute_in_type): Delete declaration.
+
+Mon Apr 8 16:30:18 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * flow.c (find_auto_inc): Also make sure there aren't
+ any sets of the incremented register between the memory
+ reference and increment insn.
+
+Mon Apr 8 15:41:14 1996 John Polstra (jdp@polstra.com)
+
+ * configure (i[3456]86-*-freebsdelf*): New target.
+ * i386/freebsd-elf.h: New file.
+ * i386/x-freebsd (USER_H): New define; to null.
+
+Mon Apr 8 14:44:41 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * c-decl.c (finish_function): Always warn if main doesn't return int.
+
+Mon Apr 8 13:01:37 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * rs6000.c (got_operand): New function, returns true if the
+ operand can go in V.4's GOT.
+ (rs6000_pic_register): New variable.
+ (output_epilog): Reset rs6000_pic_register.
+
+ * rs6000.h (rs6000_pic_register, got_operand, flag_pic): Add decls.
+ (PREDICATE_CODES): Add got_operand.
+
+ * rs6000.md (movsi): Add support for V.4's -fpic and -FPIC.
+ (init_v4_pic): Initialize the V4 pic register if needed.
+ (call patterns): If -fpic/-fPIC, call function with @plt suffix.
+
+ * t-eabigas (MULTILIB_DIRNAMES): Remove errant pic directory.
+
+ * rs6000.c (output_prolog): Correctly store & restore the
+ arguments to main in their correct save location, when calling the
+ start function.
+
+Mon Apr 8 13:01:37 1996 David Reese <Dave.Reese@East.Sun.COM>
+
+ * rs6000.c (print_operand): Use reg_names to print registers.
+
+Fri Apr 5 00:40:19 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.c (h8300_valid_machine_decl_attribute): Use underscores,
+ not dashes in attributes.
+ (h8300_funcvec_function_p): Corresponding changes.
+ (h8300_interrupt_function_p): Likewise.
+
+ * pa.h (INIT_CUMULATIVE_INCOMING_ARGS): Initialize "indirect"
+ field to zero.
+
+Thu Apr 4 12:52:11 1996 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * loop.c (combine_givs): Use new macro GIV_SORT_CRITERION.
+ New variable giv_array. Loop over giv_array instead of following
+ next_iv links.
+ (giv_sort): New function.
+ * sh.h (GIV_SORT_CRITERION): Define.
+
+ * c-typeck.c (push_init_level): When output alignment for structure
+ field, add check to verify it is the next field to be output.
+
+Thu Apr 4 12:19:26 1996 David Mosberger-Tang <davidm@AZStarNet.com>
+
+ * alpha.c: Don't include stamp.h for Linux-based GNU systems.
+
+Thu Apr 4 12:17:08 1996 Richardg Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * objc/Makefile: Rename thread* to thr*.
+ * objc/thread.c: Rename thread-* to thr-*.
+ * objc/thr-decosf1.c: Renamed from thread-decosf1.c
+ * objc/thr-irix.c: Renamed from thread-irix.c.
+ * objc/thr-single.c: Renamed from thread-single.c.
+ * objc/thr-solarius.c: Renamed from thread-solaris.c.
+ * objc/thr-win32.c: Renamed from thread-win32.c.
+ * objc/objc-api.h: Include thr.h, not thread.h.
+ * objc/runtime.h, objc/sarray.h: Likewise.
+
+ * i386.md (ashldi3_const_int): Don't recognize if won't match
+ constraint of operand 2.
+
+Thu Apr 4 11:40:55 1996 Michael Meissner <meissner@tiktok.cygnus.com>
+
+ * config/fp-bit.c (EXTENDED_FLOAT_STUBS): If EXTENDED_FLOAT_STUBS
+ is defined, define all of the XF/TF functions that might be
+ generated that we don't have code for yet.
+
+ * i960/t-(vxworks960,960bare): (LIB2FUNCS_EXTRA): Make and
+ compile xp-bits.c that defines EXTENDED_FLOAT_STUBS.
+
+ From: steve chamberlain <sac@slash.cygnus.com>
+ * i386/x-cygwin32 (LANGUAGES): Delete.
+ * i386/xm-cygwin32.h (EXECUTABLE_SUFFIX): Set to .exe.
+ * rs6000/xm-cygwin32.h (EXECUTABLE_SUFFIX): Set to .exe.
+
+Wed Apr 3 14:10:16 1996 Jim Wilson <wilson@chestnut.cygnus.com>
+
+ * expr.c (emit_push_insn): Clobber register only if it is non-zero.
+
+Wed Apr 3 11:31:55 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.h (h8300_funcvec_function_p): Declaration moved here.
+ * h8300.c (h8300_funcvec_function_p): Declaration removed from here.
+ * h8300.md (tstqi): Tweak to work like other tstXX patterns.
+ (cmphi): Turn into a define_expand. Add two anonymous
+ matterns to match the output of the cmphi expander.
+ (cmpsi): Accept constants as the second input operand.
+
+Tue Apr 2 13:52:30 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.md (movqi_internal): Remove useless alternative(s). Fix
+ lengths and simplify by reordering remaining alternatives.
+ (movstrictqi, movhi_internal, movstricthi): Likewise.
+ (movsi_h8300h, movsf_h8300h): Likewise.
+
+ * h8300/h8300.c (extra_pop): Remove unused variable.
+ (current_function_anonymous_args): Likewise.
+ (function_prologue): Remove incorrect varargs/stdarg
+ related code.
+ (function_epilogue): Likewise.
+ (function_arg): Never pass unnamed arguments in registers.
+ * h8300.h (LONG_LONG_TYPE_SIZE): Use 64bits when ints are 32bits.
+ (SETUP_INCOMING_VARARGS): Remove definition.
+
+Mon Apr 1 16:59:48 1996 Ian Lance Taylor <ian@cygnus.com>
+
+ * fixincludes: Fix signal prototype on SunOS to avoid pedantic C++
+ error.
+
+Mon Apr 1 16:16:34 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
+
+ * expr.c (get_inner_reference): When finding mode to access bitfield
+ that ends up properly aligned, use mode class of its type unless
+ type's mode was BLKmode.
+
+Mon Apr 1 13:45:30 1996 Jeffrey A. Law <law@cygnus.com>
+
+ * h8300.c (interrupt_handler): Renamed from pragma_interrupt.
+ All references changed.
+ (function_prologue): Set interrupt_handler if the current
+ function has the "interrrupt-handler" attribute.
+ (small_call_insn_operand): New function.
+ (h8300_interrrupt_function_p): New function.
+ (h8300_funcvec_function_p): New function.
+ (h8300_valid_machine_decl_attribute): New function.
+ * h8300.h (VALID_MACHINE_DECL_ATTRIBUTE): Define.
+ * h8300.md (call insns): Handle calls through the
+ function vector. Indirect calls and calls through
+ the function vector have a length of two bytes.
+
+See ChangeLog.10 for earlier changes.
+
+Use a consistent time stamp format in ChangeLog entries.
+Not everyone has Emacs 20 yet, so stick with Emacs 19 format for now.
+
+Local Variables:
+add-log-time-format: current-time-string
+End:
diff --git a/contrib/gcc/alias.c b/contrib/gcc/alias.c
index a84d894..c5a6265 100644
--- a/contrib/gcc/alias.c
+++ b/contrib/gcc/alias.c
@@ -728,6 +728,7 @@ find_base_value (src)
rtx src;
{
unsigned int regno;
+
switch (GET_CODE (src))
{
case SYMBOL_REF:
@@ -744,12 +745,12 @@ find_base_value (src)
return new_reg_base_value[regno];
/* If a pseudo has a known base value, return it. Do not do this
- for hard regs since it can result in a circular dependency
- chain for registers which have values at function entry.
+ for non-fixed hard regs since it can result in a circular
+ dependency chain for registers which have values at function entry.
The test above is not sufficient because the scheduler may move
a copy out of an arg reg past the NOTE_INSN_FUNCTION_BEGIN. */
- if (regno >= FIRST_PSEUDO_REGISTER
+ if ((regno >= FIRST_PSEUDO_REGISTER || fixed_regs[regno])
&& regno < reg_base_value_size
&& reg_base_value[regno])
return reg_base_value[regno];
@@ -846,8 +847,6 @@ find_base_value (src)
if (GET_MODE_SIZE (GET_MODE (src)) < GET_MODE_SIZE (Pmode))
break;
/* Fall through. */
- case ZERO_EXTEND:
- case SIGN_EXTEND: /* used for NT/Alpha pointers */
case HIGH:
case PRE_INC:
case PRE_DEC:
@@ -857,6 +856,19 @@ find_base_value (src)
case POST_MODIFY:
return find_base_value (XEXP (src, 0));
+ case ZERO_EXTEND:
+ case SIGN_EXTEND: /* used for NT/Alpha pointers */
+ {
+ rtx temp = find_base_value (XEXP (src, 0));
+
+#ifdef POINTERS_EXTEND_UNSIGNED
+ if (temp != 0 && CONSTANT_P (temp) && GET_MODE (temp) != Pmode)
+ temp = convert_memory_address (Pmode, temp);
+#endif
+
+ return temp;
+ }
+
default:
break;
}
@@ -1230,8 +1242,6 @@ find_base_term (x)
if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (Pmode))
return 0;
/* Fall through. */
- case ZERO_EXTEND:
- case SIGN_EXTEND: /* Used for Alpha/NT pointers */
case HIGH:
case PRE_INC:
case PRE_DEC:
@@ -1241,6 +1251,19 @@ find_base_term (x)
case POST_MODIFY:
return find_base_term (XEXP (x, 0));
+ case ZERO_EXTEND:
+ case SIGN_EXTEND: /* Used for Alpha/NT pointers */
+ {
+ rtx temp = find_base_term (XEXP (x, 0));
+
+#ifdef POINTERS_EXTEND_UNSIGNED
+ if (temp != 0 && CONSTANT_P (temp) && GET_MODE (temp) != Pmode)
+ temp = convert_memory_address (Pmode, temp);
+#endif
+
+ return temp;
+ }
+
case VALUE:
val = CSELIB_VAL_PTR (x);
for (l = val->locs; l; l = l->next)
@@ -1999,6 +2022,13 @@ true_dependence (mem, mem_mode, x, varies)
if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
return 1;
+ /* (mem:BLK (scratch)) is a special mechanism to conflict with everything.
+ This is used in epilogue deallocation functions. */
+ if (GET_MODE (x) == BLKmode && GET_CODE (XEXP (x, 0)) == SCRATCH)
+ return 1;
+ if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
+ return 1;
+
if (DIFFERENT_ALIAS_SETS_P (x, mem))
return 0;
@@ -2074,6 +2104,13 @@ canon_true_dependence (mem, mem_mode, mem_addr, x, varies)
if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
return 1;
+ /* (mem:BLK (scratch)) is a special mechanism to conflict with everything.
+ This is used in epilogue deallocation functions. */
+ if (GET_MODE (x) == BLKmode && GET_CODE (XEXP (x, 0)) == SCRATCH)
+ return 1;
+ if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
+ return 1;
+
if (DIFFERENT_ALIAS_SETS_P (x, mem))
return 0;
@@ -2133,6 +2170,13 @@ write_dependence_p (mem, x, writep)
if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
return 1;
+ /* (mem:BLK (scratch)) is a special mechanism to conflict with everything.
+ This is used in epilogue deallocation functions. */
+ if (GET_MODE (x) == BLKmode && GET_CODE (XEXP (x, 0)) == SCRATCH)
+ return 1;
+ if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
+ return 1;
+
if (DIFFERENT_ALIAS_SETS_P (x, mem))
return 0;
@@ -2253,6 +2297,7 @@ nonlocal_mentioned_p (x)
case CC0:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CONST:
case LABEL_REF:
return 0;
diff --git a/contrib/gcc/ansidecl.h b/contrib/gcc/ansidecl.h
index cdb9fb7..9a7c577 100644
--- a/contrib/gcc/ansidecl.h
+++ b/contrib/gcc/ansidecl.h
@@ -1,5 +1,6 @@
/* ANSI and traditional C compatability macros
- Copyright 1991, 1992, 1996 Free Software Foundation, Inc.
+ Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
This program is free software; you can redistribute it and/or modify
@@ -20,144 +21,275 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
ANSI C is assumed if __STDC__ is #defined.
- Macro ANSI C definition Traditional C definition
- ----- ---- - ---------- ----------- - ----------
- PTR `void *' `char *'
- LONG_DOUBLE `long double' `double'
- VOLATILE `volatile' `'
- SIGNED `signed' `'
- PTRCONST `void *const' `char *'
- ANSI_PROTOTYPES 1 not defined
-
- CONST is also defined, but is obsolete. Just use const.
-
- obsolete -- DEFUN (name, arglist, args)
-
- Defines function NAME.
-
- ARGLIST lists the arguments, separated by commas and enclosed in
- parentheses. ARGLIST becomes the argument list in traditional C.
-
- ARGS list the arguments with their types. It becomes a prototype in
- ANSI C, and the type declarations in traditional C. Arguments should
- be separated with `AND'. For functions with a variable number of
- arguments, the last thing listed should be `DOTS'.
-
- obsolete -- DEFUN_VOID (name)
-
- Defines a function NAME, which takes no arguments.
-
- obsolete -- EXFUN (name, (prototype)) -- obsolete.
-
- Replaced by PARAMS. Do not use; will disappear someday soon.
- Was used in external function declarations.
- In ANSI C it is `NAME PROTOTYPE' (so PROTOTYPE should be enclosed in
- parentheses). In traditional C it is `NAME()'.
- For a function that takes no arguments, PROTOTYPE should be `(void)'.
-
- obsolete -- PROTO (type, name, (prototype) -- obsolete.
-
- This one has also been replaced by PARAMS. Do not use.
-
- PARAMS ((args))
-
- We could use the EXFUN macro to handle prototype declarations, but
- the name is misleading and the result is ugly. So we just define a
- simple macro to handle the parameter lists, as in:
-
- static int foo PARAMS ((int, char));
-
- This produces: `static int foo();' or `static int foo (int, char);'
-
- EXFUN would have done it like this:
-
- static int EXFUN (foo, (int, char));
-
- but the function is not external...and it's hard to visually parse
- the function name out of the mess. EXFUN should be considered
- obsolete; new code should be written to use PARAMS.
-
- DOTS is also obsolete.
-
- Examples:
-
- extern int printf PARAMS ((const char *format, ...));
-*/
+ Macro ANSI C definition Traditional C definition
+ ----- ---- - ---------- ----------- - ----------
+ ANSI_PROTOTYPES 1 not defined
+ PTR `void *' `char *'
+ PTRCONST `void *const' `char *'
+ LONG_DOUBLE `long double' `double'
+ const not defined `'
+ volatile not defined `'
+ signed not defined `'
+ VA_START(ap, var) va_start(ap, var) va_start(ap)
+
+ Note that it is safe to write "void foo();" indicating a function
+ with no return value, in all K+R compilers we have been able to test.
+
+ For declaring functions with prototypes, we also provide these:
+
+ PARAMS ((prototype))
+ -- for functions which take a fixed number of arguments. Use this
+ when declaring the function. When defining the function, write a
+ K+R style argument list. For example:
+
+ char *strcpy PARAMS ((char *dest, char *source));
+ ...
+ char *
+ strcpy (dest, source)
+ char *dest;
+ char *source;
+ { ... }
+
+
+ VPARAMS ((prototype, ...))
+ -- for functions which take a variable number of arguments. Use
+ PARAMS to declare the function, VPARAMS to define it. For example:
+
+ int printf PARAMS ((const char *format, ...));
+ ...
+ int
+ printf VPARAMS ((const char *format, ...))
+ {
+ ...
+ }
+
+ For writing functions which take variable numbers of arguments, we
+ also provide the VA_OPEN, VA_CLOSE, and VA_FIXEDARG macros. These
+ hide the differences between K+R <varargs.h> and C89 <stdarg.h> more
+ thoroughly than the simple VA_START() macro mentioned above.
+
+ VA_OPEN and VA_CLOSE are used *instead of* va_start and va_end.
+ Immediately after VA_OPEN, put a sequence of VA_FIXEDARG calls
+ corresponding to the list of fixed arguments. Then use va_arg
+ normally to get the variable arguments, or pass your va_list object
+ around. You do not declare the va_list yourself; VA_OPEN does it
+ for you.
+
+ Here is a complete example:
+
+ int
+ printf VPARAMS ((const char *format, ...))
+ {
+ int result;
+
+ VA_OPEN (ap, format);
+ VA_FIXEDARG (ap, const char *, format);
+
+ result = vfprintf (stdout, format, ap);
+ VA_CLOSE (ap);
+
+ return result;
+ }
+
+
+ You can declare variables either before or after the VA_OPEN,
+ VA_FIXEDARG sequence. Also, VA_OPEN and VA_CLOSE are the beginning
+ and end of a block. They must appear at the same nesting level,
+ and any variables declared after VA_OPEN go out of scope at
+ VA_CLOSE. Unfortunately, with a K+R compiler, that includes the
+ argument list. You can have multiple instances of VA_OPEN/VA_CLOSE
+ pairs in a single function in case you need to traverse the
+ argument list more than once.
+
+ For ease of writing code which uses GCC extensions but needs to be
+ portable to other compilers, we provide the GCC_VERSION macro that
+ simplifies testing __GNUC__ and __GNUC_MINOR__ together, and various
+ wrappers around __attribute__. Also, __extension__ will be #defined
+ to nothing if it doesn't work. See below.
+
+ This header also defines a lot of obsolete macros:
+ CONST, VOLATILE, SIGNED, PROTO, EXFUN, DEFUN, DEFUN_VOID,
+ AND, DOTS, NOARGS. Don't use them. */
#ifndef _ANSIDECL_H
-
-#define _ANSIDECL_H 1
-
+#define _ANSIDECL_H 1
/* Every source file includes this file,
so they will all get the switch for lint. */
/* LINTLIBRARY */
+/* Using MACRO(x,y) in cpp #if conditionals does not work with some
+ older preprocessors. Thus we can't define something like this:
+
+#define HAVE_GCC_VERSION(MAJOR, MINOR) \
+ (__GNUC__ > (MAJOR) || (__GNUC__ == (MAJOR) && __GNUC_MINOR__ >= (MINOR)))
+
+and then test "#if HAVE_GCC_VERSION(2,7)".
+
+So instead we use the macro below and test it against specific values. */
+
+/* This macro simplifies testing whether we are using gcc, and if it
+ is of a particular minimum version. (Both major & minor numbers are
+ significant.) This macro will evaluate to 0 if we are not using
+ gcc at all. */
+#ifndef GCC_VERSION
+#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
+#endif /* GCC_VERSION */
#if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(_WIN32)
/* All known AIX compilers implement these things (but don't always
define __STDC__). The RISC/OS MIPS compiler defines these things
in SVR4 mode, but does not define __STDC__. */
-#define PTR void *
-#define PTRCONST void *CONST
-#define LONG_DOUBLE long double
-
-#ifndef IN_GCC
-#define AND ,
-#define NOARGS void
-#define VOLATILE volatile
-#define SIGNED signed
-#endif /* ! IN_GCC */
-
-#define PARAMS(paramlist) paramlist
-#define ANSI_PROTOTYPES 1
-
-#define VPARAMS(ARGS) ARGS
-#define VA_START(va_list,var) va_start(va_list,var)
+#define ANSI_PROTOTYPES 1
+#define PTR void *
+#define PTRCONST void *const
+#define LONG_DOUBLE long double
+
+#define PARAMS(ARGS) ARGS
+#define VPARAMS(ARGS) ARGS
+#define VA_START(VA_LIST, VAR) va_start(VA_LIST, VAR)
+
+/* variadic function helper macros */
+/* "struct Qdmy" swallows the semicolon after VA_OPEN/VA_FIXEDARG's
+ use without inhibiting further decls and without declaring an
+ actual variable. */
+#define VA_OPEN(AP, VAR) { va_list AP; va_start(AP, VAR); { struct Qdmy
+#define VA_CLOSE(AP) } va_end(AP); }
+#define VA_FIXEDARG(AP, T, N) struct Qdmy
+
+#undef const
+#undef volatile
+#undef signed
+
+/* inline requires special treatment; it's in C99, and GCC >=2.7 supports
+ it too, but it's not in C89. */
+#undef inline
+#if __STDC_VERSION__ > 199901L
+/* it's a keyword */
+#else
+# if GCC_VERSION >= 2007
+# define inline __inline__ /* __inline__ prevents -pedantic warnings */
+# else
+# define inline /* nothing */
+# endif
+#endif
/* These are obsolete. Do not use. */
#ifndef IN_GCC
-#define CONST const
-#define DOTS , ...
+#define CONST const
+#define VOLATILE volatile
+#define SIGNED signed
+
#define PROTO(type, name, arglist) type name arglist
#define EXFUN(name, proto) name proto
#define DEFUN(name, arglist, args) name(args)
#define DEFUN_VOID(name) name(void)
+#define AND ,
+#define DOTS , ...
+#define NOARGS void
#endif /* ! IN_GCC */
#else /* Not ANSI C. */
-#define PTR char *
-#define PTRCONST PTR
-#define LONG_DOUBLE double
-
-#ifndef IN_GCC
-#define AND ;
-#define NOARGS
-#define VOLATILE
-#define SIGNED
-#endif /* !IN_GCC */
-
-#ifndef const /* some systems define it in header files for non-ansi mode */
-#define const
-#endif
-
-#define PARAMS(paramlist) ()
-
-#define VPARAMS(ARGS) (va_alist) va_dcl
-#define VA_START(va_list,var) va_start(va_list)
+#undef ANSI_PROTOTYPES
+#define PTR char *
+#define PTRCONST PTR
+#define LONG_DOUBLE double
+
+#define PARAMS(args) ()
+#define VPARAMS(args) (va_alist) va_dcl
+#define VA_START(va_list, var) va_start(va_list)
+
+#define VA_OPEN(AP, VAR) { va_list AP; va_start(AP); { struct Qdmy
+#define VA_CLOSE(AP) } va_end(AP); }
+#define VA_FIXEDARG(AP, TYPE, NAME) TYPE NAME = va_arg(AP, TYPE)
+
+/* some systems define these in header files for non-ansi mode */
+#undef const
+#undef volatile
+#undef signed
+#undef inline
+#define const
+#define volatile
+#define signed
+#define inline
-/* These are obsolete. Do not use. */
#ifndef IN_GCC
#define CONST
-#define DOTS
+#define VOLATILE
+#define SIGNED
+
#define PROTO(type, name, arglist) type name ()
#define EXFUN(name, proto) name()
#define DEFUN(name, arglist, args) name arglist args;
#define DEFUN_VOID(name) name()
+#define AND ;
+#define DOTS
+#define NOARGS
#endif /* ! IN_GCC */
#endif /* ANSI C. */
+/* Define macros for some gcc attributes. This permits us to use the
+ macros freely, and know that they will come into play for the
+ version of gcc in which they are supported. */
+
+#if (GCC_VERSION < 2007)
+# define __attribute__(x)
+#endif
+
+/* Attribute __malloc__ on functions was valid as of gcc 2.96. */
+#ifndef ATTRIBUTE_MALLOC
+# if (GCC_VERSION >= 2096)
+# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+# define ATTRIBUTE_MALLOC
+# endif /* GNUC >= 2.96 */
+#endif /* ATTRIBUTE_MALLOC */
+
+/* Attributes on labels were valid as of gcc 2.93. */
+#ifndef ATTRIBUTE_UNUSED_LABEL
+# if (GCC_VERSION >= 2093)
+# define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED
+# else
+# define ATTRIBUTE_UNUSED_LABEL
+# endif /* GNUC >= 2.93 */
+#endif /* ATTRIBUTE_UNUSED_LABEL */
+
+#ifndef ATTRIBUTE_UNUSED
+#define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#endif /* ATTRIBUTE_UNUSED */
+
+#ifndef ATTRIBUTE_NORETURN
+#define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
+#endif /* ATTRIBUTE_NORETURN */
+
+#ifndef ATTRIBUTE_PRINTF
+#define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n)))
+#define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2)
+#define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3)
+#define ATTRIBUTE_PRINTF_3 ATTRIBUTE_PRINTF(3, 4)
+#define ATTRIBUTE_PRINTF_4 ATTRIBUTE_PRINTF(4, 5)
+#define ATTRIBUTE_PRINTF_5 ATTRIBUTE_PRINTF(5, 6)
+#endif /* ATTRIBUTE_PRINTF */
+
+/* We use __extension__ in some places to suppress -pedantic warnings
+ about GCC extensions. This feature didn't work properly before
+ gcc 2.8. */
+#if GCC_VERSION < 2008
+#define __extension__
+#endif
+
+/* Bootstrap support: Adjust certain macros defined by Autoconf,
+ which are only valid for the stage1 compiler. If we detect
+ a modern version of GCC, we are probably in stage2 or beyond,
+ so unconditionally reset the values. Note that const, inline,
+ etc. have been dealt with above. */
+#if (GCC_VERSION >= 2007)
+# ifndef HAVE_LONG_DOUBLE
+# define HAVE_LONG_DOUBLE 1
+# endif
+#endif /* GCC >= 2.7 */
+
#endif /* ansidecl.h */
diff --git a/contrib/gcc/attribs.c b/contrib/gcc/attribs.c
index 7cb1172..b915c88 100644
--- a/contrib/gcc/attribs.c
+++ b/contrib/gcc/attribs.c
@@ -51,6 +51,8 @@ static tree handle_noreturn_attribute PARAMS ((tree *, tree, tree, int,
bool *));
static tree handle_noinline_attribute PARAMS ((tree *, tree, tree, int,
bool *));
+static tree handle_always_inline_attribute PARAMS ((tree *, tree, tree, int,
+ bool *));
static tree handle_used_attribute PARAMS ((tree *, tree, tree, int,
bool *));
static tree handle_unused_attribute PARAMS ((tree *, tree, tree, int,
@@ -109,6 +111,8 @@ static const struct attribute_spec c_common_attribute_table[] =
handle_noreturn_attribute },
{ "noinline", 0, 0, true, false, false,
handle_noinline_attribute },
+ { "always_inline", 0, 0, true, false, false,
+ handle_always_inline_attribute },
{ "used", 0, 0, true, false, false,
handle_used_attribute },
{ "unused", 0, 0, false, false, false,
@@ -382,7 +386,9 @@ decl_attributes (node, attributes, flags)
/* Layout the decl in case anything changed. */
if (spec->type_required && DECL_P (*node)
- && TREE_CODE (*node) == VAR_DECL)
+ && (TREE_CODE (*node) == VAR_DECL
+ || TREE_CODE (*node) == PARM_DECL
+ || TREE_CODE (*node) == RESULT_DECL))
{
/* Force a recalculation of mode and size. */
DECL_MODE (*node) = VOIDmode;
@@ -563,6 +569,31 @@ handle_noinline_attribute (node, name, args, flags, no_add_attrs)
return NULL_TREE;
}
+/* Handle a "always_inline" attribute; arguments as in
+ struct attribute_spec.handler. */
+
+static tree
+handle_always_inline_attribute (node, name, args, flags, no_add_attrs)
+ tree *node;
+ tree name;
+ tree args ATTRIBUTE_UNUSED;
+ int flags ATTRIBUTE_UNUSED;
+ bool *no_add_attrs;
+{
+ if (TREE_CODE (*node) == FUNCTION_DECL)
+ {
+ /* Do nothing else, just set the attribute. We'll get at
+ it later with lookup_attribute. */
+ }
+ else
+ {
+ warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
+ *no_add_attrs = true;
+ }
+
+ return NULL_TREE;
+}
+
/* Handle a "used" attribute; arguments as in
struct attribute_spec.handler. */
@@ -1431,3 +1462,4 @@ strip_attrs (specs_attrs)
return specs;
}
+
diff --git a/contrib/gcc/basic-block.h b/contrib/gcc/basic-block.h
index 1bc1d78..f5bbd26 100644
--- a/contrib/gcc/basic-block.h
+++ b/contrib/gcc/basic-block.h
@@ -1,5 +1,5 @@
/* Define control and data flow tables, and regsets.
- Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001
+ Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
This file is part of GCC.
@@ -311,6 +311,7 @@ extern void redirect_edge_pred PARAMS ((edge, basic_block));
extern basic_block create_basic_block_structure PARAMS ((int, rtx, rtx, rtx));
extern basic_block create_basic_block PARAMS ((int, rtx, rtx));
extern int flow_delete_block PARAMS ((basic_block));
+extern int flow_delete_block_noexpunge PARAMS ((basic_block));
extern void merge_blocks_nomove PARAMS ((basic_block, basic_block));
extern void tidy_fallthru_edge PARAMS ((edge, basic_block,
basic_block));
@@ -629,6 +630,7 @@ extern void debug_regset PARAMS ((regset));
extern void allocate_reg_life_data PARAMS ((void));
extern void allocate_bb_life_data PARAMS ((void));
extern void expunge_block PARAMS ((basic_block));
+extern void expunge_block_nocompact PARAMS ((basic_block));
extern basic_block alloc_block PARAMS ((void));
extern void find_unreachable_blocks PARAMS ((void));
extern void delete_noop_moves PARAMS ((rtx));
@@ -689,6 +691,7 @@ extern conflict_graph conflict_graph_compute
partition));
extern bool mark_dfs_back_edges PARAMS ((void));
extern void update_br_prob_note PARAMS ((basic_block));
+extern void fixup_abnormal_edges PARAMS ((void));
/* In dominance.c */
diff --git a/contrib/gcc/bb-reorder.c b/contrib/gcc/bb-reorder.c
index 97ad142..2578604 100644
--- a/contrib/gcc/bb-reorder.c
+++ b/contrib/gcc/bb-reorder.c
@@ -1,5 +1,5 @@
/* Basic block reordering routines for the GNU compiler.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2002 Free Software Foundation, Inc.
This file is part of GCC.
@@ -89,6 +89,7 @@
#include "flags.h"
#include "output.h"
#include "cfglayout.h"
+#include "target.h"
/* Local function prototypes. */
static void make_reorder_chain PARAMS ((void));
@@ -260,6 +261,9 @@ reorder_basic_blocks ()
if (n_basic_blocks <= 1)
return;
+ if ((* targetm.cannot_modify_jumps_p) ())
+ return;
+
cfg_layout_initialize ();
make_reorder_chain ();
diff --git a/contrib/gcc/builtins.c b/contrib/gcc/builtins.c
index e3adb05..7eb878f7 100644
--- a/contrib/gcc/builtins.c
+++ b/contrib/gcc/builtins.c
@@ -2991,37 +2991,54 @@ rtx
std_expand_builtin_va_arg (valist, type)
tree valist, type;
{
- tree addr_tree, t;
- HOST_WIDE_INT align;
- HOST_WIDE_INT rounded_size;
+ tree addr_tree, t, type_size = NULL;
+ tree align, alignm1;
+ tree rounded_size;
rtx addr;
/* Compute the rounded size of the type. */
- align = PARM_BOUNDARY / BITS_PER_UNIT;
- rounded_size = (((int_size_in_bytes (type) + align - 1) / align) * align);
+ align = size_int (PARM_BOUNDARY / BITS_PER_UNIT);
+ alignm1 = size_int (PARM_BOUNDARY / BITS_PER_UNIT - 1);
+ if (type == error_mark_node
+ || (type_size = TYPE_SIZE_UNIT (TYPE_MAIN_VARIANT (type))) == NULL
+ || TREE_OVERFLOW (type_size))
+ rounded_size = size_zero_node;
+ else
+ rounded_size = fold (build (MULT_EXPR, sizetype,
+ fold (build (TRUNC_DIV_EXPR, sizetype,
+ fold (build (PLUS_EXPR, sizetype,
+ type_size, alignm1)),
+ align)),
+ align));
/* Get AP. */
addr_tree = valist;
- if (PAD_VARARGS_DOWN)
+ if (PAD_VARARGS_DOWN && ! integer_zerop (rounded_size))
{
/* Small args are padded downward. */
-
- HOST_WIDE_INT adj
- = rounded_size > align ? rounded_size : int_size_in_bytes (type);
-
- addr_tree = build (PLUS_EXPR, TREE_TYPE (addr_tree), addr_tree,
- build_int_2 (rounded_size - adj, 0));
+ addr_tree = fold (build (PLUS_EXPR, TREE_TYPE (addr_tree), addr_tree,
+ fold (build (COND_EXPR, sizetype,
+ fold (build (GT_EXPR, sizetype,
+ rounded_size,
+ align)),
+ size_zero_node,
+ fold (build (MINUS_EXPR, sizetype,
+ rounded_size,
+ type_size))))));
}
addr = expand_expr (addr_tree, NULL_RTX, Pmode, EXPAND_NORMAL);
addr = copy_to_reg (addr);
/* Compute new value for AP. */
- t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
- build (PLUS_EXPR, TREE_TYPE (valist), valist,
- build_int_2 (rounded_size, 0)));
- TREE_SIDE_EFFECTS (t) = 1;
- expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+ if (! integer_zerop (rounded_size))
+ {
+ t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
+ build (PLUS_EXPR, TREE_TYPE (valist), valist,
+ rounded_size));
+ TREE_SIDE_EFFECTS (t) = 1;
+ expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+ }
return addr;
}
@@ -3064,7 +3081,7 @@ expand_builtin_va_arg (valist, type)
else if ((promoted_type = (*lang_type_promotes_to) (type)) != NULL_TREE)
{
const char *name = "<anonymous type>", *pname = 0;
- static int gave_help;
+ static bool gave_help;
if (TYPE_NAME (type))
{
@@ -3083,13 +3100,24 @@ expand_builtin_va_arg (valist, type)
pname = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (promoted_type)));
}
- error ("`%s' is promoted to `%s' when passed through `...'", name, pname);
+ /* 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. */
+ warning ("`%s' is promoted to `%s' when passed through `...'",
+ name, pname);
if (! gave_help)
{
- gave_help = 1;
- error ("(so you should pass `%s' not `%s' to `va_arg')", pname, name);
+ gave_help = true;
+ warning ("(so you should pass `%s' not `%s' to `va_arg')",
+ pname, name);
}
+ /* We can, however, treat "undefined" any way we please.
+ Call abort to encourage the user to fix the program. */
+ expand_builtin_trap ();
+
+ /* This is dead code, but go ahead and finish so that the
+ mode of the result comes out right. */
addr = const0_rtx;
}
else
@@ -3541,6 +3569,18 @@ expand_builtin_expect_jump (exp, if_false_label, if_true_label)
return ret;
}
+
+void
+expand_builtin_trap ()
+{
+#ifdef HAVE_trap
+ if (HAVE_trap)
+ emit_insn (gen_trap ());
+ else
+#endif
+ emit_library_call (abort_libfunc, LCT_NORETURN, VOIDmode, 0);
+ emit_barrier ();
+}
/* Expand an expression EXP that calls a built-in function,
with result going to TARGET if that's convenient
@@ -3875,13 +3915,7 @@ expand_builtin (exp, target, subtarget, mode, ignore)
}
case BUILT_IN_TRAP:
-#ifdef HAVE_trap
- if (HAVE_trap)
- emit_insn (gen_trap ());
- else
-#endif
- error ("__builtin_trap not supported by this target");
- emit_barrier ();
+ expand_builtin_trap ();
return const0_rtx;
case BUILT_IN_PUTCHAR:
diff --git a/contrib/gcc/c-common.def b/contrib/gcc/c-common.def
index d59a151..7ad9e38 100644
--- a/contrib/gcc/c-common.def
+++ b/contrib/gcc/c-common.def
@@ -71,8 +71,8 @@ DEFTREECODE (BREAK_STMT, "break_stmt", 'e', 0)
DEFTREECODE (CONTINUE_STMT, "continue_stmt", 'e', 0)
/* Used to represent a 'switch' statement. The operands are
- SWITCH_COND and SWITCH_BODY, respectively. */
-DEFTREECODE (SWITCH_STMT, "switch_stmt", 'e', 2)
+ SWITCH_COND, SWITCH_BODY and SWITCH_TYPE, respectively. */
+DEFTREECODE (SWITCH_STMT, "switch_stmt", 'e', 3)
/* Used to represent a 'goto' statement. The operand is GOTO_DESTINATION. */
DEFTREECODE (GOTO_STMT, "goto_stmt", 'e', 1)
@@ -113,6 +113,11 @@ DEFTREECODE (STMT_EXPR, "stmt_expr", 'e', 1)
the compound literal. */
DEFTREECODE (COMPOUND_LITERAL_EXPR, "compound_literal_expr", 'e', 1)
+/* A CLEANUP_STMT marks the point at which a declaration is fully
+ constructed. If, after this point, the CLEANUP_DECL goes out of
+ scope, the CLEANUP_EXPR must be run. */
+DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", 'e', 2)
+
/*
Local variables:
mode:c
diff --git a/contrib/gcc/c-common.h b/contrib/gcc/c-common.h
index 3aaa513..df74f2e 100644
--- a/contrib/gcc/c-common.h
+++ b/contrib/gcc/c-common.h
@@ -33,6 +33,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
DECL_PRETTY_FUNCTION_P (in VAR_DECL)
NEW_FOR_SCOPE_P (in FOR_STMT)
ASM_INPUT_P (in ASM_STMT)
+ STMT_EXPR_NO_SCOPE (in STMT_EXPR)
1: C_DECLARED_LABEL_FLAG (in LABEL_DECL)
STMT_IS_FULL_EXPR_P (in _STMT)
2: STMT_LINENO_FOR_FN_P (in _STMT)
@@ -538,6 +539,7 @@ extern char *get_directive_line PARAMS ((void));
and, if so, perhaps change them both back to their original type. */
extern tree shorten_compare PARAMS ((tree *, tree *, tree *, enum tree_code *));
+extern tree pointer_int_sum PARAMS ((enum tree_code, tree, tree));
extern unsigned int min_precision PARAMS ((tree, int));
/* Add qualifiers to a type, in the fashion for C. */
@@ -603,10 +605,12 @@ extern tree strip_array_types PARAMS ((tree));
#define FOR_EXPR(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 2)
#define FOR_BODY(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 3)
-/* SWITCH_STMT accessors. These give access to the condition and body
+/* SWITCH_STMT accessors. These give access to the condition, body and
+ original condition type (before any compiler conversions)
of the switch statement, respectively. */
#define SWITCH_COND(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 0)
#define SWITCH_BODY(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 1)
+#define SWITCH_TYPE(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 2)
/* CASE_LABEL accessors. These give access to the high and low values
of a case label, respectively. */
@@ -643,6 +647,10 @@ extern tree strip_array_types PARAMS ((tree));
/* STMT_EXPR accessor. */
#define STMT_EXPR_STMT(NODE) TREE_OPERAND (STMT_EXPR_CHECK (NODE), 0)
+/* Nonzero if this statement-expression does not have an associated scope. */
+#define STMT_EXPR_NO_SCOPE(NODE) \
+ TREE_LANG_FLAG_0 (STMT_EXPR_CHECK (NODE))
+
/* LABEL_STMT accessor. This gives access to the label associated with
the given label statement. */
#define LABEL_STMT_LABEL(NODE) TREE_OPERAND (LABEL_STMT_CHECK (NODE), 0)
@@ -694,6 +702,13 @@ extern tree strip_array_types PARAMS ((tree));
#define ASM_VOLATILE_P(NODE) \
(ASM_CV_QUAL (ASM_STMT_CHECK (NODE)) != NULL_TREE)
+/* The VAR_DECL to clean up in a CLEANUP_STMT. */
+#define CLEANUP_DECL(NODE) \
+ TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 0)
+/* The cleanup to run in a CLEANUP_STMT. */
+#define CLEANUP_EXPR(NODE) \
+ TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 1)
+
/* The filename we are changing to as of this FILE_STMT. */
#define FILE_STMT_FILENAME_NODE(NODE) \
(TREE_OPERAND (FILE_STMT_CHECK (NODE), 0))
@@ -749,7 +764,7 @@ extern void genrtl_compound_stmt PARAMS ((tree));
extern void genrtl_asm_stmt PARAMS ((tree, tree,
tree, tree,
tree, int));
-extern void genrtl_decl_cleanup PARAMS ((tree, tree));
+extern void genrtl_decl_cleanup PARAMS ((tree));
extern int stmts_are_full_exprs_p PARAMS ((void));
extern int anon_aggr_type_p PARAMS ((tree));
diff --git a/contrib/gcc/c-decl.c b/contrib/gcc/c-decl.c
index 4153f50..2628257 100644
--- a/contrib/gcc/c-decl.c
+++ b/contrib/gcc/c-decl.c
@@ -46,6 +46,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "debug.h"
#include "timevar.h"
#include "c-common.h"
+#include "c-pragma.h"
/* In grokdeclarator, distinguish syntactic contexts of declarators. */
enum decl_context
@@ -53,6 +54,7 @@ enum decl_context
FUNCDEF, /* Function definition */
PARM, /* Declaration of parm before function body */
FIELD, /* Declaration inside struct or union */
+ BITFIELD, /* Likewise but with specified width */
TYPENAME}; /* Typename (inside cast or sizeof) */
@@ -133,6 +135,11 @@ int current_function_returns_value;
int current_function_returns_null;
+/* Set to 0 at beginning of a function definition, set to 1 if
+ a call to a noreturn function is seen. */
+
+int current_function_returns_abnormally;
+
/* Set to nonzero by `grokdeclarator' for a function
whose return type is defaulted, if warnings for this are desired. */
@@ -275,13 +282,12 @@ static tree lookup_tag PARAMS ((enum tree_code, tree,
struct binding_level *, int));
static tree lookup_tag_reverse PARAMS ((tree));
static tree grokdeclarator PARAMS ((tree, tree, enum decl_context,
- int, tree));
+ int));
static tree grokparms PARAMS ((tree, int));
static void layout_array_type PARAMS ((tree));
static tree c_make_fname_decl PARAMS ((tree, int));
static void c_expand_body PARAMS ((tree, int, int));
static void warn_if_shadowing PARAMS ((tree, tree));
-static tree build_bitfield_integer_type PARAMS ((tree, tree, const char *));
/* C-specific option variables. */
@@ -319,7 +325,7 @@ int flag_noniso_default_format_attributes = 1;
being traditional. */
int flag_allow_single_precision = 0;
-/* Nonzero means to treat bit-fields as signed unless they say `unsigned'. */
+/* Nonzero means to treat bitfields as signed unless they say `unsigned'. */
int flag_signed_bitfields = 1;
int explicit_flag_signed_bitfields = 0;
@@ -1543,6 +1549,22 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
if (! different_binding_level)
TREE_TYPE (olddecl) = oldtype;
}
+ else if (TYPE_ARG_TYPES (oldtype) == NULL
+ && TYPE_ARG_TYPES (newtype) != NULL)
+ {
+ /* For bcmp, bzero, fputs the builtin type has arguments not
+ specified. Use the ones from the prototype so that type checking
+ is done for them. */
+ tree trytype
+ = build_function_type (TREE_TYPE (oldtype),
+ TYPE_ARG_TYPES (newtype));
+ trytype = build_type_attribute_variant (trytype,
+ TYPE_ATTRIBUTES (oldtype));
+
+ oldtype = trytype;
+ if (! different_binding_level)
+ TREE_TYPE (olddecl) = oldtype;
+ }
if (!types_match)
{
/* If types don't match for a built-in, throw away the built-in. */
@@ -1669,6 +1691,7 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
&& current_binding_level == global_binding_level)
? "`%s' previously defined here"
: "`%s' previously declared here"));
+ return 0;
}
else if (TREE_CODE (newdecl) == TYPE_DECL
&& (DECL_IN_SYSTEM_HEADER (olddecl)
@@ -1932,7 +1955,8 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
}
/* Merge the storage class information. */
- DECL_WEAK (newdecl) |= DECL_WEAK (olddecl);
+ merge_weak (newdecl, olddecl);
+
/* For functions, static overrides non-static. */
if (TREE_CODE (newdecl) == FUNCTION_DECL)
{
@@ -2177,11 +2201,13 @@ pushdecl (x)
not errors. X11 for instance depends on this. */
if (! t && DECL_EXTERNAL (x) && TREE_PUBLIC (x) && ! flag_traditional)
{
- t = lookup_name (name);
+ t = IDENTIFIER_GLOBAL_VALUE (name);
/* Type decls at global scope don't conflict with externs declared
inside lexical blocks. */
- if (t && TREE_CODE (t) == TYPE_DECL)
- t = 0;
+ if (! t || TREE_CODE (t) == TYPE_DECL)
+ /* If there's no visible global declaration, try for an
+ invisible one. */
+ t = IDENTIFIER_LIMBO_VALUE (name);
different_binding_level = 1;
}
if (t != 0 && t == error_mark_node)
@@ -3053,8 +3079,7 @@ c_init_decl_processing ()
boolean_true_node = integer_one_node;
boolean_false_node = integer_zero_node;
- /* With GCC, C99's _Bool is always of size 1. */
- c_bool_type_node = make_unsigned_type (CHAR_TYPE_SIZE);
+ c_bool_type_node = make_unsigned_type (BOOL_TYPE_SIZE);
TREE_SET_CODE (c_bool_type_node, BOOLEAN_TYPE);
TYPE_MAX_VALUE (c_bool_type_node) = build_int_2 (1, 0);
TREE_TYPE (TYPE_MAX_VALUE (c_bool_type_node)) = c_bool_type_node;
@@ -3214,6 +3239,10 @@ builtin_function (name, type, function_code, class, library_name)
DECL_BUILT_IN_CLASS (decl) = class;
DECL_FUNCTION_CODE (decl) = function_code;
+ /* The return builtins leave the current function. */
+ if (function_code == BUILT_IN_RETURN || function_code == BUILT_IN_EH_RETURN)
+ TREE_THIS_VOLATILE (decl) = 1;
+
/* Warn if a function in the namespace for users
is used without an occasion to consider it declared. */
if (name[0] != '_' || name[1] != '_')
@@ -3390,8 +3419,7 @@ groktypename (typename)
split_specs_attrs (TREE_PURPOSE (typename), &specs, &attrs);
- typename = grokdeclarator (TREE_VALUE (typename), specs, TYPENAME, 0,
- NULL_TREE);
+ typename = grokdeclarator (TREE_VALUE (typename), specs, TYPENAME, 0);
/* Apply attributes. */
decl_attributes (&typename, attrs, 0);
@@ -3409,7 +3437,7 @@ groktypename_in_parm_context (typename)
return typename;
return grokdeclarator (TREE_VALUE (typename),
TREE_PURPOSE (typename),
- PARM, 0, NULL_TREE);
+ PARM, 0);
}
/* Decode a declarator in an ordinary declaration or data definition.
@@ -3442,7 +3470,7 @@ start_decl (declarator, declspecs, initialized, attributes)
deprecated_state = DEPRECATED_SUPPRESS;
decl = grokdeclarator (declarator, declspecs,
- NORMAL, initialized, NULL_TREE);
+ NORMAL, initialized);
deprecated_state = DEPRECATED_NORMAL;
@@ -3551,6 +3579,10 @@ start_decl (declarator, declspecs, initialized, attributes)
/* Set attributes here so if duplicate decl, will have proper attributes. */
decl_attributes (&decl, attributes, 0);
+ /* If #pragma weak was used, mark the decl weak now. */
+ if (current_binding_level == global_binding_level)
+ maybe_apply_pragma_weak (decl);
+
if (TREE_CODE (decl) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (decl)
&& DECL_UNINLINABLE (decl)
@@ -3596,6 +3628,8 @@ finish_decl (decl, init, asmspec_tree)
const char *asmspec = 0;
/* If a name was specified, get the string. */
+ if (current_binding_level == global_binding_level)
+ asmspec_tree = maybe_apply_renaming_pragma (decl, asmspec_tree);
if (asmspec_tree)
asmspec = TREE_STRING_POINTER (asmspec_tree);
@@ -3820,8 +3854,7 @@ push_parm_decl (parm)
immediate_size_expand = 0;
decl = grokdeclarator (TREE_VALUE (TREE_PURPOSE (parm)),
- TREE_PURPOSE (TREE_PURPOSE (parm)),
- PARM, 0, NULL_TREE);
+ TREE_PURPOSE (TREE_PURPOSE (parm)), PARM, 0);
decl_attributes (&decl, TREE_VALUE (parm), 0);
#if 0
@@ -3981,92 +4014,6 @@ complete_array_type (type, initial_value, do_default)
return value;
}
-/* A bit-field NAME should have an integer type whose precision
- accurately reflects its WIDTH. If TYPE is good for that, return
- it, otherwise create and return the appropriate type.
-
- This routine also performs sanity checks on the bit-field's type
- and width, and uses appropriate values if they are invalid. */
-static tree
-build_bitfield_integer_type (type, width, orig_name)
- tree type, width;
- const char *orig_name;
-{
- tree type_mv;
- unsigned int max_width;
- unsigned HOST_WIDE_INT w;
- const char *name = orig_name ? orig_name: _("<anonymous>");
-
- /* Necessary? */
- STRIP_NOPS (width);
-
- /* Detect and ignore out of range field width and process valid
- field widths. */
- if (TREE_CODE (width) != INTEGER_CST)
- {
- error ("bit-field `%s' width not an integer constant", name);
- width = integer_one_node;
- }
- else
- {
- constant_expression_warning (width);
- if (tree_int_cst_sgn (width) < 0)
- {
- error ("negative width in bit-field `%s'", name);
- width = integer_one_node;
- }
- else if (integer_zerop (width) && orig_name)
- {
- error ("zero width for bit-field `%s'", name);
- width = integer_one_node;
- }
- }
-
- /* Detect invalid bit-field type. */
- if (TREE_CODE (type) != INTEGER_TYPE
- && TREE_CODE (type) != BOOLEAN_TYPE
- && TREE_CODE (type) != ENUMERAL_TYPE)
- {
- error ("bit-field `%s' has invalid type", name);
- type = unsigned_type_node;
- }
-
- type_mv = TYPE_MAIN_VARIANT (type);
- if (pedantic
- && type_mv != integer_type_node
- && type_mv != unsigned_type_node
- && type_mv != c_bool_type_node
- /* Accept an enum that's equivalent to int or unsigned int. */
- && (TREE_CODE (type) != ENUMERAL_TYPE
- || TYPE_PRECISION (type) != TYPE_PRECISION (integer_type_node)))
- pedwarn ("type of bit-field `%s' is a GCC extension", name);
-
- if (type_mv == c_bool_type_node)
- max_width = CHAR_TYPE_SIZE;
- else
- max_width = TYPE_PRECISION (type);
-
- if (0 < compare_tree_int (width, max_width))
- {
- error ("width of `%s' exceeds its type", name);
- w = max_width;
- }
- else
- w = tree_low_cst (width, 1);
-
- if (TREE_CODE (type) == ENUMERAL_TYPE
- && (w < min_precision (TYPE_MIN_VALUE (type), TREE_UNSIGNED (type))
- || w < min_precision (TYPE_MAX_VALUE (type), TREE_UNSIGNED (type))))
- warning ("`%s' is narrower than values of its type", name);
-
- /* The type of a bit-field should have precision the same as the
- bit-field's width. */
- if (w != TYPE_PRECISION (type))
- type = build_nonstandard_integer_type (w, TREE_UNSIGNED (type));
-
- return type;
-}
-
/* Given declspecs and a declarator,
determine the name and type of the object declared
and construct a ..._DECL node for it.
@@ -4086,9 +4033,8 @@ build_bitfield_integer_type (type, width, orig_name)
TYPENAME if for a typename (in a cast or sizeof).
Don't make a DECL node; just return the ..._TYPE node.
FIELD for a struct or union field; make a FIELD_DECL.
+ BITFIELD for a field with specified width.
INITIALIZED is 1 if the decl has an initializer.
- WIDTH is non-NULL for bit-fields, and is an INTEGER_CST node representing
- the width of the bit-field.
In the TYPENAME case, DECLARATOR is really an absolute declarator.
It may also be so in the PARM case, for a prototype where the
@@ -4098,12 +4044,11 @@ build_bitfield_integer_type (type, width, orig_name)
and `extern' are interpreted. */
static tree
-grokdeclarator (declarator, declspecs, decl_context, initialized, width)
+grokdeclarator (declarator, declspecs, decl_context, initialized)
tree declspecs;
tree declarator;
enum decl_context decl_context;
int initialized;
- tree width;
{
int specbits = 0;
tree spec;
@@ -4118,16 +4063,19 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
int explicit_char = 0;
int defaulted_int = 0;
tree typedef_decl = 0;
- const char *name, *orig_name;
+ const char *name;
tree typedef_type = 0;
int funcdef_flag = 0;
enum tree_code innermost_code = ERROR_MARK;
+ int bitfield = 0;
int size_varies = 0;
tree decl_attr = NULL_TREE;
tree array_ptr_quals = NULL_TREE;
int array_parm_static = 0;
tree returned_attrs = NULL_TREE;
- bool bitfield = width != NULL_TREE;
+
+ if (decl_context == BITFIELD)
+ bitfield = 1, decl_context = FIELD;
if (decl_context == FUNCDEF)
funcdef_flag = 1, decl_context = NORMAL;
@@ -4160,7 +4108,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
default:
abort ();
}
- orig_name = name;
if (name == 0)
name = "type name";
}
@@ -4377,9 +4324,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
}
/* Decide whether an integer type is signed or not.
- Optionally treat bit-fields as signed by default. */
+ Optionally treat bitfields as signed by default. */
if (specbits & 1 << (int) RID_UNSIGNED
- /* Traditionally, all bit-fields are unsigned. */
+ /* Traditionally, all bitfields are unsigned. */
|| (bitfield && flag_traditional
&& (! explicit_flag_signed_bitfields || !flag_signed_bitfields))
|| (bitfield && ! flag_signed_bitfields
@@ -4452,11 +4399,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
}
}
- /* A bit-field needs its type to have precision equal to its width,
- rather than the precision of the specified standard type. */
- if (bitfield)
- type = build_bitfield_integer_type (type, width, orig_name);
-
/* Figure out the type qualifiers for the declaration. There are
two ways a declaration can become qualified. One is something
like `const int i' where the `const' is explicit. Another is
@@ -4602,9 +4544,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
if (inner_decl == NULL_TREE
|| TREE_CODE (inner_decl) == IDENTIFIER_NODE)
attr_flags |= (int) ATTR_FLAG_DECL_NEXT;
- if (TREE_CODE (inner_decl) == CALL_EXPR)
+ else if (TREE_CODE (inner_decl) == CALL_EXPR)
attr_flags |= (int) ATTR_FLAG_FUNCTION_NEXT;
- if (TREE_CODE (inner_decl) == ARRAY_REF)
+ else if (TREE_CODE (inner_decl) == ARRAY_REF)
attr_flags |= (int) ATTR_FLAG_ARRAY_NEXT;
returned_attrs = decl_attributes (&type,
chainon (returned_attrs, attrs),
@@ -4723,10 +4665,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
}
else if (decl_context == FIELD)
{
- /* ??? Need to check somewhere that this is a structure
- and not a union, that this field is last, and that
- this structure has at least one other named member. */
-
if (pedantic && !flag_isoc99 && !in_system_header)
pedwarn ("ISO C89 does not support flexible array members");
@@ -5106,6 +5044,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
else if (decl_context == FIELD)
{
/* Structure field. It may not be a function. */
+
if (TREE_CODE (type) == FUNCTION_TYPE)
{
error ("field `%s' declared as a function", name);
@@ -5129,29 +5068,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
#endif
}
decl = build_decl (FIELD_DECL, declarator, type);
- if (bitfield)
- {
- DECL_SIZE (decl) = bitsize_int (TYPE_PRECISION (type));
- DECL_BIT_FIELD (decl) = 1;
- SET_DECL_C_BIT_FIELD (decl);
-
- /* Bit-field width 0 => force desired amount of alignment. */
- if (TYPE_PRECISION (type) == 0)
- {
-#ifdef EMPTY_FIELD_BOUNDARY
- DECL_ALIGN (decl) = MAX (DECL_ALIGN (decl),
- EMPTY_FIELD_BOUNDARY);
-#endif
-#ifdef PCC_BITFIELD_TYPE_MATTERS
- if (PCC_BITFIELD_TYPE_MATTERS)
- {
- DECL_ALIGN (decl) = MAX (DECL_ALIGN (decl),
- TYPE_ALIGN (type));
- DECL_USER_ALIGN (decl) |= TYPE_USER_ALIGN (type);
- }
-#endif
- }
- }
DECL_NONADDRESSABLE_P (decl) = bitfield;
if (size_varies)
@@ -5201,6 +5117,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
TREE_PUBLIC (decl)
= !(specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_AUTO)));
+ if (defaulted_int)
+ C_FUNCTION_IMPLICIT_INT (decl) = 1;
+
/* Record presence of `inline', if it is reasonable. */
if (MAIN_NAME_P (declarator))
{
@@ -5654,7 +5573,7 @@ start_struct (code, name)
/* Process the specs, declarator (NULL if omitted) and width (NULL if omitted)
of a structure component, returning a FIELD_DECL node.
- WIDTH is non-NULL for bit-fields only, and is an INTEGER_CST node.
+ WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node.
This is done during the parsing of the struct declaration.
The FIELD_DECL nodes are chained together and the lot of them
@@ -5680,9 +5599,10 @@ grokfield (filename, line, declarator, declspecs, width)
}
}
- value = grokdeclarator (declarator, declspecs, FIELD, 0, width);
+ value = grokdeclarator (declarator, declspecs, width ? BITFIELD : FIELD, 0);
finish_decl (value, NULL_TREE, NULL_TREE);
+ DECL_INITIAL (value) = width;
maybe_objc_check_decl (value);
return value;
@@ -5734,7 +5654,10 @@ finish_struct (t, fieldlist, attributes)
fieldlist ? _("named members") : _("members"));
}
- /* Install struct as DECL_CONTEXT of each field decl. */
+ /* Install struct as DECL_CONTEXT of each field decl.
+ Also process specified field sizes,m which is found in the DECL_INITIAL.
+ Store 0 there, except for ": 0" fields (so we can find them
+ and delete them, below). */
saw_named_field = 0;
for (x = fieldlist; x; x = TREE_CHAIN (x))
@@ -5770,7 +5693,94 @@ finish_struct (t, fieldlist, attributes)
error ("nested redefinition of `%s'",
IDENTIFIER_POINTER (TYPE_NAME (t)));
- if (TREE_TYPE (x) != error_mark_node && !DECL_BIT_FIELD (x))
+ /* Detect invalid bit-field size. */
+ if (DECL_INITIAL (x))
+ STRIP_NOPS (DECL_INITIAL (x));
+ if (DECL_INITIAL (x))
+ {
+ if (TREE_CODE (DECL_INITIAL (x)) == INTEGER_CST)
+ constant_expression_warning (DECL_INITIAL (x));
+ else
+ {
+ error_with_decl (x,
+ "bit-field `%s' width not an integer constant");
+ DECL_INITIAL (x) = NULL;
+ }
+ }
+
+ /* Detect invalid bit-field type. */
+ if (DECL_INITIAL (x)
+ && TREE_CODE (TREE_TYPE (x)) != INTEGER_TYPE
+ && TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE
+ && TREE_CODE (TREE_TYPE (x)) != ENUMERAL_TYPE)
+ {
+ error_with_decl (x, "bit-field `%s' has invalid type");
+ DECL_INITIAL (x) = NULL;
+ }
+
+ if (DECL_INITIAL (x) && pedantic
+ && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != integer_type_node
+ && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != unsigned_type_node
+ && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != c_bool_type_node
+ /* Accept an enum that's equivalent to int or unsigned int. */
+ && !(TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE
+ && (TYPE_PRECISION (TREE_TYPE (x))
+ == TYPE_PRECISION (integer_type_node))))
+ pedwarn_with_decl (x, "bit-field `%s' type invalid in ISO C");
+
+ /* Detect and ignore out of range field width and process valid
+ field widths. */
+ if (DECL_INITIAL (x))
+ {
+ int max_width
+ = (TYPE_MAIN_VARIANT (TREE_TYPE (x)) == c_bool_type_node
+ ? CHAR_TYPE_SIZE : TYPE_PRECISION (TREE_TYPE (x)));
+
+ if (tree_int_cst_sgn (DECL_INITIAL (x)) < 0)
+ error_with_decl (x, "negative width in bit-field `%s'");
+ else if (0 < compare_tree_int (DECL_INITIAL (x), max_width))
+ pedwarn_with_decl (x, "width of `%s' exceeds its type");
+ else if (integer_zerop (DECL_INITIAL (x)) && DECL_NAME (x) != 0)
+ error_with_decl (x, "zero width for bit-field `%s'");
+ else
+ {
+ /* The test above has assured us that TREE_INT_CST_HIGH is 0. */
+ unsigned HOST_WIDE_INT width
+ = tree_low_cst (DECL_INITIAL (x), 1);
+
+ if (TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE
+ && (width < min_precision (TYPE_MIN_VALUE (TREE_TYPE (x)),
+ TREE_UNSIGNED (TREE_TYPE (x)))
+ || (width
+ < min_precision (TYPE_MAX_VALUE (TREE_TYPE (x)),
+ TREE_UNSIGNED (TREE_TYPE (x))))))
+ warning_with_decl (x,
+ "`%s' is narrower than values of its type");
+
+ DECL_SIZE (x) = bitsize_int (width);
+ DECL_BIT_FIELD (x) = 1;
+ SET_DECL_C_BIT_FIELD (x);
+
+ if (width == 0
+ && ! (* targetm.ms_bitfield_layout_p) (t))
+ {
+ /* field size 0 => force desired amount of alignment. */
+#ifdef EMPTY_FIELD_BOUNDARY
+ DECL_ALIGN (x) = MAX (DECL_ALIGN (x), EMPTY_FIELD_BOUNDARY);
+#endif
+#ifdef PCC_BITFIELD_TYPE_MATTERS
+ if (PCC_BITFIELD_TYPE_MATTERS)
+ {
+ DECL_ALIGN (x) = MAX (DECL_ALIGN (x),
+ TYPE_ALIGN (TREE_TYPE (x)));
+ DECL_USER_ALIGN (x) |= TYPE_USER_ALIGN (TREE_TYPE (x));
+ }
+#endif
+ }
+ }
+ }
+
+ else if (TREE_TYPE (x) != error_mark_node)
{
unsigned int min_align = (DECL_PACKED (x) ? BITS_PER_UNIT
: TYPE_ALIGN (TREE_TYPE (x)));
@@ -5782,6 +5792,8 @@ finish_struct (t, fieldlist, attributes)
DECL_USER_ALIGN (x) |= TYPE_USER_ALIGN (TREE_TYPE (x));
}
+ DECL_INITIAL (x) = 0;
+
/* Detect flexible array member in an invalid context. */
if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE
&& TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE
@@ -6197,6 +6209,7 @@ start_function (declspecs, declarator, attributes)
current_function_returns_value = 0; /* Assume, until we see it does. */
current_function_returns_null = 0;
+ current_function_returns_abnormally = 0;
warn_about_return_type = 0;
current_extern_inline = 0;
c_function_varargs = 0;
@@ -6206,7 +6219,7 @@ start_function (declspecs, declarator, attributes)
/* Don't expand any sizes in the return type of the function. */
immediate_size_expand = 0;
- decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1, NULL_TREE);
+ decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1);
/* If the declarator is not suitable for a function definition,
cause a syntax error. */
@@ -6218,6 +6231,10 @@ start_function (declspecs, declarator, attributes)
decl_attributes (&decl1, attributes, 0);
+ /* If #pragma weak was used, mark the decl weak now. */
+ if (current_binding_level == global_binding_level)
+ maybe_apply_pragma_weak (decl1);
+
if (DECL_DECLARED_INLINE_P (decl1)
&& DECL_UNINLINABLE (decl1)
&& lookup_attribute ("noinline", DECL_ATTRIBUTES (decl1)))
@@ -6874,17 +6891,21 @@ store_parm_decls ()
This is called after parsing the body of the function definition.
- NESTED is nonzero if the function being finished is nested in another. */
+ NESTED is nonzero if the function being finished is nested in another.
+ CAN_DEFER_P is nonzero if the function may be deferred. */
void
-finish_function (nested)
+finish_function (nested, can_defer_p)
int nested;
+ int can_defer_p;
{
tree fndecl = current_function_decl;
-/* TREE_READONLY (fndecl) = 1;
- This caused &foo to be of type ptr-to-const-function
- which then got a warning when stored in a ptr-to-function variable. */
+#if 0
+ /* This caused &foo to be of type ptr-to-const-function which then
+ got a warning when stored in a ptr-to-function variable. */
+ TREE_READONLY (fndecl) = 1;
+#endif
poplevel (1, 0, 1);
BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
@@ -6926,6 +6947,22 @@ finish_function (nested)
/* Tie off the statement tree for this function. */
finish_stmt_tree (&DECL_SAVED_TREE (fndecl));
+
+ /* Complain if there's just no return statement. */
+ if (warn_return_type
+ && TREE_CODE (TREE_TYPE (TREE_TYPE (fndecl))) != VOID_TYPE
+ && !current_function_returns_value && !current_function_returns_null
+ /* Don't complain if we abort. */
+ && !current_function_returns_abnormally
+ /* Don't warn for main(). */
+ && !MAIN_NAME_P (DECL_NAME (fndecl))
+ /* Or if they didn't actually specify a return type. */
+ && !C_FUNCTION_IMPLICIT_INT (fndecl)
+ /* Normally, with -Wreturn-type, flow will complain. Unless we're an
+ inline function, as we might never be compiled separately. */
+ && DECL_INLINE (fndecl))
+ warning ("no return statement in function returning non-void");
+
/* Clear out memory we no longer need. */
free_after_parsing (cfun);
/* Since we never call rest_of_compilation, we never clear
@@ -6936,7 +6973,8 @@ finish_function (nested)
if (! nested)
{
/* Generate RTL for the body of this function. */
- c_expand_body (fndecl, nested, 1);
+ c_expand_body (fndecl, nested, can_defer_p);
+
/* Let the error reporting routines know that we're outside a
function. For a nested function, this value is used in
pop_c_function_context and then reset via pop_function_context. */
@@ -7215,6 +7253,7 @@ struct c_language_function
tree shadowed_labels;
int returns_value;
int returns_null;
+ int returns_abnormally;
int warn_about_return_type;
int extern_inline;
struct binding_level *binding_level;
@@ -7238,6 +7277,7 @@ push_c_function_context (f)
p->shadowed_labels = shadowed_labels;
p->returns_value = current_function_returns_value;
p->returns_null = current_function_returns_null;
+ p->returns_abnormally = current_function_returns_abnormally;
p->warn_about_return_type = warn_about_return_type;
p->extern_inline = current_extern_inline;
p->binding_level = current_binding_level;
@@ -7275,6 +7315,7 @@ pop_c_function_context (f)
shadowed_labels = p->shadowed_labels;
current_function_returns_value = p->returns_value;
current_function_returns_null = p->returns_null;
+ current_function_returns_abnormally = p->returns_abnormally;
warn_about_return_type = p->warn_about_return_type;
current_extern_inline = p->extern_inline;
current_binding_level = p->binding_level;
diff --git a/contrib/gcc/c-format.c b/contrib/gcc/c-format.c
index b15b630..d52cfba 100644
--- a/contrib/gcc/c-format.c
+++ b/contrib/gcc/c-format.c
@@ -1,6 +1,6 @@
/* Check calls to formatted I/O functions (-Wformat).
- Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
- Free Software Foundation, Inc.
+ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ 2001, 2002 Free Software Foundation, Inc.
This file is part of GCC.
@@ -1516,13 +1516,12 @@ check_format_info_recurse (status, res, info, format_tree, params, arg_num)
res->number_non_literal++;
return;
}
- if (!host_integerp (arg1, 1))
+ if (!host_integerp (arg1, 0)
+ || (offset = tree_low_cst (arg1, 0)) < 0)
{
res->number_non_literal++;
return;
}
-
- offset = TREE_INT_CST_LOW (arg1);
}
if (TREE_CODE (format_tree) != ADDR_EXPR)
{
diff --git a/contrib/gcc/c-lang.c b/contrib/gcc/c-lang.c
index 497d32a..aa6c2ff 100644
--- a/contrib/gcc/c-lang.c
+++ b/contrib/gcc/c-lang.c
@@ -65,6 +65,9 @@ static void c_post_options PARAMS ((void));
#undef LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P
#define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P \
anon_aggr_type_p
+#undef LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING
+#define LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
+ c_convert_parm_for_inlining
/* ### When changing hooks, consider if ObjC needs changing too!! ### */
diff --git a/contrib/gcc/c-lex.c b/contrib/gcc/c-lex.c
index a0d2bbd..9eb308c 100644
--- a/contrib/gcc/c-lex.c
+++ b/contrib/gcc/c-lex.c
@@ -85,7 +85,8 @@ static int ignore_escape_flag;
static void parse_float PARAMS ((PTR));
static tree lex_number PARAMS ((const char *, unsigned int));
-static tree lex_string PARAMS ((const char *, unsigned int, int));
+static tree lex_string PARAMS ((const unsigned char *, unsigned int,
+ int));
static tree lex_charconst PARAMS ((const cpp_token *));
static void update_header_times PARAMS ((const char *));
static int dump_one_header PARAMS ((splay_tree_node, void *));
@@ -239,7 +240,7 @@ cb_ident (pfile, line, str)
if (! flag_no_ident)
{
/* Convert escapes in the string. */
- tree value = lex_string ((const char *)str->text, str->len, 0);
+ tree value = lex_string (str->text, str->len, 0);
ASM_OUTPUT_IDENT (asm_out_file, TREE_STRING_POINTER (value));
}
#endif
@@ -271,10 +272,12 @@ cb_file_change (pfile, new_map)
main_input_filename = new_map->to_file;
else
{
- lineno = SOURCE_LINE (new_map - 1, new_map->from_line - 1);
+ int included_at = SOURCE_LINE (new_map - 1, new_map->from_line - 1);
+
+ lineno = included_at;
push_srcloc (new_map->to_file, 1);
input_file_stack->indent_level = indent_level;
- (*debug_hooks->start_source_file) (lineno, new_map->to_file);
+ (*debug_hooks->start_source_file) (included_at, new_map->to_file);
#ifndef NO_IMPLICIT_EXTERN_C
if (c_header_level)
++c_header_level;
@@ -807,8 +810,8 @@ c_lex (value)
case CPP_STRING:
case CPP_WSTRING:
- *value = lex_string ((const char *)tok->val.str.text,
- tok->val.str.len, tok->type == CPP_WSTRING);
+ *value = lex_string (tok->val.str.text, tok->val.str.len,
+ tok->type == CPP_WSTRING);
break;
/* These tokens should not be visible outside cpplib. */
@@ -1297,14 +1300,14 @@ lex_number (str, len)
static tree
lex_string (str, len, wide)
- const char *str;
+ const unsigned char *str;
unsigned int len;
int wide;
{
tree value;
char *buf = alloca ((len + 1) * (wide ? WCHAR_BYTES : 1));
char *q = buf;
- const char *p = str, *limit = str + len;
+ const unsigned char *p = str, *limit = str + len;
unsigned int c;
unsigned width = wide ? WCHAR_TYPE_SIZE
: TYPE_PRECISION (char_type_node);
@@ -1320,7 +1323,7 @@ lex_string (str, len, wide)
wchar_t wc;
int char_len;
- char_len = local_mbtowc (&wc, p, limit - p);
+ char_len = local_mbtowc (&wc, (const char *) p, limit - p);
if (char_len == -1)
{
warning ("ignoring invalid multibyte character");
@@ -1344,8 +1347,7 @@ lex_string (str, len, wide)
mask = ((unsigned int) 1 << width) - 1;
else
mask = ~0;
- c = cpp_parse_escape (parse_in, (const unsigned char **) &p,
- (const unsigned char *) limit,
+ c = cpp_parse_escape (parse_in, &p, limit,
mask, flag_traditional);
}
@@ -1405,7 +1407,7 @@ lex_charconst (token)
const cpp_token *token;
{
HOST_WIDE_INT result;
- tree value;
+ tree type, value;
unsigned int chars_seen;
result = cpp_interpret_charconst (parse_in, token, warn_multichar,
@@ -1413,7 +1415,7 @@ lex_charconst (token)
if (token->type == CPP_WCHAR)
{
value = build_int_2 (result, 0);
- TREE_TYPE (value) = wchar_type_node;
+ type = wchar_type_node;
}
else
{
@@ -1425,10 +1427,24 @@ lex_charconst (token)
/* In C, a character constant has type 'int'.
In C++ 'char', but multi-char charconsts have type 'int'. */
if (c_language == clk_cplusplus && chars_seen <= 1)
- TREE_TYPE (value) = char_type_node;
+ type = char_type_node;
else
- TREE_TYPE (value) = integer_type_node;
+ type = integer_type_node;
}
-
+
+ /* cpp_interpret_charconst issues a warning if the constant
+ overflows, but if the number fits in HOST_WIDE_INT anyway, it
+ will return it un-truncated, which may cause problems down the
+ line. So set the type to widest_integer_literal_type, call
+ convert to truncate it to the proper type, then clear
+ TREE_OVERFLOW so we don't get a second warning.
+
+ FIXME: cpplib's assessment of overflow may not be accurate on a
+ platform where the final type can change at (compiler's) runtime. */
+
+ TREE_TYPE (value) = widest_integer_literal_type_node;
+ value = convert (type, value);
+ TREE_OVERFLOW (value) = 0;
+
return value;
}
diff --git a/contrib/gcc/c-objc-common.c b/contrib/gcc/c-objc-common.c
index 6554cf5..0ed3869 100644
--- a/contrib/gcc/c-objc-common.c
+++ b/contrib/gcc/c-objc-common.c
@@ -59,6 +59,9 @@ int
c_disregard_inline_limits (fn)
tree fn;
{
+ if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) != NULL)
+ return 1;
+
return DECL_DECLARED_INLINE_P (fn) && DECL_EXTERNAL (fn);
}
@@ -142,6 +145,10 @@ c_cannot_inline_tree_fn (fnp)
tree fn = *fnp;
tree t;
+ if (flag_really_no_inline
+ && lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) == NULL)
+ return 1;
+
if (! function_attribute_inlinable_p (fn))
{
DECL_UNINLINABLE (fn) = 1;
@@ -317,7 +324,7 @@ finish_cdtor (body)
RECHAIN_STMTS (body, COMPOUND_BODY (body));
- finish_function (0);
+ finish_function (0, 0);
}
/* Called at end of parsing, but before end-of-file processing. */
diff --git a/contrib/gcc/c-parse.in b/contrib/gcc/c-parse.in
index 524d407..9740aa3 100644
--- a/contrib/gcc/c-parse.in
+++ b/contrib/gcc/c-parse.in
@@ -395,7 +395,7 @@ fndef:
save_filename save_lineno compstmt_or_error
{ DECL_SOURCE_FILE (current_function_decl) = $7;
DECL_SOURCE_LINE (current_function_decl) = $8;
- finish_function (0);
+ finish_function (0, 1);
POP_DECLSPEC_STACK; }
| declspecs_ts setspecs declarator error
{ POP_DECLSPEC_STACK; }
@@ -409,7 +409,7 @@ fndef:
save_filename save_lineno compstmt_or_error
{ DECL_SOURCE_FILE (current_function_decl) = $7;
DECL_SOURCE_LINE (current_function_decl) = $8;
- finish_function (0);
+ finish_function (0, 1);
POP_DECLSPEC_STACK; }
| declspecs_nots setspecs notype_declarator error
{ POP_DECLSPEC_STACK; }
@@ -423,7 +423,7 @@ fndef:
save_filename save_lineno compstmt_or_error
{ DECL_SOURCE_FILE (current_function_decl) = $6;
DECL_SOURCE_LINE (current_function_decl) = $7;
- finish_function (0);
+ finish_function (0, 1);
POP_DECLSPEC_STACK; }
| setspecs notype_declarator error
{ POP_DECLSPEC_STACK; }
@@ -1582,7 +1582,7 @@ nested_function:
{ tree decl = current_function_decl;
DECL_SOURCE_FILE (decl) = $5;
DECL_SOURCE_LINE (decl) = $6;
- finish_function (1);
+ finish_function (1, 1);
pop_function_context ();
add_decl_stmt (decl); }
;
@@ -1612,7 +1612,7 @@ notype_nested_function:
{ tree decl = current_function_decl;
DECL_SOURCE_FILE (decl) = $5;
DECL_SOURCE_LINE (decl) = $6;
- finish_function (1);
+ finish_function (1, 1);
pop_function_context ();
add_decl_stmt (decl); }
;
@@ -2067,6 +2067,7 @@ end ifobjc
poplevel: /* empty */
{ $$ = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0); }
+ ;
/* Start and end blocks created for the new scopes of C99. */
c99_block_start: /* empty */
@@ -2137,7 +2138,8 @@ compstmt_or_error:
;
compstmt_start: '{' { compstmt_count++;
- $$ = c_begin_compound_stmt (); }
+ $$ = c_begin_compound_stmt (); }
+ ;
compstmt_nostart: '}'
{ $$ = convert (void_type_node, integer_zero_node); }
@@ -2169,9 +2171,11 @@ compstmt_primary_start:
compstmt_count++;
$$ = add_stmt (build_stmt (COMPOUND_STMT, last_tree));
}
+ ;
compstmt: compstmt_start compstmt_nostart
{ RECHAIN_STMTS ($1, COMPOUND_BODY ($1));
+ last_expr_type = NULL_TREE;
$$ = $1; }
;
diff --git a/contrib/gcc/c-pragma.c b/contrib/gcc/c-pragma.c
index f0c2b40..d5df355 100644
--- a/contrib/gcc/c-pragma.c
+++ b/contrib/gcc/c-pragma.c
@@ -1,5 +1,5 @@
/* Handle #pragma, system V.4 style. Supports #pragma weak and #pragma pack.
- Copyright (C) 1992, 1997, 1998, 1999, 2000, 2001
+ Copyright (C) 1992, 1997, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
This file is part of GCC.
@@ -30,6 +30,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "toplev.h"
#include "ggc.h"
#include "c-lex.h"
+#include "c-common.h"
#include "output.h"
#include "tm_p.h"
@@ -55,9 +56,9 @@ static struct align_stack * alignment_stack = NULL;
maximum_field_alignment in effect. When the final pop_alignment()
happens, we restore the value to this, not to a value of 0 for
maximum_field_alignment. Value is in bits. */
-static int default_alignment;
+static int default_alignment;
#define SET_GLOBAL_ALIGNMENT(ALIGN) \
-(default_alignment = maximum_field_alignment = (ALIGN))
+ (default_alignment = maximum_field_alignment = (ALIGN))
static void push_alignment PARAMS ((int, tree));
static void pop_alignment PARAMS ((tree));
@@ -69,7 +70,6 @@ push_alignment (alignment, id)
int alignment;
tree id;
{
-
if (alignment_stack == NULL
|| alignment_stack->alignment != alignment
|| id != NULL_TREE)
@@ -274,14 +274,57 @@ handle_pragma_pack (dummy)
#endif /* HANDLE_PRAGMA_PACK */
#ifdef HANDLE_PRAGMA_WEAK
+static void apply_pragma_weak PARAMS ((tree, tree));
static void handle_pragma_weak PARAMS ((cpp_reader *));
+static tree pending_weaks;
+
+static void
+apply_pragma_weak (decl, value)
+ tree decl, value;
+{
+ if (value)
+ decl_attributes (&decl, build_tree_list (get_identifier ("alias"),
+ build_tree_list (NULL, value)),
+ 0);
+ if (SUPPORTS_WEAK && DECL_EXTERNAL (decl) && TREE_USED (decl)
+ && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
+ warning_with_decl (decl, "applying #pragma weak `%s' after first use results in unspecified behavior");
+
+ declare_weak (decl);
+}
+
+void
+maybe_apply_pragma_weak (decl)
+ tree decl;
+{
+ tree *p, t, id;
+
+ /* Copied from the check in set_decl_assembler_name. */
+ if (TREE_CODE (decl) == FUNCTION_DECL
+ || (TREE_CODE (decl) == VAR_DECL
+ && (TREE_STATIC (decl)
+ || DECL_EXTERNAL (decl)
+ || TREE_PUBLIC (decl))))
+ id = DECL_ASSEMBLER_NAME (decl);
+ else
+ return;
+
+ for (p = &pending_weaks; (t = *p) ; p = &TREE_CHAIN (t))
+ if (id == TREE_PURPOSE (t))
+ {
+ apply_pragma_weak (decl, TREE_VALUE (t));
+ *p = TREE_CHAIN (t);
+ break;
+ }
+}
+
/* #pragma weak name [= value] */
static void
handle_pragma_weak (dummy)
cpp_reader *dummy ATTRIBUTE_UNUSED;
{
- tree name, value, x;
+ tree name, value, x, decl;
enum cpp_ttype t;
value = 0;
@@ -298,10 +341,149 @@ handle_pragma_weak (dummy)
if (t != CPP_EOF)
warning ("junk at end of #pragma weak");
- add_weak (IDENTIFIER_POINTER (name), value ? IDENTIFIER_POINTER (value) : 0);
+ decl = identifier_global_value (name);
+ if (decl && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd')
+ apply_pragma_weak (decl, value);
+ else
+ pending_weaks = tree_cons (name, value, pending_weaks);
+}
+#else
+void
+maybe_apply_pragma_weak (decl)
+ tree decl ATTRIBUTE_UNUSED;
+{
+}
+#endif /* HANDLE_PRAGMA_WEAK */
+
+#ifdef HANDLE_PRAGMA_REDEFINE_EXTNAME
+static void handle_pragma_redefine_extname PARAMS ((cpp_reader *));
+
+static tree pending_redefine_extname;
+
+/* #pragma redefined_extname oldname newname */
+static void
+handle_pragma_redefine_extname (dummy)
+ cpp_reader *dummy ATTRIBUTE_UNUSED;
+{
+ tree oldname, newname, decl, x;
+ enum cpp_ttype t;
+
+ if (c_lex (&oldname) != CPP_NAME)
+ {
+ warning ("malformed #pragma redefine_extname, ignored");
+ return;
+ }
+ if (c_lex (&newname) != CPP_NAME)
+ {
+ warning ("malformed #pragma redefine_extname, ignored");
+ return;
+ }
+ t = c_lex (&x);
+ if (t != CPP_EOF)
+ warning ("junk at end of #pragma redefine_extname");
+
+ decl = identifier_global_value (oldname);
+ if (decl && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd')
+ {
+ if (DECL_ASSEMBLER_NAME_SET_P (decl)
+ && DECL_ASSEMBLER_NAME (decl) != newname)
+ warning ("#pragma redefine_extname conflicts with declaration");
+ SET_DECL_ASSEMBLER_NAME (decl, newname);
+ }
+ else
+ pending_redefine_extname
+ = tree_cons (oldname, newname, pending_redefine_extname);
+}
+#endif
+
+#ifdef HANDLE_PRAGMA_EXTERN_PREFIX
+static void handle_pragma_extern_prefix PARAMS ((cpp_reader *));
+
+static tree pragma_extern_prefix;
+
+/* #pragma extern_prefix "prefix" */
+static void
+handle_pragma_extern_prefix (dummy)
+ cpp_reader *dummy ATTRIBUTE_UNUSED;
+{
+ tree prefix, x;
+ enum cpp_ttype t;
+
+ if (c_lex (&prefix) != CPP_STRING)
+ {
+ warning ("malformed #pragma extern_prefix, ignored");
+ return;
+ }
+ t = c_lex (&x);
+ if (t != CPP_EOF)
+ warning ("junk at end of #pragma extern_prefix");
+
+ /* Note that the length includes the null terminator. */
+ pragma_extern_prefix = (TREE_STRING_LENGTH (prefix) > 1 ? prefix : NULL);
}
#endif
+/* Hook from the front ends to apply the results of one of the preceeding
+ pragmas that rename variables. */
+
+tree
+maybe_apply_renaming_pragma (decl, asmname)
+ tree decl, asmname;
+{
+ tree oldname;
+
+ /* Copied from the check in set_decl_assembler_name. */
+ if (TREE_CODE (decl) == FUNCTION_DECL
+ || (TREE_CODE (decl) == VAR_DECL
+ && (TREE_STATIC (decl)
+ || DECL_EXTERNAL (decl)
+ || TREE_PUBLIC (decl))))
+ oldname = DECL_ASSEMBLER_NAME (decl);
+ else
+ return asmname;
+
+ /* If the name begins with a *, that's a sign of an asmname attached to
+ a previous declaration. */
+ if (IDENTIFIER_POINTER (oldname)[0] == '*')
+ {
+ const char *oldasmname = IDENTIFIER_POINTER (oldname) + 1;
+ if (asmname && strcmp (TREE_STRING_POINTER (asmname), oldasmname) != 0)
+ warning ("asm declaration conficts with previous rename");
+ asmname = build_string (strlen (oldasmname), oldasmname);
+ }
+
+#ifdef HANDLE_PRAGMA_REDEFINE_EXTNAME
+ {
+ tree *p, t;
+
+ for (p = &pending_redefine_extname; (t = *p) ; p = &TREE_CHAIN (t))
+ if (oldname == TREE_PURPOSE (t))
+ {
+ const char *newname = IDENTIFIER_POINTER (TREE_VALUE (t));
+
+ if (asmname && strcmp (TREE_STRING_POINTER (asmname), newname) != 0)
+ warning ("#pragma redefine_extname conflicts with declaration");
+ *p = TREE_CHAIN (t);
+
+ return build_string (strlen (newname), newname);
+ }
+ }
+#endif
+
+#ifdef HANDLE_PRAGMA_EXTERN_PREFIX
+ if (pragma_extern_prefix && !asmname)
+ {
+ char *x = concat (TREE_STRING_POINTER (pragma_extern_prefix),
+ IDENTIFIER_POINTER (oldname), NULL);
+ asmname = build_string (strlen (x), x);
+ free (x);
+ return asmname;
+ }
+#endif
+
+ return asmname;
+}
+
void
init_pragma ()
{
@@ -310,7 +492,19 @@ init_pragma ()
#endif
#ifdef HANDLE_PRAGMA_WEAK
cpp_register_pragma (parse_in, 0, "weak", handle_pragma_weak);
+ ggc_add_tree_root (&pending_weaks, 1);
+#endif
+#ifdef HANDLE_PRAGMA_REDEFINE_EXTNAME
+ cpp_register_pragma (parse_in, 0, "redefine_extname",
+ handle_pragma_redefine_extname);
+ ggc_add_tree_root (&pending_redefine_extname, 1);
#endif
+#ifdef HANDLE_PRAGMA_EXTERN_PREFIX
+ cpp_register_pragma (parse_in, 0, "extern_prefix",
+ handle_pragma_extern_prefix);
+ ggc_add_tree_root (&pragma_extern_prefix, 1);
+#endif
+
#ifdef REGISTER_TARGET_PRAGMAS
REGISTER_TARGET_PRAGMAS (parse_in);
#endif
diff --git a/contrib/gcc/c-pragma.h b/contrib/gcc/c-pragma.h
index ff00f32..22e4f7a 100644
--- a/contrib/gcc/c-pragma.h
+++ b/contrib/gcc/c-pragma.h
@@ -23,9 +23,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define GCC_C_PRAGMA_H
#ifdef HANDLE_SYSV_PRAGMA
-/* Support #pragma weak iff ASM_WEAKEN_LABEL and ASM_OUTPUT_WEAK_ALIAS are
- defined. */
-#if defined (ASM_WEAKEN_LABEL) && defined (ASM_OUTPUT_WEAK_ALIAS)
+#if ((defined (ASM_WEAKEN_LABEL) && defined (ASM_OUTPUT_WEAK_ALIAS)) \
+ || defined (ASM_WEAKEN_DECL))
#define HANDLE_PRAGMA_WEAK SUPPORTS_WEAK
#endif
@@ -54,4 +53,7 @@ extern void cpp_register_pragma PARAMS ((cpp_reader *,
void (*) PARAMS ((cpp_reader *))));
#endif
+extern void maybe_apply_pragma_weak PARAMS ((tree));
+extern tree maybe_apply_renaming_pragma PARAMS ((tree, tree));
+
#endif /* GCC_C_PRAGMA_H */
diff --git a/contrib/gcc/c-semantics.c b/contrib/gcc/c-semantics.c
index c0bbc51..030a04c 100644
--- a/contrib/gcc/c-semantics.c
+++ b/contrib/gcc/c-semantics.c
@@ -644,7 +644,7 @@ genrtl_switch_stmt (t)
emit_line_note (input_filename, lineno);
expand_start_case (1, cond, TREE_TYPE (cond), "switch statement");
expand_stmt (SWITCH_BODY (t));
- expand_end_case (cond);
+ expand_end_case_type (cond, SWITCH_TYPE (t));
}
/* Create a CASE_LABEL tree node and return it. */
@@ -737,12 +737,12 @@ genrtl_asm_stmt (cv_qualifier, string, output_operands,
/* Generate the RTL for a DECL_CLEANUP. */
void
-genrtl_decl_cleanup (decl, cleanup)
- tree decl;
- tree cleanup;
+genrtl_decl_cleanup (t)
+ tree t;
{
+ tree decl = CLEANUP_DECL (t);
if (!decl || (DECL_SIZE (decl) && TREE_TYPE (decl) != error_mark_node))
- expand_decl_cleanup (decl, cleanup);
+ expand_decl_cleanup_eh (decl, CLEANUP_EXPR (t), CLEANUP_EH_ONLY (t));
}
/* We're about to expand T, a statement. Set up appropriate context
@@ -847,6 +847,10 @@ expand_stmt (t)
genrtl_scope_stmt (t);
break;
+ case CLEANUP_STMT:
+ genrtl_decl_cleanup (t);
+ break;
+
default:
if (lang_expand_stmt)
(*lang_expand_stmt) (t);
diff --git a/contrib/gcc/c-typeck.c b/contrib/gcc/c-typeck.c
index 37f6a87..b21cac0 100644
--- a/contrib/gcc/c-typeck.c
+++ b/contrib/gcc/c-typeck.c
@@ -58,7 +58,6 @@ static tree decl_constant_value_for_broken_optimization PARAMS ((tree));
static tree default_function_array_conversion PARAMS ((tree));
static tree lookup_field PARAMS ((tree, tree));
static tree convert_arguments PARAMS ((tree, tree, tree, tree));
-static tree pointer_int_sum PARAMS ((enum tree_code, tree, tree));
static tree pointer_diff PARAMS ((tree, tree));
static tree unary_complex_lvalue PARAMS ((enum tree_code, tree, int));
static void pedantic_lvalue_warning PARAMS ((enum tree_code));
@@ -149,6 +148,11 @@ incomplete_type_error (value, type)
case ARRAY_TYPE:
if (TYPE_DOMAIN (type))
{
+ if (TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == NULL)
+ {
+ error ("invalid use of flexible array member");
+ return;
+ }
type = TREE_TYPE (type);
goto retry;
}
@@ -1547,6 +1551,9 @@ build_function_call (function, params)
return error_mark_node;
}
+ if (fundecl && TREE_THIS_VOLATILE (fundecl))
+ current_function_returns_abnormally = 1;
+
/* fntype now gets the type of function pointed to. */
fntype = TREE_TYPE (fntype);
@@ -2052,29 +2059,6 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
case BIT_XOR_EXPR:
if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
shorten = -1;
- /* If one operand is a constant, and the other is a short type
- that has been converted to an int,
- really do the work in the short type and then convert the
- result to int. If we are lucky, the constant will be 0 or 1
- in the short type, making the entire operation go away. */
- if (TREE_CODE (op0) == INTEGER_CST
- && TREE_CODE (op1) == NOP_EXPR
- && TYPE_PRECISION (type1) > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op1, 0)))
- && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op1, 0))))
- {
- final_type = result_type;
- op1 = TREE_OPERAND (op1, 0);
- result_type = TREE_TYPE (op1);
- }
- if (TREE_CODE (op1) == INTEGER_CST
- && TREE_CODE (op0) == NOP_EXPR
- && TYPE_PRECISION (type0) > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))
- && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
- {
- final_type = result_type;
- op0 = TREE_OPERAND (op0, 0);
- result_type = TREE_TYPE (op0);
- }
break;
case TRUNC_MOD_EXPR:
@@ -2652,95 +2636,6 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
}
}
-/* Return a tree for the sum or difference (RESULTCODE says which)
- of pointer PTROP and integer INTOP. */
-
-static tree
-pointer_int_sum (resultcode, ptrop, intop)
- enum tree_code resultcode;
- tree ptrop, intop;
-{
- tree size_exp;
-
- tree result;
- tree folded;
-
- /* The result is a pointer of the same type that is being added. */
-
- tree result_type = TREE_TYPE (ptrop);
-
- if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
- {
- if (pedantic || warn_pointer_arith)
- pedwarn ("pointer of type `void *' used in arithmetic");
- size_exp = integer_one_node;
- }
- else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE)
- {
- if (pedantic || warn_pointer_arith)
- pedwarn ("pointer to a function used in arithmetic");
- size_exp = integer_one_node;
- }
- else
- size_exp = c_size_in_bytes (TREE_TYPE (result_type));
-
- /* If what we are about to multiply by the size of the elements
- contains a constant term, apply distributive law
- and multiply that constant term separately.
- This helps produce common subexpressions. */
-
- if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR)
- && ! TREE_CONSTANT (intop)
- && TREE_CONSTANT (TREE_OPERAND (intop, 1))
- && TREE_CONSTANT (size_exp)
- /* If the constant comes from pointer subtraction,
- skip this optimization--it would cause an error. */
- && TREE_CODE (TREE_TYPE (TREE_OPERAND (intop, 0))) == INTEGER_TYPE
- /* If the constant is unsigned, and smaller than the pointer size,
- then we must skip this optimization. This is because it could cause
- an overflow error if the constant is negative but INTOP is not. */
- && (! TREE_UNSIGNED (TREE_TYPE (intop))
- || (TYPE_PRECISION (TREE_TYPE (intop))
- == TYPE_PRECISION (TREE_TYPE (ptrop)))))
- {
- enum tree_code subcode = resultcode;
- tree int_type = TREE_TYPE (intop);
- if (TREE_CODE (intop) == MINUS_EXPR)
- subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR);
- /* Convert both subexpression types to the type of intop,
- because weird cases involving pointer arithmetic
- can result in a sum or difference with different type args. */
- ptrop = build_binary_op (subcode, ptrop,
- convert (int_type, TREE_OPERAND (intop, 1)), 1);
- intop = convert (int_type, TREE_OPERAND (intop, 0));
- }
-
- /* Convert the integer argument to a type the same size as sizetype
- so the multiply won't overflow spuriously. */
-
- if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype)
- || TREE_UNSIGNED (TREE_TYPE (intop)) != TREE_UNSIGNED (sizetype))
- intop = convert (type_for_size (TYPE_PRECISION (sizetype),
- TREE_UNSIGNED (sizetype)), intop);
-
- /* Replace the integer argument with a suitable product by the object size.
- Do this multiplication as signed, then convert to the appropriate
- pointer type (actually unsigned integral). */
-
- intop = convert (result_type,
- build_binary_op (MULT_EXPR, intop,
- convert (TREE_TYPE (intop), size_exp), 1));
-
- /* Create the sum or difference. */
-
- result = build (resultcode, result_type, ptrop, intop);
-
- folded = fold (result);
- if (folded == result)
- TREE_CONSTANT (folded) = TREE_CONSTANT (ptrop) & TREE_CONSTANT (intop);
- return folded;
-}
-
/* Return a tree for the difference of pointers OP0 and OP1.
The resulting tree has type int. */
@@ -3819,7 +3714,8 @@ build_c_cast (type, expr)
{
tree in_type = type;
tree in_otype = otype;
- int warn = 0;
+ int added = 0;
+ int discarded = 0;
/* Check that the qualifiers on IN_TYPE are a superset of
the qualifiers of IN_OTYPE. The outermost level of
@@ -3829,12 +3725,24 @@ build_c_cast (type, expr)
{
in_otype = TREE_TYPE (in_otype);
in_type = TREE_TYPE (in_type);
- warn |= (TYPE_QUALS (in_otype) & ~TYPE_QUALS (in_type));
+
+ /* GNU C allows cv-qualified function types. 'const'
+ means the function is very pure, 'volatile' means it
+ can't return. We need to warn when such qualifiers
+ are added, not when they're taken away. */
+ if (TREE_CODE (in_otype) == FUNCTION_TYPE
+ && TREE_CODE (in_type) == FUNCTION_TYPE)
+ added |= (TYPE_QUALS (in_type) & ~TYPE_QUALS (in_otype));
+ else
+ discarded |= (TYPE_QUALS (in_otype) & ~TYPE_QUALS (in_type));
}
while (TREE_CODE (in_type) == POINTER_TYPE
&& TREE_CODE (in_otype) == POINTER_TYPE);
- if (warn)
+ if (added)
+ warning ("cast adds new qualifiers to function type");
+
+ if (discarded)
/* There are qualifiers present in IN_OTYPE that are not
present in IN_TYPE. */
warning ("cast discards qualifiers from pointer target type");
@@ -4372,6 +4280,30 @@ convert_for_assignment (type, rhs, errtype, fundecl, funname, parmnum)
return error_mark_node;
}
+/* Convert VALUE for assignment into inlined parameter PARM. */
+
+tree
+c_convert_parm_for_inlining (parm, value, fn)
+ tree parm, value, fn;
+{
+ tree ret, type;
+
+ /* If FN was prototyped, the value has been converted already
+ in convert_arguments. */
+ if (! value || TYPE_ARG_TYPES (TREE_TYPE (fn)))
+ return value;
+
+ type = TREE_TYPE (parm);
+ ret = convert_for_assignment (type, value,
+ (char *) 0 /* arg passing */, fn,
+ DECL_NAME (fn), 0);
+ if (PROMOTE_PROTOTYPES
+ && INTEGRAL_TYPE_P (type)
+ && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)))
+ ret = default_conversion (ret);
+ return ret;
+}
+
/* Print a warning using MSGID.
It gets OPNAME as its one parameter.
If OPNAME is null, it is replaced by "passing arg ARGNUM of `FUNCTION'".
@@ -4809,6 +4741,8 @@ digest_init (type, init, require_constant, constructor_constant)
TYPE_MAIN_VARIANT (type))
|| (code == ARRAY_TYPE
&& comptypes (TREE_TYPE (inside_init), type))
+ || (code == VECTOR_TYPE
+ && comptypes (TREE_TYPE (inside_init), type))
|| (code == POINTER_TYPE
&& (TREE_CODE (TREE_TYPE (inside_init)) == ARRAY_TYPE
|| TREE_CODE (TREE_TYPE (inside_init)) == FUNCTION_TYPE)
@@ -5320,6 +5254,14 @@ really_start_incremental_init (type)
constructor_unfilled_index = constructor_index;
}
+ else if (TREE_CODE (constructor_type) == VECTOR_TYPE)
+ {
+ /* Vectors are like simple fixed-size arrays. */
+ constructor_max_index =
+ build_int_2 (TYPE_VECTOR_SUBPARTS (constructor_type) - 1, 0);
+ constructor_index = convert (bitsizetype, integer_zero_node);
+ constructor_unfilled_index = constructor_index;
+ }
else
{
/* Handle the case of int x = {5}; */
@@ -5466,6 +5408,14 @@ push_init_level (implicit)
constructor_unfilled_fields = constructor_fields;
constructor_bit_index = bitsize_zero_node;
}
+ else if (TREE_CODE (constructor_type) == VECTOR_TYPE)
+ {
+ /* Vectors are like simple fixed-size arrays. */
+ constructor_max_index =
+ build_int_2 (TYPE_VECTOR_SUBPARTS (constructor_type) - 1, 0);
+ constructor_index = convert (bitsizetype, integer_zero_node);
+ constructor_unfilled_index = constructor_index;
+ }
else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
{
if (TYPE_DOMAIN (constructor_type))
@@ -5602,7 +5552,8 @@ pop_init_level (implicit)
;
else if (TREE_CODE (constructor_type) != RECORD_TYPE
&& TREE_CODE (constructor_type) != UNION_TYPE
- && TREE_CODE (constructor_type) != ARRAY_TYPE)
+ && TREE_CODE (constructor_type) != ARRAY_TYPE
+ && TREE_CODE (constructor_type) != VECTOR_TYPE)
{
/* A nonincremental scalar initializer--just return
the element, after verifying there is just one. */
@@ -6648,6 +6599,16 @@ process_init_element (value)
fieldtype = TYPE_MAIN_VARIANT (fieldtype);
fieldcode = TREE_CODE (fieldtype);
+ /* Error for non-static initialization of a flexible array member. */
+ if (fieldcode == ARRAY_TYPE
+ && !require_constant_value
+ && TYPE_SIZE (fieldtype) == NULL_TREE
+ && TREE_CHAIN (constructor_fields) == NULL_TREE)
+ {
+ error_init ("non-static initialization of a flexible array member");
+ break;
+ }
+
/* Accept a string constant to initialize a subarray. */
if (value != 0
&& fieldcode == ARRAY_TYPE
@@ -6811,6 +6772,31 @@ process_init_element (value)
constructor_unfilled_index. */
constructor_unfilled_index = constructor_index;
}
+ else if (TREE_CODE (constructor_type) == VECTOR_TYPE)
+ {
+ tree elttype = TYPE_MAIN_VARIANT (TREE_TYPE (constructor_type));
+
+ /* Do a basic check of initializer size. Note that vectors
+ always have a fixed size derived from their type. */
+ if (tree_int_cst_lt (constructor_max_index, constructor_index))
+ {
+ pedwarn_init ("excess elements in vector initializer");
+ break;
+ }
+
+ /* Now output the actual element. */
+ if (value)
+ output_init_element (value, elttype, constructor_index, 1);
+
+ constructor_index
+ = size_binop (PLUS_EXPR, constructor_index, bitsize_one_node);
+
+ if (! value)
+ /* If we are doing the bookkeeping for an element that was
+ directly output as a constructor, we must update
+ constructor_unfilled_index. */
+ constructor_unfilled_index = constructor_index;
+ }
/* Handle the sole element allowed in a braced initializer
for a scalar variable. */
@@ -7071,6 +7057,7 @@ c_expand_return (retval)
tree res = DECL_RESULT (current_function_decl);
tree inner;
+ current_function_returns_value = 1;
if (t == error_mark_node)
return NULL_TREE;
@@ -7128,7 +7115,6 @@ c_expand_return (retval)
}
retval = build (MODIFY_EXPR, TREE_TYPE (res), res, t);
- current_function_returns_value = 1;
}
return add_stmt (build_return_stmt (retval));
@@ -7163,15 +7149,15 @@ c_start_case (exp)
tree exp;
{
enum tree_code code;
- tree type;
+ tree type, orig_type = error_mark_node;
struct c_switch *cs;
if (exp != error_mark_node)
{
code = TREE_CODE (TREE_TYPE (exp));
- type = TREE_TYPE (exp);
+ orig_type = TREE_TYPE (exp);
- if (! INTEGRAL_TYPE_P (type)
+ if (! INTEGRAL_TYPE_P (orig_type)
&& code != ERROR_MARK)
{
error ("switch quantity not an integer");
@@ -7193,7 +7179,7 @@ c_start_case (exp)
/* Add this new SWITCH_STMT to the stack. */
cs = (struct c_switch *) xmalloc (sizeof (*cs));
- cs->switch_stmt = build_stmt (SWITCH_STMT, exp, NULL_TREE, NULL_TREE);
+ cs->switch_stmt = build_stmt (SWITCH_STMT, exp, NULL_TREE, orig_type);
cs->cases = splay_tree_new (case_compare, NULL, NULL);
cs->next = switch_stack;
switch_stack = cs;
diff --git a/contrib/gcc/calls.c b/contrib/gcc/calls.c
index 3d4540d..6cb2956 100644
--- a/contrib/gcc/calls.c
+++ b/contrib/gcc/calls.c
@@ -181,7 +181,8 @@ static int calls_function_1 PARAMS ((tree, int));
static void emit_call_1 PARAMS ((rtx, tree, tree, HOST_WIDE_INT,
HOST_WIDE_INT, HOST_WIDE_INT, rtx,
- rtx, int, rtx, int));
+ rtx, int, rtx, int,
+ CUMULATIVE_ARGS *));
static void precompute_register_parameters PARAMS ((int,
struct arg_data *,
int *));
@@ -444,7 +445,7 @@ prepare_call_address (funexp, fndecl, call_fusage, reg_parm_seen, sibcallp)
static void
emit_call_1 (funexp, fndecl, funtype, stack_size, rounded_stack_size,
struct_value_size, next_arg_reg, valreg, old_inhibit_defer_pop,
- call_fusage, ecf_flags)
+ call_fusage, ecf_flags, args_so_far)
rtx funexp;
tree fndecl ATTRIBUTE_UNUSED;
tree funtype ATTRIBUTE_UNUSED;
@@ -456,6 +457,7 @@ emit_call_1 (funexp, fndecl, funtype, stack_size, rounded_stack_size,
int old_inhibit_defer_pop;
rtx call_fusage;
int ecf_flags;
+ CUMULATIVE_ARGS *args_so_far ATTRIBUTE_UNUSED;
{
rtx rounded_stack_size_rtx = GEN_INT (rounded_stack_size);
rtx call_insn;
@@ -466,6 +468,10 @@ emit_call_1 (funexp, fndecl, funtype, stack_size, rounded_stack_size,
struct_value_size_rtx = GEN_INT (struct_value_size);
#endif
+#ifdef CALL_POPS_ARGS
+ n_popped += CALL_POPS_ARGS (* args_so_far);
+#endif
+
/* Ensure address is valid. SYMBOL_REF is already valid, so no need,
and we don't want to load it into a register as an optimization,
because prepare_call_address already did it if it should be done. */
@@ -1505,14 +1511,9 @@ precompute_arguments (flags, num_actuals, args)
if (TREE_ADDRESSABLE (TREE_TYPE (args[i].tree_value)))
abort ();
- push_temp_slots ();
-
args[i].value
= expand_expr (args[i].tree_value, NULL_RTX, VOIDmode, 0);
- preserve_temp_slots (args[i].value);
- pop_temp_slots ();
-
/* ANSI doesn't require a sequence point here,
but PCC has one, so this will avoid some problems. */
emit_queue ();
@@ -2675,10 +2676,6 @@ expand_call (exp, target, ignore)
if (pass && (flags & ECF_LIBCALL_BLOCK))
NO_DEFER_POP;
- /* Push the temporary stack slot level so that we can free any
- temporaries we make. */
- push_temp_slots ();
-
#ifdef FINAL_REG_PARM_STACK_SPACE
reg_parm_stack_space = FINAL_REG_PARM_STACK_SPACE (args_size.constant,
args_size.var);
@@ -3055,7 +3052,7 @@ expand_call (exp, target, ignore)
emit_call_1 (funexp, fndecl, funtype, unadjusted_args_size,
adjusted_args_size.constant, struct_value_size,
next_arg_reg, valreg, old_inhibit_defer_pop, call_fusage,
- flags);
+ flags, & args_so_far);
/* Verify that we've deallocated all the stack we used. */
if (pass
@@ -3328,8 +3325,6 @@ expand_call (exp, target, ignore)
if ((flags & ECF_MAY_BE_ALLOCA) && nonlocal_goto_handler_slots != 0)
emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX);
- pop_temp_slots ();
-
/* Free up storage we no longer need. */
for (i = 0; i < num_actuals; ++i)
if (args[i].aligned_regs)
@@ -4053,7 +4048,7 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p)
struct_value_size,
FUNCTION_ARG (args_so_far, VOIDmode, void_type_node, 1),
valreg,
- old_inhibit_defer_pop + 1, call_fusage, flags);
+ old_inhibit_defer_pop + 1, call_fusage, flags, & args_so_far);
/* For calls to `setjmp', etc., inform flow.c it should complain
if nonvolatile values are live. For functions that cannot return,
@@ -4361,7 +4356,13 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space)
/* If this isn't going to be placed on both the stack and in registers,
set up the register and number of words. */
if (! arg->pass_on_stack)
- reg = arg->reg, partial = arg->partial;
+ {
+ if (flags & ECF_SIBCALL)
+ reg = arg->tail_call_reg;
+ else
+ reg = arg->reg;
+ partial = arg->partial;
+ }
if (reg != 0 && partial == 0)
/* Being passed entirely in a register. We shouldn't be called in
@@ -4459,6 +4460,11 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space)
partial, reg, used - size, argblock,
ARGS_SIZE_RTX (arg->offset), reg_parm_stack_space,
ARGS_SIZE_RTX (arg->alignment_pad));
+
+ /* Unless this is a partially-in-register argument, the argument is now
+ in the stack. */
+ if (partial == 0)
+ arg->value = arg->stack;
}
else
{
@@ -4558,16 +4564,18 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space)
argblock, ARGS_SIZE_RTX (arg->offset),
reg_parm_stack_space,
ARGS_SIZE_RTX (arg->alignment_pad));
- }
- /* Unless this is a partially-in-register argument, the argument is now
- in the stack.
+ /* Unless this is a partially-in-register argument, the argument is now
+ in the stack.
- ??? Note that this can change arg->value from arg->stack to
- arg->stack_slot and it matters when they are not the same.
- It isn't totally clear that this is correct in all cases. */
- if (partial == 0)
- arg->value = arg->stack_slot;
+ ??? Unlike the case above, in which we want the actual
+ address of the data, so that we can load it directly into a
+ register, here we want the address of the stack slot, so that
+ it's properly aligned for word-by-word copying or something
+ like that. It's not clear that this is always correct. */
+ if (partial == 0)
+ arg->value = arg->stack_slot;
+ }
/* Once we have pushed something, pops can't safely
be deferred during the rest of the arguments. */
diff --git a/contrib/gcc/cfg.c b/contrib/gcc/cfg.c
index 8adcef6..73689c3 100644
--- a/contrib/gcc/cfg.c
+++ b/contrib/gcc/cfg.c
@@ -1,6 +1,6 @@
/* Control flow graph manipulation code for GNU compiler.
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001 Free Software Foundation, Inc.
+ 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GCC.
@@ -222,6 +222,17 @@ alloc_block ()
/* Remove block B from the basic block array and compact behind it. */
void
+expunge_block_nocompact (b)
+ basic_block b;
+{
+ /* Invalidate data to make bughunting easier. */
+ memset (b, 0, sizeof *b);
+ b->index = -3;
+ b->succ = (edge) first_deleted_block;
+ first_deleted_block = (basic_block) b;
+}
+
+void
expunge_block (b)
basic_block b;
{
@@ -234,13 +245,10 @@ expunge_block (b)
x->index = i;
}
- /* Invalidate data to make bughunting easier. */
- memset (b, 0, sizeof *b);
- b->index = -3;
- basic_block_info->num_elements--;
n_basic_blocks--;
- b->succ = (edge) first_deleted_block;
- first_deleted_block = (basic_block) b;
+ basic_block_info->num_elements--;
+
+ expunge_block_nocompact (b);
}
/* Create an edge connecting SRC and DST with FLAGS optionally using
diff --git a/contrib/gcc/cfganal.c b/contrib/gcc/cfganal.c
index 1c499f4..6009d59 100644
--- a/contrib/gcc/cfganal.c
+++ b/contrib/gcc/cfganal.c
@@ -25,9 +25,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "rtl.h"
#include "hard-reg-set.h"
#include "basic-block.h"
+#include "insn-config.h"
+#include "recog.h"
#include "toplev.h"
-
#include "obstack.h"
+#include "tm_p.h"
/* Store the data structures necessary for depth-first search. */
struct depth_first_search_dsS {
@@ -53,6 +55,7 @@ static void flow_dfs_compute_reverse_finish
PARAMS ((depth_first_search_ds));
static void remove_fake_successors PARAMS ((basic_block));
static bool need_fake_edge_p PARAMS ((rtx));
+static bool keep_with_call_p PARAMS ((rtx));
/* Return true if the block has no effect and only forwards control flow to
its single destination. */
@@ -209,6 +212,32 @@ need_fake_edge_p (insn)
|| GET_CODE (PATTERN (insn)) == ASM_INPUT);
}
+/* Return true if INSN should be kept in the same block as a preceding call.
+ This is done for a single-set whose destination is a fixed register or
+ whose source is the function return value. This is a helper function for
+ flow_call_edges_add. */
+
+static bool
+keep_with_call_p (insn)
+ rtx insn;
+{
+ rtx set;
+
+ if (INSN_P (insn) && (set = single_set (insn)) != NULL)
+ {
+ if (GET_CODE (SET_DEST (set)) == REG
+ && fixed_regs[REGNO (SET_DEST (set))]
+ && general_operand (SET_SRC (set), VOIDmode))
+ return true;
+ if (GET_CODE (SET_SRC (set)) == REG
+ && FUNCTION_VALUE_REGNO_P (REGNO (SET_SRC (set)))
+ && GET_CODE (SET_DEST (set)) == REG
+ && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
+ return true;
+ }
+ return false;
+}
+
/* Add fake edges to the function exit for any non constant and non noreturn
calls, volatile inline assembly in the bitmap of blocks specified by
BLOCKS or to the whole CFG if BLOCKS is zero. Return the number of blocks
@@ -259,17 +288,27 @@ flow_call_edges_add (blocks)
spanning tree in the case that the call doesn't return.
Handle this by adding a dummy instruction in a new last basic block. */
- if (check_last_block
- && need_fake_edge_p (BASIC_BLOCK (n_basic_blocks - 1)->end))
+ if (check_last_block)
{
- edge e;
+ basic_block bb = BASIC_BLOCK (n_basic_blocks - 1);
+ rtx insn = bb->end;
- for (e = BASIC_BLOCK (n_basic_blocks - 1)->succ; e; e = e->succ_next)
- if (e->dest == EXIT_BLOCK_PTR)
- break;
+ /* Back up past insns that must be kept in the same block as a call. */
+ while (insn != bb->head
+ && keep_with_call_p (insn))
+ insn = PREV_INSN (insn);
+
+ if (need_fake_edge_p (insn))
+ {
+ edge e;
- insert_insn_on_edge (gen_rtx_USE (VOIDmode, const0_rtx), e);
- commit_edge_insertions ();
+ for (e = bb->succ; e; e = e->succ_next)
+ if (e->dest == EXIT_BLOCK_PTR)
+ break;
+
+ insert_insn_on_edge (gen_rtx_USE (VOIDmode, const0_rtx), e);
+ commit_edge_insertions ();
+ }
}
/* Now add fake edges to the function exit for any non constant
@@ -288,14 +327,22 @@ flow_call_edges_add (blocks)
if (need_fake_edge_p (insn))
{
edge e;
+ rtx split_at_insn = insn;
+
+ /* Don't split the block between a call and an insn that should
+ remain in the same block as the call. */
+ if (GET_CODE (insn) == CALL_INSN)
+ while (split_at_insn != bb->end
+ && keep_with_call_p (NEXT_INSN (split_at_insn)))
+ split_at_insn = NEXT_INSN (split_at_insn);
- /* The above condition should be enough to verify that there is
- no edge to the exit block in CFG already. Calling make_edge
- in such case would make us to mark that edge as fake and
- remove it later. */
+ /* The handling above of the final block before the epilogue
+ should be enough to verify that there is no edge to the exit
+ block in CFG already. Calling make_edge in such case would
+ cause us to mark that edge as fake and remove it later. */
#ifdef ENABLE_CHECKING
- if (insn == bb->end)
+ if (split_at_insn == bb->end)
for (e = bb->succ; e; e = e->succ_next)
if (e->dest == EXIT_BLOCK_PTR)
abort ();
@@ -303,7 +350,7 @@ flow_call_edges_add (blocks)
/* Note that the following may create a new basic block
and renumber the existing basic blocks. */
- e = split_block (bb, insn);
+ e = split_block (bb, split_at_insn);
if (e)
blocks_split++;
diff --git a/contrib/gcc/cfgcleanup.c b/contrib/gcc/cfgcleanup.c
index 13c5a8e..ed48b6e 100644
--- a/contrib/gcc/cfgcleanup.c
+++ b/contrib/gcc/cfgcleanup.c
@@ -1,6 +1,6 @@
/* Control flow optimization code for GNU compiler.
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001 Free Software Foundation, Inc.
+ 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GCC.
@@ -44,6 +44,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "toplev.h"
#include "cselib.h"
#include "tm_p.h"
+#include "target.h"
#include "obstack.h"
@@ -1096,9 +1097,20 @@ outgoing_edges_match (mode, bb1, bb2)
if (!bb2->succ
|| !bb2->succ->succ_next
- || bb1->succ->succ_next->succ_next
+ || bb2->succ->succ_next->succ_next
|| !any_condjump_p (bb2->end)
- || !onlyjump_p (bb1->end))
+ || !onlyjump_p (bb2->end))
+ return false;
+
+ /* Do not crossjump across loop boundaries. This is a temporary
+ workaround for the common scenario in which crossjumping results
+ in killing the duplicated loop condition, making bb-reorder rotate
+ the loop incorectly, leaving an extra unconditional jump inside
+ the loop.
+
+ This check should go away once bb-reorder knows how to duplicate
+ code in this case or rotate the loops to avoid this scenario. */
+ if (bb1->loop_depth != bb2->loop_depth)
return false;
b1 = BRANCH_EDGE (bb1);
@@ -1174,9 +1186,10 @@ outgoing_edges_match (mode, bb1, bb2)
/* Do not use f2 probability as f2 may be forwarded. */
prob2 = REG_BR_PROB_BASE - b2->probability;
- /* Fail if the difference in probabilities is
- greater than 5%. */
- if (abs (b1->probability - prob2) > REG_BR_PROB_BASE / 20)
+ /* Fail if the difference in probabilities is greater than 50%.
+ This rules out two well-predicted branches with opposite
+ outcomes. */
+ if (abs (b1->probability - prob2) > REG_BR_PROB_BASE / 2)
{
if (rtl_dump_file)
fprintf (rtl_dump_file,
@@ -1277,12 +1290,10 @@ try_crossjump_to_edge (mode, e1, e2)
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
&& FORWARDER_BLOCK_P (src1))
e1 = src1->pred, src1 = e1->src;
if (src2->pred
- && !src2->pred->pred_next
&& FORWARDER_BLOCK_P (src2))
e2 = src2->pred, src2 = e2->src;
@@ -1531,149 +1542,158 @@ try_optimize_cfg (mode)
for (i = 0; i < n_basic_blocks; i++)
update_forwarder_flag (BASIC_BLOCK (i));
- /* Attempt to merge blocks as made possible by edge removal. If a block
- has only one successor, and the successor has only one predecessor,
- they may be combined. */
- do
+ if (! (* targetm.cannot_modify_jumps_p) ())
{
- changed = false;
- iterations++;
-
- if (rtl_dump_file)
- fprintf (rtl_dump_file, "\n\ntry_optimize_cfg iteration %i\n\n",
- iterations);
-
- for (i = 0; i < n_basic_blocks;)
+ /* Attempt to merge blocks as made possible by edge removal. If
+ a block has only one successor, and the successor has only
+ one predecessor, they may be combined. */
+ do
{
- basic_block c, b = BASIC_BLOCK (i);
- edge s;
- bool changed_here = false;
+ changed = false;
+ iterations++;
- /* Delete trivially dead basic blocks. */
- while (b->pred == NULL)
+ if (rtl_dump_file)
+ fprintf (rtl_dump_file,
+ "\n\ntry_optimize_cfg iteration %i\n\n",
+ iterations);
+
+ for (i = 0; i < n_basic_blocks;)
{
- c = BASIC_BLOCK (b->index - 1);
- if (rtl_dump_file)
- fprintf (rtl_dump_file, "Deleting block %i.\n", b->index);
+ basic_block c, b = BASIC_BLOCK (i);
+ edge s;
+ bool changed_here = false;
- flow_delete_block (b);
- changed = true;
- b = c;
- }
+ /* Delete trivially dead basic blocks. */
+ while (b->pred == NULL)
+ {
+ c = BASIC_BLOCK (b->index - 1);
+ if (rtl_dump_file)
+ fprintf (rtl_dump_file, "Deleting block %i.\n",
+ b->index);
+
+ flow_delete_block (b);
+ changed = true;
+ b = c;
+ }
- /* Remove code labels no longer used. Don't do this before
- CALL_PLACEHOLDER is removed, as some branches may be hidden
- within. */
- if (b->pred->pred_next == NULL
- && (b->pred->flags & EDGE_FALLTHRU)
- && !(b->pred->flags & EDGE_COMPLEX)
- && GET_CODE (b->head) == CODE_LABEL
- && (!(mode & CLEANUP_PRE_SIBCALL)
- || !tail_recursion_label_p (b->head))
- /* If the previous block ends with a branch to this block,
- we can't delete the label. Normally this is a condjump
- that is yet to be simplified, but 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
- || GET_CODE (b->pred->src->end) != JUMP_INSN
- || ! label_is_jump_target_p (b->head, b->pred->src->end)))
- {
- rtx label = b->head;
+ /* Remove code labels no longer used. Don't do this
+ before CALL_PLACEHOLDER is removed, as some branches
+ may be hidden within. */
+ if (b->pred->pred_next == NULL
+ && (b->pred->flags & EDGE_FALLTHRU)
+ && !(b->pred->flags & EDGE_COMPLEX)
+ && GET_CODE (b->head) == CODE_LABEL
+ && (!(mode & CLEANUP_PRE_SIBCALL)
+ || !tail_recursion_label_p (b->head))
+ /* If the previous block ends with a branch to this
+ block, we can't delete the label. Normally this
+ is a condjump that is yet to be simplified, but
+ 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
+ || GET_CODE (b->pred->src->end) != JUMP_INSN
+ || ! label_is_jump_target_p (b->head,
+ b->pred->src->end)))
+ {
+ rtx label = b->head;
- b->head = NEXT_INSN (b->head);
- delete_insn_chain (label, label);
- if (rtl_dump_file)
- fprintf (rtl_dump_file, "Deleted label in block %i.\n",
- b->index);
- }
+ b->head = NEXT_INSN (b->head);
+ delete_insn_chain (label, label);
+ if (rtl_dump_file)
+ fprintf (rtl_dump_file, "Deleted label in block %i.\n",
+ b->index);
+ }
- /* If we fall through an empty block, we can remove it. */
- if (b->pred->pred_next == NULL
- && (b->pred->flags & EDGE_FALLTHRU)
- && GET_CODE (b->head) != CODE_LABEL
- && FORWARDER_BLOCK_P (b)
- /* Note that forwarder_block_p true ensures that there
- is a successor for this block. */
- && (b->succ->flags & EDGE_FALLTHRU)
- && n_basic_blocks > 1)
- {
- if (rtl_dump_file)
- fprintf (rtl_dump_file, "Deleting fallthru block %i.\n",
- b->index);
+ /* If we fall through an empty block, we can remove it. */
+ if (b->pred->pred_next == NULL
+ && (b->pred->flags & EDGE_FALLTHRU)
+ && GET_CODE (b->head) != CODE_LABEL
+ && FORWARDER_BLOCK_P (b)
+ /* Note that forwarder_block_p true ensures that
+ there is a successor for this block. */
+ && (b->succ->flags & EDGE_FALLTHRU)
+ && n_basic_blocks > 1)
+ {
+ if (rtl_dump_file)
+ fprintf (rtl_dump_file,
+ "Deleting fallthru block %i.\n",
+ b->index);
+
+ c = BASIC_BLOCK (b->index ? b->index - 1 : 1);
+ redirect_edge_succ_nodup (b->pred, b->succ->dest);
+ flow_delete_block (b);
+ changed = true;
+ b = c;
+ }
- c = BASIC_BLOCK (b->index ? b->index - 1 : 1);
- redirect_edge_succ_nodup (b->pred, b->succ->dest);
- flow_delete_block (b);
- changed = true;
- b = c;
- }
+ /* Merge blocks. Loop because chains of blocks might be
+ combineable. */
+ while ((s = b->succ) != NULL
+ && s->succ_next == NULL
+ && !(s->flags & EDGE_COMPLEX)
+ && (c = s->dest) != EXIT_BLOCK_PTR
+ && c->pred->pred_next == NULL
+ /* If the jump insn has side effects,
+ we can't kill the edge. */
+ && (GET_CODE (b->end) != JUMP_INSN
+ || onlyjump_p (b->end))
+ && merge_blocks (s, b, c, mode))
+ changed_here = true;
+
+ /* Simplify branch over branch. */
+ if ((mode & CLEANUP_EXPENSIVE) && try_simplify_condjump (b))
+ {
+ BB_SET_FLAG (b, BB_UPDATE_LIFE);
+ changed_here = true;
+ }
- /* Merge blocks. Loop because chains of blocks might be
- combineable. */
- while ((s = b->succ) != NULL
- && s->succ_next == NULL
- && !(s->flags & EDGE_COMPLEX)
- && (c = s->dest) != EXIT_BLOCK_PTR
- && c->pred->pred_next == NULL
- /* If the jump insn has side effects,
- we can't kill the edge. */
- && (GET_CODE (b->end) != JUMP_INSN
- || onlyjump_p (b->end))
- && merge_blocks (s, b, c, mode))
- changed_here = true;
-
- /* Simplify branch over branch. */
- if ((mode & CLEANUP_EXPENSIVE) && try_simplify_condjump (b))
- {
- BB_SET_FLAG (b, BB_UPDATE_LIFE);
- changed_here = true;
- }
+ /* If B has a single outgoing edge, but uses a
+ non-trivial jump instruction without side-effects, we
+ can either delete the jump entirely, or replace it
+ with a simple unconditional jump. Use
+ redirect_edge_and_branch to do the dirty work. */
+ if (b->succ
+ && ! b->succ->succ_next
+ && b->succ->dest != EXIT_BLOCK_PTR
+ && onlyjump_p (b->end)
+ && redirect_edge_and_branch (b->succ, b->succ->dest))
+ {
+ BB_SET_FLAG (b, BB_UPDATE_LIFE);
+ update_forwarder_flag (b);
+ changed_here = true;
+ }
- /* If B has a single outgoing edge, but uses a non-trivial jump
- instruction without side-effects, we can either delete the
- jump entirely, or replace it with a simple unconditional jump.
- Use redirect_edge_and_branch to do the dirty work. */
- if (b->succ
- && ! b->succ->succ_next
- && b->succ->dest != EXIT_BLOCK_PTR
- && onlyjump_p (b->end)
- && redirect_edge_and_branch (b->succ, b->succ->dest))
- {
- BB_SET_FLAG (b, BB_UPDATE_LIFE);
- update_forwarder_flag (b);
- changed_here = true;
- }
+ /* Simplify branch to branch. */
+ if (try_forward_edges (mode, b))
+ changed_here = true;
- /* Simplify branch to branch. */
- if (try_forward_edges (mode, b))
- changed_here = true;
+ /* Look for shared code between blocks. */
+ if ((mode & CLEANUP_CROSSJUMP)
+ && try_crossjump_bb (mode, b))
+ changed_here = true;
- /* Look for shared code between blocks. */
- if ((mode & CLEANUP_CROSSJUMP)
- && try_crossjump_bb (mode, b))
- changed_here = true;
+ /* Don't get confused by the index shift caused by
+ deleting blocks. */
+ if (!changed_here)
+ i = b->index + 1;
+ else
+ changed = true;
+ }
- /* Don't get confused by the index shift caused by deleting
- blocks. */
- if (!changed_here)
- i = b->index + 1;
- else
+ if ((mode & CLEANUP_CROSSJUMP)
+ && try_crossjump_bb (mode, EXIT_BLOCK_PTR))
changed = true;
- }
-
- if ((mode & CLEANUP_CROSSJUMP)
- && try_crossjump_bb (mode, EXIT_BLOCK_PTR))
- changed = true;
#ifdef ENABLE_CHECKING
- if (changed)
- verify_flow_info ();
+ if (changed)
+ verify_flow_info ();
#endif
- changed_overall |= changed;
+ changed_overall |= changed;
+ }
+ while (changed);
}
- while (changed);
if (mode & CLEANUP_CROSSJUMP)
remove_fake_edges ();
@@ -1709,22 +1729,33 @@ try_optimize_cfg (mode)
static bool
delete_unreachable_blocks ()
{
- int i;
+ int i, j;
bool changed = false;
find_unreachable_blocks ();
- /* Delete all unreachable basic blocks. Count down so that we
- don't interfere with the block renumbering that happens in
- flow_delete_block. */
+ /* Delete all unreachable basic blocks. Do compaction concurrently,
+ as otherwise we can wind up with O(N^2) behaviour here when we
+ have oodles of dead code. */
- for (i = n_basic_blocks - 1; i >= 0; --i)
+ for (i = j = 0; i < n_basic_blocks; ++i)
{
basic_block b = BASIC_BLOCK (i);
if (!(b->flags & BB_REACHABLE))
- flow_delete_block (b), changed = true;
+ {
+ flow_delete_block_noexpunge (b);
+ expunge_block_nocompact (b);
+ changed = true;
+ }
+ else
+ {
+ BASIC_BLOCK (j) = b;
+ b->index = j++;
+ }
}
+ n_basic_blocks = j;
+ basic_block_info->num_elements = j;
if (changed)
tidy_fallthru_edges ();
diff --git a/contrib/gcc/cfgrtl.c b/contrib/gcc/cfgrtl.c
index f318798..5e8bde2 100644
--- a/contrib/gcc/cfgrtl.c
+++ b/contrib/gcc/cfgrtl.c
@@ -1,6 +1,6 @@
/* Control flow graph manipulation code for GNU compiler.
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001 Free Software Foundation, Inc.
+ 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GCC.
@@ -101,8 +101,7 @@ can_delete_label_p (label)
/* User declared labels must be preserved. */
&& LABEL_NAME (label) == 0
&& !in_expr_list_p (forced_labels, label)
- && !in_expr_list_p (label_value_list, label)
- && !in_expr_list_p (exception_handler_labels, label));
+ && !in_expr_list_p (label_value_list, label));
}
/* Delete INSN by patching it out. Return the next insn. */
@@ -323,7 +322,7 @@ create_basic_block (index, head, end)
to post-process the stream to remove empty blocks, loops, ranges, etc. */
int
-flow_delete_block (b)
+flow_delete_block_noexpunge (b)
basic_block b;
{
int deleted_handler = 0;
@@ -338,7 +337,7 @@ flow_delete_block (b)
insn = b->head;
- never_reached_warning (insn);
+ never_reached_warning (insn, b->end);
if (GET_CODE (insn) == CODE_LABEL)
maybe_remove_eh_handler (insn);
@@ -372,6 +371,15 @@ flow_delete_block (b)
b->pred = NULL;
b->succ = NULL;
+ return deleted_handler;
+}
+
+int
+flow_delete_block (b)
+ basic_block b;
+{
+ int deleted_handler = flow_delete_block_noexpunge (b);
+
/* Remove the basic block from the array, and compact behind it. */
expunge_block (b);
@@ -611,9 +619,9 @@ merge_blocks_nomove (a, b)
rtx x;
for (x = a_end; x != b_end; x = NEXT_INSN (x))
- BLOCK_FOR_INSN (x) = a;
+ set_block_for_insn (x, a);
- BLOCK_FOR_INSN (b_end) = a;
+ set_block_for_insn (b_end, a);
}
a_end = b_end;
@@ -714,7 +722,7 @@ try_redirect_by_replacing_jump (e, target)
else
{
rtx target_label = block_label (target);
- rtx barrier;
+ rtx barrier, tmp;
emit_jump_insn_after (gen_jump (target_label), insn);
JUMP_LABEL (src->end) = target_label;
@@ -723,8 +731,21 @@ try_redirect_by_replacing_jump (e, target)
fprintf (rtl_dump_file, "Replacing insn %i by jump %i\n",
INSN_UID (insn), INSN_UID (src->end));
+
delete_insn_chain (kill_from, insn);
+ /* Recognize a tablejump that we are converting to a
+ simple jump and remove its associated CODE_LABEL
+ and ADDR_VEC or ADDR_DIFF_VEC. */
+ if ((tmp = JUMP_LABEL (insn)) != NULL_RTX
+ && (tmp = NEXT_INSN (tmp)) != NULL_RTX
+ && GET_CODE (tmp) == JUMP_INSN
+ && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
+ || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
+ {
+ delete_insn_chain (JUMP_LABEL (insn), tmp);
+ }
+
barrier = next_nonnote_insn (src->end);
if (!barrier || GET_CODE (barrier) != BARRIER)
emit_barrier_after (src->end);
@@ -905,7 +926,31 @@ force_nonfallthru_and_redirect (e, target)
abort ();
else if (!(e->flags & EDGE_FALLTHRU))
abort ();
- else if (e->src->succ->succ_next)
+ else 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 (0, e->dest->head, NULL);
+
+ /* 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;
+ bb->count = e->count;
+ bb->frequency = EDGE_FREQUENCY (e);
+ bb->loop_depth = 0;
+ 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;
+ make_single_succ_edge (ENTRY_BLOCK_PTR, bb, EDGE_FALLTHRU);
+ }
+
+ if (e->src->succ->succ_next)
{
/* Create the new structures. */
note = last_loop_beg_note (e->src->end);
@@ -1180,6 +1225,7 @@ split_edge (edge_in)
: edge_in->dest->index, before, NULL);
bb->count = edge_in->count;
bb->frequency = EDGE_FREQUENCY (edge_in);
+ bb->loop_depth = edge_in->dest->loop_depth;
/* ??? This info is likely going to be out of date very soon. */
if (edge_in->dest->global_live_at_start)
@@ -1863,9 +1909,30 @@ purge_dead_edges (bb)
rtx insn = bb->end, note;
bool purged = false;
- /* ??? This makes no sense since the later test includes more cases. */
- if (GET_CODE (insn) == JUMP_INSN && !simplejump_p (insn))
- return false;
+ /* If this instruction cannot trap, remove REG_EH_REGION notes. */
+ if (GET_CODE (insn) == INSN
+ && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
+ {
+ rtx eqnote;
+
+ if (! may_trap_p (PATTERN (insn))
+ || ((eqnote = find_reg_equal_equiv_note (insn))
+ && ! may_trap_p (XEXP (eqnote, 0))))
+ remove_note (insn, note);
+ }
+
+ /* Cleanup abnormal edges caused by throwing insns that have been
+ eliminated. */
+ if (! can_throw_internal (bb->end))
+ for (e = bb->succ; e; e = next)
+ {
+ next = e->succ_next;
+ if (e->flags & EDGE_EH)
+ {
+ remove_edge (e);
+ purged = true;
+ }
+ }
if (GET_CODE (insn) == JUMP_INSN)
{
@@ -1934,31 +2001,6 @@ purge_dead_edges (bb)
return purged;
}
- /* If this instruction cannot trap, remove REG_EH_REGION notes. */
- if (GET_CODE (insn) == INSN
- && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
- {
- rtx eqnote;
-
- if (! may_trap_p (PATTERN (insn))
- || ((eqnote = find_reg_equal_equiv_note (insn))
- && ! may_trap_p (XEXP (eqnote, 0))))
- remove_note (insn, note);
- }
-
- /* Cleanup abnormal edges caused by throwing insns that have been
- eliminated. */
- if (! can_throw_internal (bb->end))
- for (e = bb->succ; e; e = next)
- {
- next = e->succ_next;
- if (e->flags & EDGE_EH)
- {
- remove_edge (e);
- purged = true;
- }
- }
-
/* If we don't see a jump insn, we don't know exactly why the block would
have been broken at this point. Look for a simple, non-fallthru edge,
as these are only created by conditional branches. If we find such an
diff --git a/contrib/gcc/collect2.c b/contrib/gcc/collect2.c
index 23e4606..6fb2efd 100644
--- a/contrib/gcc/collect2.c
+++ b/contrib/gcc/collect2.c
@@ -532,7 +532,7 @@ dump_file (name)
if (no_demangle)
result = 0;
else
- result = cplus_demangle (p, DMGL_PARAMS | DMGL_ANSI);
+ result = cplus_demangle (p, DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE);
if (result)
{
diff --git a/contrib/gcc/combine.c b/contrib/gcc/combine.c
index 47ac3a8..bb22b0c 100644
--- a/contrib/gcc/combine.c
+++ b/contrib/gcc/combine.c
@@ -424,6 +424,33 @@ do_SUBST (into, newval)
if (oldval == newval)
return;
+ /* We'd like to catch as many invalid transformations here as
+ possible. Unfortunately, there are way too many mode changes
+ that are perfectly valid, so we'd waste too much effort for
+ little gain doing the checks here. Focus on catching invalid
+ transformations involving integer constants. */
+ if (GET_MODE_CLASS (GET_MODE (oldval)) == MODE_INT
+ && GET_CODE (newval) == CONST_INT)
+ {
+ /* Sanity check that we're replacing oldval with a CONST_INT
+ that is a valid sign-extension for the original mode. */
+ if (INTVAL (newval) != trunc_int_for_mode (INTVAL (newval),
+ GET_MODE (oldval)))
+ abort ();
+
+ /* Replacing the operand of a SUBREG or a ZERO_EXTEND with a
+ CONST_INT is not valid, because after the replacement, the
+ original mode would be gone. Unfortunately, we can't tell
+ when do_SUBST is called to replace the operand thereof, so we
+ perform this test on oldval instead, checking whether an
+ invalid replacement took place before we got here. */
+ if ((GET_CODE (oldval) == SUBREG
+ && GET_CODE (SUBREG_REG (oldval)) == CONST_INT)
+ || (GET_CODE (oldval) == ZERO_EXTEND
+ && GET_CODE (XEXP (oldval, 0)) == CONST_INT))
+ abort ();
+ }
+
if (undobuf.frees)
buf = undobuf.frees, undobuf.frees = buf->next;
else
@@ -877,8 +904,10 @@ set_nonzero_bits_and_sign_copies (x, set, data)
<< GET_MODE_BITSIZE (GET_MODE (x))));
#endif
- reg_nonzero_bits[REGNO (x)]
- |= nonzero_bits (src, nonzero_bits_mode);
+ /* Don't call nonzero_bits if it cannot change anything. */
+ if (reg_nonzero_bits[REGNO (x)] != ~(unsigned HOST_WIDE_INT) 0)
+ reg_nonzero_bits[REGNO (x)]
+ |= nonzero_bits (src, nonzero_bits_mode);
num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
if (reg_sign_bit_copies[REGNO (x)] == 0
|| reg_sign_bit_copies[REGNO (x)] > num)
@@ -1478,6 +1507,7 @@ try_combine (i3, i2, i1, new_direct_jump_p)
{
/* New patterns for I3 and I2, respectively. */
rtx newpat, newi2pat = 0;
+ int substed_i2 = 0, substed_i1 = 0;
/* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead. */
int added_sets_1, added_sets_2;
/* Total number of SETs to put into I3. */
@@ -1939,6 +1969,7 @@ try_combine (i3, i2, i1, new_direct_jump_p)
subst_low_cuid = INSN_CUID (i2);
newpat = subst (PATTERN (i3), i2dest, i2src, 0,
! i1_feeds_i3 && i1dest_in_i1src);
+ substed_i2 = 1;
/* Record whether i2's body now appears within i3's body. */
i2_is_used = n_occurrences;
@@ -1963,6 +1994,7 @@ try_combine (i3, i2, i1, new_direct_jump_p)
n_occurrences = 0;
subst_low_cuid = INSN_CUID (i1);
newpat = subst (newpat, i1dest, i1src, 0, 0);
+ substed_i1 = 1;
}
/* Fail if an autoincrement side-effect has been duplicated. Be careful
@@ -2534,6 +2566,23 @@ try_combine (i3, i2, i1, new_direct_jump_p)
INSN_CODE (i3) = insn_code_number;
PATTERN (i3) = newpat;
+
+ if (GET_CODE (i3) == CALL_INSN && CALL_INSN_FUNCTION_USAGE (i3))
+ {
+ rtx call_usage = CALL_INSN_FUNCTION_USAGE (i3);
+
+ reset_used_flags (call_usage);
+ call_usage = copy_rtx (call_usage);
+
+ if (substed_i2)
+ replace_rtx (call_usage, i2dest, i2src);
+
+ if (substed_i1)
+ replace_rtx (call_usage, i1dest, i1src);
+
+ CALL_INSN_FUNCTION_USAGE (i3) = call_usage;
+ }
+
if (undobuf.other_insn)
INSN_CODE (undobuf.other_insn) = other_code_number;
@@ -3013,8 +3062,11 @@ find_split_point (loc, insn)
SUBST (SET_SRC (x),
gen_binary (IOR, mode,
gen_binary (AND, mode, dest,
- GEN_INT (~(mask << pos)
- & GET_MODE_MASK (mode))),
+ GEN_INT
+ (
+ trunc_int_for_mode
+ (~(mask << pos)
+ & GET_MODE_MASK (mode), mode))),
GEN_INT (src << pos)));
SUBST (SET_DEST (x), dest);
@@ -3485,7 +3537,24 @@ subst (x, from, to, in_dest, unique_copy)
if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx)
return new;
- SUBST (XEXP (x, i), new);
+ if (GET_CODE (new) == CONST_INT && GET_CODE (x) == SUBREG)
+ {
+ x = simplify_subreg (GET_MODE (x), new,
+ GET_MODE (SUBREG_REG (x)),
+ SUBREG_BYTE (x));
+ if (! x)
+ abort ();
+ }
+ else if (GET_CODE (new) == CONST_INT
+ && GET_CODE (x) == ZERO_EXTEND)
+ {
+ x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
+ new, GET_MODE (XEXP (x, 0)));
+ if (! x)
+ abort ();
+ }
+ else
+ SUBST (XEXP (x, i), new);
}
}
}
@@ -3807,6 +3876,13 @@ combine_simplify_rtx (x, op0_mode, last, in_dest)
return temp;
}
+ /* Don't change the mode of the MEM if that would change the meaning
+ of the address. */
+ if (GET_CODE (SUBREG_REG (x)) == MEM
+ && (MEM_VOLATILE_P (SUBREG_REG (x))
+ || mode_dependent_address_p (XEXP (SUBREG_REG (x), 0))))
+ return gen_rtx_CLOBBER (mode, const0_rtx);
+
/* Note that we cannot do any narrowing for non-constants since
we might have been counting on using the fact that some bits were
zero. We now do this in the SET. */
@@ -5963,6 +6039,9 @@ make_extraction (mode, inner, pos, pos_rtx, len,
if (mode == tmode)
return new;
+ if (GET_CODE (new) == CONST_INT)
+ return GEN_INT (trunc_int_for_mode (INTVAL (new), mode));
+
/* If we know that no extraneous bits are set, and that the high
bit is not set, convert the extraction to the cheaper of
sign and zero extension, that are equivalent in these cases. */
@@ -6753,33 +6832,12 @@ force_to_mode (x, mode, mask, reg, just_select)
smask |= (HOST_WIDE_INT) -1 << width;
if (GET_CODE (XEXP (x, 1)) == CONST_INT
- && exact_log2 (- smask) >= 0)
- {
-#ifdef STACK_BIAS
- if (STACK_BIAS
- && (XEXP (x, 0) == stack_pointer_rtx
- || XEXP (x, 0) == frame_pointer_rtx))
- {
- int sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT;
- unsigned HOST_WIDE_INT sp_mask = GET_MODE_MASK (mode);
-
- sp_mask &= ~(sp_alignment - 1);
- if ((sp_mask & ~smask) == 0
- && ((INTVAL (XEXP (x, 1)) - STACK_BIAS) & ~smask) != 0)
- return force_to_mode (plus_constant (XEXP (x, 0),
- ((INTVAL (XEXP (x, 1)) -
- STACK_BIAS) & smask)
- + STACK_BIAS),
- mode, smask, reg, next_select);
- }
-#endif
- if ((nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
- && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
- return force_to_mode (plus_constant (XEXP (x, 0),
- (INTVAL (XEXP (x, 1))
- & smask)),
- mode, smask, reg, next_select);
- }
+ && exact_log2 (- smask) >= 0
+ && (nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
+ && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
+ return force_to_mode (plus_constant (XEXP (x, 0),
+ (INTVAL (XEXP (x, 1)) & smask)),
+ mode, smask, reg, next_select);
}
/* ... fall through ... */
@@ -7322,7 +7380,7 @@ if_then_else_cond (x, ptrue, pfalse)
&& GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
&& exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
{
- *ptrue = GEN_INT (nz), *pfalse = const0_rtx;
+ *ptrue = GEN_INT (trunc_int_for_mode (nz, mode)), *pfalse = const0_rtx;
return x;
}
@@ -7431,6 +7489,50 @@ known_cond (x, cond, reg, val)
}
}
}
+ else if (code == SUBREG)
+ {
+ enum machine_mode inner_mode = GET_MODE (SUBREG_REG (x));
+ rtx new, r = known_cond (SUBREG_REG (x), cond, reg, val);
+
+ if (SUBREG_REG (x) != r)
+ {
+ /* We must simplify subreg here, before we lose track of the
+ original inner_mode. */
+ new = simplify_subreg (GET_MODE (x), r,
+ inner_mode, SUBREG_BYTE (x));
+ if (new)
+ return new;
+ else
+ SUBST (SUBREG_REG (x), r);
+ }
+
+ return x;
+ }
+ /* We don't have to handle SIGN_EXTEND here, because even in the
+ case of replacing something with a modeless CONST_INT, a
+ CONST_INT is already (supposed to be) a valid sign extension for
+ its narrower mode, which implies it's already properly
+ sign-extended for the wider mode. Now, for ZERO_EXTEND, the
+ story is different. */
+ else if (code == ZERO_EXTEND)
+ {
+ enum machine_mode inner_mode = GET_MODE (XEXP (x, 0));
+ rtx new, r = known_cond (XEXP (x, 0), cond, reg, val);
+
+ if (XEXP (x, 0) != r)
+ {
+ /* We must simplify the zero_extend here, before we lose
+ track of the original inner_mode. */
+ new = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
+ r, inner_mode);
+ if (new)
+ return new;
+ else
+ SUBST (XEXP (x, 0), r);
+ }
+
+ return x;
+ }
fmt = GET_RTX_FORMAT (code);
for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
@@ -7743,14 +7845,23 @@ simplify_and_const_int (x, mode, varop, constop)
int i;
/* Simplify VAROP knowing that we will be only looking at some of the
- bits in it. */
+ bits in it.
+
+ Note by passing in CONSTOP, we guarantee that the bits not set in
+ CONSTOP are not significant and will never be examined. We must
+ ensure that is the case by explicitly masking out those bits
+ before returning. */
varop = force_to_mode (varop, mode, constop, NULL_RTX, 0);
- /* If VAROP is a CLOBBER, we will fail so return it; if it is a
- CONST_INT, we are done. */
- if (GET_CODE (varop) == CLOBBER || GET_CODE (varop) == CONST_INT)
+ /* If VAROP is a CLOBBER, we will fail so return it. */
+ if (GET_CODE (varop) == CLOBBER)
return varop;
+ /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
+ to VAROP and return the new constant. */
+ if (GET_CODE (varop) == CONST_INT)
+ return GEN_INT (trunc_int_for_mode (INTVAL (varop) & constop, mode));
+
/* See what bits may be nonzero in VAROP. Unlike the general case of
a call to nonzero_bits, here we don't care about bits outside
MODE. */
@@ -7916,40 +8027,28 @@ nonzero_bits (x, mode)
nonzero &= GET_MODE_MASK (ptr_mode);
#endif
-#ifdef STACK_BOUNDARY
- /* If this is the stack pointer, we may know something about its
- alignment. If PUSH_ROUNDING is defined, it is possible for the
- stack to be momentarily aligned only to that amount, so we pick
- the least alignment. */
-
- /* We can't check for arg_pointer_rtx here, because it is not
- guaranteed to have as much alignment as the stack pointer.
- In particular, in the Irix6 n64 ABI, the stack has 128 bit
- alignment but the argument pointer has only 64 bit alignment. */
-
- if ((x == frame_pointer_rtx
- || x == stack_pointer_rtx
- || x == hard_frame_pointer_rtx
- || (REGNO (x) >= FIRST_VIRTUAL_REGISTER
- && REGNO (x) <= LAST_VIRTUAL_REGISTER))
-#ifdef STACK_BIAS
- && !STACK_BIAS
-#endif
- )
+ /* Include declared information about alignment of pointers. */
+ /* ??? We don't properly preserve REG_POINTER changes across
+ pointer-to-integer casts, so we can't trust it except for
+ things that we know must be pointers. See execute/960116-1.c. */
+ if ((x == stack_pointer_rtx
+ || x == frame_pointer_rtx
+ || x == arg_pointer_rtx)
+ && REGNO_POINTER_ALIGN (REGNO (x)))
{
- int sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT;
+ unsigned HOST_WIDE_INT alignment
+ = REGNO_POINTER_ALIGN (REGNO (x)) / BITS_PER_UNIT;
#ifdef PUSH_ROUNDING
- if (REGNO (x) == STACK_POINTER_REGNUM && PUSH_ARGS)
- sp_alignment = MIN (PUSH_ROUNDING (1), sp_alignment);
+ /* If PUSH_ROUNDING is defined, it is possible for the
+ stack to be momentarily aligned only to that amount,
+ so we pick the least alignment. */
+ if (x == stack_pointer_rtx && PUSH_ARGS)
+ alignment = MIN (PUSH_ROUNDING (1), alignment);
#endif
- /* We must return here, otherwise we may get a worse result from
- one of the choices below. There is nothing useful below as
- far as the stack pointer is concerned. */
- return nonzero &= ~(sp_alignment - 1);
+ nonzero &= ~(alignment - 1);
}
-#endif
/* If X is a register whose nonzero bits value is current, use it.
Otherwise, if X is a register whose value we can find, use that
@@ -7957,14 +8056,16 @@ nonzero_bits (x, mode)
for this register. */
if (reg_last_set_value[REGNO (x)] != 0
- && reg_last_set_mode[REGNO (x)] == mode
+ && (reg_last_set_mode[REGNO (x)] == mode
+ || (GET_MODE_CLASS (reg_last_set_mode[REGNO (x)]) == MODE_INT
+ && GET_MODE_CLASS (mode) == MODE_INT))
&& (reg_last_set_label[REGNO (x)] == label_tick
|| (REGNO (x) >= FIRST_PSEUDO_REGISTER
&& REG_N_SETS (REGNO (x)) == 1
&& ! REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start,
REGNO (x))))
&& INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid)
- return reg_last_set_nonzero_bits[REGNO (x)];
+ return reg_last_set_nonzero_bits[REGNO (x)] & nonzero;
tem = get_last_value (x);
@@ -7990,7 +8091,7 @@ nonzero_bits (x, mode)
| ((HOST_WIDE_INT) (-1)
<< GET_MODE_BITSIZE (GET_MODE (x))));
#endif
- return nonzero_bits (tem, mode);
+ return nonzero_bits (tem, mode) & nonzero;
}
else if (nonzero_sign_valid && reg_nonzero_bits[REGNO (x)])
{
@@ -8099,8 +8200,14 @@ nonzero_bits (x, mode)
case XOR: case IOR:
case UMIN: case UMAX: case SMIN: case SMAX:
- nonzero &= (nonzero_bits (XEXP (x, 0), mode)
- | nonzero_bits (XEXP (x, 1), mode));
+ {
+ unsigned HOST_WIDE_INT nonzero0 = nonzero_bits (XEXP (x, 0), mode);
+
+ /* Don't call nonzero_bits for the second time if it cannot change
+ anything. */
+ if ((nonzero & nonzero0) != nonzero)
+ nonzero &= (nonzero0 | nonzero_bits (XEXP (x, 1), mode));
+ }
break;
case PLUS: case MINUS:
@@ -8128,22 +8235,6 @@ nonzero_bits (x, mode)
switch (code)
{
case PLUS:
-#ifdef STACK_BIAS
- if (STACK_BIAS
- && (XEXP (x, 0) == stack_pointer_rtx
- || XEXP (x, 0) == frame_pointer_rtx)
- && GET_CODE (XEXP (x, 1)) == CONST_INT)
- {
- int sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT;
-
- nz0 = (GET_MODE_MASK (mode) & ~(sp_alignment - 1));
- nz1 = INTVAL (XEXP (x, 1)) - STACK_BIAS;
- width0 = floor_log2 (nz0) + 1;
- width1 = floor_log2 (nz1) + 1;
- low0 = floor_log2 (nz0 & -nz0);
- low1 = floor_log2 (nz1 & -nz1);
- }
-#endif
result_width = MAX (width0, width1) + 1;
result_low = MIN (low0, low1);
break;
@@ -9590,7 +9681,7 @@ recog_for_combine (pnewpat, insn, pnotes)
int num_clobbers_to_add = 0;
int i;
rtx notes = 0;
- rtx old_notes;
+ rtx dummy_insn;
/* If PAT is a PARALLEL, check to see if it contains the CLOBBER
we use to indicate that something didn't match. If we find such a
@@ -9601,11 +9692,13 @@ recog_for_combine (pnewpat, insn, pnotes)
&& XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
return -1;
- /* Remove the old notes prior to trying to recognize the new pattern. */
- old_notes = REG_NOTES (insn);
- REG_NOTES (insn) = 0;
+ /* *pnewpat does not have to be actual PATTERN (insn), so make a dummy
+ instruction for pattern recognition. */
+ dummy_insn = shallow_copy_rtx (insn);
+ PATTERN (dummy_insn) = pat;
+ REG_NOTES (dummy_insn) = 0;
- insn_code_number = recog (pat, insn, &num_clobbers_to_add);
+ insn_code_number = recog (pat, dummy_insn, &num_clobbers_to_add);
/* If it isn't, there is the possibility that we previously had an insn
that clobbered some register as a side effect, but the combined
@@ -9630,15 +9723,14 @@ recog_for_combine (pnewpat, insn, pnotes)
if (pos == 1)
pat = XVECEXP (pat, 0, 0);
- insn_code_number = recog (pat, insn, &num_clobbers_to_add);
+ PATTERN (dummy_insn) = pat;
+ insn_code_number = recog (pat, dummy_insn, &num_clobbers_to_add);
}
/* Recognize all noop sets, these will be killed by followup pass. */
if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
- REG_NOTES (insn) = old_notes;
-
/* If we had any clobbers to add, make a new pattern than contains
them. Then check to make sure that all of them are dead. */
if (num_clobbers_to_add)
@@ -10775,9 +10867,9 @@ simplify_comparison (code, pop0, pop1)
&& XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
&& (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
MODE_INT, 1)) != BLKmode
- && ((unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (tmode)
- || ((unsigned HOST_WIDE_INT) -const_op
- <= GET_MODE_MASK (tmode))))
+ && (((unsigned HOST_WIDE_INT) const_op
+ + (GET_MODE_MASK (tmode) >> 1) + 1)
+ <= GET_MODE_MASK (tmode)))
{
op0 = gen_lowpart_for_combine (tmode, XEXP (XEXP (op0, 0), 0));
continue;
@@ -10794,9 +10886,9 @@ simplify_comparison (code, pop0, pop1)
&& XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
&& (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
MODE_INT, 1)) != BLKmode
- && ((unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (tmode)
- || ((unsigned HOST_WIDE_INT) -const_op
- <= GET_MODE_MASK (tmode))))
+ && (((unsigned HOST_WIDE_INT) const_op
+ + (GET_MODE_MASK (tmode) >> 1) + 1)
+ <= GET_MODE_MASK (tmode)))
{
rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
rtx add_const = XEXP (XEXP (op0, 0), 1);
@@ -10821,10 +10913,18 @@ simplify_comparison (code, pop0, pop1)
&& mode_width <= HOST_BITS_PER_WIDE_INT
&& (nonzero_bits (XEXP (op0, 0), mode)
& (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
- && (const_op == 0
- || (floor_log2 (const_op) + INTVAL (XEXP (op0, 1))
- < mode_width)))
- {
+ && (((unsigned HOST_WIDE_INT) const_op
+ + (GET_CODE (op0) != LSHIFTRT
+ ? ((GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1)) >> 1)
+ + 1)
+ : 0))
+ <= GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1))))
+ {
+ /* If the shift was logical, then we must make the condition
+ unsigned. */
+ if (GET_CODE (op0) == LSHIFTRT)
+ code = unsigned_condition (code);
+
const_op <<= INTVAL (XEXP (op0, 1));
op1 = GEN_INT (const_op);
op0 = XEXP (op0, 0);
@@ -10853,38 +10953,56 @@ simplify_comparison (code, pop0, pop1)
/* Now make any compound operations involved in this comparison. Then,
check for an outmost SUBREG on OP0 that is not doing anything or is
- paradoxical. The latter case can only occur when it is known that the
- "extra" bits will be zero. Therefore, it is safe to remove the SUBREG.
- We can never remove a SUBREG for a non-equality comparison because the
- sign bit is in a different place in the underlying object. */
+ paradoxical. The latter transformation must only be performed when
+ it is known that the "extra" bits will be the same in op0 and op1 or
+ that they don't matter. There are three cases to consider:
+
+ 1. SUBREG_REG (op0) is a register. In this case the bits are don't
+ care bits and we can assume they have any convenient value. So
+ making the transformation is safe.
+
+ 2. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is not defined.
+ In this case the upper bits of op0 are undefined. We should not make
+ the simplification in that case as we do not know the contents of
+ those bits.
+
+ 3. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is defined and not
+ NIL. In that case we know those bits are zeros or ones. We must
+ also be sure that they are the same as the upper bits of op1.
+
+ We can never remove a SUBREG for a non-equality comparison because
+ the sign bit is in a different place in the underlying object. */
op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
op1 = make_compound_operation (op1, SET);
if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
+ /* Case 3 above, to sometimes allow (subreg (mem x)), isn't
+ implemented. */
+ && GET_CODE (SUBREG_REG (op0)) == REG
&& GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
&& GET_MODE_CLASS (GET_MODE (SUBREG_REG (op0))) == MODE_INT
- && (code == NE || code == EQ)
- && ((GET_MODE_SIZE (GET_MODE (op0))
- > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))))
+ && (code == NE || code == EQ))
{
- op0 = SUBREG_REG (op0);
- op1 = gen_lowpart_for_combine (GET_MODE (op0), op1);
- }
+ if (GET_MODE_SIZE (GET_MODE (op0))
+ > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))
+ {
+ op0 = SUBREG_REG (op0);
+ op1 = gen_lowpart_for_combine (GET_MODE (op0), op1);
+ }
+ else if ((GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
+ <= HOST_BITS_PER_WIDE_INT)
+ && (nonzero_bits (SUBREG_REG (op0),
+ GET_MODE (SUBREG_REG (op0)))
+ & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
+ {
+ tem = gen_lowpart_for_combine (GET_MODE (SUBREG_REG (op0)), op1);
- else if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
- && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
- && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op0))) == MODE_INT
- && (code == NE || code == EQ)
- && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
- <= HOST_BITS_PER_WIDE_INT)
- && (nonzero_bits (SUBREG_REG (op0), GET_MODE (SUBREG_REG (op0)))
- & ~GET_MODE_MASK (GET_MODE (op0))) == 0
- && (tem = gen_lowpart_for_combine (GET_MODE (SUBREG_REG (op0)),
- op1),
- (nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
- & ~GET_MODE_MASK (GET_MODE (op0))) == 0))
- op0 = SUBREG_REG (op0), op1 = tem;
+ if ((nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
+ & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
+ op0 = SUBREG_REG (op0), op1 = tem;
+ }
+ }
/* We now do the opposite procedure: Some machines don't have compare
insns in all modes. If OP0's mode is an integer mode smaller than a
@@ -10902,14 +11020,22 @@ simplify_comparison (code, pop0, pop1)
tmode = GET_MODE_WIDER_MODE (tmode))
if (have_insn_for (COMPARE, tmode))
{
+ int zero_extended;
+
/* If the only nonzero bits in OP0 and OP1 are those in the
narrower mode and this is an equality or unsigned comparison,
we can use the wider mode. Similarly for sign-extended
values, in which case it is true for all comparisons. */
- if (((code == EQ || code == NE
- || code == GEU || code == GTU || code == LEU || code == LTU)
- && (nonzero_bits (op0, tmode) & ~GET_MODE_MASK (mode)) == 0
- && (nonzero_bits (op1, tmode) & ~GET_MODE_MASK (mode)) == 0)
+ zero_extended = ((code == EQ || code == NE
+ || code == GEU || code == GTU
+ || code == LEU || code == LTU)
+ && (nonzero_bits (op0, tmode)
+ & ~GET_MODE_MASK (mode)) == 0
+ && ((GET_CODE (op1) == CONST_INT
+ || (nonzero_bits (op1, tmode)
+ & ~GET_MODE_MASK (mode)) == 0)));
+
+ if (zero_extended
|| ((num_sign_bit_copies (op0, tmode)
> GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))
&& (num_sign_bit_copies (op1, tmode)
@@ -10926,6 +11052,8 @@ simplify_comparison (code, pop0, pop1)
XEXP (op0, 1)));
op0 = gen_lowpart_for_combine (tmode, op0);
+ if (zero_extended && GET_CODE (op1) == CONST_INT)
+ op1 = GEN_INT (INTVAL (op1) & GET_MODE_MASK (mode));
op1 = gen_lowpart_for_combine (tmode, op1);
break;
}
@@ -11123,9 +11251,13 @@ record_value_for_reg (reg, insn, value)
if (value)
{
+ enum machine_mode mode = GET_MODE (reg);
subst_low_cuid = INSN_CUID (insn);
- reg_last_set_mode[regno] = GET_MODE (reg);
- reg_last_set_nonzero_bits[regno] = nonzero_bits (value, GET_MODE (reg));
+ reg_last_set_mode[regno] = mode;
+ if (GET_MODE_CLASS (mode) == MODE_INT
+ && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
+ mode = nonzero_bits_mode;
+ reg_last_set_nonzero_bits[regno] = nonzero_bits (value, mode);
reg_last_set_sign_bit_copies[regno]
= num_sign_bit_copies (value, GET_MODE (reg));
}
@@ -11612,6 +11744,7 @@ mark_used_regs_combine (x)
case CONST_INT:
case CONST:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case PC:
case ADDR_VEC:
case ADDR_DIFF_VEC:
diff --git a/contrib/gcc/concat.c b/contrib/gcc/concat.c
new file mode 100644
index 0000000..98b20e1
--- /dev/null
+++ b/contrib/gcc/concat.c
@@ -0,0 +1,236 @@
+/* Concatenate variable number of strings.
+ Copyright (C) 1991, 1994, 2001 Free Software Foundation, Inc.
+ Written by Fred Fish @ Cygnus Support
+
+This file is part of the libiberty library.
+Libiberty is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+Libiberty 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with libiberty; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+
+/*
+
+@deftypefn Extension char* concat (const char *@var{s1}, const char *@var{s2}, @dots{}, @code{NULL})
+
+Concatenate zero or more of strings and return the result in freshly
+@code{xmalloc}ed memory. Returns @code{NULL} if insufficient memory is
+available. The argument list is terminated by the first @code{NULL}
+pointer encountered. Pointers to empty strings are ignored.
+
+@end deftypefn
+
+NOTES
+
+ This function uses xmalloc() which is expected to be a front end
+ function to malloc() that deals with low memory situations. In
+ typical use, if malloc() returns NULL then xmalloc() diverts to an
+ error handler routine which never returns, and thus xmalloc will
+ never return a NULL pointer. If the client application wishes to
+ deal with low memory situations itself, it should supply an xmalloc
+ that just directly invokes malloc and blindly returns whatever
+ malloc returns.
+
+*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "ansidecl.h"
+#include "libiberty.h"
+#include <sys/types.h> /* size_t */
+
+#ifdef ANSI_PROTOTYPES
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+# if HAVE_STRING_H
+# include <string.h>
+# else
+# if HAVE_STRINGS_H
+# include <strings.h>
+# endif
+# endif
+
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+static inline unsigned long vconcat_length PARAMS ((const char *, va_list));
+static inline unsigned long
+vconcat_length (first, args)
+ const char *first;
+ va_list args;
+{
+ unsigned long length = 0;
+ const char *arg;
+
+ for (arg = first; arg ; arg = va_arg (args, const char *))
+ length += strlen (arg);
+
+ return length;
+}
+
+static inline char *vconcat_copy PARAMS ((char *, const char *, va_list));
+static inline char *
+vconcat_copy (dst, first, args)
+ char *dst;
+ const char *first;
+ va_list args;
+{
+ char *end = dst;
+ const char *arg;
+
+ for (arg = first; arg ; arg = va_arg (args, const char *))
+ {
+ unsigned long length = strlen (arg);
+ memcpy (end, arg, length);
+ end += length;
+ }
+ *end = '\000';
+
+ return dst;
+}
+
+/* @undocumented concat_length */
+
+unsigned long
+concat_length VPARAMS ((const char *first, ...))
+{
+ unsigned long length;
+
+ VA_OPEN (args, first);
+ VA_FIXEDARG (args, const char *, first);
+ length = vconcat_length (first, args);
+ VA_CLOSE (args);
+
+ return length;
+}
+
+/* @undocumented concat_copy */
+
+char *
+concat_copy VPARAMS ((char *dst, const char *first, ...))
+{
+ char *save_dst;
+
+ VA_OPEN (args, first);
+ VA_FIXEDARG (args, char *, dst);
+ VA_FIXEDARG (args, const char *, first);
+ vconcat_copy (dst, first, args);
+ save_dst = dst; /* With K&R C, dst goes out of scope here. */
+ VA_CLOSE (args);
+
+ return save_dst;
+}
+
+char *libiberty_concat_ptr;
+
+/* @undocumented concat_copy2 */
+
+char *
+concat_copy2 VPARAMS ((const char *first, ...))
+{
+ VA_OPEN (args, first);
+ VA_FIXEDARG (args, const char *, first);
+ vconcat_copy (libiberty_concat_ptr, first, args);
+ VA_CLOSE (args);
+
+ return libiberty_concat_ptr;
+}
+
+char *
+concat VPARAMS ((const char *first, ...))
+{
+ char *newstr;
+
+ /* First compute the size of the result and get sufficient memory. */
+ VA_OPEN (args, first);
+ VA_FIXEDARG (args, const char *, first);
+ newstr = (char *) xmalloc (vconcat_length (first, args) + 1);
+ VA_CLOSE (args);
+
+ /* Now copy the individual pieces to the result string. */
+ VA_OPEN (args, first);
+ VA_FIXEDARG (args, const char *, first);
+ vconcat_copy (newstr, first, args);
+ VA_CLOSE (args);
+
+ return newstr;
+}
+
+/*
+
+@deftypefn Extension char* reconcat (char *@var{optr}, const char *@var{s1}, @dots{}, @code{NULL})
+
+Same as @code{concat}, except that if @var{optr} is not @code{NULL} it
+is freed after the string is created. This is intended to be useful
+when you're extending an existing string or building up a string in a
+loop:
+
+@example
+ str = reconcat (str, "pre-", str, NULL);
+@end example
+
+@end deftypefn
+
+*/
+
+char *
+reconcat VPARAMS ((char *optr, const char *first, ...))
+{
+ char *newstr;
+
+ /* First compute the size of the result and get sufficient memory. */
+ VA_OPEN (args, first);
+ VA_FIXEDARG (args, char *, optr);
+ VA_FIXEDARG (args, const char *, first);
+ newstr = (char *) xmalloc (vconcat_length (first, args) + 1);
+ VA_CLOSE (args);
+
+ /* Now copy the individual pieces to the result string. */
+ VA_OPEN (args, first);
+ VA_FIXEDARG (args, char *, optr);
+ VA_FIXEDARG (args, const char *, first);
+ vconcat_copy (newstr, first, args);
+ if (optr) /* Done before VA_CLOSE so optr stays in scope for K&R C. */
+ free (optr);
+ VA_CLOSE (args);
+
+ return newstr;
+}
+
+#ifdef MAIN
+#define NULLP (char *)0
+
+/* Simple little test driver. */
+
+#include <stdio.h>
+
+int
+main ()
+{
+ printf ("\"\" = \"%s\"\n", concat (NULLP));
+ printf ("\"a\" = \"%s\"\n", concat ("a", NULLP));
+ printf ("\"ab\" = \"%s\"\n", concat ("a", "b", NULLP));
+ printf ("\"abc\" = \"%s\"\n", concat ("a", "b", "c", NULLP));
+ printf ("\"abcd\" = \"%s\"\n", concat ("ab", "cd", NULLP));
+ printf ("\"abcde\" = \"%s\"\n", concat ("ab", "c", "de", NULLP));
+ printf ("\"abcdef\" = \"%s\"\n", concat ("", "a", "", "bcd", "ef", NULLP));
+ return 0;
+}
+
+#endif
diff --git a/contrib/gcc/config.gcc b/contrib/gcc/config.gcc
index 23c6aa1..6736c3a 100644
--- a/contrib/gcc/config.gcc
+++ b/contrib/gcc/config.gcc
@@ -207,6 +207,80 @@ gas="$gas_flag"
gnu_ld="$gnu_ld_flag"
enable_threads=$enable_threads_flag
+# Obsolete configurations.
+# To avoid some tedious lists, we have a blacklist with a whitelist
+# embedded within it.
+case $machine in
+ 1750a-* \
+ | a29k-* \
+ | alpha*-*-osf[123]* \
+ | arm-*-riscix* \
+ | c*-convex-* \
+ | clipper-* \
+ | elxsi-* \
+ | i860-* \
+ | i?86-*-aix* \
+ | i?86-*-bsd* \
+ | i?86-*-chorusos* \
+ | i?86-*-dgux* \
+ | i?86-*-freebsd1.* \
+ | i?86-*-isc* \
+ | i?86-*-linux*oldld* \
+ | i?86-*-osf1* \
+ | i?86-*-osfrose* \
+ | i?86-*-rtemscoff* \
+ | i?86-*-sunos* \
+ | i?86-go32-rtems* \
+ | i?86-next-* \
+ | i?86-sequent-bsd* \
+ | i?86-sequent-ptx[12]* \
+ | i?86-sequent-sysv3* \
+ | m68[k0]*-*-lynxos* \
+ | m68[k0]*-*-rtemscoff* \
+ | m68[k0]*-*-sysv3* \
+ | m68[k0]*-altos-* \
+ | m68[k0]*-apollo-* \
+ | m68[k0]*-apple-* \
+ | m68[k0]*-bull-* \
+ | m68[k0]*-convergent-* \
+ | m68[k0]*-isi-* \
+ | m68[k0]*-next-* \
+ | m68[k0]*-sony-* \
+ | m88k-* \
+ | mips-*-bsd* \
+ | mips-*-riscos* \
+ | mips-*-sysv* \
+ | mips-*-ultrix* \
+ | mips-dec-* \
+ | mips-sgi-irix[1234]* \
+ | mips-sony-* \
+ | mips-tandem-* \
+ | ns32k-* \
+ | pj-* \
+ | pjl-* \
+ | romp-* \
+ | sparc-*-rtemsaout* \
+ | we32k-* \
+)
+ case $machine in
+ mips-sni-sysv4 \
+ | m88k-*-aout* | m88k-*-openbsd* | m88k-*-sysv4* \
+ | ns32k-*-netbsd* | ns32k-*-openbsd* \
+ | romp-*-openbsd* \
+ )
+ # Whitelisted.
+ ;;
+ *)
+ if test "x$enable_obsolete" != xyes; then
+ echo "*** Configuration $machine is obsolete." >&2
+ echo "*** Specify --enable-obsolete to build it anyway." >&2
+ echo "*** Support will be REMOVED in the next major release of GCC," >&2
+ echo "*** unless a maintainer comes forward." >&2
+ exit 1
+ fi;;
+ esac
+esac
+
# Set default cpu_type, tm_file, tm_p_file and xm_file so it can be
# updated in each machine entry. Also set default extra_headers for some
# machines.
@@ -243,7 +317,7 @@ ia64-*-*)
hppa*-*-* | parisc*-*-*)
cpu_type=pa
;;
-m680[02]0-*-*)
+m680[012]0-*-*)
cpu_type=m68k
extra_headers=math-68881.h
;;
@@ -263,6 +337,9 @@ powerpc*-*-*)
sparc*-*-*)
cpu_type=sparc
;;
+sh64-*-*)
+ cpu_type=sh
+ ;;
esac
tm_file=${cpu_type}/${cpu_type}.h
@@ -320,7 +397,7 @@ case $machine in
fi
;;
*-*-netbsd*)
- tmake_file="t-libc-ok t-netbsd"
+ tmake_file="t-slibgcc-elf-ver t-libc-ok t-netbsd"
xm_defines=POSIX
gas=yes
gnu_ld=yes
@@ -360,7 +437,7 @@ case $machine in
*-*-freebsd6 | *-*-freebsd[6].*) fbsd_tm_file="freebsd6.h";;
*) echo 'Please update *-*-freebsd* in gcc/config.gcc'; exit 1;;
esac
- tmake_file=t-freebsd
+ tmake_file="t-slibgcc-elf-ver t-freebsd"
xmake_file=none
xm_defines=POSIX
case x${enable_threads} in
@@ -368,6 +445,12 @@ case $machine in
x | xyes | xpthreads | xposix)
thread_file='posix'
tmake_file="${tmake_file} t-freebsd-thread"
+ # Before 5.0, FreeBSD can't bind shared libraries to -lc
+ # when "optionally" threaded via weak pthread_* checks.
+ case $machine in
+ *-*-freebsd[34] | *-*-freebsd[34].*)
+ tmake_file="${tmake_file} t-slibgcc-nolc-override";;
+ esac
;;
*) echo 'Unknown thread configuration for FreeBSD'; exit 1;;
esac
@@ -407,7 +490,8 @@ a29k-*-udi | a29k-*-coff)
tmake_file=a29k/t-a29kbare
;;
a29k*-*-rtems*)
- tm_file=a29k/rtems.h
+ xm_defines=POSIX
+ tm_file="a29k/a29k.h a29k/rtems.h rtems.h"
tmake_file="a29k/t-a29kbare t-rtems"
if test x$enable_threads = xyes; then
thread_file='rtems'
@@ -587,13 +671,6 @@ arc-*-elf*)
tm_file="dbxelf.h elfos.h svr4.h ${tm_file}"
extra_parts="crtinit.o crtfini.o"
;;
-arm*-*-rtems*)
- tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/rtems-elf.h rtems.h"
- tmake_file="arm/t-arm-elf t-rtems"
- if test x$enable_threads = xyes; then
- thread_file='rtems'
- fi
- ;;
arm-*-coff* | armel-*-coff*)
tm_file="arm/semi.h arm/aout.h arm/arm.h arm/coff.h"
tmake_file=arm/t-arm-coff
@@ -629,6 +706,9 @@ arm*-*-freebsd*|strongarm*-*-freebsd*)
tm_file="dbxelf.h elfos.h ${fbsd_tm_file} arm/elf.h arm/aout.h arm/freebsd.h arm/arm.h"
tmake_file="${tmake_file} arm/t-strongarm-elf"
;;
+arm*-*-netbsdelf*)
+ echo "GCC does not yet support the ${machine} target"; exit 1
+ ;;
arm*-*-netbsd*)
tm_file="arm/aout.h arm/arm.h netbsd.h netbsd-aout.h arm/netbsd.h"
tmake_file="t-netbsd arm/t-netbsd"
@@ -657,6 +737,14 @@ arm*-*-ecos-elf)
tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/ecos-elf.h"
tmake_file=arm/t-arm-elf
;;
+arm*-*-rtems*)
+ xm_defines=POSIX
+ tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/rtems-elf.h rtems.h"
+ tmake_file="arm/t-arm-elf t-rtems"
+ if test x$enable_threads = xyes; then
+ thread_file='rtems'
+ fi
+ ;;
arm*-*-elf)
tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h"
tmake_file=arm/t-arm-elf
@@ -697,8 +785,9 @@ c38-convex-*)
use_collect2=yes
;;
c4x-*-rtems*)
+ xm_defines=POSIX
tmake_file="c4x/t-c4x t-rtems"
- tm_file=c4x/rtems.h
+ tm_file="c4x/c4x.h c4x/rtems.h rtems.h"
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
@@ -753,8 +842,9 @@ fr30-*-elf)
extra_parts="crti.o crtn.o crtbegin.o crtend.o"
;;
h8300-*-rtems*)
+ xm_defines=POSIX
tmake_file="h8300/t-h8300 t-rtems"
- tm_file=h8300/rtems.h
+ tm_file="h8300/h8300.h h8300/rtems.h rtems.h"
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
@@ -794,32 +884,39 @@ hppa1.1-*-pro*)
target_cpu_default="(MASK_JUMP_IN_DELAY | MASK_PORTABLE_RUNTIME | MASK_GAS | MASK_NO_SPACE_REGS | MASK_SOFT_FLOAT)"
tm_file="${tm_file} pa/pa32-regs.h dbxelf.h elfos.h pa/elf.h pa/pa-pro-end.h libgloss.h"
tmake_file="pa/t-bsd pa/t-pro"
+ xmake_file="pa/x-ada"
;;
hppa1.1-*-osf*)
target_cpu_default="MASK_PA_11"
tm_file="${tm_file} pa/pa32-regs.h pa/som.h pa/pa-osf.h"
tmake_file="pa/t-bsd pa/t-pa"
+ xmake_file="pa/x-ada"
use_collect2=yes
;;
hppa1.1-*-rtems*)
+ xm_defines=POSIX
target_cpu_default="(MASK_JUMP_IN_DELAY | MASK_PORTABLE_RUNTIME | MASK_GAS | MASK_NO_SPACE_REGS | MASK_SOFT_FLOAT)"
- tm_file="${tm_file} pa/pa32-regs.h dbxelf.h elfos.h pa/elf.h pa/pa-pro-end.h libgloss.h pa/rtems.h"
+ tm_file="${tm_file} pa/pa32-regs.h dbxelf.h elfos.h pa/elf.h pa/pa-pro-end.h libgloss.h pa/rtems.h rtems.h"
tmake_file="pa/t-bsd pa/t-pro"
+ xmake_file="pa/x-ada"
;;
hppa1.0-*-osf*)
tm_file="${tm_file} pa/pa32-regs.h pa/som.h pa/pa-osf.h"
tmake_file="pa/t-bsd pa/t-pa"
+ xmake_file="pa/x-ada"
use_collect2=yes
;;
hppa1.1-*-bsd*)
tm_file="${tm_file} pa/pa32-regs.h pa/som.h"
target_cpu_default="MASK_PA_11"
tmake_file="pa/t-bsd pa/t-pa"
+ xmake_file="pa/x-ada"
use_collect2=yes
;;
hppa1.0-*-bsd*)
tm_file="${tm_file} pa/pa32-regs.h pa/som.h"
tmake_file="pa/t-bsd pa/t-pa"
+ xmake_file="pa/x-ada"
use_collect2=yes
;;
hppa1.0-*-hpux7*)
@@ -873,6 +970,7 @@ hppa1.1-*-hpux10* | hppa2*-*-hpux10*)
float_format=i128
xm_defines=POSIX
tmake_file="pa/t-pa pa/t-pa-hpux pa/t-hpux-shlib"
+ xmake_file="pa/x-ada"
if test x$enable_threads = x; then
enable_threads=$have_pthread_h
fi
@@ -889,6 +987,7 @@ hppa1.0-*-hpux10*)
float_format=i128
xm_defines=POSIX
tmake_file="pa/t-pa pa/t-pa-hpux pa/t-hpux-shlib"
+ xmake_file="pa/x-ada"
if test x$enable_threads = x; then
enable_threads=$have_pthread_h
fi
@@ -905,6 +1004,7 @@ hppa*64*-*-hpux11*)
tm_file="pa/pa64-start.h ${tm_file} pa/pa64-regs.h pa/long_double.h pa/elf.h pa/pa-hpux.h pa/pa-hpux11.h pa/pa-64.h pa/pa64-hpux.h"
float_format=i128
tmake_file="pa/t-pa64 pa/t-pa-hpux"
+ xmake_file="pa/x-ada"
target_cpu_default="(MASK_PA_11|MASK_PA_20|MASK_GAS)"
# if [ x$enable_threads = x ]; then
@@ -923,6 +1023,7 @@ hppa1.1-*-hpux11* | hppa2*-*-hpux11*)
float_format=i128
xm_defines=POSIX
tmake_file="pa/t-pa pa/t-pa-hpux pa/t-hpux-shlib"
+ xmake_file="pa/x-ada"
# if test x$enable_threads = x; then
# enable_threads=$have_pthread_h
# fi
@@ -938,6 +1039,7 @@ hppa1.0-*-hpux11*)
float_format=i128
xm_defines=POSIX
tmake_file="pa/t-pa pa/t-pa-hpux pa/t-hpux-shlib"
+ xmake_file="pa/x-ada"
# if test x$enable_threads = x; then
# enable_threads=$have_pthread_h
# fi
@@ -982,6 +1084,7 @@ hppa*-*-lites*)
tm_file="${tm_file} pa/pa32-regs.h dbxelf.h elfos.h pa/elf.h"
target_cpu_default="MASK_PA_11"
tmake_file="pa/t-bsd pa/t-pa"
+ xmake_file="pa/x-ada"
use_collect2=yes
;;
hppa*-*-mpeix*)
@@ -1221,7 +1324,7 @@ i[34567]86-*-linux*) # Intel 80386's running GNU/Linux
x86_64-*-linux*)
tm_file="${tm_file} i386/att.h dbxelf.h elfos.h svr4.h linux.h \
i386/x86-64.h i386/linux64.h"
- tmake_file="t-slibgcc-elf-ver t-linux i386/t-crtstuff"
+ tmake_file="t-slibgcc-elf-ver t-linux i386/t-crtstuff i386/t-linux64"
extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o"
gnu_ld=yes
float_format=i386
@@ -1281,21 +1384,24 @@ i[34567]86-*-osfrose*) # 386 using OSF/rose
extra_objs=halfpic.o
;;
i[34567]86-go32-rtems*)
- tm_file=i386/djgpp-rtems.h
+ xm_defines=POSIX
+ tm_file="i386/djgpp.h i386/djgpp-rtems.h rtems.h"
tmake_file=t-rtems
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
;;
i[34567]86-*-rtemscoff*)
- tm_file=i386/rtems.h
+ xm_defines=POSIX
+ tm_file="i386/i386-coff.h i386/rtems.h rtems.h"
tmake_file=t-rtems
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
;;
i[34567]86-*-rtems*|i[34567]86-*-rtemself*)
- tm_file="${tm_file} i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/rtemself.h rtems.h"
+ xm_defines=POSIX
+ tm_file="${tm_file} i386/att.h dbxelf.h elfos.h i386/i386elf.h i386/rtemself.h rtems.h"
extra_parts="crtbegin.o crtend.o crti.o crtn.o"
tmake_file="i386/t-rtems-i386 i386/t-crtstuff t-rtems"
if test x$enable_threads = xyes; then
@@ -1319,7 +1425,6 @@ i[34567]86-*-solaris2*)
xm_defines="POSIX SMALL_ARG_MAX"
tm_file="${tm_file} i386/att.h dbxelf.h elfos.h svr4.h i386/sysv4.h i386/sol2.h"
if test x$gas = xyes; then
- # Only needed if gas does not support -s
tm_file="i386/sol2gas.h ${tm_file}"
fi
tmake_file="i386/t-sol2 t-svr4"
@@ -1557,8 +1662,9 @@ i960-*-coff*)
cxx_target_objs="i960-c.o"
;;
i960-*-rtems)
+ xm_defines=POSIX
tmake_file="i960/t-960bare t-rtems"
- tm_file="${tm_file} dbxcoff.h i960/rtems.h"
+ tm_file="${tm_file} dbxcoff.h i960/i960-coff.h i960/rtems.h rtems.h"
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
@@ -1591,7 +1697,7 @@ ia64*-*-elf*)
float_format=i386
;;
ia64*-*-freebsd*)
- tm_file="${tm_file} ${fbsd_tm_file} dbxelf.h elfos.h ia64/sysv4.h ia64/freebsd.h"
+ tm_file="${tm_file} dbxelf.h elfos.h ${fbsd_tm_file} ia64/sysv4.h ia64/freebsd.h"
target_cpu_default="MASK_GNU_AS|MASK_GNU_LD"
tmake_file="${tmake_file} ia64/t-ia64"
float_format=i386
@@ -1932,6 +2038,18 @@ m68k-*-lynxos*)
tmake_file=m68k/t-lynx
float_format=m68k
;;
+m68010-*-netbsdelf* | m68k*-*-netbsdelf*)
+ tm_file="${tm_file} dbxelf.h elfos.h netbsd.h netbsd-elf.h m68k/netbsd-elf.h"
+ case $machine in
+ m68010*)
+ target_cpu_default="0"
+ ;;
+ *)
+ target_cpu_default="MASK_68020|MASK_68881|MASK_BITFIELD"
+ ;;
+ esac
+ float_format=m68k
+ ;;
m68k*-*-netbsd*)
tm_file=m68k/netbsd.h
tmake_file=t-netbsd
@@ -1991,16 +2109,18 @@ m68k-*-psos*)
float_format=m68k
;;
m68k-*-rtemscoff*)
+ xm_defines=POSIX
tmake_file="m68k/t-m68kbare t-rtems"
- tm_file=m68k/rtems.h
+ tm_file="m68k/m68k-coff.h m68k/rtems.h rtems.h"
float_format=m68k
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
;;
m68k-*-rtemself*|m68k-*-rtems*)
+ xm_defines=POSIX
tmake_file="m68k/t-m68kbare t-rtems m68k/t-crtstuff"
- tm_file=m68k/rtemself.h
+ tm_file="m68k/m68k-none.h m68k/m68kelf.h dbxelf.h elfos.h m68k/m68kemb.h m68k/m68020-elf.h m68k/rtemself.h rtems.h"
float_format=m68k
extra_parts="crtbegin.o crtend.o"
if test x$enable_threads = xyes; then
@@ -2518,14 +2638,16 @@ mips64orion-*-elf*)
tmake_file=mips/t-elf
;;
mips64orion-*-rtems*)
- tm_file="mips/elforion.h mips/elf64.h mips/rtems64.h"
+ xm_defines=POSIX
+ tm_file="mips/elforion.h mips/elf64.h mips/rtems64.h rtems.h"
tmake_file="mips/t-elf t-rtems"
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
;;
mips*-*-rtems*)
- tm_file="mips/elf.h mips/rtems.h"
+ xm_defines=POSIX
+ tm_file="mips/elf.h mips/rtems.h rtems.h"
tmake_file="mips/t-elf t-rtems"
if test x$enable_threads = xyes; then
thread_file='rtems'
@@ -2602,6 +2724,9 @@ ns32k-pc532-minix*)
xm_defines='POSIX HZ=60'
use_collect2=yes
;;
+ns32k-*-netbsdelf*)
+ echo "GCC does not yet support the ${machine} target"; exit 1
+ ;;
ns32k-*-netbsd*)
tm_file=ns32k/netbsd.h
# On NetBSD, the headers are already okay, except for math.h.
@@ -2643,7 +2768,12 @@ powerpc-*-openbsd*)
powerpc64-*-linux*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux64.h"
out_file=rs6000/rs6000.c
- tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm"
+ tmake_file="rs6000/t-rs6000 t-slibgcc-elf-ver t-linux rs6000/t-linux64"
+ ;;
+powerpc64-*-gnu*)
+ tm_file="${cpu_type}/${cpu_type}.h elfos.h svr4.h freebsd-spec.h gnu.h rs6000/sysv4.h rs6000/linux64.h rs6000/gnu.h"
+ out_file=rs6000/rs6000.c
+ tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-gnu rs6000/t-ppccomm"
;;
powerpc-*-beos*)
tm_file="${tm_file} rs6000/aix.h rs6000/beos.h rs6000/xcoff.h"
@@ -2719,7 +2849,7 @@ powerpc-*-eabi*)
;;
powerpc-*-rtems*)
xm_defines=POSIX
- tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/eabi.h rtems.h rs6000/rtems.h"
+ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/eabi.h rs6000/rtems.h rtems.h"
tmake_file="rs6000/t-ppcgas t-rtems rs6000/t-ppccomm"
if test x$enable_threads = xyes; then
thread_file='rtems'
@@ -2749,6 +2879,22 @@ powerpc-*-linux*)
thread_file='posix'
fi
;;
+powerpc-*-gnu-gnualtivec*)
+ tm_file="${cpu_type}/${cpu_type}.h elfos.h svr4.h freebsd-spec.h gnu.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxaltivec.h rs6000/gnu.h"
+ out_file=rs6000/rs6000.c
+ tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-gnu rs6000/t-ppccomm"
+ if test x$enable_threads = xyes; then
+ thread_file='posix'
+ fi
+ ;;
+powerpc-*-gnu*)
+ tm_file="${cpu_type}/${cpu_type}.h elfos.h svr4.h freebsd-spec.h gnu.h rs6000/sysv4.h rs6000/linux.h rs6000/gnu.h"
+ out_file=rs6000/rs6000.c
+ tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-gnu rs6000/t-ppccomm"
+ if test x$enable_threads = xyes; then
+ thread_file='posix'
+ fi
+ ;;
powerpc-wrs-vxworks*)
xm_defines=POSIX
tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/vxppc.h"
@@ -2852,11 +2998,11 @@ s390-*-linux*)
fi
;;
s390x-*-linux*)
- tm_file="s390/s390.h dbxelf.h elfos.h svr4.h linux.h s390/linux.h s390/linux64.h"
+ tm_file="s390/s390x.h s390/s390.h dbxelf.h elfos.h svr4.h linux.h s390/linux.h"
tm_p_file=s390/s390-protos.h
md_file=s390/s390.md
out_file=s390/s390.c
- tmake_file="t-slibgcc-elf-ver t-linux s390/t-linux"
+ tmake_file="t-slibgcc-elf-ver t-linux s390/t-linux s390/t-linux64"
extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o"
if test x$enable_threads = xyes; then
thread_file='posix'
@@ -2867,17 +3013,29 @@ sh-*-elf*)
tm_file="${tm_file} sh/elf.h"
float_format=sh
;;
+sh64-*-elf*)
+ tmake_file="sh/t-sh sh/t-elf sh/t-sh64"
+ tm_file="${tm_file} sh/sh.h sh/elf.h sh/sh64.h"
+ float_format=sh
+ extra_headers="../../config/sh/shmedia.h ../../config/sh/ushmedia.h ../../config/sh/sshmedia.h"
+ # Not strictly necessary to check this, but a good idea anyway.
+ if test $machine = $target; then
+ target_requires_64bit_host_wide_int=yes
+ fi
+ ;;
sh-*-rtemself*)
+ xm_defines=POSIX
tmake_file="sh/t-sh sh/t-elf t-rtems"
- tm_file="${tm_file} sh/elf.h sh/rtemself.h"
+ tm_file="${tm_file} sh/elf.h sh/rtemself.h rtems.h"
float_format=sh
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
;;
sh-*-rtems*)
+ xm_defines=POSIX
tmake_file="sh/t-sh t-rtems"
- tm_file="${tm_file} sh/rtems.h"
+ tm_file="${tm_file} sh/rtems.h rtems.h"
float_format=sh
if test x$enable_threads = xyes; then
thread_file='rtems'
@@ -2901,7 +3059,7 @@ sparc-tti-*)
;;
sparc64-wrs-vxworks*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sol2.h sparc/elf.h sparc/biarch64.h gofast.h sparc/vxsparc64.h"
- tmake_file=sparc/t-vxsparc64
+ tmake_file="sparc/t-vxsparc64 sparc/t-crtfm"
use_collect2=yes
;;
sparc-wrs-vxworks* | sparclite-wrs-vxworks*)
@@ -2914,6 +3072,9 @@ sparc-*-aout*)
tmake_file=sparc/t-sparcbare
tm_file="sparc/sparc.h aoutos.h sparc/aout.h libgloss.h"
;;
+sparc-*-netbsdelf*)
+ tm_file="${tm_file} elfos.h svr4.h sparc/sysv4.h netbsd.h netbsd-elf.h sparc/netbsd-elf.h"
+ ;;
sparc-*-netbsd*)
tm_file="${tm_file} sparc/aout.h netbsd.h netbsd-aout.h sparc/netbsd.h"
tmake_file=t-netbsd
@@ -2931,7 +3092,7 @@ sparc-*-bsd*)
;;
sparc-*-chorusos*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sol2.h sparc/elf.h chorus.h"
- tmake_file=sparc/t-chorus-elf
+ tmake_file="sparc/t-chorus-elf sparc/t-crtfm"
extra_parts="crti.o crtn.o crtbegin.o crtend.o"
float_format=i64
case x${enable_threads} in
@@ -2942,7 +3103,7 @@ sparc-*-chorusos*)
;;
sparc-*-elf*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sol2.h sparc/elf.h"
- tmake_file=sparc/t-elf
+ tmake_file="sparc/t-elf sparc/t-crtfm"
extra_parts="crti.o crtn.o crtbegin.o crtend.o"
#float_format=i128
float_format=i64
@@ -2953,14 +3114,14 @@ sparc-*-linux*aout*) # Sparc's running GNU/Linux, a.out
;;
sparc-*-linux*libc1*) # Sparc's running GNU/Linux, libc5
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/linux.h"
- tmake_file="t-slibgcc-elf-ver t-linux t-linux-gnulibc1"
+ tmake_file="t-slibgcc-elf-ver t-linux t-linux-gnulibc1 sparc/t-crtfm"
extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
gnu_ld=yes
float_format=sparc
;;
sparc-*-linux*) # Sparc's running GNU/Linux, libc6
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/linux.h"
- tmake_file="t-slibgcc-elf-ver t-linux"
+ tmake_file="t-slibgcc-elf-ver t-linux sparc/t-crtfm"
extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o"
gnu_ld=yes
if test x$enable_threads = xyes; then
@@ -2978,6 +3139,7 @@ sparc-*-lynxos*)
tmake_file=sparc/t-sunos41
;;
sparc-*-rtemsaout*)
+ xm_defines=POSIX
tmake_file="sparc/t-sparcbare t-rtems"
tm_file="${tm_file} aoutos.h sparc/aout.h sparc/rtems.h rtems.h"
if test x$enable_threads = xyes; then
@@ -2985,8 +3147,9 @@ sparc-*-rtemsaout*)
fi
;;
sparc-*-rtems*|sparc-*-rtemself*)
+ xm_defines=POSIX
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sol2.h sparc/elf.h sparc/rtemself.h rtems.h"
- tmake_file="sparc/t-elf t-rtems"
+ tmake_file="sparc/t-elf sparc/t-crtfm t-rtems"
extra_parts="crti.o crtn.o crtbegin.o crtend.o"
#float_format=i128
float_format=i64
@@ -2994,22 +3157,23 @@ sparc-*-rtems*|sparc-*-rtemself*)
thread_file='rtems'
fi
;;
-sparcv9-*-solaris2* | sparc64-*-solaris2*)
- if test x$gnu_ld = xyes
- then
- tm_file="sparc/sol2-sld-64.h sparc/sol2-64.h"
- else
- tm_file=sparc/sol2-sld-64.h
+sparc64-*-solaris2* | sparcv9-*-solaris2*)
+ tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sol2.h sparc/sol2-64.h sparc/sol2-bi.h"
+ if test x$gnu_ld = xyes; then
+ tm_file="${tm_file} sparc/sol2-gld.h sparc/sol2-gld-bi.h"
+ fi
+ if test x$gas = xyes; then
+ tm_file="${tm_file} sparc/sol2-gas-bi.h"
fi
xm_defines=POSIX
- tmake_file="sparc/t-sol2 sparc/t-sol2-64"
+ tmake_file="sparc/t-sol2 sparc/t-sol2-64 sparc/t-crtfm"
if test x$gnu_ld = xyes; then
tmake_file="$tmake_file t-slibgcc-elf-ver"
else
tmake_file="$tmake_file t-slibgcc-sld"
fi
extra_parts="crt1.o crti.o crtn.o gcrt1.o crtbegin.o crtend.o"
- float_format=none
+ float_format=i128
if test x${enable_threads} = x ; then
enable_threads=$have_pthread_h
if test x${enable_threads} = x ; then
@@ -3027,58 +3191,50 @@ sparcv9-*-solaris2* | sparc64-*-solaris2*)
sparc-hal-solaris2*)
xm_defines=POSIX
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sol2.h sparc/hal.h"
- tmake_file="sparc/t-halos sparc/t-sol2"
+ tmake_file="sparc/t-halos sparc/t-sol2 sparc/t-crtfm"
if test x$gnu_ld = xyes; then
+ tm_file="${tm_file} sparc/sol2-gld.h"
tmake_file="$tmake_file t-slibgcc-elf-ver"
else
tmake_file="$tmake_file t-slibgcc-sld"
fi
extra_parts="crt1.o crti.o crtn.o gmon.o crtbegin.o crtend.o"
- case $machine in
- *-*-solaris2.[0-4])
- float_format=i128
- ;;
- *)
- float_format=none
- ;;
- esac
+ float_format=i128
thread_file='solaris'
;;
sparc-*-solaris2*)
- if test x$gnu_ld = xyes
- then
- tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sol2.h"
- else
- tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sol2.h sparc/sol2-sld.h"
+ tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sol2.h"
+ if test x$gnu_ld = xyes; then
+ tm_file="${tm_file} sparc/sol2-gld.h"
fi
- xm_defines=POSIX
- tmake_file=sparc/t-sol2
+ tmake_file="sparc/t-sol2 sparc/t-crtfm"
if test x$gnu_ld = xyes; then
tmake_file="$tmake_file t-slibgcc-elf-ver"
else
tmake_file="$tmake_file t-slibgcc-sld"
fi
- extra_parts="crt1.o crti.o crtn.o gcrt1.o gmon.o crtbegin.o crtend.o"
case $machine in
- *-*-solaris2.[0-6] | *-*-solaris2.[0-6].*) ;;
- *-*-solaris2*)
- if test x$gnu_ld = xyes
- then
- tm_file="sparc/sol2-sld-64.h sparc/sol2-64.h"
- else
- tm_file="sparc/sol2-sld-64.h"
+ *-*-solaris2.[789])
+ tm_file="sparc/biarch64.h ${tm_file} sparc/sol2-bi.h"
+ if test x$gnu_ld = xyes; then
+ tm_file="${tm_file} sparc/sol2-gld-bi.h"
+ fi
+ if test x$gas = xyes; then
+ tm_file="${tm_file} sparc/sol2-gas-bi.h"
fi
tmake_file="$tmake_file sparc/t-sol2-64"
;;
esac
case $machine in
- *-*-solaris2.[0-4])
- float_format=i128
- ;;
- *)
- float_format=none
+ *-*-solaris2.[0-7] | *-*-solaris2.[0-7].*)
+ if test x$gnu_ld = xno; then
+ tm_file="${tm_file} sparc/sol27-sld.h"
+ fi
;;
esac
+ xm_defines=POSIX
+ extra_parts="crt1.o crti.o crtn.o gcrt1.o gmon.o crtbegin.o crtend.o"
+ float_format=i128
if test x${enable_threads} = x; then
enable_threads=$have_pthread_h
if test x${enable_threads} = x; then
@@ -3134,7 +3290,7 @@ sparclite-*-aout*)
;;
sparclite-*-elf*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sol2.h sparc/elf.h gofast.h sparc/liteelf.h"
- tmake_file=sparc/t-sparclite
+ tmake_file="sparc/t-sparclite sparc/t-crtfm"
extra_parts="crtbegin.o crtend.o"
;;
sparc86x-*-aout*)
@@ -3143,7 +3299,7 @@ sparc86x-*-aout*)
;;
sparc86x-*-elf*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sol2.h sparc/elf.h gofast.h sparc/sp86x-elf.h"
- tmake_file=sparc/t-sp86x
+ tmake_file="sparc/t-sp86x sparc/t-crtfm"
extra_parts="crtbegin.o crtend.o"
;;
sparc64-*-aout*)
@@ -3151,18 +3307,21 @@ sparc64-*-aout*)
;;
sparc64-*-elf*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sol2.h sparc/sp64-elf.h"
+ tmake_file="${tmake_file} sparc/t-crtfm"
extra_parts="crtbegin.o crtend.o"
;;
sparc64-*-freebsd*|ultrasparc-*-freebsd*)
tm_file="${tm_file} ${fbsd_tm_file} dbxelf.h elfos.h sparc/sysv4.h sparc/freebsd.h"
+ tmake_file="${tmake_file} sparc/t-crtfm"
xmake_file=none
case "x$with_cpu" in
+ xultrasparc) ;;
x) with_cpu=ultrasparc ;;
*) echo "$with_cpu not supported for freebsd target"; exit 1 ;;
esac
;;
sparc64-*-linux*) # 64-bit Sparc's running GNU/Linux
- tmake_file="t-slibgcc-elf-ver t-linux sparc/t-linux64"
+ tmake_file="t-slibgcc-elf-ver t-linux sparc/t-linux64 sparc/t-crtfm"
tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/linux64.h"
extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o"
gnu_ld=yes
@@ -3171,6 +3330,12 @@ sparc64-*-linux*) # 64-bit Sparc's running GNU/Linux
fi
float_format=sparc
;;
+sparc64-*-netbsd*)
+ tmake_file="${tmake_file} sparc/t-netbsd64"
+ tm_file="sparc/biarch64.h ${tm_file}"
+ tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h netbsd.h netbsd-elf.h sparc/netbsd-elf.h"
+ float_format=sparc
+ ;;
strongarm-*-elf*)
tm_file="arm/strongarm-elf.h dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h"
tmake_file=arm/t-strongarm-elf
@@ -3197,7 +3362,8 @@ thumb*-*-*)
*** when the -mthumb switch is given to the compiler." 1>&2; exit 1; }
;;
v850-*-rtems*)
- tm_file="dbxelf.h elfos.h svr4.h ${tm_file} v850/rtems.h"
+ xm_defines=POSIX
+ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} v850/v850.h v850/rtems.h rtems.h"
tmake_file="v850/t-v850 t-rtems"
if test x$stabs = xyes
then
@@ -3228,6 +3394,9 @@ vax-*-sysv*) # VAXen running system V
xm_defines=POSIX
float_format=vax
;;
+vax-*-netbsdelf*)
+ echo "GCC does not yet support the ${machine} target"; exit 1
+ ;;
vax-*-netbsd*)
tm_file="${tm_file} netbsd.h netbsd-aout.h vax/netbsd.h"
tmake_file=t-netbsd
diff --git a/contrib/gcc/config.in b/contrib/gcc/config.in
index fbe9acd..06f9742 100644
--- a/contrib/gcc/config.in
+++ b/contrib/gcc/config.in
@@ -1,4 +1,4 @@
-/* config.in. Generated automatically from configure.in by autoheader 2.13. */
+/* config.in. Generated automatically from configure.in by autoheader. */
/* Define if using alloca.c. */
#undef C_ALLOCA
@@ -529,8 +529,8 @@
/* Define if your assembler and linker support unaligned PC relative relocs. */
#undef HAVE_AS_SPARC_UA_PCREL
-/* Define if the assembler supports 64bit sparc. */
-#undef AS_SPARC64_FLAG
+/* Define if your assembler and linker support unaligned PC relative relocs against hidden symbols. */
+#undef HAVE_AS_SPARC_UA_PCREL_HIDDEN
/* Define if your assembler supports offsetable %lo(). */
#undef HAVE_AS_OFFSETABLE_LO10
diff --git a/contrib/gcc/config/alpha/alpha-protos.h b/contrib/gcc/config/alpha/alpha-protos.h
index 2ff0350..c6fdd04 100644
--- a/contrib/gcc/config/alpha/alpha-protos.h
+++ b/contrib/gcc/config/alpha/alpha-protos.h
@@ -59,7 +59,7 @@ extern int current_file_function_operand PARAMS ((rtx, enum machine_mode));
extern int direct_call_operand PARAMS ((rtx, enum machine_mode));
extern int local_symbolic_operand PARAMS ((rtx, enum machine_mode));
extern int small_symbolic_operand PARAMS ((rtx, enum machine_mode));
-extern int some_small_symbolic_mem_operand PARAMS ((rtx, enum machine_mode));
+extern int some_small_symbolic_operand PARAMS ((rtx, enum machine_mode));
extern int global_symbolic_operand PARAMS ((rtx, enum machine_mode));
extern int call_operand PARAMS ((rtx, enum machine_mode));
extern int symbolic_operand PARAMS ((rtx, enum machine_mode));
@@ -90,7 +90,7 @@ extern rtx alpha_legitimize_address PARAMS ((rtx, rtx, enum machine_mode));
extern rtx alpha_legitimize_reload_address PARAMS ((rtx, enum machine_mode,
int, int, int));
-extern rtx split_small_symbolic_mem_operand PARAMS ((rtx));
+extern rtx split_small_symbolic_operand PARAMS ((rtx));
extern void get_aligned_mem PARAMS ((rtx, rtx *, rtx *));
extern rtx get_unaligned_address PARAMS ((rtx, int));
@@ -163,6 +163,8 @@ extern rtx function_arg PARAMS ((CUMULATIVE_ARGS, enum machine_mode,
#endif
extern void alpha_start_function PARAMS ((FILE *, const char *, tree));
extern void alpha_end_function PARAMS ((FILE *, const char *, tree));
+extern void alpha_output_mi_thunk_osf PARAMS ((FILE *, tree,
+ HOST_WIDE_INT, tree));
extern void alpha_encode_section_info PARAMS ((tree));
#endif /* TREE CODE */
diff --git a/contrib/gcc/config/alpha/alpha.h b/contrib/gcc/config/alpha/alpha.h
index dd8d820..b2363bc 100644
--- a/contrib/gcc/config/alpha/alpha.h
+++ b/contrib/gcc/config/alpha/alpha.h
@@ -43,12 +43,6 @@ Boston, MA 02111-1307, USA. */
#define CPP_SUBTARGET_SPEC ""
#endif
-/* Set the spec to use for signed char. The default tests the above macro
- but DEC's compiler can't handle the conditional in a "constant"
- operand. */
-
-#define SIGNED_CHAR_SPEC "%{funsigned-char:-D__CHAR_UNSIGNED__}"
-
#define WORD_SWITCH_TAKES_ARG(STR) \
(!strcmp (STR, "rpath") || DEFAULT_WORD_SWITCH_TAKES_ARG(STR))
@@ -2079,7 +2073,8 @@ do { \
{"reg_no_subreg_operand", {REG}}, \
{"addition_operation", {PLUS}}, \
{"symbolic_operand", {SYMBOL_REF, LABEL_REF, CONST}}, \
- {"some_small_symbolic_mem_operand", {SET, PARALLEL}},
+ {"some_small_symbolic_operand", {SET, PARALLEL, PREFETCH, UNSPEC, \
+ UNSPEC_VOLATILE}},
/* Define the `__builtin_va_list' type for the ABI. */
#define BUILD_VA_LIST_TYPE(VALIST) \
@@ -2242,3 +2237,8 @@ do { \
/* Generate calls to memcpy, etc., not bcopy, etc. */
#define TARGET_MEM_FUNCTIONS 1
+
+/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
+ Used for C++ multiple inheritance. */
+#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
+ alpha_output_mi_thunk_osf (FILE, THUNK_FNDECL, DELTA, FUNCTION)
diff --git a/contrib/gcc/config/alpha/alpha.md b/contrib/gcc/config/alpha/alpha.md
index b987de8..785a61d 100644
--- a/contrib/gcc/config/alpha/alpha.md
+++ b/contrib/gcc/config/alpha/alpha.md
@@ -39,6 +39,7 @@
(UNSPEC_LITERAL 11)
(UNSPEC_LITUSE 12)
(UNSPEC_SIBCALL 13)
+ (UNSPEC_SYMBOL 14)
])
;; UNSPEC_VOLATILE:
@@ -518,31 +519,14 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
(sign_extend:DI (match_dup 1)))]
"")
-;; Do addsi3 the way expand_binop would do if we didn't have one. This
-;; generates better code. We have the anonymous addsi3 pattern below in
-;; case combine wants to make it.
+;; Don't say we have addsi3 if optimizing. This generates better code. We
+;; have the anonymous addsi3 pattern below in case combine wants to make it.
(define_expand "addsi3"
[(set (match_operand:SI 0 "register_operand" "")
(plus:SI (match_operand:SI 1 "reg_or_0_operand" "")
(match_operand:SI 2 "add_operand" "")))]
- ""
-{
- if (optimize)
- {
- rtx op1 = gen_lowpart (DImode, operands[1]);
- rtx op2 = gen_lowpart (DImode, operands[2]);
-
- if (! cse_not_expected)
- {
- rtx tmp = gen_reg_rtx (DImode);
- emit_insn (gen_adddi3 (tmp, op1, op2));
- emit_move_insn (gen_lowpart (DImode, operands[0]), tmp);
- }
- else
- emit_insn (gen_adddi3 (gen_lowpart (DImode, operands[0]), op1, op2));
- DONE;
- }
-})
+ "! optimize"
+ "")
(define_insn "*addsi_internal"
[(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
@@ -581,6 +565,17 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
addl %r1,%2,%0
subl %r1,%n2,%0")
+(define_insn "*addsi_se2"
+ [(set (match_operand:DI 0 "register_operand" "=r,r")
+ (sign_extend:DI
+ (subreg:SI (plus:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ")
+ (match_operand:DI 2 "sext_add_operand" "rI,O"))
+ 0)))]
+ ""
+ "@
+ addl %r1,%2,%0
+ subl %r1,%n2,%0")
+
(define_split
[(set (match_operand:DI 0 "register_operand" "")
(sign_extend:DI
@@ -844,24 +839,8 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
[(set (match_operand:SI 0 "register_operand" "")
(minus:SI (match_operand:SI 1 "reg_or_0_operand" "")
(match_operand:SI 2 "reg_or_8bit_operand" "")))]
- ""
-{
- if (optimize)
- {
- rtx op1 = gen_lowpart (DImode, operands[1]);
- rtx op2 = gen_lowpart (DImode, operands[2]);
-
- if (! cse_not_expected)
- {
- rtx tmp = gen_reg_rtx (DImode);
- emit_insn (gen_subdi3 (tmp, op1, op2));
- emit_move_insn (gen_lowpart (DImode, operands[0]), tmp);
- }
- else
- emit_insn (gen_subdi3 (gen_lowpart (DImode, operands[0]), op1, op2));
- DONE;
- }
-})
+ "! optimize"
+ "")
(define_insn "*subsi_internal"
[(set (match_operand:SI 0 "register_operand" "=r")
@@ -877,6 +856,15 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
""
"subl %r1,%2,%0")
+(define_insn "*subsi_se2"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (sign_extend:DI
+ (subreg:SI (minus:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
+ (match_operand:DI 2 "reg_or_8bit_operand" "rI"))
+ 0)))]
+ ""
+ "subl %r1,%2,%0")
+
(define_insn "subvsi3"
[(set (match_operand:SI 0 "register_operand" "=r")
(minus:SI (match_operand:SI 1 "reg_or_0_operand" "rJ")
@@ -1610,23 +1598,20 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
}
[(set_attr "type" "iadd,shift")])
-;; ??? The following pattern is made by combine, but earlier phases
-;; (specifically flow) can't handle it. This occurs in jump.c. Deal
-;; with this in a better way at some point.
-;;(define_insn ""
-;; [(set (match_operand:DI 0 "register_operand" "=r")
-;; (sign_extend:DI
-;; (subreg:SI (ashift:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
-;; (match_operand:DI 2 "const_int_operand" "P"))
-;; 0)))]
-;; "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 3"
-;;{
-;; if (operands[2] == const1_rtx)
-;; return "addl %r1,%r1,%0";
-;; else
-;; return "s%P2addl %r1,0,%0";
-;;}
-;; [(set_attr "type" "iadd")])
+(define_insn "*ashldi_se"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (sign_extend:DI
+ (subreg:SI (ashift:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
+ (match_operand:DI 2 "const_int_operand" "P"))
+ 0)))]
+ "INTVAL (operands[2]) >= 1 && INTVAL (operands[2]) <= 3"
+{
+ if (operands[2] == const1_rtx)
+ return "addl %r1,%r1,%0";
+ else
+ return "s%P2addl %r1,0,%0";
+}
+ [(set_attr "type" "iadd")])
(define_insn "lshrdi3"
[(set (match_operand:DI 0 "register_operand" "=r")
@@ -5111,6 +5096,16 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
""
"call_pal 0x86"
[(set_attr "type" "ibr")])
+
+;; BUGCHK is documented common to OSF/1 and VMS PALcode.
+;; NT does not document anything at 0x81 -- presumably it would generate
+;; the equivalent of SIGILL, but this isn't that important.
+;; ??? Presuming unicosmk uses either OSF/1 or VMS PALcode.
+(define_insn "trap"
+ [(trap_if (const_int 1) (const_int 0))]
+ "!TARGET_ABI_WINDOWS_NT"
+ "call_pal 0x81"
+ [(set_attr "type" "ibr")])
;; Finally, we have the basic data motion insns. The byte and word insns
;; are done via define_expand. Start with the floating-point insns, since
@@ -5292,10 +5287,11 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
itofs %1,%0"
[(set_attr "type" "ilog,iadd,iadd,ild,ist,fcpys,fld,fst,ftoi,itof")])
-(define_insn "*movsi_nt_vms"
+(define_insn "*movsi_nt_vms_nofix"
[(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,r,r,m,*f,*f,m")
(match_operand:SI 1 "input_operand" "rJ,K,L,s,m,rJ,*fJ,m,*f"))]
"(TARGET_ABI_WINDOWS_NT || TARGET_ABI_OPEN_VMS)
+ && !TARGET_FIX
&& (register_operand (operands[0], SImode)
|| reg_or_0_operand (operands[1], SImode))"
"@
@@ -5310,6 +5306,27 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
st%, %R1,%0"
[(set_attr "type" "ilog,iadd,iadd,ldsym,ild,ist,fcpys,fld,fst")])
+(define_insn "*movsi_nt_vms_fix"
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,r,r,m,*f,*f,m,r,*f")
+ (match_operand:SI 1 "input_operand" "rJ,K,L,s,m,rJ,*fJ,m,*f,*f,r"))]
+ "(TARGET_ABI_WINDOWS_NT || TARGET_ABI_OPEN_VMS)
+ && TARGET_FIX
+ && (register_operand (operands[0], SImode)
+ || reg_or_0_operand (operands[1], SImode))"
+ "@
+ bis $31,%1,%0
+ lda %0,%1
+ ldah %0,%h1
+ lda %0,%1
+ ldl %0,%1
+ stl %r1,%0
+ cpys %R1,%R1,%0
+ ld%, %0,%1
+ st%, %R1,%0
+ ftois %1,%0
+ itofs %1,%0"
+ [(set_attr "type" "ilog,iadd,iadd,ldsym,ild,ist,fcpys,fld,fst,ftoi,itof")])
+
(define_insn "*movhi_nobwx"
[(set (match_operand:HI 0 "register_operand" "=r,r")
(match_operand:HI 1 "input_operand" "rJ,n"))]
@@ -5501,10 +5518,10 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
"operands[2] = pic_offset_table_rtx;")
(define_split
- [(match_operand 0 "some_small_symbolic_mem_operand" "")]
+ [(match_operand 0 "some_small_symbolic_operand" "")]
"TARGET_EXPLICIT_RELOCS && reload_completed"
[(match_dup 0)]
- "operands[0] = split_small_symbolic_mem_operand (operands[0]);")
+ "operands[0] = split_small_symbolic_operand (operands[0]);")
(define_insn "movdi_er_high_g"
[(set (match_operand:DI 0 "register_operand" "=r")
@@ -5531,6 +5548,41 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
(const_int 0)] UNSPEC_LITERAL))]
"operands[2] = pic_offset_table_rtx;")
+;; With RTL inlining, at -O3, rtl is generated, stored, then actually
+;; compiled at the end of compilation. In the meantime, someone can
+;; re-encode-section-info on some symbol changing it e.g. from global
+;; to local-not-small. If this happens, we'd have emitted a plain
+;; load rather than a high+losum load and not recognize the insn.
+;;
+;; So if rtl inlining is in effect, we delay the global/not-global
+;; decision until rest_of_compilation by wrapping it in an UNSPEC_SYMBOL.
+
+(define_insn_and_split "movdi_er_maybe_g"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (unspec:DI [(match_operand:DI 1 "symbolic_operand" "")]
+ UNSPEC_SYMBOL))]
+ "TARGET_EXPLICIT_RELOCS && flag_inline_functions"
+ "#"
+ ""
+ [(set (match_dup 0) (match_dup 1))]
+{
+ if (local_symbolic_operand (operands[1], Pmode)
+ && !small_symbolic_operand (operands[1], Pmode))
+ {
+ rtx subtarget = no_new_pseudos ? operands[0] : gen_reg_rtx (Pmode);
+ rtx tmp;
+
+ tmp = gen_rtx_HIGH (Pmode, operands[1]);
+ if (reload_completed)
+ tmp = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, tmp);
+ emit_insn (gen_rtx_SET (VOIDmode, subtarget, tmp));
+
+ tmp = gen_rtx_LO_SUM (Pmode, subtarget, operands[1]);
+ emit_insn (gen_rtx_SET (VOIDmode, operands[0], tmp));
+ DONE;
+ }
+})
+
(define_insn "*movdi_er_nofix"
[(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,r,r,r,m,*f,*f,Q")
(match_operand:DI 1 "input_operand" "rJ,K,L,T,s,m,rJ,*fJ,Q,*f"))]
@@ -6700,13 +6752,10 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
(set_attr "type" "multi")])
(define_insn "*exception_receiver_2"
- [(unspec_volatile [(match_operand:DI 0 "nonimmediate_operand" "r,m")]
- UNSPECV_EHR)]
+ [(unspec_volatile [(match_operand:DI 0 "memory_operand" "m")] UNSPECV_EHR)]
"TARGET_LD_BUGGY_LDGP"
- "@
- bis $31,%0,$29
- ldq $29,%0"
- [(set_attr "type" "ilog,ild")])
+ "ldq $29,%0"
+ [(set_attr "type" "ild")])
(define_expand "nonlocal_goto_receiver"
[(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
diff --git a/contrib/gcc/config/alpha/linux.h b/contrib/gcc/config/alpha/linux.h
index 8a1b93f..912d7b26 100644
--- a/contrib/gcc/config/alpha/linux.h
+++ b/contrib/gcc/config/alpha/linux.h
@@ -1,6 +1,6 @@
/* Definitions of target machine for GNU compiler,
for Alpha Linux-based GNU systems.
- Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1998, 2002 Free Software Foundation, Inc.
Contributed by Richard Henderson.
This file is part of GNU CC.
@@ -25,7 +25,7 @@ Boston, MA 02111-1307, USA. */
#undef CPP_PREDEFINES
#define CPP_PREDEFINES \
-"-Dlinux -Dunix -Asystem=linux -D_LONGLONG -D__alpha__ " \
+"-D__gnu_linux__ -Dlinux -Dunix -Asystem=linux -D_LONGLONG -D__alpha__ " \
SUB_CPP_PREDEFINES
/* The GNU C++ standard library requires that these macros be defined. */
diff --git a/contrib/gcc/config/alpha/netbsd.h b/contrib/gcc/config/alpha/netbsd.h
index 7eacce2..e5551da 100644
--- a/contrib/gcc/config/alpha/netbsd.h
+++ b/contrib/gcc/config/alpha/netbsd.h
@@ -79,19 +79,5 @@ Boston, MA 02111-1307, USA. */
%{!shared:crtend%O%s} %{shared:crtendS%O%s}"
-/* Make gcc agree with <machine/ansi.h> */
-
-#undef WCHAR_TYPE
-#define WCHAR_TYPE "int"
-
-#undef WCHAR_UNSIGNED
-#define WCHAR_UNSIGNED 0
-
-#undef WCHAR_TYPE_SIZE
-#define WCHAR_TYPE_SIZE 32
-
-#undef WINT_TYPE
-#define WINT_TYPE "int"
-
#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (NetBSD/alpha ELF)");
diff --git a/contrib/gcc/config/alpha/osf.h b/contrib/gcc/config/alpha/osf.h
index 250974c..efb0a16 100644
--- a/contrib/gcc/config/alpha/osf.h
+++ b/contrib/gcc/config/alpha/osf.h
@@ -47,7 +47,8 @@ Boston, MA 02111-1307, USA. */
#undef CPP_SUBTARGET_SPEC
#define CPP_SUBTARGET_SPEC \
-"%{pthread|threads:-D_REENTRANT} %{threads:-D_PTHREAD_USE_D4} %(cpp_xfloat)"
+"%{pthread|threads:-D_REENTRANT} %{threads:-D_PTHREAD_USE_D4} %(cpp_xfloat) \
+-D__EXTERN_PREFIX"
/* Under OSF4, -p and -pg require -lprof1, and -lprof1 requires -lpdf. */
@@ -56,12 +57,13 @@ Boston, MA 02111-1307, USA. */
%{threads: -lpthreads} %{pthread|threads: -lpthread -lmach -lexc} -lc"
/* Pass "-G 8" to ld because Alpha's CC does. Pass -O3 if we are
- optimizing, -O1 if we are not. Pass -shared, -non_shared or
+ optimizing, -O1 if we are not. Pass -S to silence `weak symbol
+ multiply defined' warnings. Pass -shared, -non_shared or
-call_shared as appropriate. Pass -hidden_symbol so that our
constructor and call-frame data structures are not accidentally
overridden. */
#define LINK_SPEC \
- "-G 8 %{O*:-O3} %{!O*:-O1} %{static:-non_shared} \
+ "-G 8 %{O*:-O3} %{!O*:-O1} -S %{static:-non_shared} \
%{!static:%{shared:-shared -hidden_symbol _GLOBAL_*} \
%{!shared:-call_shared}} %{pg} %{taso} %{rpath*}"
@@ -93,19 +95,18 @@ Boston, MA 02111-1307, USA. */
#define ASM_OLDAS_SPEC ""
-/* No point in running CPP on our assembler output. */
-#if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_GAS) != 0
-/* Don't pass -g to GNU as, because some versions don't accept this option. */
-#define ASM_SPEC "%{malpha-as:-g %(asm_oldas)} -nocpp %{pg}"
-#else
/* In OSF/1 v3.2c, the assembler by default does not output file names which
causes mips-tfile to fail. Passing -g to the assembler fixes this problem.
??? Strictly speaking, we need -g only if the user specifies -g. Passing
it always means that we get slightly larger than necessary object files
if the user does not specify -g. If we don't pass -g, then mips-tfile
will need to be fixed to work in this case. Pass -O0 since some
- optimization are broken and don't help us anyway. */
-#define ASM_SPEC "%{!mgas:-g %(asm_oldas)} -nocpp %{pg} -O0"
+ optimization are broken and don't help us anyway. Pass -nocpp because
+ there's no point in running CPP on our assembler output. */
+#if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_GAS) != 0
+#define ASM_SPEC "%{malpha-as:-g %(asm_oldas) -nocpp %{pg} -O0}"
+#else
+#define ASM_SPEC "%{!mgas:-g %(asm_oldas) -nocpp %{pg} -O0}"
#endif
/* Specify to run a post-processor, mips-tfile after the assembler
@@ -209,3 +210,7 @@ __enable_execute_stack (addr) \
/* Handle #pragma weak and #pragma pack. */
#undef HANDLE_SYSV_PRAGMA
#define HANDLE_SYSV_PRAGMA 1
+
+/* Handle #pragma extern_prefix. Technically only needed for Tru64 5.x,
+ but easier to manipulate preprocessor bits from here. */
+#define HANDLE_PRAGMA_EXTERN_PREFIX 1
diff --git a/contrib/gcc/config/alpha/t-vms b/contrib/gcc/config/alpha/t-vms
index 5057c31..516d3ec 100644
--- a/contrib/gcc/config/alpha/t-vms
+++ b/contrib/gcc/config/alpha/t-vms
@@ -20,3 +20,7 @@ vcrt0.o: $(CRT0_S) $(GCC_PASSES)
pcrt0.o: $(CRT0_S) $(GCC_PASSES)
decc -c /names=as_is $(srcdir)/config/alpha/vms-psxcrt0.c -o pcrt0.o
+MULTILIB_OPTIONS = mcpu=ev6
+MULTILIB_DIRNAMES = ev6
+LIBGCC = stmp-multilib
+INSTALL_LIBGCC = install-multilib
diff --git a/contrib/gcc/config/alpha/vms.h b/contrib/gcc/config/alpha/vms.h
index a01556e..ffc3275 100644
--- a/contrib/gcc/config/alpha/vms.h
+++ b/contrib/gcc/config/alpha/vms.h
@@ -251,6 +251,12 @@ typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info;
alpha_write_verstamp (FILE); \
fprintf (FILE, "\t.set noreorder\n"); \
fprintf (FILE, "\t.set volatile\n"); \
+ if (TARGET_BWX | TARGET_MAX | TARGET_FIX | TARGET_CIX) \
+ { \
+ fprintf (FILE, "\t.arch %s\n", \
+ (TARGET_CPU_EV6 ? "ev6" \
+ : TARGET_MAX ? "pca56" : "ev56")); \
+ } \
ASM_OUTPUT_SOURCE_FILENAME (FILE, main_input_filename); \
}
@@ -385,22 +391,14 @@ do { \
#define LINK_EH_SPEC "vms-dwarf2eh.o%s "
#ifdef IN_LIBGCC2
-#include <libicb.h>
#include <pdscdef.h>
#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \
do { \
- unsigned long handle; \
- PDSCDEF *pv; \
- INVO_CONTEXT_BLK invo; \
+ PDSCDEF *pv = *((PDSCDEF **) (CONTEXT)->reg [29]); \
\
- memset (&invo, 0, sizeof (INVO_CONTEXT_BLK)); \
- \
- invo.libicb$q_ireg [29] = *((long long *) (CONTEXT)->reg [29]); \
- invo.libicb$q_ireg [30] = (long long) (CONTEXT)->cfa; \
- handle = LIB$GET_INVO_HANDLE (&invo); \
- LIB$GET_INVO_CONTEXT (handle, &invo); \
- pv = (PDSCDEF *) invo.libicb$ph_procedure_descriptor; \
+ if (pv && ((long) pv & 0x7) == 0) /* low bits 0 means address */ \
+ pv = *(PDSCDEF **) pv; \
\
if (pv && ((pv->pdsc$w_flags & 0xf) == PDSC$K_KIND_FP_STACK)) \
{ \
@@ -426,6 +424,19 @@ do { \
\
goto SUCCESS; \
} \
+ else if (pv && ((pv->pdsc$w_flags & 0xf) == PDSC$K_KIND_FP_REGISTER)) \
+ { \
+ (FS)->cfa_offset = pv->pdsc$l_size; \
+ (FS)->cfa_reg = pv->pdsc$w_flags & PDSC$M_BASE_REG_IS_FP ? 29 : 30; \
+ (FS)->retaddr_column = 26; \
+ (FS)->cfa_how = CFA_REG_OFFSET; \
+ (FS)->regs.reg[26].loc.reg = pv->pdsc$b_save_ra; \
+ (FS)->regs.reg[26].how = REG_SAVED_REG; \
+ (FS)->regs.reg[29].loc.reg = pv->pdsc$b_save_fp; \
+ (FS)->regs.reg[29].how = REG_SAVED_REG; \
+ \
+ goto SUCCESS; \
+ } \
} while (0)
#endif
@@ -508,11 +519,17 @@ do { \
#define NAME__MAIN "__gccmain"
#define SYMBOL__MAIN __gccmain
+#define MD_EXEC_PREFIX "/gnu/lib/gcc-lib/"
+#define MD_STARTFILE_PREFIX "/gnu/lib/gcc-lib/"
+
/* Specify the list of include file directories. */
-#define INCLUDE_DEFAULTS \
-{ \
- { "/gnu_gxx_include", 0, 1, 1 }, \
- { "/gnu_cc_include", 0, 0, 0 }, \
- { "/gnu/include", 0, 0, 0 }, \
- { 0, 0, 0, 0 } \
+#define INCLUDE_DEFAULTS \
+{ \
+ { "/gnu/lib/gcc-lib/include", 0, 0, 0 }, \
+ { "/gnu_gxx_include", 0, 1, 1 }, \
+ { "/gnu_cc_include", 0, 0, 0 }, \
+ { "/gnu/include", 0, 0, 0 }, \
+ { 0, 0, 0, 0 } \
}
+
+#define LONGLONG_STANDALONE 1
diff --git a/contrib/gcc/config/alpha/x-vms b/contrib/gcc/config/alpha/x-vms
index f53f1c7..c98f03d 100644
--- a/contrib/gcc/config/alpha/x-vms
+++ b/contrib/gcc/config/alpha/x-vms
@@ -1,6 +1,8 @@
# Under VMS, directory names cannot contain dots.
version:=$(shell echo $(gcc_version) | sed -e 's/\./_/g')
+libsubdir=$(libdir)/gcc-lib
+
# Rules for linker and compiler wrappers. These are only useful on
# a VMS host.
EXTRA_PROGRAMS=ld.exe decc.exe
diff --git a/contrib/gcc/config/alpha/xm-vms.h b/contrib/gcc/config/alpha/xm-vms.h
index d728ec1..7bfceba 100644
--- a/contrib/gcc/config/alpha/xm-vms.h
+++ b/contrib/gcc/config/alpha/xm-vms.h
@@ -37,6 +37,9 @@ Boston, MA 02111-1307, USA. */
/* Open files in stream mode if not otherwise explicitly specified */
#define __UNIX_FOPEN 1
+/* Write to stdout using fputc to avoid record terminators in pipes */
+#define __UNIX_FWRITE 1
+
#define STDC_HEADERS 1
#define HOST_EXECUTABLE_SUFFIX ".exe"
diff --git a/contrib/gcc/config/arm/aof.h b/contrib/gcc/config/arm/aof.h
index 750bc08..f110ea2 100644
--- a/contrib/gcc/config/arm/aof.h
+++ b/contrib/gcc/config/arm/aof.h
@@ -120,6 +120,10 @@ do { \
(*ptr++) (); \
} while (0)
+/* We really want to put Thumb tables in a read-only data section, but
+ switching to another section during function output is not
+ possible. We could however do what the SPARC does and defer the
+ whole table generation until the end of the function. */
#define JUMP_TABLES_IN_TEXT_SECTION 1
#ifndef ARM_OS_NAME
@@ -322,8 +326,13 @@ do { \
/* Output of Dispatch Tables */
-#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM,BODY,VALUE,REL) \
- fprintf ((STREAM), "\tb\t|L..%d|\n", (VALUE))
+#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM,BODY,VALUE,REL) \
+ do { \
+ if (TARGET_ARM) \
+ fprintf ((STREAM), "\tb\t|L..%d|\n", (VALUE)); \
+ else \
+ fprintf ((STREAM), "\tDCD\t|L..%d| - |L..%d|\n", (VALUE), (REL)); \
+ } while (0)
#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM,VALUE) \
fprintf ((STREAM), "\tDCD\t|L..%d|\n", (VALUE))
diff --git a/contrib/gcc/config/arm/aout.h b/contrib/gcc/config/arm/aout.h
index 64ca8b7..868eee0 100644
--- a/contrib/gcc/config/arm/aout.h
+++ b/contrib/gcc/config/arm/aout.h
@@ -181,8 +181,16 @@ Boston, MA 02111-1307, USA. */
#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \
asm_fprintf (STREAM, "\t.word\t%LL%d\n", VALUE)
-#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL) \
- asm_fprintf (STREAM, "\tb\t%LL%d\n", VALUE)
+#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL) \
+ do \
+ { \
+ if (TARGET_ARM) \
+ asm_fprintf (STREAM, "\tb\t%LL%d\n", VALUE); \
+ else \
+ asm_fprintf (STREAM, "\t.word\t%LL%d-%LL%d\n", VALUE, REL); \
+ } \
+ while (0)
+
#undef ASM_OUTPUT_ASCII
#define ASM_OUTPUT_ASCII(STREAM, PTR, LEN) \
diff --git a/contrib/gcc/config/arm/arm.c b/contrib/gcc/config/arm/arm.c
index dd823a2..4ef7279 100644
--- a/contrib/gcc/config/arm/arm.c
+++ b/contrib/gcc/config/arm/arm.c
@@ -266,12 +266,9 @@ int thumb_code = 0;
PRINT_OPERAND_ADDRESS. */
enum machine_mode output_memory_reference_mode;
-/* Nonzero if the prologue must setup `fp'. */
-int current_function_anonymous_args;
-
/* The register number to be used for the PIC offset register. */
const char * arm_pic_register_string = NULL;
-int arm_pic_register = 9;
+int arm_pic_register = INVALID_REGNUM;
/* Set to 1 when a return insn is output, this means that the epilogue
is not needed. */
@@ -654,8 +651,8 @@ arm_override_options ()
/* If stack checking is disabled, we can use r10 as the PIC register,
which keeps r9 available. */
- if (flag_pic && !TARGET_APCS_STACK)
- arm_pic_register = 10;
+ if (flag_pic)
+ arm_pic_register = TARGET_APCS_STACK ? 9 : 10;
if (TARGET_APCS_FLOAT)
warning ("passing floating point arguments in fp regs not yet supported");
@@ -716,18 +713,16 @@ arm_override_options ()
if (arm_pic_register_string != NULL)
{
- int pic_register;
-
+ int pic_register = decode_reg_name (arm_pic_register_string);
+
if (!flag_pic)
warning ("-mpic-register= is useless without -fpic");
- pic_register = decode_reg_name (arm_pic_register_string);
-
/* Prevent the user from choosing an obviously stupid PIC register. */
- if (pic_register < 0 || call_used_regs[pic_register]
- || pic_register == HARD_FRAME_POINTER_REGNUM
- || pic_register == STACK_POINTER_REGNUM
- || pic_register >= PC_REGNUM)
+ else if (pic_register < 0 || call_used_regs[pic_register]
+ || pic_register == HARD_FRAME_POINTER_REGNUM
+ || pic_register == STACK_POINTER_REGNUM
+ || pic_register >= PC_REGNUM)
error ("unable to use '%s' for PIC register", arm_pic_register_string);
else
arm_pic_register = pic_register;
@@ -902,14 +897,14 @@ use_return_insn (iscond)
func_type = arm_current_func_type ();
- /* Naked functions, volatile functiond and interrupt
- functions all need special consideration. */
- if (func_type & (ARM_FT_INTERRUPT | ARM_FT_VOLATILE | ARM_FT_NAKED))
+ /* Naked functions and volatile functions need special
+ consideration. */
+ if (func_type & (ARM_FT_VOLATILE | ARM_FT_NAKED))
return 0;
/* As do variadic functions. */
if (current_function_pretend_args_size
- || current_function_anonymous_args
+ || cfun->machine->uses_anonymous_args
/* Of if the function calls __builtin_eh_return () */
|| ARM_FUNC_TYPE (func_type) == ARM_FT_EXCEPTION_HANDLER
/* Or if there is no frame pointer and there is a stack adjustment. */
@@ -2102,9 +2097,6 @@ arm_encode_call_attribute (decl, flag)
int len = strlen (str);
char * newstr;
- if (TREE_CODE (decl) != FUNCTION_DECL)
- return;
-
/* Do not allow weak functions to be treated as short call. */
if (DECL_WEAK (decl) && flag == SHORT_CALL_FLAG_CHAR)
return;
@@ -2318,7 +2310,10 @@ legitimize_pic_address (orig, mode, reg)
else
emit_insn (gen_pic_load_addr_thumb (address, orig));
- if (GET_CODE (orig) == LABEL_REF && NEED_GOT_RELOC)
+ if ((GET_CODE (orig) == LABEL_REF
+ || (GET_CODE (orig) == SYMBOL_REF &&
+ ENCODED_SHORT_CALL_ATTR_P (XSTR (orig, 0))))
+ && NEED_GOT_RELOC)
pic_ref = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, address);
else
{
@@ -5334,14 +5329,29 @@ is_jump_table (insn)
return NULL_RTX;
}
+#ifndef JUMP_TABLES_IN_TEXT_SECTION
+#define JUMP_TABLES_IN_TEXT_SECTION 0
+#endif
+
static HOST_WIDE_INT
get_jump_table_size (insn)
rtx insn;
{
- rtx body = PATTERN (insn);
- int elt = GET_CODE (body) == ADDR_DIFF_VEC ? 1 : 0;
+ /* ADDR_VECs only take room if read-only data does into the text
+ section. */
+ if (JUMP_TABLES_IN_TEXT_SECTION
+#if !defined(READONLY_DATA_SECTION)
+ || 1
+#endif
+ )
+ {
+ rtx body = PATTERN (insn);
+ int elt = GET_CODE (body) == ADDR_DIFF_VEC ? 1 : 0;
+
+ return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, elt);
+ }
- return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, elt);
+ return 0;
}
/* Move a minipool fix MP from its current location to before MAX_MP.
@@ -7139,17 +7149,16 @@ arm_compute_save_reg_mask ()
/* Decide if we need to save the link register.
Interrupt routines have their own banked link register,
so they never need to save it.
- Otheriwse if we do not use the link register we do not need to save
+ Otherwise if we do not use the link register we do not need to save
it. If we are pushing other registers onto the stack however, we
can save an instruction in the epilogue by pushing the link register
now and then popping it back into the PC. This incurs extra memory
accesses though, so we only do it when optimising for size, and only
if we know that we will not need a fancy return sequence. */
- if (! IS_INTERRUPT (func_type)
- && (regs_ever_live [LR_REGNUM]
+ if (regs_ever_live [LR_REGNUM]
|| (save_reg_mask
&& optimize_size
- && ARM_FUNC_TYPE (func_type) == ARM_FT_NORMAL)))
+ && ARM_FUNC_TYPE (func_type) == ARM_FT_NORMAL))
save_reg_mask |= 1 << LR_REGNUM;
if (cfun->machine->lr_save_eliminated)
@@ -7207,21 +7216,19 @@ output_return_instruction (operand, really_return, reverse)
live_regs_mask = arm_compute_save_reg_mask ();
- /* On some ARM architectures it is faster to use LDR rather than LDM to
- load a single register. On other architectures, the cost is the same.
- In 26 bit mode we have to use LDM in order to be able to restore the CPSR. */
- if ((live_regs_mask == (1 << LR_REGNUM))
- && ! TARGET_INTERWORK
- && ! IS_INTERRUPT (func_type)
- && (! really_return || TARGET_APCS_32))
+ if (live_regs_mask)
{
- if (! really_return)
- sprintf (instr, "ldr%s\t%%|lr, [%%|sp], #4", conditional);
+ const char * return_reg;
+
+ /* If we do not have any special requirements for function exit
+ (eg interworking, or ISR) then we can load the return address
+ directly into the PC. Otherwise we must load it into LR. */
+ if (really_return
+ && ! TARGET_INTERWORK)
+ return_reg = reg_names[PC_REGNUM];
else
- sprintf (instr, "ldr%s\t%%|pc, [%%|sp], #4", conditional);
- }
- else if (live_regs_mask)
- {
+ return_reg = reg_names[LR_REGNUM];
+
if ((live_regs_mask & (1 << IP_REGNUM)) == (1 << IP_REGNUM))
/* There are two possible reasons for the IP register being saved.
Either a stack frame was created, in which case IP contains the
@@ -7233,96 +7240,91 @@ output_return_instruction (operand, really_return, reverse)
live_regs_mask |= (1 << SP_REGNUM);
}
- /* Generate the load multiple instruction to restore the registers. */
- if (frame_pointer_needed)
- sprintf (instr, "ldm%sea\t%%|fp, {", conditional);
- else
- sprintf (instr, "ldm%sfd\t%%|sp!, {", conditional);
-
- for (reg = 0; reg <= SP_REGNUM; reg++)
- if (live_regs_mask & (1 << reg))
- {
- strcat (instr, "%|");
- strcat (instr, reg_names[reg]);
- strcat (instr, ", ");
- }
-
- if ((live_regs_mask & (1 << LR_REGNUM)) == 0)
+ /* On some ARM architectures it is faster to use LDR rather than
+ LDM to load a single register. On other architectures, the
+ cost is the same. In 26 bit mode, or for exception handlers,
+ we have to use LDM to load the PC so that the CPSR is also
+ restored. */
+ for (reg = 0; reg <= LAST_ARM_REGNUM; reg++)
{
- /* If we are not restoring the LR register then we will
- have added one too many commas to the list above.
- Replace it with a closing brace. */
- instr [strlen (instr) - 2] = '}';
+ if (live_regs_mask == (unsigned int)(1 << reg))
+ break;
}
- else
+ if (reg <= LAST_ARM_REGNUM
+ && (reg != LR_REGNUM
+ || ! really_return
+ || (TARGET_APCS_32 && ! IS_INTERRUPT (func_type))))
{
- strcat (instr, "%|");
-
- /* At this point there should only be one or two registers left in
- live_regs_mask: always LR, and possibly PC if we created a stack
- frame. LR contains the return address. If we do not have any
- special requirements for function exit (eg interworking, or ISR)
- then we can load this value directly into the PC and save an
- instruction. */
- if (! TARGET_INTERWORK
- && ! IS_INTERRUPT (func_type)
- && really_return)
- strcat (instr, reg_names [PC_REGNUM]);
- else
- strcat (instr, reg_names [LR_REGNUM]);
-
- strcat (instr, (TARGET_APCS_32 || !really_return) ? "}" : "}^");
+ sprintf (instr, "ldr%s\t%%|%s, [%%|sp], #4", conditional,
+ (reg == LR_REGNUM) ? return_reg : reg_names[reg]);
}
-
- if (really_return)
+ else
{
- /* See if we need to generate an extra instruction to
- perform the actual function return. */
- switch ((int) ARM_FUNC_TYPE (func_type))
- {
- case ARM_FT_ISR:
- case ARM_FT_FIQ:
- output_asm_insn (instr, & operand);
+ char *p;
+ int first = 1;
- strcpy (instr, "sub");
- strcat (instr, conditional);
- strcat (instr, "s\t%|pc, %|lr, #4");
- break;
+ /* Generate the load multiple instruction to restore the registers. */
+ if (frame_pointer_needed)
+ sprintf (instr, "ldm%sea\t%%|fp, {", conditional);
+ else
+ sprintf (instr, "ldm%sfd\t%%|sp!, {", conditional);
- case ARM_FT_EXCEPTION:
- output_asm_insn (instr, & operand);
+ p = instr + strlen (instr);
- strcpy (instr, "mov");
- strcat (instr, conditional);
- strcat (instr, "s\t%|pc, %|lr");
- break;
+ for (reg = 0; reg <= SP_REGNUM; reg++)
+ if (live_regs_mask & (1 << reg))
+ {
+ int l = strlen (reg_names[reg]);
- case ARM_FT_INTERWORKED:
- output_asm_insn (instr, & operand);
+ if (first)
+ first = 0;
+ else
+ {
+ memcpy (p, ", ", 2);
+ p += 2;
+ }
- strcpy (instr, "bx");
- strcat (instr, conditional);
- strcat (instr, "\t%|lr");
- break;
+ memcpy (p, "%|", 2);
+ memcpy (p + 2, reg_names[reg], l);
+ p += l + 2;
+ }
+
+ if (live_regs_mask & (1 << LR_REGNUM))
+ {
+ int l = strlen (return_reg);
- default:
- /* The return has already been handled
- by loading the LR into the PC. */
- if ((live_regs_mask & (1 << LR_REGNUM)) == 0)
+ if (! first)
{
- output_asm_insn (instr, & operand);
-
- strcpy (instr, "mov");
- strcat (instr, conditional);
- if (! TARGET_APCS_32)
- strcat (instr, "s");
- strcat (instr, "\t%|pc, %|lr");
+ memcpy (p, ", ", 2);
+ p += 2;
}
- break;
+
+ memcpy (p, "%|", 2);
+ memcpy (p + 2, return_reg, l);
+ strcpy (p + 2 + l, ((TARGET_APCS_32
+ && !IS_INTERRUPT (func_type))
+ || !really_return)
+ ? "}" : "}^");
}
+ else
+ strcpy (p, "}");
+ }
+
+ output_asm_insn (instr, & operand);
+
+ /* See if we need to generate an extra instruction to
+ perform the actual function return. */
+ if (really_return
+ && func_type != ARM_FT_INTERWORKED
+ && (live_regs_mask & (1 << LR_REGNUM)) != 0)
+ {
+ /* The return has already been handled
+ by loading the LR into the PC. */
+ really_return = 0;
}
}
- else if (really_return)
+
+ if (really_return)
{
switch ((int) ARM_FUNC_TYPE (func_type))
{
@@ -7340,18 +7342,19 @@ output_return_instruction (operand, really_return, reverse)
break;
default:
- sprintf (instr, "mov%s%s\t%%|pc, %%|lr",
- conditional, TARGET_APCS_32 ? "" : "s");
+ /* ARMv5 implementations always provide BX, so interworking
+ is the default unless APCS-26 is in use. */
+ if ((insn_flags & FL_ARCH5) != 0 && TARGET_APCS_32)
+ sprintf (instr, "bx%s\t%%|lr", conditional);
+ else
+ sprintf (instr, "mov%s%s\t%%|pc, %%|lr",
+ conditional, TARGET_APCS_32 ? "" : "s");
break;
}
+
+ output_asm_insn (instr, & operand);
}
- else
- /* Nothing to load off the stack, and
- no return instruction to generate. */
- return "";
- output_asm_insn (instr, & operand);
-
return "";
}
@@ -7457,9 +7460,9 @@ arm_output_function_prologue (f, frame_size)
current_function_args_size,
current_function_pretend_args_size, frame_size);
- asm_fprintf (f, "\t%@ frame_needed = %d, current_function_anonymous_args = %d\n",
+ asm_fprintf (f, "\t%@ frame_needed = %d, uses_anonymous_args = %d\n",
frame_pointer_needed,
- current_function_anonymous_args);
+ cfun->machine->uses_anonymous_args);
if (cfun->machine->lr_save_eliminated)
asm_fprintf (f, "\t%@ link register save eliminated.\n");
@@ -7479,8 +7482,9 @@ arm_output_epilogue (really_return)
int reg;
unsigned long saved_regs_mask;
unsigned long func_type;
- /* If we need this, then it will always be at least this much. */
- int floats_offset = 12;
+ /* Floats_offset is the offset from the "virtual" frame. In an APCS
+ frame that is $fp + 4 for a non-variadic function. */
+ int floats_offset = 0;
rtx operands[3];
int frame_size = get_frame_size ();
FILE * f = asm_out_file;
@@ -7517,6 +7521,9 @@ arm_output_epilogue (really_return)
saved_regs_mask = arm_compute_save_reg_mask ();
+ /* XXX We should adjust floats_offset for any anonymous args, and then
+ re-adjust vfp_offset below to compensate. */
+
/* Compute how far away the floats will be. */
for (reg = 0; reg <= LAST_ARM_REGNUM; reg ++)
if (saved_regs_mask & (1 << reg))
@@ -7524,6 +7531,8 @@ arm_output_epilogue (really_return)
if (frame_pointer_needed)
{
+ int vfp_offset = 4;
+
if (arm_fpu_arch == FP_SOFT2)
{
for (reg = LAST_ARM_FP_REGNUM; reg >= FIRST_ARM_FP_REGNUM; reg--)
@@ -7531,7 +7540,7 @@ arm_output_epilogue (really_return)
{
floats_offset += 12;
asm_fprintf (f, "\tldfe\t%r, [%r, #-%d]\n",
- reg, FP_REGNUM, floats_offset);
+ reg, FP_REGNUM, floats_offset - vfp_offset);
}
}
else
@@ -7548,7 +7557,7 @@ arm_output_epilogue (really_return)
if (start_reg - reg == 3)
{
asm_fprintf (f, "\tlfm\t%r, 4, [%r, #-%d]\n",
- reg, FP_REGNUM, floats_offset);
+ reg, FP_REGNUM, floats_offset - vfp_offset);
start_reg = reg - 1;
}
}
@@ -7557,7 +7566,7 @@ arm_output_epilogue (really_return)
if (reg != start_reg)
asm_fprintf (f, "\tlfm\t%r, %d, [%r, #-%d]\n",
reg + 1, start_reg - reg,
- FP_REGNUM, floats_offset);
+ FP_REGNUM, floats_offset - vfp_offset);
start_reg = reg - 1;
}
}
@@ -7566,7 +7575,7 @@ arm_output_epilogue (really_return)
if (reg != start_reg)
asm_fprintf (f, "\tlfm\t%r, %d, [%r, #-%d]\n",
reg + 1, start_reg - reg,
- FP_REGNUM, floats_offset);
+ FP_REGNUM, floats_offset - vfp_offset);
}
/* saved_regs_mask should contain the IP, which at the time of stack
@@ -7660,7 +7669,7 @@ arm_output_epilogue (really_return)
to load use the LDR instruction - it is faster. */
if (saved_regs_mask == (1 << LR_REGNUM))
{
- /* The excpetion handler ignores the LR, so we do
+ /* The exception handler ignores the LR, so we do
not really need to load it off the stack. */
if (eh_ofs)
asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM);
@@ -7686,7 +7695,10 @@ arm_output_epilogue (really_return)
REGNO (eh_ofs));
#endif
- if (! really_return)
+ if (! really_return
+ || (ARM_FUNC_TYPE (func_type) == ARM_FT_NORMAL
+ && current_function_pretend_args_size == 0
+ && saved_regs_mask & (1 << PC_REGNUM)))
return "";
/* Generate the return instruction. */
@@ -7754,7 +7766,6 @@ arm_output_function_epilogue (file, frame_size)
abort ();
/* Reset the ARM-specific per-function variables. */
- current_function_anonymous_args = 0;
after_arm_reorg = 0;
}
}
@@ -8068,7 +8079,7 @@ arm_compute_initial_elimination_offset (from, to)
/* FIXME: Not sure about this. Maybe we should always return 0 ? */
return (frame_pointer_needed
&& current_function_needs_context
- && ! current_function_anonymous_args) ? 4 : 0;
+ && ! cfun->machine->uses_anonymous_args) ? 4 : 0;
case STACK_POINTER_REGNUM:
/* If nothing has been pushed on the stack at all
@@ -8209,7 +8220,7 @@ arm_expand_prologue ()
else
{
/* Store the args on the stack. */
- if (current_function_anonymous_args)
+ if (cfun->machine->uses_anonymous_args)
insn = emit_multi_reg_push
((0xf0 >> (args_to_push / 4)) & 0xf);
else
@@ -8245,7 +8256,7 @@ arm_expand_prologue ()
if (args_to_push)
{
/* Push the argument registers, or reserve space for them. */
- if (current_function_anonymous_args)
+ if (cfun->machine->uses_anonymous_args)
insn = emit_multi_reg_push
((0xf0 >> (args_to_push / 4)) & 0xf);
else
@@ -8255,6 +8266,19 @@ arm_expand_prologue ()
RTX_FRAME_RELATED_P (insn) = 1;
}
+ /* If this is an interrupt service routine, and the link register is
+ going to be pushed, subtracting four now will mean that the
+ function return can be done with a single instruction. */
+ if ((func_type == ARM_FT_ISR || func_type == ARM_FT_FIQ)
+ && (live_regs_mask & (1 << LR_REGNUM)) != 0)
+ {
+ emit_insn (gen_rtx_SET (SImode,
+ gen_rtx_REG (SImode, LR_REGNUM),
+ gen_rtx_PLUS (SImode,
+ gen_rtx_REG (SImode, LR_REGNUM),
+ GEN_INT (-4))));
+ }
+
if (live_regs_mask)
{
insn = emit_multi_reg_push (live_regs_mask);
@@ -8609,7 +8633,9 @@ arm_assemble_integer (x, size, aligned_p)
if (NEED_GOT_RELOC && flag_pic && making_const_table &&
(GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF))
{
- if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
+ if (GET_CODE (x) == SYMBOL_REF
+ && (CONSTANT_POOL_ADDRESS_P (x)
+ || ENCODED_SHORT_CALL_ATTR_P (XSTR (x, 0))))
fputs ("(GOTOFF)", asm_out_file);
else if (GET_CODE (x) == LABEL_REF)
fputs ("(GOTOFF)", asm_out_file);
@@ -9139,20 +9165,8 @@ arm_hard_regno_mode_ok (regno, mode)
return (NUM_REGS (mode) < 2) || (regno < LAST_LO_REGNUM);
if (regno <= LAST_ARM_REGNUM)
- /* We allow an SImode or smaller value to be stored in any
- general purpose register. This does not mean, for example
- that GCC will choose to store a variable in the stack pointer
- since it is a fixed register. But it is important to allow
- access to these special registers, so that they can be
- referenced from C code via the asm assembler alias, eg:
-
- register char * stack_ptr asm ("sp");
-
- For any mode requiring more than one register to hold the
- value we restrict the choice so that r13, r14, and r15
- cannot be part of the register set. */
- return (NUM_REGS (mode) <= 1)
- || (regno < (SP_REGNUM - (unsigned) NUM_REGS (mode)));
+ /* We allow any value to be stored in the general regisetrs. */
+ return 1;
if ( regno == FRAME_POINTER_REGNUM
|| regno == ARG_POINTER_REGNUM)
@@ -10187,7 +10201,6 @@ thumb_expand_prologue ()
if (regno > LAST_LO_REGNUM) /* Very unlikely */
{
rtx spare = gen_rtx (REG, SImode, IP_REGNUM);
- rtx insn;
/* Choose an arbitary, non-argument low register. */
reg = gen_rtx (REG, SImode, LAST_LO_REGNUM);
@@ -10312,7 +10325,7 @@ thumb_output_function_prologue (f, size)
if (current_function_pretend_args_size)
{
- if (current_function_anonymous_args)
+ if (cfun->machine->uses_anonymous_args)
{
int num_pushes;
diff --git a/contrib/gcc/config/arm/arm.h b/contrib/gcc/config/arm/arm.h
index 46f938e..5e8b5d9 100644
--- a/contrib/gcc/config/arm/arm.h
+++ b/contrib/gcc/config/arm/arm.h
@@ -81,8 +81,6 @@ extern struct rtx_def * pool_vector_label;
/* Set to 1 when a return insn is output, this means that the epilogue
is not needed. */
extern int return_used_this_function;
-/* Nonzero if the prologue must setup `fp'. */
-extern int current_function_anonymous_args;
/* Just in case configure has failed to define anything. */
#ifndef TARGET_CPU_DEFAULT
@@ -855,7 +853,7 @@ extern const char * structure_size_string;
regno <= LAST_ARM_FP_REGNUM; ++regno) \
fixed_regs[regno] = call_used_regs[regno] = 1; \
} \
- if (flag_pic) \
+ if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM) \
{ \
fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
@@ -1029,6 +1027,13 @@ extern const char * structure_size_string;
16, 17, 18, 19, 20, 21, 22, 23, \
24, 25, 26 \
}
+
+/* Interrupt functions can only use registers that have already been
+ saved by the prologue, even if they would normally be
+ call-clobbered. */
+#define HARD_REGNO_RENAME_OK(SRC, DST) \
+ (! IS_INTERRUPT (cfun->machine->func_type) || \
+ regs_ever_live[DST])
/* Register and constant classes. */
@@ -1454,6 +1459,8 @@ typedef struct machine_function
int lr_save_eliminated;
/* Records the type of the current function. */
unsigned long func_type;
+ /* Record if the function has a variable argument list. */
+ int uses_anonymous_args;
}
machine_function;
@@ -1536,8 +1543,7 @@ typedef struct
that way. */
#define SETUP_INCOMING_VARARGS(CUM, MODE, TYPE, PRETEND_SIZE, NO_RTL) \
{ \
- extern int current_function_anonymous_args; \
- current_function_anonymous_args = 1; \
+ cfun->machine->uses_anonymous_args = 1; \
if ((CUM).nregs < NUM_ARG_REGS) \
(PRETEND_SIZE) = (NUM_ARG_REGS - (CUM).nregs) * UNITS_PER_WORD; \
}
@@ -1844,7 +1850,8 @@ typedef struct
#define THUMB_LEGITIMATE_CONSTANT_P(X) \
( GET_CODE (X) == CONST_INT \
|| GET_CODE (X) == CONST_DOUBLE \
- || CONSTANT_ADDRESS_P (X))
+ || CONSTANT_ADDRESS_P (X) \
+ || flag_pic)
#define LEGITIMATE_CONSTANT_P(X) \
(TARGET_ARM ? ARM_LEGITIMATE_CONSTANT_P (X) : THUMB_LEGITIMATE_CONSTANT_P (X))
@@ -1892,9 +1899,9 @@ typedef struct
or known to be defined in this file then encode a short call flag.
This macro is used inside the ENCODE_SECTION macro. */
#define ARM_ENCODE_CALL_TYPE(decl) \
- if (TREE_CODE (decl) == FUNCTION_DECL) \
+ if (TREE_CODE_CLASS (TREE_CODE (decl)) == 'd') \
{ \
- if (DECL_WEAK (decl)) \
+ if (TREE_CODE (decl) == FUNCTION_DECL && DECL_WEAK (decl)) \
arm_encode_call_attribute (decl, LONG_CALL_FLAG_CHAR); \
else if (! TREE_PUBLIC (decl)) \
arm_encode_call_attribute (decl, SHORT_CALL_FLAG_CHAR); \
diff --git a/contrib/gcc/config/arm/arm.md b/contrib/gcc/config/arm/arm.md
index 3646fe5..91bbf61 100644
--- a/contrib/gcc/config/arm/arm.md
+++ b/contrib/gcc/config/arm/arm.md
@@ -135,8 +135,12 @@
(define_attr "neg_pool_range" "" (const_int 0))
; An assembler sequence may clobber the condition codes without us knowing.
+; If such an insn references the pool, then we have no way of knowing how,
+; so use the most conservative value for pool_range.
(define_asm_attributes
- [(set_attr "conds" "clob")])
+ [(set_attr "conds" "clob")
+ (set_attr "length" "4")
+ (set_attr "pool_range" "250")])
; TYPE attribute is used to detect floating point instructions which, if
; running on a co-processor can run in parallel with other, basic instructions
@@ -3959,7 +3963,7 @@
[(set_attr "length" "8")
(set_attr "type" "*,load,store2")
(set_attr "pool_range" "*,1020,*")
- (set_attr "neg_pool_range" "*,1012,*")]
+ (set_attr "neg_pool_range" "*,1008,*")]
)
;;; ??? This should have alternatives for constants.
@@ -4132,27 +4136,6 @@
}"
)
-(define_expand "movaddr"
- [(set (match_operand:SI 0 "s_register_operand" "")
- (match_operand:DI 1 "address_operand" ""))]
- "TARGET_ARM"
- ""
-)
-
-(define_insn "*movaddr_insn"
- [(set (match_operand:SI 0 "s_register_operand" "=r")
- (match_operand:DI 1 "address_operand" "p"))]
- "TARGET_ARM
- && reload_completed
- && (GET_CODE (operands[1]) == LABEL_REF
- || (GET_CODE (operands[1]) == CONST
- && GET_CODE (XEXP (operands[1], 0)) == PLUS
- && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
- && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == CONST_INT))"
- "adr%?\\t%0, %a1"
- [(set_attr "predicable" "yes")]
-)
-
;; When generating pic, we need to load the symbol offset into a register.
;; So that the optimizer does not confuse this with a normal symbol load
;; we use an unspec. The offset will be loaded from a constant pool entry,
@@ -5110,8 +5093,8 @@
(set_attr "predicable" "yes")
(set_attr "type"
"load,store2,*,store2,load,ffarith,ffarith,f_load,f_store,r_mem_f,f_mem_r")
- (set_attr "pool_range" "*,*,*,*,252,*,*,1024,*,*,*")
- (set_attr "neg_pool_range" "*,*,*,*,244,*,*,1012,*,*,*")]
+ (set_attr "pool_range" "*,*,*,*,1020,*,*,1024,*,*,*")
+ (set_attr "neg_pool_range" "*,*,*,*,1008,*,*,1008,*,*,*")]
)
;; Software floating point version. This is essentially the same as movdi.
@@ -5126,8 +5109,8 @@
"* return output_move_double (operands);"
[(set_attr "length" "8,8,8")
(set_attr "type" "*,load,store2")
- (set_attr "pool_range" "252")
- (set_attr "neg_pool_range" "244")]
+ (set_attr "pool_range" "1020")
+ (set_attr "neg_pool_range" "1008")]
)
;;; ??? This should have alternatives for constants.
@@ -5201,7 +5184,7 @@
(set_attr "predicable" "yes")
(set_attr "type" "ffarith,ffarith,f_load,f_store,r_mem_f,f_mem_r,*")
(set_attr "pool_range" "*,*,1024,*,*,*,*")
- (set_attr "neg_pool_range" "*,*,1012,*,*,*,*")]
+ (set_attr "neg_pool_range" "*,*,1004,*,*,*,*")]
)
@@ -6655,7 +6638,8 @@
(use (match_operand 2 "" ""))
(clobber (reg:SI LR_REGNUM))]
"TARGET_THUMB
- && operands[2] == const0_rtx && (GET_CODE (operands[0]) == SYMBOL_REF)"
+ && GET_CODE (operands[0]) == SYMBOL_REF
+ && !arm_is_longcall_p (operands[0], INTVAL (operands[2]), 1)"
"bl\\t%a0"
[(set_attr "length" "4")
(set_attr "type" "call")]
@@ -6668,7 +6652,8 @@
(use (match_operand 3 "" ""))
(clobber (reg:SI LR_REGNUM))]
"TARGET_THUMB
- && operands[3] == const0_rtx && (GET_CODE (operands[1]) == SYMBOL_REF)"
+ && GET_CODE (operands[1]) == SYMBOL_REF
+ && !arm_is_longcall_p (operands[1], INTVAL (operands[3]), 1)"
"bl\\t%a1"
[(set_attr "length" "4")
(set_attr "type" "call")]
@@ -8297,6 +8282,7 @@
"TARGET_ARM
&& !BYTES_BIG_ENDIAN
&& !TARGET_MMU_TRAPS
+ && !arm_arch4
&& REGNO (operands[0]) != FRAME_POINTER_REGNUM
&& REGNO (operands[1]) != FRAME_POINTER_REGNUM
&& (GET_CODE (operands[2]) != REG
@@ -8315,6 +8301,7 @@
"TARGET_ARM
&& !BYTES_BIG_ENDIAN
&& !TARGET_MMU_TRAPS
+ && !arm_arch4
&& REGNO (operands[0]) != FRAME_POINTER_REGNUM
&& REGNO (operands[1]) != FRAME_POINTER_REGNUM
&& (GET_CODE (operands[2]) != REG
@@ -8479,6 +8466,7 @@
"TARGET_ARM
&& !BYTES_BIG_ENDIAN
&& !TARGET_MMU_TRAPS
+ && !arm_arch4
&& REGNO (operands[0]) != FRAME_POINTER_REGNUM
&& REGNO (operands[1]) != FRAME_POINTER_REGNUM
&& REGNO (operands[3]) != FRAME_POINTER_REGNUM"
@@ -8499,6 +8487,7 @@
"TARGET_ARM
&& !BYTES_BIG_ENDIAN
&& !TARGET_MMU_TRAPS
+ && !arm_arch4
&& REGNO (operands[0]) != FRAME_POINTER_REGNUM
&& REGNO (operands[1]) != FRAME_POINTER_REGNUM
&& REGNO (operands[3]) != FRAME_POINTER_REGNUM"
@@ -8562,6 +8551,7 @@
"TARGET_ARM
&& !BYTES_BIG_ENDIAN
&& !TARGET_MMU_TRAPS
+ && !arm_arch4
&& REGNO (operands[0]) != REGNO(operands[1])
&& (GET_CODE (operands[2]) != REG
|| REGNO(operands[0]) != REGNO (operands[2]))"
@@ -9136,11 +9126,28 @@
;; Miscellaneous Thumb patterns
-(define_insn "tablejump"
+(define_expand "tablejump"
+ [(parallel [(set (pc) (match_operand:SI 0 "register_operand" "l*r"))
+ (use (label_ref (match_operand 1 "" "")))])]
+ "TARGET_THUMB"
+ "
+ if (flag_pic)
+ {
+ /* Hopefully, CSE will eliminate this copy. */
+ rtx reg1 = copy_addr_to_reg (gen_rtx_LABEL_REF (Pmode, operands[1]));
+ rtx reg2 = gen_reg_rtx (SImode);
+
+ emit_insn (gen_addsi3 (reg2, operands[0], reg1));
+ operands[0] = reg2;
+ }
+ "
+)
+
+(define_insn "*thumb_tablejump"
[(set (pc) (match_operand:SI 0 "register_operand" "l*r"))
(use (label_ref (match_operand 1 "" "")))]
"TARGET_THUMB"
- "mov pc, %0"
+ "mov\\t%|pc, %0"
[(set_attr "length" "2")]
)
diff --git a/contrib/gcc/config/arm/coff.h b/contrib/gcc/config/arm/coff.h
index f53dace..c9f0d92 100644
--- a/contrib/gcc/config/arm/coff.h
+++ b/contrib/gcc/config/arm/coff.h
@@ -72,7 +72,9 @@ Boston, MA 02111-1307, USA. */
/* Define this macro if jump tables (for `tablejump' insns) should be
output in the text section, along with the assembler instructions.
Otherwise, the readonly data section is used. */
-#define JUMP_TABLES_IN_TEXT_SECTION 1
+/* We put ARM jump tables in the text section, because it makes the code
+ more efficient, but for Thumb it's better to put them out of band. */
+#define JUMP_TABLES_IN_TEXT_SECTION (TARGET_ARM)
#undef READONLY_DATA_SECTION
#define READONLY_DATA_SECTION rdata_section
diff --git a/contrib/gcc/config/arm/elf.h b/contrib/gcc/config/arm/elf.h
index c27daca..1cab2c4 100644
--- a/contrib/gcc/config/arm/elf.h
+++ b/contrib/gcc/config/arm/elf.h
@@ -103,7 +103,9 @@ Boston, MA 02111-1307, USA. */
/* Define this macro if jump tables (for `tablejump' insns) should be
output in the text section, along with the assembler instructions.
Otherwise, the readonly data section is used. */
-#define JUMP_TABLES_IN_TEXT_SECTION 1
+/* We put ARM jump tables in the text section, because it makes the code
+ more efficient, but for Thumb it's better to put them out of band. */
+#define JUMP_TABLES_IN_TEXT_SECTION (TARGET_ARM)
#ifndef LINK_SPEC
#define LINK_SPEC "%{mbig-endian:-EB} -X"
diff --git a/contrib/gcc/config/arm/linux-elf.h b/contrib/gcc/config/arm/linux-elf.h
index 74f7e7e..f1c86d2 100644
--- a/contrib/gcc/config/arm/linux-elf.h
+++ b/contrib/gcc/config/arm/linux-elf.h
@@ -1,5 +1,5 @@
/* Definitions for ARM running Linux-based GNU systems using ELF
- Copyright (C) 1993, 1994, 1997, 1998, 1999, 2000, 2001
+ Copyright (C) 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
Contributed by Philip Blundell <philb@gnu.org>
@@ -42,6 +42,10 @@ Boston, MA 02111-1307, USA. */
#define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+/* The GNU C++ standard library requires that these macros be defined. */
+#undef CPLUSPLUS_CPP_SPEC
+#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
+
/* Now we define the strings used to build the spec file. */
#define LIB_SPEC \
"%{shared: -lc} \
@@ -87,7 +91,7 @@ Boston, MA 02111-1307, USA. */
#undef CPP_PREDEFINES
#define CPP_PREDEFINES \
-"-Dunix -Dlinux -D__ELF__ \
+"-Dunix -D__gnu_linux__ -Dlinux -D__ELF__ \
-Asystem=unix -Asystem=posix"
/* Allow #sccs in preprocessor. */
diff --git a/contrib/gcc/config/arm/netbsd.h b/contrib/gcc/config/arm/netbsd.h
index 74f32e8..2be49d8 100644
--- a/contrib/gcc/config/arm/netbsd.h
+++ b/contrib/gcc/config/arm/netbsd.h
@@ -1,4 +1,4 @@
-/* NetBSD/arm (RiscBSD) version.
+/* NetBSD/arm a.out version.
Copyright (C) 1993, 1994, 1997, 1998 Free Software Foundation, Inc.
Contributed by Mark Brinicombe (amb@physig.ph.kcl.ac.uk)
@@ -77,15 +77,6 @@ Boston, MA 02111-1307, USA. */
#undef PTRDIFF_TYPE
#define PTRDIFF_TYPE "int"
-#undef WCHAR_TYPE
-#define WCHAR_TYPE "int"
-
-#undef WCHAR_UNSIGNED
-#define WCHAR_UNSIGNED 0
-
-#undef WCHAR_TYPE_SIZE
-#define WCHAR_TYPE_SIZE 32
-
#define HANDLE_SYSV_PRAGMA
/* We don't have any limit on the length as out debugger is GDB. */
diff --git a/contrib/gcc/config/arm/rtems-elf.h b/contrib/gcc/config/arm/rtems-elf.h
index 954f72b..312c96f 100644
--- a/contrib/gcc/config/arm/rtems-elf.h
+++ b/contrib/gcc/config/arm/rtems-elf.h
@@ -1,5 +1,5 @@
/* Definitions for RTEMS based ARM systems using ELF
- Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -19,15 +19,10 @@ the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Run-time Target Specification. */
-#undef TARGET_VERSION
+#undef TARGET_VERSION
#define TARGET_VERSION fputs (" (ARM/ELF RTEMS)", stderr);
#define HAS_INIT_SECTION
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Darm -Darm_elf -Drtems -D__rtems__ -D__ELF__ \
- -Asystem(rtems) -Acpu(arm) -Amachine(arm)"
-
-/*#undef INVOKE_main*/
-
-
+#undef CPP_PREDEFINES
+#define CPP_PREDEFINES "-D__rtems__ -D__ELF__ -Asystem=rtems"
diff --git a/contrib/gcc/config/float-sparc.h b/contrib/gcc/config/float-sparc.h
index f3c2583..84250e5 100644
--- a/contrib/gcc/config/float-sparc.h
+++ b/contrib/gcc/config/float-sparc.h
@@ -66,7 +66,7 @@
#undef DBL_MAX_10_EXP
#define DBL_MAX_10_EXP 308
-#if defined(__sparcv9) || defined(__arch64__)
+#if defined(__sparcv9) || defined(__arch64__) || defined(__LONG_DOUBLE_128__)
/* Number of base-FLT_RADIX digits in the significand of a long double */
#undef LDBL_MANT_DIG
diff --git a/contrib/gcc/config/i386/cygwin.h b/contrib/gcc/config/i386/cygwin.h
index 2a812a5..35f8209 100644
--- a/contrib/gcc/config/i386/cygwin.h
+++ b/contrib/gcc/config/i386/cygwin.h
@@ -423,6 +423,11 @@ extern void i386_pe_unique_section PARAMS ((TREE, int));
#undef ASM_COMMENT_START
#define ASM_COMMENT_START " #"
+/* DWARF2 Unwinding doesn't work with exception handling yet. To make it
+ work, we need to build a libgcc_s.dll, and dcrt0.o should be changed to
+ call __register_frame_info/__deregister_frame_info. */
+#define DWARF2_UNWIND_INFO 0
+
/* Don't assume anything about the header files. */
#define NO_IMPLICIT_EXTERN_C
diff --git a/contrib/gcc/config/i386/djgpp-rtems.h b/contrib/gcc/config/i386/djgpp-rtems.h
index b8f4908..551b666 100644
--- a/contrib/gcc/config/i386/djgpp-rtems.h
+++ b/contrib/gcc/config/i386/djgpp-rtems.h
@@ -1,7 +1,7 @@
/* Configuration for an i386 running RTEMS on top of MS-DOS with
DJGPP v2.x.
- Copyright (C) 1996,1999 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1999, 2002 Free Software Foundation, Inc.
Contributed by Joel Sherrill (joel@OARcorp.com).
This file is part of GNU CC.
@@ -21,20 +21,15 @@ along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#include "i386/djgpp.h"
-
/* Specify predefined symbols in preprocessor. */
#ifdef CPP_PREDEFINES
#undef CPP_PREDEFINES
#endif
-#define CPP_PREDEFINES "-Dunix -DGO32 -DDJGPP=2 -DMSDOS \
+#define CPP_PREDEFINES "-Dunix -DGO32 -DDJGPP=2 -DMSDOS -D__rtems__ \
-Asystem=unix -Asystem=msdos -Asystem=rtems"
/* Generate calls to memcpy, memcmp and memset. */
#ifndef TARGET_MEM_FUNCTIONS
#define TARGET_MEM_FUNCTIONS
#endif
-
-/* end of i386/djgpp-rtems.h */
-
diff --git a/contrib/gcc/config/i386/gnu.h b/contrib/gcc/config/i386/gnu.h
index 0214c05..b14328f 100644
--- a/contrib/gcc/config/i386/gnu.h
+++ b/contrib/gcc/config/i386/gnu.h
@@ -5,7 +5,7 @@
#undef CPP_PREDEFINES
#define CPP_PREDEFINES "-D__ELF__ -DMACH -Asystem=mach \
- -Dunix -Asystem=unix -Asystem=posix -D__GNU__ -Asystem=gnu"
+ -Dunix -Asystem=unix -Asystem=posix -D__gnu_hurd__ -D__GNU__ -Asystem=gnu"
#undef CPP_SPEC
#define CPP_SPEC "%(cpp_cpu) \
diff --git a/contrib/gcc/config/i386/i386-interix.h b/contrib/gcc/config/i386/i386-interix.h
index 962862f..76357f3 100644
--- a/contrib/gcc/config/i386/i386-interix.h
+++ b/contrib/gcc/config/i386/i386-interix.h
@@ -65,6 +65,7 @@ Boston, MA 02111-1307, USA. */
-D_M_IX86=300 -D_X86_=1 \
-D__stdcall=__attribute__((__stdcall__)) \
-D__cdecl=__attribute__((__cdecl__)) \
+ -D__declspec(x)=__attribute__((x)) \
-Asystem=unix -Asystem=interix"
#undef CPP_SPEC
@@ -237,6 +238,7 @@ Boston, MA 02111-1307, USA. */
#undef LD_INIT_SWITCH
#undef LD_FINI_SWITCH
+#define EH_FRAME_IN_DATA_SECTION
/* Note that there appears to be two different ways to support const
sections at the moment. You can either #define the symbol
@@ -410,10 +412,10 @@ extern void i386_pe_unique_section ();
#define UNIQUE_SECTION(DECL,RELOC) i386_pe_unique_section (DECL, RELOC)
#define SUPPORTS_ONE_ONLY 1
+#endif /* 0 */
/* Switch into a generic section. */
#define TARGET_ASM_NAMED_SECTION default_pe_asm_named_section
-#endif /* 0 */
/* DWARF2 Unwinding doesn't work with exception handling yet. */
#define DWARF2_UNWIND_INFO 0
@@ -421,3 +423,11 @@ extern void i386_pe_unique_section ();
/* Don't assume anything about the header files. */
#define NO_IMPLICIT_EXTERN_C
+/* MSVC returns structs of up to 8 bytes via registers. */
+
+#define DEFAULT_PCC_STRUCT_RETURN 0
+
+#undef RETURN_IN_MEMORY
+#define RETURN_IN_MEMORY(TYPE) \
+ (TYPE_MODE (TYPE) == BLKmode || \
+ (AGGREGATE_TYPE_P (TYPE) && int_size_in_bytes(TYPE) > 8 ))
diff --git a/contrib/gcc/config/i386/i386-protos.h b/contrib/gcc/config/i386/i386-protos.h
index 01c4d44..8321d47 100644
--- a/contrib/gcc/config/i386/i386-protos.h
+++ b/contrib/gcc/config/i386/i386-protos.h
@@ -169,6 +169,7 @@ extern int ix86_memory_move_cost PARAMS ((enum machine_mode, enum reg_class,
extern void ix86_set_move_mem_attrs PARAMS ((rtx, rtx, rtx, rtx, rtx));
extern void emit_i387_cw_initialization PARAMS ((rtx, rtx));
extern bool ix86_fp_jump_nontrivial_p PARAMS ((enum rtx_code));
+extern void x86_order_regs_for_local_alloc PARAMS ((void));
#ifdef TREE_CODE
diff --git a/contrib/gcc/config/i386/libgcc-x86_64-glibc.ver b/contrib/gcc/config/i386/libgcc-x86_64-glibc.ver
new file mode 100644
index 0000000..2ea321f
--- /dev/null
+++ b/contrib/gcc/config/i386/libgcc-x86_64-glibc.ver
@@ -0,0 +1,25 @@
+# In order to work around the very problems that force us to now generally
+# create a libgcc.so, glibc reexported a number of routines from libgcc.a.
+# By now choosing the same version tags for these specific routines, we
+# maintain enough binary compatibility to allow future versions of glibc
+# to defer implementation of these routines to libgcc.so via DT_AUXILIARY.
+
+%ifndef __x86_64__
+%inherit GCC_3.0 GLIBC_2.0
+GLIBC_2.0 {
+ # Sampling of DImode arithmetic used by (at least) i386 and m68k.
+ __divdi3
+ __moddi3
+ __udivdi3
+ __umoddi3
+
+ # Exception handling support functions used by most everyone.
+ __register_frame
+ __register_frame_table
+ __deregister_frame
+ __register_frame_info
+ __deregister_frame_info
+ __frame_state_for
+ __register_frame_info_table
+}
+%endif
diff --git a/contrib/gcc/config/i386/linux-aout.h b/contrib/gcc/config/i386/linux-aout.h
index 302ee69..4b9cd5c 100644
--- a/contrib/gcc/config/i386/linux-aout.h
+++ b/contrib/gcc/config/i386/linux-aout.h
@@ -1,5 +1,5 @@
/* Definitions for Intel 386 running Linux-based GNU systems using a.out.
- Copyright (C) 1992, 1994, 1995, 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1992, 1994, 1995, 1997, 1998, 2002 Free Software Foundation, Inc.
Contributed by H.J. Lu (hjl@nynexst.com)
This file is part of GNU CC.
@@ -31,7 +31,7 @@ Boston, MA 02111-1307, USA. */
/* Specify predefined symbols in preprocessor. */
#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dunix -Dlinux -Asystem=posix"
+#define CPP_PREDEFINES "-Dunix -D__gnu_linux__ -Dlinux -Asystem=posix"
#undef CPP_SPEC
#define CPP_SPEC "%(cpp_cpu) %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{posix:-D_POSIX_SOURCE}"
diff --git a/contrib/gcc/config/i386/linux-oldld.h b/contrib/gcc/config/i386/linux-oldld.h
index 6102aa8..a95c205 100644
--- a/contrib/gcc/config/i386/linux-oldld.h
+++ b/contrib/gcc/config/i386/linux-oldld.h
@@ -1,6 +1,6 @@
/* Definitions for Intel 386 running Linux-based GNU systems with pre-BFD
a.out linkers.
- Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1997, 1998, 2002 Free Software Foundation, Inc.
Contributed by Michael Meissner (meissner@cygnus.com)
This file is part of GNU CC.
@@ -32,7 +32,7 @@ Boston, MA 02111-1307, USA. */
/* Specify predefined symbols in preprocessor. */
#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dunix -Dlinux -Asystem=posix"
+#define CPP_PREDEFINES "-Dunix -D__gnu_linux__ -Dlinux -Asystem=posix"
#undef CPP_SPEC
#define CPP_SPEC "%(cpp_cpu) %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{posix:-D_POSIX_SOURCE}"
diff --git a/contrib/gcc/config/i386/linux.h b/contrib/gcc/config/i386/linux.h
index de634d3..b07bd03 100644
--- a/contrib/gcc/config/i386/linux.h
+++ b/contrib/gcc/config/i386/linux.h
@@ -85,7 +85,7 @@ Boston, MA 02111-1307, USA. */
#define WCHAR_TYPE_SIZE BITS_PER_WORD
#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-D__ELF__ -Dunix -Dlinux -Asystem=posix"
+#define CPP_PREDEFINES "-D__ELF__ -Dunix -D__gnu_linux__ -Dlinux -Asystem=posix"
#undef CPP_SPEC
#ifdef USE_GNULIBC_1
diff --git a/contrib/gcc/config/i386/linux64.h b/contrib/gcc/config/i386/linux64.h
index 8d70972..4926999 100644
--- a/contrib/gcc/config/i386/linux64.h
+++ b/contrib/gcc/config/i386/linux64.h
@@ -1,5 +1,5 @@
/* Definitions for AMD x86-64 running Linux-based GNU systems with ELF format.
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002 Free Software Foundation, Inc.
Contributed by Jan Hubicka <jh@suse.cz>, based on linux.h.
This file is part of GNU CC.
@@ -25,7 +25,7 @@ Boston, MA 02111-1307, USA. */
#define TARGET_VERSION fprintf (stderr, " (x86-64 Linux/ELF)");
#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-D__ELF__ -Dunix -Dlinux -Asystem(posix)"
+#define CPP_PREDEFINES "-D__ELF__ -Dunix -D__gnu_linux__ -Dlinux -Asystem(posix)"
#undef CPP_SPEC
#define CPP_SPEC "%(cpp_cpu) %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT} %{!m32:-D__LONG_MAX__=9223372036854775807L}"
@@ -39,10 +39,96 @@ Boston, MA 02111-1307, USA. */
done. */
#undef LINK_SPEC
-#define LINK_SPEC "%{!m32:-m elf_x86_64} %{m32:-m elf_i386} %{shared:-shared} \
+#define LINK_SPEC "%{!m32:-m elf_x86_64 -Y P,/usr/lib64} %{m32:-m elf_i386} \
+ %{shared:-shared} \
%{!shared: \
%{!static: \
%{rdynamic:-export-dynamic} \
- %{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}} \
- %{static:-static}}"
+ %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
+ %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \
+ %{static:-static}}"
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC \
+ "%{m32:%{!shared: \
+ %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} \
+ %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} \
+ crti.o%s %{static:crtbeginT.o%s}\
+ %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}} \
+ %{!m32:%{!shared: \
+ %{pg:/usr/lib64/gcrt1.o%s} %{!pg:%{p:/usr/lib64/gcrt1.o%s} \
+ %{!p:%{profile:/usr/lib64/gcrt1.o%s} %{!profile:/usr/lib64/crt1.o%s}}}}\
+ /usr/lib64/crti.o%s %{static:crtbeginT.o%s} \
+ %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}}"
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC "\
+ %{m32:%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s} \
+ %{!m32:%{!shared:crtend.o%s} %{shared:crtendS.o%s} /usr/lib64/crtn.o%s}"
+
+#define MULTILIB_DEFAULTS { "m64" }
+
+/* Do code reading to identify a signal frame, and set the frame
+ state data appropriately. See unwind-dw2.c for the structs. */
+
+#ifdef IN_LIBGCC2
+#include <signal.h>
+#include <sys/ucontext.h>
+#endif
+
+#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \
+ do { \
+ unsigned char *pc_ = (CONTEXT)->ra; \
+ struct sigcontext *sc_; \
+ long new_cfa_; \
+ \
+ /* movq __NR_rt_sigreturn, %rax ; syscall */ \
+ if (*(unsigned char *)(pc_+0) == 0x48 \
+ && *(unsigned long *)(pc_+1) == 0x050f0000000fc0c7) \
+ { \
+ struct ucontext *uc_ = (CONTEXT)->cfa; \
+ sc_ = (struct sigcontext *) &uc_->uc_mcontext; \
+ } \
+ else \
+ break; \
+ \
+ new_cfa_ = sc_->rsp; \
+ (FS)->cfa_how = CFA_REG_OFFSET; \
+ /* Register 7 is rsp */ \
+ (FS)->cfa_reg = 7; \
+ (FS)->cfa_offset = new_cfa_ - (long) (CONTEXT)->cfa; \
+ \
+ /* The SVR4 register numbering macros aren't usable in libgcc. */ \
+ (FS)->regs.reg[0].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[0].loc.offset = (long)&sc_->rax - new_cfa_; \
+ (FS)->regs.reg[1].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[1].loc.offset = (long)&sc_->rbx - new_cfa_; \
+ (FS)->regs.reg[2].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[2].loc.offset = (long)&sc_->rcx - new_cfa_; \
+ (FS)->regs.reg[3].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[3].loc.offset = (long)&sc_->rdx - new_cfa_; \
+ (FS)->regs.reg[4].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[4].loc.offset = (long)&sc_->rbp - new_cfa_; \
+ (FS)->regs.reg[5].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[5].loc.offset = (long)&sc_->rsi - new_cfa_; \
+ (FS)->regs.reg[6].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[6].loc.offset = (long)&sc_->rdi - new_cfa_; \
+ (FS)->regs.reg[8].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[8].loc.offset = (long)&sc_->r8 - new_cfa_; \
+ (FS)->regs.reg[9].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[9].loc.offset = (long)&sc_->r9 - new_cfa_; \
+ (FS)->regs.reg[10].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[10].loc.offset = (long)&sc_->r10 - new_cfa_; \
+ (FS)->regs.reg[11].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[11].loc.offset = (long)&sc_->r11 - new_cfa_; \
+ (FS)->regs.reg[12].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[12].loc.offset = (long)&sc_->r12 - new_cfa_; \
+ (FS)->regs.reg[13].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[13].loc.offset = (long)&sc_->r13 - new_cfa_; \
+ (FS)->regs.reg[14].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[14].loc.offset = (long)&sc_->r14 - new_cfa_; \
+ (FS)->regs.reg[15].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[15].loc.offset = (long)&sc_->r15 - new_cfa_; \
+ (FS)->retaddr_column = 16; \
+ goto SUCCESS; \
+ } while (0)
diff --git a/contrib/gcc/config/i386/netbsd-elf.h b/contrib/gcc/config/i386/netbsd-elf.h
index 7ff3c21..30267df 100644
--- a/contrib/gcc/config/i386/netbsd-elf.h
+++ b/contrib/gcc/config/i386/netbsd-elf.h
@@ -51,18 +51,6 @@ Boston, MA 02111-1307, USA. */
#undef PTRDIFF_TYPE
#define PTRDIFF_TYPE "int"
-#undef WCHAR_TYPE
-#define WCHAR_TYPE "int"
-
-#undef WCHAR_UNSIGNED
-#define WCHAR_UNSIGNED 0
-
-#undef WCHAR_TYPE_SIZE
-#define WCHAR_TYPE_SIZE 32
-
-#undef WINT_TYPE
-#define WINT_TYPE "int"
-
#undef ASM_APP_ON
#define ASM_APP_ON "#APP\n"
diff --git a/contrib/gcc/config/i386/netbsd.h b/contrib/gcc/config/i386/netbsd.h
index 659a4f0..1d95de2 100644
--- a/contrib/gcc/config/i386/netbsd.h
+++ b/contrib/gcc/config/i386/netbsd.h
@@ -22,15 +22,6 @@
#undef PTRDIFF_TYPE
#define PTRDIFF_TYPE "int"
-#undef WCHAR_TYPE
-#define WCHAR_TYPE "int"
-
-#undef WCHAR_UNSIGNED
-#define WCHAR_UNSIGNED 0
-
-#undef WCHAR_TYPE_SIZE
-#define WCHAR_TYPE_SIZE 32
-
#undef ASM_APP_ON
#define ASM_APP_ON "#APP\n"
diff --git a/contrib/gcc/config/i386/rtems.h b/contrib/gcc/config/i386/rtems.h
index 9101332..0fda632 100644
--- a/contrib/gcc/config/i386/rtems.h
+++ b/contrib/gcc/config/i386/rtems.h
@@ -1,5 +1,5 @@
/* Definitions for rtems targeting an Intel i386 using coff.
- Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 2000, 2002 Free Software Foundation, Inc.
Contributed by Joel Sherrill (joel@OARcorp.com).
This file is part of GNU CC.
@@ -19,19 +19,7 @@ along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#include "i386/i386-coff.h"
-
/* Specify predefined symbols in preprocessor. */
#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Drtems -D__rtems__ -Asystem=rtems"
-
-/* Generate calls to memcpy, memcmp and memset. */
-#ifndef TARGET_MEM_FUNCTIONS
-#define TARGET_MEM_FUNCTIONS
-#endif
-
-/* Get machine-independent configuration parameters for RTEMS. */
-#include <rtems.h>
-
-/* end of i386/rtems.h */
+#define CPP_PREDEFINES "-D__rtems__ -Asystem=rtems"
diff --git a/contrib/gcc/config/i386/rtemself.h b/contrib/gcc/config/i386/rtemself.h
index 6e31f56..7e831b9 100644
--- a/contrib/gcc/config/i386/rtemself.h
+++ b/contrib/gcc/config/i386/rtemself.h
@@ -1,8 +1,6 @@
-/* Definitions for Intel 386 running Linux-based GNU systems with ELF format.
- Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000
- Free Software Foundation, Inc.
- Contributed by Eric Youngdale.
- Modified for stabs-in-ELF by H.J. Lu.
+/* Definitions for rtems targeting a ix86 using ELF.
+ Copyright (C) 1996, 1997, 2000, 2001, 2002 Free Software Foundation, Inc.
+ Contributed by Joel Sherrill (joel@OARcorp.com).
This file is part of GNU CC.
@@ -21,65 +19,13 @@ along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#define LINUX_DEFAULT_ELF
+/* Specify predefined symbols in preprocessor. */
-#undef TARGET_VERSION
-#define TARGET_VERSION fprintf (stderr, " (i386 RTEMS with ELF)");
+#include <i386/i386elf.h>
-/* The svr4 ABI for the i386 says that records and unions are returned
- in memory. */
-#undef DEFAULT_PCC_STRUCT_RETURN
-#define DEFAULT_PCC_STRUCT_RETURN 1
-
-#undef DBX_REGISTER_NUMBER
-#define DBX_REGISTER_NUMBER(n) svr4_dbx_register_map[n]
-
-/* Output assembler code to FILE to increment profiler label # LABELNO
- for profiling a function entry. */
-
-#undef FUNCTION_PROFILER
-#define FUNCTION_PROFILER(FILE, LABELNO) \
-{ \
- if (flag_pic) \
- { \
- fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%edx\n", \
- LPREFIX, (LABELNO)); \
- fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n"); \
- } \
- else \
- { \
- fprintf (FILE, "\tmovl $%sP%d,%%edx\n", LPREFIX, (LABELNO)); \
- fprintf (FILE, "\tcall mcount\n"); \
- } \
-}
-
-#undef SIZE_TYPE
-#define SIZE_TYPE "unsigned int"
-
-#undef PTRDIFF_TYPE
-#define PTRDIFF_TYPE "int"
-
-#undef WCHAR_TYPE
-#define WCHAR_TYPE "long int"
-
-#undef WCHAR_TYPE_SIZE
-#define WCHAR_TYPE_SIZE BITS_PER_WORD
-
#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Drtems -D__rtems__ -Asystem=rtems"
-
-/* A C statement (sans semicolon) to output to the stdio stream
- FILE the assembler definition of uninitialized global DECL named
- NAME whose size is SIZE bytes and alignment is ALIGN bytes.
- Try to use asm_output_aligned_bss to implement this macro. */
-
-#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
- asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
-
-#undef STARTFILE_SPEC
-#define STARTFILE_SPEC "crt0.o%s crti.o%s crtbegin.o%s"
-
-#undef ENDFILE_SPEC
-#define ENDFILE_SPEC "crtend.o%s crtn.o%s"
+#define CPP_PREDEFINES "-D__rtems__ -Asystem=rtems \
+ -D__ELF__ -D__i386__ -D__USE_INIT_FINI__"
-/* end of i386/rtemself.h */
+#undef CPP_SPEC
+#define CPP_SPEC "%(cpp_cpu) %{msoft-float:-D_SOFT_FLOAT}"
diff --git a/contrib/gcc/config/i386/sco5.h b/contrib/gcc/config/i386/sco5.h
index 211ca36..36a04d5 100644
--- a/contrib/gcc/config/i386/sco5.h
+++ b/contrib/gcc/config/i386/sco5.h
@@ -20,9 +20,6 @@ along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#include "i386/i386.h" /* Base i386 target definitions */
-#include "i386/att.h" /* Use AT&T i386 assembler syntax */
-
#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (i386, SCO OpenServer 5 Syntax)");
diff --git a/contrib/gcc/config/i386/sol2.h b/contrib/gcc/config/i386/sol2.h
index fb9d745..5fa5fcd 100644
--- a/contrib/gcc/config/i386/sol2.h
+++ b/contrib/gcc/config/i386/sol2.h
@@ -39,6 +39,8 @@ Boston, MA 02111-1307, USA. */
#define ASM_SPEC \
"%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Wa,*:%*} -s"
+#define CMOV_SUN_AS_SYNTAX 1
+
#else /* GAS_REJECTS_MINUS_S */
/* Same as above, except for -s, unsupported by GNU as. */
@@ -73,10 +75,11 @@ Boston, MA 02111-1307, USA. */
#undef WINT_TYPE_SIZE
#define WINT_TYPE_SIZE BITS_PER_WORD
-/* Add "sun" to the list of symbols defined for SVR4. */
+#define HANDLE_PRAGMA_REDEFINE_EXTNAME 1
+
#undef CPP_PREDEFINES
#define CPP_PREDEFINES \
- "-Dunix -D__svr4__ -D__SVR4 -Dsun -Asystem=svr4"
+ "-Dunix -D__svr4__ -D__SVR4 -Dsun -D__PRAGMA_REDEFINE_EXTNAME -Asystem=svr4"
/* Solaris 2/Intel as chokes on #line directives. */
#undef CPP_SPEC
@@ -154,3 +157,6 @@ Boston, MA 02111-1307, USA. */
#undef LOCAL_LABEL_PREFIX
#define LOCAL_LABEL_PREFIX "."
+
+/* The Solaris assembler does not support .quad. Do not use it. */
+#undef ASM_QUAD
diff --git a/contrib/gcc/config/i386/t-interix b/contrib/gcc/config/i386/t-interix
index 3f78f78..adcf593 100644
--- a/contrib/gcc/config/i386/t-interix
+++ b/contrib/gcc/config/i386/t-interix
@@ -4,5 +4,3 @@ LIB1ASMFUNCS = _chkstk
interix.o: $(srcdir)/config/i386/interix.c
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/config/i386/interix.c
-# System headers will track gcc's needs.
-USER_H=
diff --git a/contrib/gcc/config/i386/t-linux64 b/contrib/gcc/config/i386/t-linux64
new file mode 100644
index 0000000..46a7caa
--- /dev/null
+++ b/contrib/gcc/config/i386/t-linux64
@@ -0,0 +1,15 @@
+# On x86-64 we do not need any exports for glibc for 64-bit libgcc_s,
+# override the settings
+# from t-slibgcc-elf-ver and t-linux
+SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \
+ $(srcdir)/config/i386/libgcc-x86_64-glibc.ver
+
+MULTILIB_OPTIONS = m64/m32
+MULTILIB_DIRNAMES = 64 32
+
+LIBGCC = stmp-multilib
+INSTALL_LIBGCC = install-multilib
+
+EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
+
+SHLIB_SLIBDIR_SUFFIXES = 64:64 32:
diff --git a/contrib/gcc/config/i386/t-rtems-i386 b/contrib/gcc/config/i386/t-rtems-i386
index d301ed9..b57f4fd 100644
--- a/contrib/gcc/config/i386/t-rtems-i386
+++ b/contrib/gcc/config/i386/t-rtems-i386
@@ -12,3 +12,43 @@ crtn.o: $(srcdir)/config/i386/sol2-cn.asm $(GCC_PASSES)
sed -e '/^!/d' <$(srcdir)/config/i386/sol2-cn.asm >crtn.s
$(GCC_FOR_TARGET) -c -o crtn.o crtn.s
+# We want fine grained libraries, so use the new code to build the
+# floating point emulation libraries.
+FPBIT = fp-bit.c
+DPBIT = dp-bit.c
+
+LIB2FUNCS_EXTRA = xp-bit.c
+
+dp-bit.c: $(srcdir)/config/fp-bit.c
+ echo '#ifdef __LITTLE_ENDIAN__' > dp-bit.c
+ echo '#define FLOAT_BIT_ORDER_MISMATCH' >>dp-bit.c
+ echo '#endif' >> dp-bit.c
+ cat $(srcdir)/config/fp-bit.c >> dp-bit.c
+
+fp-bit.c: $(srcdir)/config/fp-bit.c
+ echo '#define FLOAT' > fp-bit.c
+ echo '#ifdef __LITTLE_ENDIAN__' >> fp-bit.c
+ echo '#define FLOAT_BIT_ORDER_MISMATCH' >>fp-bit.c
+ echo '#endif' >> fp-bit.c
+ cat $(srcdir)/config/fp-bit.c >> fp-bit.c
+
+xp-bit.c: $(srcdir)/config/fp-bit.c
+ echo '#define EXTENDED_FLOAT_STUBS' > xp-bit.c
+ cat $(srcdir)/config/fp-bit.c >> xp-bit.c
+
+MULTILIB_OPTIONS = mcpu=i486/mcpu=pentium/mcpu=pentiumpro/mcpu=k6/mcpu=athlon \
+msoft-float mno-fp-ret-in-387
+MULTILIB_DIRNAMES= m486 mpentium mpentiumpro k6 athlon soft-float nofp
+MULTILIB_MATCHES = msoft-float=mno-m80387
+MULTILIB_EXCEPTIONS = \
+mno-fp-ret-in-387 \
+mcpu=i486/*mno-fp-ret-in-387* \
+mcpu=pentium/*msoft-float* mcpu=pentium/*mno-fp-ret-in-387* \
+mcpu=pentiumpro/*msoft-float* mcpu=pentiumpro/*mno-fp-ret-in-387* \
+mcpu=k6/*msoft-float* mcpu=k6/*mno-fp-ret-in-387* \
+mcpu=athlon/*msoft-float* mcpu=athlon/*mno-fp-ret-in-387*
+
+EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o
+
+LIBGCC = stmp-multilib
+INSTALL_LIBGCC = install-multilib
diff --git a/contrib/gcc/config/i386/x86-64.h b/contrib/gcc/config/i386/x86-64.h
index c6a8376..56e4684 100644
--- a/contrib/gcc/config/i386/x86-64.h
+++ b/contrib/gcc/config/i386/x86-64.h
@@ -73,7 +73,6 @@ Boston, MA 02111-1307, USA. */
This is used to align code labels according to Intel recommendations. */
-#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \
do { \
if ((LOG) != 0) { \
@@ -81,7 +80,6 @@ Boston, MA 02111-1307, USA. */
else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \
} \
} while (0)
-#endif
/* i386 System V Release 4 uses DWARF debugging info.
diff --git a/contrib/gcc/config/ia64/aix.h b/contrib/gcc/config/ia64/aix.h
index 1e57c2b..fee0732 100644
--- a/contrib/gcc/config/ia64/aix.h
+++ b/contrib/gcc/config/ia64/aix.h
@@ -86,9 +86,9 @@ Boston, MA 02111-1307, USA. */
#undef CPP_PREDEFINES
#define CPP_PREDEFINES "\
--D__ia64 -D__ia64__ -D_AIX -D_AIX64 -D_LONGLONG -Dunix \
--D__LP64__ -D__ELF__ -Asystem=unix -Asystem=aix -Acpu=ia64 -Amachine=ia64 \
--D__64BIT__ -D_LONG_LONG -D_IA64 -D__int128=__size128_t"
+ -D_AIX -D_AIX64 -D_LONGLONG -Dunix \
+ -Asystem=unix -Asystem=aix \
+ -D__64BIT__ -D_LONG_LONG -D_IA64 -D__int128=__size128_t"
/* The GNU C++ standard library requires that these macros be defined. */
#undef CPLUSPLUS_CPP_SPEC
@@ -100,10 +100,6 @@ Boston, MA 02111-1307, USA. */
-D__LONG_MAX__=9223372036854775807L \
%{cpp_cpu}"
-/* ia64-specific options for gas */
-#undef ASM_SPEC
-#define ASM_SPEC "-x %{mconstant-gp} %{mauto-pic}"
-
/* Define this for shared library support. */
#undef LINK_SPEC
@@ -115,14 +111,8 @@ Boston, MA 02111-1307, USA. */
%{!dynamic-linker:-dynamic-linker /usr/lib/ia64l64/libc.so.1}} \
%{static:-static}}"
-#define DONT_USE_BUILTIN_SETJMP
#define JMP_BUF_SIZE 85
-/* Output any profiling code before the prologue. */
-
-#undef PROFILE_BEFORE_PROLOGUE
-#define PROFILE_BEFORE_PROLOGUE 1
-
/* A C statement or compound statement to output to FILE some assembler code to
call the profiling subroutine `mcount'.
diff --git a/contrib/gcc/config/ia64/elf.h b/contrib/gcc/config/ia64/elf.h
index af8c7a6..af6d917 100644
--- a/contrib/gcc/config/ia64/elf.h
+++ b/contrib/gcc/config/ia64/elf.h
@@ -17,10 +17,12 @@
#if ((TARGET_CPU_DEFAULT | TARGET_DEFAULT) & MASK_GNU_AS) != 0
/* GNU AS. */
-#define ASM_SPEC \
- "%{mno-gnu-as:-N so} %{!mno-gnu-as:-x} %{mconstant-gp} %{mauto-pic}"
+#undef ASM_EXTRA_SPEC
+#define ASM_EXTRA_SPEC \
+ "%{mno-gnu-as:-N so} %{!mno-gnu-as:-x}"
#else
/* Intel ias. */
+#undef ASM_SPEC
#define ASM_SPEC \
"%{!mgnu-as:-N so} %{mgnu-as:-x} %{mconstant-gp:-M const_gp}\
%{mauto-pic:-M no_plabel}"
diff --git a/contrib/gcc/config/ia64/freebsd.h b/contrib/gcc/config/ia64/freebsd.h
index 6140128..57bb391 100644
--- a/contrib/gcc/config/ia64/freebsd.h
+++ b/contrib/gcc/config/ia64/freebsd.h
@@ -19,7 +19,6 @@ along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-#undef LINK_SPEC
#define LINK_SPEC \
"%{p:%e`-p' not supported; use `-pg' and gprof(1)} \
%{Wl,*:%*} \
@@ -32,9 +31,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
%{!dynamic-linker:-dynamic-linker /usr/libexec/ld-elf.so.1}} \
%{static:-Bstatic}}"
-#undef ASM_SPEC
-#define ASM_SPEC "-x %{mconstant-gp} %{mauto-pic}"
-
/************************[ Target stuff ]***********************************/
@@ -57,10 +53,4 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define TARGET_ELF 1
-#define DONT_USE_BUILTIN_SETJMP
#define JMP_BUF_SIZE 76
-
-/* Output any profiling code before the prologue. */
-
-#undef PROFILE_BEFORE_PROLOGUE
-#define PROFILE_BEFORE_PROLOGUE 1
diff --git a/contrib/gcc/config/ia64/hpux.h b/contrib/gcc/config/ia64/hpux.h
index 89b2902..d46acf2 100644
--- a/contrib/gcc/config/ia64/hpux.h
+++ b/contrib/gcc/config/ia64/hpux.h
@@ -27,9 +27,9 @@ Boston, MA 02111-1307, USA. */
#undef CPP_PREDEFINES
#define CPP_PREDEFINES "\
- -D__IA64__ -D__ia64 -D__ia64__ -D__hpux -D__hpux__ -Dhpux -Dunix \
- -D__BIG_ENDIAN__ -D_LONGLONG -D__ELF__ \
- -Asystem=hpux -Asystem=posix -Asystem=unix -Acpu=ia64 -Amachine=ia64 \
+ -D__IA64__ -D__hpux -D__hpux__ -Dhpux -Dunix \
+ -D__BIG_ENDIAN__ -D_LONGLONG \
+ -Asystem=hpux -Asystem=posix -Asystem=unix \
-D_UINT128_T"
/* -D__fpreg=long double is needed to compensate for the lack of __fpreg
@@ -40,15 +40,14 @@ Boston, MA 02111-1307, USA. */
#undef CPP_SPEC
#define CPP_SPEC "\
%{mcpu=itanium:-D__itanium__} \
- %{mlp64:-D__LP64__ -D__LONG_MAX__=9223372036854775807L} \
+ %{mlp64:-D__LP64__ -D_LP64 -D__LONG_MAX__=9223372036854775807L} \
%{!ansi:%{!std=c*:%{!std=i*: -D_HPUX_SOURCE -D__STDC_EXT__}}} \
-D__fpreg=long\\ double \
-D__float80=long\\ double \
-D__float128=long\\ double"
-#undef ASM_SPEC
-#define ASM_SPEC "-x %{mconstant-gp} %{mauto-pic} \
- %{milp32:-milp32} %{mlp64:-mlp64}"
+#undef ASM_EXTRA_SPEC
+#define ASM_EXTRA_SPEC "%{milp32:-milp32} %{mlp64:-mlp64}"
#undef ENDFILE_SPEC
@@ -84,7 +83,6 @@ Boston, MA 02111-1307, USA. */
#define POINTERS_EXTEND_UNSIGNED -1
-#define DONT_USE_BUILTIN_SETJMP
#define JMP_BUF_SIZE (8 * 76)
#undef CONST_SECTION_ASM_OP
diff --git a/contrib/gcc/config/ia64/ia64-protos.h b/contrib/gcc/config/ia64/ia64-protos.h
index 43538cc..659adc5 100644
--- a/contrib/gcc/config/ia64/ia64-protos.h
+++ b/contrib/gcc/config/ia64/ia64-protos.h
@@ -113,6 +113,9 @@ extern int ia64_function_arg_partial_nregs PARAMS((CUMULATIVE_ARGS *,
extern void ia64_function_arg_advance PARAMS((CUMULATIVE_ARGS *,
enum machine_mode,
tree, int));
+extern int ia64_function_arg_pass_by_reference PARAMS((CUMULATIVE_ARGS *,
+ enum machine_mode,
+ tree, int));
extern int ia64_return_in_memory PARAMS((tree));
extern void ia64_asm_output_external PARAMS((FILE *, tree, const char *));
@@ -122,6 +125,7 @@ extern void ia64_encode_section_info PARAMS((tree));
extern int ia64_register_move_cost PARAMS((enum machine_mode, enum reg_class,
enum reg_class));
extern int ia64_epilogue_uses PARAMS((int));
+extern int ia64_eh_uses PARAMS((int));
extern void emit_safe_across_calls PARAMS((FILE *));
extern void ia64_init_builtins PARAMS((void));
extern void ia64_override_options PARAMS((void));
diff --git a/contrib/gcc/config/ia64/ia64.c b/contrib/gcc/config/ia64/ia64.c
index 7ca060b..91dd396 100644
--- a/contrib/gcc/config/ia64/ia64.c
+++ b/contrib/gcc/config/ia64/ia64.c
@@ -24,7 +24,6 @@ Boston, MA 02111-1307, USA. */
#include "system.h"
#include "rtl.h"
#include "tree.h"
-#include "tm_p.h"
#include "regs.h"
#include "hard-reg-set.h"
#include "real.h"
@@ -46,6 +45,7 @@ Boston, MA 02111-1307, USA. */
#include "timevar.h"
#include "target.h"
#include "target-def.h"
+#include "tm_p.h"
/* This is used for communication between ASM_OUTPUT_LABEL and
ASM_OUTPUT_LABELREF. */
@@ -138,7 +138,6 @@ static rtx ia64_expand_compare_and_swap PARAMS ((enum machine_mode, int,
static rtx ia64_expand_lock_test_and_set PARAMS ((enum machine_mode,
tree, rtx));
static rtx ia64_expand_lock_release PARAMS ((enum machine_mode, tree, rtx));
-const struct attribute_spec ia64_attribute_table[];
static bool ia64_assemble_integer PARAMS ((rtx, unsigned int, int));
static void ia64_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
static void ia64_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
@@ -156,6 +155,14 @@ static int ia64_variable_issue PARAMS ((FILE *, int, rtx, int));
static rtx ia64_cycle_display PARAMS ((int, rtx));
+/* Table of valid machine attributes. */
+static const struct attribute_spec ia64_attribute_table[] =
+{
+ /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
+ { "syscall_linkage", 0, 0, false, true, true, NULL },
+ { NULL, 0, 0, false, false, false, NULL }
+};
+
/* Initialize the GCC target structure. */
#undef TARGET_ATTRIBUTE_TABLE
#define TARGET_ATTRIBUTE_TABLE ia64_attribute_table
@@ -1137,7 +1144,8 @@ ia64_expand_call (retval, addr, nextarg, sibcall_p)
rtx nextarg;
int sibcall_p;
{
- rtx insn, b0, pfs, gp_save, narg_rtx;
+ rtx insn, b0, pfs, gp_save, narg_rtx, dest;
+ bool indirect_p;
int narg;
addr = XEXP (addr, 0);
@@ -1164,61 +1172,36 @@ ia64_expand_call (retval, addr, nextarg, sibcall_p)
return;
}
- if (sibcall_p)
+ indirect_p = ! symbolic_operand (addr, VOIDmode);
+
+ if (sibcall_p || (TARGET_CONST_GP && !indirect_p))
gp_save = NULL_RTX;
else
gp_save = ia64_gp_save_reg (setjmp_operand (addr, VOIDmode));
+ if (gp_save)
+ emit_move_insn (gp_save, pic_offset_table_rtx);
+
/* If this is an indirect call, then we have the address of a descriptor. */
- if (! symbolic_operand (addr, VOIDmode))
+ if (indirect_p)
{
- rtx dest;
-
- if (! sibcall_p)
- emit_move_insn (gp_save, pic_offset_table_rtx);
-
dest = force_reg (DImode, gen_rtx_MEM (DImode, addr));
emit_move_insn (pic_offset_table_rtx,
gen_rtx_MEM (DImode, plus_constant (addr, 8)));
-
- if (sibcall_p)
- insn = gen_sibcall_pic (dest, narg_rtx, b0, pfs);
- else if (! retval)
- insn = gen_call_pic (dest, narg_rtx, b0);
- else
- insn = gen_call_value_pic (retval, dest, narg_rtx, b0);
- emit_call_insn (insn);
-
- if (! sibcall_p)
- emit_move_insn (pic_offset_table_rtx, gp_save);
- }
- else if (TARGET_CONST_GP)
- {
- if (sibcall_p)
- insn = gen_sibcall_nopic (addr, narg_rtx, b0, pfs);
- else if (! retval)
- insn = gen_call_nopic (addr, narg_rtx, b0);
- else
- insn = gen_call_value_nopic (retval, addr, narg_rtx, b0);
- emit_call_insn (insn);
}
else
- {
- if (sibcall_p)
- emit_call_insn (gen_sibcall_pic (addr, narg_rtx, b0, pfs));
- else
- {
- emit_move_insn (gp_save, pic_offset_table_rtx);
+ dest = addr;
- if (! retval)
- insn = gen_call_pic (addr, narg_rtx, b0);
- else
- insn = gen_call_value_pic (retval, addr, narg_rtx, b0);
- emit_call_insn (insn);
+ if (sibcall_p)
+ insn = gen_sibcall_pic (dest, narg_rtx, b0, pfs);
+ else if (! retval)
+ insn = gen_call_pic (dest, narg_rtx, b0);
+ else
+ insn = gen_call_value_pic (retval, dest, narg_rtx, b0);
+ emit_call_insn (insn);
- emit_move_insn (pic_offset_table_rtx, gp_save);
- }
- }
+ if (gp_save)
+ emit_move_insn (pic_offset_table_rtx, gp_save);
}
/* Begin the assembly file. */
@@ -2040,7 +2023,7 @@ ia64_expand_prologue ()
/* We don't need an alloc instruction if we've used no outputs or locals. */
if (current_frame_info.n_local_regs == 0
&& current_frame_info.n_output_regs == 0
- && current_frame_info.n_input_regs <= current_function_args_info.words)
+ && current_frame_info.n_input_regs <= current_function_args_info.int_regs)
{
/* If there is no alloc, but there are input registers used, then we
need a .regstk directive. */
@@ -2873,7 +2856,7 @@ hfa_element_mode (type, nested)
return VOIDmode;
case ARRAY_TYPE:
- return TYPE_MODE (TREE_TYPE (type));
+ return hfa_element_mode (TREE_TYPE (type), 1);
case RECORD_TYPE:
case UNION_TYPE:
@@ -3181,14 +3164,14 @@ ia64_function_arg_advance (cum, mode, type, named)
FR registers, then FP values must also go in general registers. This can
happen when we have a SFmode HFA. */
else if (! FLOAT_MODE_P (mode) || cum->fp_regs == MAX_ARGUMENT_SLOTS)
- return;
+ cum->int_regs = cum->words;
/* If there is a prototype, then FP values go in a FR register when
named, and in a GR registeer when unnamed. */
else if (cum->prototype)
{
if (! named)
- return;
+ cum->int_regs = cum->words;
else
/* ??? Complex types should not reach here. */
cum->fp_regs += (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT ? 2 : 1);
@@ -3196,10 +3179,24 @@ ia64_function_arg_advance (cum, mode, type, named)
/* If there is no prototype, then FP values go in both FR and GR
registers. */
else
- /* ??? Complex types should not reach here. */
- cum->fp_regs += (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT ? 2 : 1);
+ {
+ /* ??? Complex types should not reach here. */
+ cum->fp_regs += (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT ? 2 : 1);
+ cum->int_regs = cum->words;
+ }
+}
- return;
+/* Variable sized types are passed by reference. */
+/* ??? At present this is a GCC extension to the IA-64 ABI. */
+
+int
+ia64_function_arg_pass_by_reference (cum, mode, type, named)
+ CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+ tree type;
+ int named ATTRIBUTE_UNUSED;
+{
+ return type && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST;
}
/* Implement va_start. */
@@ -3232,6 +3229,13 @@ ia64_va_arg (valist, type)
{
tree t;
+ /* Variable sized types are passed by reference. */
+ if (TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
+ {
+ rtx addr = std_expand_builtin_va_arg (valist, build_pointer_type (type));
+ return gen_rtx_MEM (ptr_mode, force_reg (Pmode, addr));
+ }
+
/* Arguments with alignment larger than 8 bytes start at the next even
boundary. */
if (TYPE_ALIGN (type) > 8 * BITS_PER_UNIT)
@@ -4765,6 +4769,7 @@ group_barrier_needed_p (insn)
/* We play dependency tricks with the epilogue in order
to get proper schedules. Undo this for dv analysis. */
case CODE_FOR_epilogue_deallocate_stack:
+ case CODE_FOR_prologue_allocate_stack:
pat = XVECEXP (pat, 0, 0);
break;
@@ -5236,21 +5241,22 @@ ia64_single_set (insn)
x = COND_EXEC_CODE (x);
if (GET_CODE (x) == SET)
return x;
- ret = single_set_2 (insn, x);
- if (ret == NULL && GET_CODE (x) == PARALLEL)
- {
- /* Special case here prologue_allocate_stack and
- epilogue_deallocate_stack. Although it is not a classical
- single set, the second set is there just to protect it
- from moving past FP-relative stack accesses. */
- if (XVECLEN (x, 0) == 2
- && GET_CODE (XVECEXP (x, 0, 0)) == SET
- && GET_CODE (XVECEXP (x, 0, 1)) == SET
- && GET_CODE (SET_DEST (XVECEXP (x, 0, 1))) == REG
- && SET_DEST (XVECEXP (x, 0, 1)) == SET_SRC (XVECEXP (x, 0, 1))
- && ia64_safe_itanium_class (insn) == ITANIUM_CLASS_IALU)
- ret = XVECEXP (x, 0, 0);
+
+ /* Special case here prologue_allocate_stack and epilogue_deallocate_stack.
+ Although they are not classical single set, the second set is there just
+ to protect it from moving past FP-relative stack accesses. */
+ switch (recog_memoized (insn))
+ {
+ case CODE_FOR_prologue_allocate_stack:
+ case CODE_FOR_epilogue_deallocate_stack:
+ ret = XVECEXP (x, 0, 0);
+ break;
+
+ default:
+ ret = single_set_2 (insn, x);
+ break;
}
+
return ret;
}
@@ -5348,6 +5354,7 @@ ia64_adjust_cost (insn, link, dep_insn, cost)
if (reg_overlap_mentioned_p (SET_DEST (set), addr))
return cost + 1;
}
+
if ((dep_class == ITANIUM_CLASS_IALU
|| dep_class == ITANIUM_CLASS_ILOG
|| dep_class == ITANIUM_CLASS_LD)
@@ -5355,25 +5362,28 @@ ia64_adjust_cost (insn, link, dep_insn, cost)
|| insn_class == ITANIUM_CLASS_MMSHF
|| insn_class == ITANIUM_CLASS_MMSHFI))
return 3;
+
if (dep_class == ITANIUM_CLASS_FMAC
&& (insn_class == ITANIUM_CLASS_FMISC
|| insn_class == ITANIUM_CLASS_FCVTFX
|| insn_class == ITANIUM_CLASS_XMPY))
return 7;
+
if ((dep_class == ITANIUM_CLASS_FMAC
|| dep_class == ITANIUM_CLASS_FMISC
|| dep_class == ITANIUM_CLASS_FCVTFX
|| dep_class == ITANIUM_CLASS_XMPY)
&& insn_class == ITANIUM_CLASS_STF)
return 8;
+
+ /* Intel docs say only LD, ST, IALU, ILOG, ISHF consumers have latency 4,
+ but HP engineers say any non-MM operation. */
if ((dep_class == ITANIUM_CLASS_MMMUL
|| dep_class == ITANIUM_CLASS_MMSHF
|| dep_class == ITANIUM_CLASS_MMSHFI)
- && (insn_class == ITANIUM_CLASS_LD
- || insn_class == ITANIUM_CLASS_ST
- || insn_class == ITANIUM_CLASS_IALU
- || insn_class == ITANIUM_CLASS_ILOG
- || insn_class == ITANIUM_CLASS_ISHF))
+ && insn_class != ITANIUM_CLASS_MMMUL
+ && insn_class != ITANIUM_CLASS_MMSHF
+ && insn_class != ITANIUM_CLASS_MMSHFI)
return 4;
return cost;
@@ -5475,32 +5485,6 @@ ia64_emit_insn_before (insn, before)
emit_insn_before (insn, before);
}
-#if 0
-/* Generate a nop insn of the given type. Note we never generate L type
- nops. */
-
-static rtx
-gen_nop_type (t)
- enum attr_type t;
-{
- switch (t)
- {
- case TYPE_M:
- return gen_nop_m ();
- case TYPE_I:
- return gen_nop_i ();
- case TYPE_B:
- return gen_nop_b ();
- case TYPE_F:
- return gen_nop_f ();
- case TYPE_X:
- return gen_nop_x ();
- default:
- abort ();
- }
-}
-#endif
-
/* When rotating a bundle out of the issue window, insert a bundle selector
insn in front of it. DUMP is the scheduling dump file or NULL. START
is either 0 or 3, depending on whether we want to emit a bundle selector
@@ -5565,8 +5549,8 @@ cycle_end_fill_slots (dump)
if (slot > sched_data.split)
abort ();
if (dump)
- fprintf (dump, "// Packet needs %s, have %s\n", type_names[packet->t[slot]],
- type_names[t]);
+ fprintf (dump, "// Packet needs %s, have %s\n",
+ type_names[packet->t[slot]], type_names[t]);
sched_data.types[slot] = packet->t[slot];
sched_data.insns[slot] = 0;
sched_data.stopbit[slot] = 0;
@@ -5578,15 +5562,22 @@ cycle_end_fill_slots (dump)
slot++;
}
+
/* Do _not_ use T here. If T == TYPE_A, then we'd risk changing the
actual slot type later. */
sched_data.types[slot] = packet->t[slot];
sched_data.insns[slot] = tmp_insns[i];
sched_data.stopbit[slot] = 0;
slot++;
+
/* TYPE_L instructions always fill up two slots. */
if (t == TYPE_L)
- slot++;
+ {
+ sched_data.types[slot] = packet->t[slot];
+ sched_data.insns[slot] = 0;
+ sched_data.stopbit[slot] = 0;
+ slot++;
+ }
}
/* This isn't right - there's no need to pad out until the forced split;
@@ -5629,6 +5620,8 @@ rotate_one_bundle (dump)
memmove (sched_data.insns,
sched_data.insns + 3,
sched_data.cur * sizeof *sched_data.insns);
+ sched_data.packet
+ = &packets[(sched_data.packet->t2 - bundle) * NR_BUNDLES];
}
else
{
@@ -6060,6 +6053,7 @@ static void
maybe_rotate (dump)
FILE *dump;
{
+ cycle_end_fill_slots (dump);
if (sched_data.cur == 6)
rotate_two_bundles (dump);
else if (sched_data.cur >= 3)
@@ -6074,12 +6068,6 @@ static int prev_cycle;
value of sched_data.first_slot. */
static int prev_first;
-/* The last insn that has been scheduled. At the start of a new cycle
- we know that we can emit new insns after it; the main scheduling code
- has already emitted a cycle_display insn after it and is using that
- as its current last insn. */
-static rtx last_issued;
-
/* Emit NOPs to fill the delay between PREV_CYCLE and CLOCK_VAR. Used to
pad out the delay between MM (shifts, etc.) and integer operations. */
@@ -6090,12 +6078,13 @@ nop_cycles_until (clock_var, dump)
{
int prev_clock = prev_cycle;
int cycles_left = clock_var - prev_clock;
+ bool did_stop = false;
/* Finish the previous cycle; pad it out with NOPs. */
if (sched_data.cur == 3)
{
- rtx t = gen_insn_group_barrier (GEN_INT (3));
- last_issued = emit_insn_after (t, last_issued);
+ sched_emit_insn (gen_insn_group_barrier (GEN_INT (3)));
+ did_stop = true;
maybe_rotate (dump);
}
else if (sched_data.cur > 0)
@@ -6114,12 +6103,9 @@ nop_cycles_until (clock_var, dump)
int i;
for (i = sched_data.cur; i < split; i++)
{
- rtx t;
-
- t = gen_nop_type (sched_data.packet->t[i]);
- last_issued = emit_insn_after (t, last_issued);
- sched_data.types[i] = sched_data.packet->t[sched_data.cur];
- sched_data.insns[i] = last_issued;
+ rtx t = sched_emit_insn (gen_nop_type (sched_data.packet->t[i]));
+ sched_data.types[i] = sched_data.packet->t[i];
+ sched_data.insns[i] = t;
sched_data.stopbit[i] = 0;
}
sched_data.cur = split;
@@ -6131,12 +6117,9 @@ nop_cycles_until (clock_var, dump)
int i;
for (i = sched_data.cur; i < 6; i++)
{
- rtx t;
-
- t = gen_nop_type (sched_data.packet->t[i]);
- last_issued = emit_insn_after (t, last_issued);
- sched_data.types[i] = sched_data.packet->t[sched_data.cur];
- sched_data.insns[i] = last_issued;
+ rtx t = sched_emit_insn (gen_nop_type (sched_data.packet->t[i]));
+ sched_data.types[i] = sched_data.packet->t[i];
+ sched_data.insns[i] = t;
sched_data.stopbit[i] = 0;
}
sched_data.cur = 6;
@@ -6146,8 +6129,8 @@ nop_cycles_until (clock_var, dump)
if (need_stop || sched_data.cur == 6)
{
- rtx t = gen_insn_group_barrier (GEN_INT (3));
- last_issued = emit_insn_after (t, last_issued);
+ sched_emit_insn (gen_insn_group_barrier (GEN_INT (3)));
+ did_stop = true;
}
maybe_rotate (dump);
}
@@ -6155,24 +6138,22 @@ nop_cycles_until (clock_var, dump)
cycles_left--;
while (cycles_left > 0)
{
- rtx t = gen_bundle_selector (GEN_INT (0));
- last_issued = emit_insn_after (t, last_issued);
- t = gen_nop_type (TYPE_M);
- last_issued = emit_insn_after (t, last_issued);
- t = gen_nop_type (TYPE_I);
- last_issued = emit_insn_after (t, last_issued);
+ sched_emit_insn (gen_bundle_selector (GEN_INT (0)));
+ sched_emit_insn (gen_nop_type (TYPE_M));
+ sched_emit_insn (gen_nop_type (TYPE_I));
if (cycles_left > 1)
{
- t = gen_insn_group_barrier (GEN_INT (2));
- last_issued = emit_insn_after (t, last_issued);
+ sched_emit_insn (gen_insn_group_barrier (GEN_INT (2)));
cycles_left--;
}
- t = gen_nop_type (TYPE_I);
- last_issued = emit_insn_after (t, last_issued);
- t = gen_insn_group_barrier (GEN_INT (3));
- last_issued = emit_insn_after (t, last_issued);
+ sched_emit_insn (gen_nop_type (TYPE_I));
+ sched_emit_insn (gen_insn_group_barrier (GEN_INT (3)));
+ did_stop = true;
cycles_left--;
}
+
+ if (did_stop)
+ init_insn_group_barriers ();
}
/* We are about to being issuing insns for this clock cycle.
@@ -6198,31 +6179,34 @@ ia64_internal_sched_reorder (dump, sched_verbose, ready, pn_ready,
dump_current_packet (dump);
}
+ /* Work around the pipeline flush that will occurr if the results of
+ an MM instruction are accessed before the result is ready. Intel
+ documentation says this only happens with IALU, ISHF, ILOG, LD,
+ and ST consumers, but experimental evidence shows that *any* non-MM
+ type instruction will incurr the flush. */
if (reorder_type == 0 && clock_var > 0 && ia64_final_schedule)
{
for (insnp = ready; insnp < e_ready; insnp++)
{
- rtx insn = *insnp;
+ rtx insn = *insnp, link;
enum attr_itanium_class t = ia64_safe_itanium_class (insn);
- if (t == ITANIUM_CLASS_IALU || t == ITANIUM_CLASS_ISHF
- || t == ITANIUM_CLASS_ILOG
- || t == ITANIUM_CLASS_LD || t == ITANIUM_CLASS_ST)
- {
- rtx link;
- for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
- if (REG_NOTE_KIND (link) != REG_DEP_OUTPUT
- && REG_NOTE_KIND (link) != REG_DEP_ANTI)
+
+ if (t == ITANIUM_CLASS_MMMUL
+ || t == ITANIUM_CLASS_MMSHF
+ || t == ITANIUM_CLASS_MMSHFI)
+ continue;
+
+ for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
+ if (REG_NOTE_KIND (link) == 0)
+ {
+ rtx other = XEXP (link, 0);
+ enum attr_itanium_class t0 = ia64_safe_itanium_class (other);
+ if (t0 == ITANIUM_CLASS_MMSHF || t0 == ITANIUM_CLASS_MMMUL)
{
- rtx other = XEXP (link, 0);
- enum attr_itanium_class t0 = ia64_safe_itanium_class (other);
- if (t0 == ITANIUM_CLASS_MMSHF
- || t0 == ITANIUM_CLASS_MMMUL)
- {
- nop_cycles_until (clock_var, sched_verbose ? dump : NULL);
- goto out;
- }
+ nop_cycles_until (clock_var, sched_verbose ? dump : NULL);
+ goto out;
}
- }
+ }
}
}
out:
@@ -6486,8 +6470,6 @@ ia64_variable_issue (dump, sched_verbose, insn, can_issue_more)
{
enum attr_type t = ia64_safe_type (insn);
- last_issued = insn;
-
if (sched_data.last_was_stop)
{
int t = sched_data.first_slot;
@@ -6833,13 +6815,33 @@ ia64_epilogue_uses (regno)
}
}
-/* Table of valid machine attributes. */
-const struct attribute_spec ia64_attribute_table[] =
+/* Return true if REGNO is used by the frame unwinder. */
+
+int
+ia64_eh_uses (regno)
+ int regno;
{
- /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
- { "syscall_linkage", 0, 0, false, true, true, NULL },
- { NULL, 0, 0, false, false, false, NULL }
-};
+ if (! reload_completed)
+ return 0;
+
+ if (current_frame_info.reg_save_b0
+ && regno == current_frame_info.reg_save_b0)
+ return 1;
+ if (current_frame_info.reg_save_pr
+ && regno == current_frame_info.reg_save_pr)
+ return 1;
+ if (current_frame_info.reg_save_ar_pfs
+ && regno == current_frame_info.reg_save_ar_pfs)
+ return 1;
+ if (current_frame_info.reg_save_ar_unat
+ && regno == current_frame_info.reg_save_ar_unat)
+ return 1;
+ if (current_frame_info.reg_save_ar_lc
+ && regno == current_frame_info.reg_save_ar_lc)
+ return 1;
+
+ return 0;
+}
/* For ia64, SYMBOL_REF_FLAG set means that it is a function.
diff --git a/contrib/gcc/config/ia64/ia64.h b/contrib/gcc/config/ia64/ia64.h
index 1900717..f69983b 100644
--- a/contrib/gcc/config/ia64/ia64.h
+++ b/contrib/gcc/config/ia64/ia64.h
@@ -31,12 +31,19 @@ Boston, MA 02111-1307, USA. */
/* Run-time target specifications */
-#define CPP_CPU_SPEC "\
- -Acpu=ia64 -Amachine=ia64 \
- %{!ansi:%{!std=c*:%{!std=i*:-Dia64}}} -D__ia64 -D__ia64__"
+#define EXTRA_SPECS \
+ { "cpp_cpu", CPP_CPU_SPEC }, \
+ { "asm_extra", ASM_EXTRA_SPEC },
+
+#define CPP_CPU_SPEC " \
+ -Acpu=ia64 -Amachine=ia64 -D__ia64 -D__ia64__ %{!milp32:-D_LP64 -D__LP64__} \
+ -D__ELF__"
#define CC1_SPEC "%(cc1_cpu) "
+#define ASM_EXTRA_SPEC ""
+
+
/* This declaration should be present. */
extern int target_flags;
@@ -203,6 +210,7 @@ extern const char *ia64_fixed_range_string;
defines in other tm.h files. */
#define CPP_SPEC \
"%{mcpu=itanium:-D__itanium__} %{mbig-endian:-D__BIG_ENDIAN__} \
+ %(cpp_cpu) \
-D__LONG_MAX__=9223372036854775807L"
/* This is always "long" so it doesn't "change" in ILP32 vs. LP64. */
@@ -340,7 +348,7 @@ while (0)
/* By default, the C++ compiler will use function addresses in the
vtable entries. Setting this non-zero tells the compiler to use
function descriptors instead. The value of this macro says how
- many words wide the descriptor is (normally 2). It is assumed
+ many words wide the descriptor is (normally 2). It is assumed
that the address of a function descriptor may be treated as a
pointer to a function. */
#define TARGET_VTABLE_USES_DESCRIPTORS 2
@@ -397,7 +405,7 @@ while (0)
/* Register Basics */
-/* Number of hardware registers known to the compiler.
+/* Number of hardware registers known to the compiler.
We have 128 general registers, 128 floating point registers,
64 predicate registers, 8 branch registers, one frame pointer,
and several "application" registers. */
@@ -459,7 +467,7 @@ while (0)
f0: constant 0.0
f1: constant 1.0
p0: constant true
- fp: eliminable frame pointer */
+ fp: eliminable frame pointer */
/* The last 16 stacked regs are reserved for the 8 input and 8 output
registers. */
@@ -529,12 +537,12 @@ while (0)
1, 1, 1, 1, 1, 0, 1 \
}
-/* Like `CALL_USED_REGISTERS' but used to overcome a historical
+/* Like `CALL_USED_REGISTERS' but used to overcome a historical
problem which makes CALL_USED_REGISTERS *always* include
- all the FIXED_REGISTERS. Until this problem has been
+ all the FIXED_REGISTERS. Until this problem has been
resolved this macro can be used to overcome this situation.
- In particular, block_propagate() requires this list
- be acurate, or we can remove registers which should be live.
+ In particular, block_propagate() requires this list
+ be acurate, or we can remove registers which should be live.
This macro is used in regs_invalidated_by_call. */
#define CALL_REALLY_USED_REGISTERS \
@@ -1151,6 +1159,14 @@ enum reg_class
in it. */
#define ARG_POINTER_REGNUM R_GR(0)
+/* Due to the way varargs and argument spilling happens, the argument
+ pointer is not 16-byte aligned like the stack pointer. */
+#define INIT_EXPANDERS \
+ do { \
+ if (cfun && cfun->emit->regno_pointer_align) \
+ REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) = 64; \
+ } while (0)
+
/* The register number for the return address register. For IA-64, this
is not actually a pointer as the name suggests, but that's a name that
gen_rtx_REG already takes care to keep unique. We modify
@@ -1258,7 +1274,8 @@ enum reg_class
pointer is passed in whatever way is appropriate for passing a pointer to
that type. */
-#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) 0
+#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \
+ ia64_function_arg_pass_by_reference (&CUM, MODE, TYPE, NAMED)
/* A C type for declaring a variable that is used as the first argument of
`FUNCTION_ARG' and other related values. For some target machines, the type
@@ -1267,6 +1284,7 @@ enum reg_class
typedef struct ia64_args
{
int words; /* # words of arguments so far */
+ int int_regs; /* # GR registers used so far */
int fp_regs; /* # FR registers used so far */
int prototype; /* whether function prototyped */
} CUMULATIVE_ARGS;
@@ -1277,6 +1295,7 @@ typedef struct ia64_args
#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT) \
do { \
(CUM).words = 0; \
+ (CUM).int_regs = 0; \
(CUM).fp_regs = 0; \
(CUM).prototype = ((FNTYPE) && TYPE_ARG_TYPES (FNTYPE)) || (LIBNAME); \
} while (0)
@@ -1290,6 +1309,7 @@ do { \
#define INIT_CUMULATIVE_INCOMING_ARGS(CUM, FNTYPE, LIBNAME) \
do { \
(CUM).words = 0; \
+ (CUM).int_regs = 0; \
(CUM).fp_regs = 0; \
(CUM).prototype = 1; \
} while (0)
@@ -1355,7 +1375,7 @@ do { \
#define FUNCTION_VALUE_REGNO_P(REGNO) \
(((REGNO) >= GR_RET_FIRST && (REGNO) <= GR_RET_LAST) \
- || ((REGNO) >= FR_RET_FIRST && (REGNO) <= FR_RET_LAST))
+ || ((REGNO) >= FR_RET_FIRST && (REGNO) <= FR_RET_LAST))
/* How Large Values are Returned */
@@ -1404,6 +1424,10 @@ do { \
#define EPILOGUE_USES(REGNO) ia64_epilogue_uses (REGNO)
+/* Nonzero for registers used by the exception handling mechanism. */
+
+#define EH_USES(REGNO) ia64_eh_uses (REGNO)
+
/* Output at beginning of assembler file. */
#define ASM_FILE_START(FILE) \
@@ -1722,7 +1746,7 @@ do { \
|| (CLASS) == GR_AND_FR_REGS ? 4 : 10)
/* A C expression for the cost of a branch instruction. A value of 1 is the
- default; other values are interpreted relative to that. Used by the
+ default; other values are interpreted relative to that. Used by the
if-conversion code as max instruction count. */
/* ??? This requires investigation. The primary effect might be how
many additional insn groups we run into, vs how good the dynamic
@@ -2273,7 +2297,7 @@ do { \
fprintf (FILE, "[.%s%d:]\n", PREFIX, NUM)
/* Use section-relative relocations for debugging offsets. Unlike other
- targets that fake this by putting the section VMA at 0, IA-64 has
+ targets that fake this by putting the section VMA at 0, IA-64 has
proper relocations for them. */
#define ASM_OUTPUT_DWARF_OFFSET(FILE, SIZE, LABEL) \
do { \
@@ -2527,4 +2551,11 @@ enum fetchop_code {
IA64_ADD_OP, IA64_SUB_OP, IA64_OR_OP, IA64_AND_OP, IA64_XOR_OP, IA64_NAND_OP
};
+#define DONT_USE_BUILTIN_SETJMP
+
+/* Output any profiling code before the prologue. */
+
+#undef PROFILE_BEFORE_PROLOGUE
+#define PROFILE_BEFORE_PROLOGUE 1
+
/* End of ia64.h */
diff --git a/contrib/gcc/config/ia64/ia64.md b/contrib/gcc/config/ia64/ia64.md
index c88e8b0..7b11c06 100644
--- a/contrib/gcc/config/ia64/ia64.md
+++ b/contrib/gcc/config/ia64/ia64.md
@@ -4848,7 +4848,7 @@
[(set (match_operand:DI 0 "register_operand" "=r,r,r")
(plus:DI (match_operand:DI 1 "register_operand" "%r,r,a")
(match_operand:DI 2 "gr_reg_or_22bit_operand" "r,I,J")))
- (set (match_operand:DI 3 "register_operand" "=r,r,r")
+ (set (match_operand:DI 3 "register_operand" "+r,r,r")
(match_dup 3))]
""
"@
@@ -5045,6 +5045,37 @@
[(set_attr "itanium_class" "stop_bit")
(set_attr "predicable" "no")])
+(define_expand "trap"
+ [(trap_if (const_int 1) (const_int 0))]
+ ""
+ "")
+
+;; ??? We don't have a match-any slot type. Setting the type to unknown
+;; produces worse code that setting the slot type to A.
+
+(define_insn "*trap"
+ [(trap_if (const_int 1) (match_operand 0 "const_int_operand" ""))]
+ ""
+ "break %0"
+ [(set_attr "itanium_class" "chk_s")])
+
+(define_expand "conditional_trap"
+ [(trap_if (match_operand 0 "" "") (match_operand 1 "" ""))]
+ ""
+{
+ operands[0] = ia64_expand_compare (GET_CODE (operands[0]), VOIDmode);
+})
+
+(define_insn "*conditional_trap"
+ [(trap_if (match_operator 0 "predicate_operator"
+ [(match_operand:BI 1 "register_operand" "c")
+ (const_int 0)])
+ (match_operand 2 "const_int_operand" ""))]
+ ""
+ "(%J0) break %2"
+ [(set_attr "itanium_class" "chk_s")
+ (set_attr "predicable" "no")])
+
(define_insn "break_f"
[(unspec_volatile [(const_int 0)] 3)]
""
diff --git a/contrib/gcc/config/ia64/linux.h b/contrib/gcc/config/ia64/linux.h
index 1889ef6..3091852 100644
--- a/contrib/gcc/config/ia64/linux.h
+++ b/contrib/gcc/config/ia64/linux.h
@@ -11,12 +11,8 @@
/* ??? Maybe this should be in sysv4.h? */
#define CPP_PREDEFINES "\
--D__ia64 -D__ia64__ -D__linux -D__linux__ -D_LONGLONG -Dlinux -Dunix \
--D__LP64__ -D__ELF__ -Asystem=linux -Acpu=ia64 -Amachine=ia64"
-
-/* ??? ia64 gas doesn't accept standard svr4 assembler options? */
-#undef ASM_SPEC
-#define ASM_SPEC "-x %{mconstant-gp} %{mauto-pic}"
+ -D__gnu_linux__ -D__linux -D__linux__ -D_LONGLONG \
+ -Dlinux -Dunix -Asystem=linux"
/* Need to override linux.h STARTFILE_SPEC, since it has crtbeginT.o in. */
#undef STARTFILE_SPEC
@@ -46,14 +42,8 @@
%{static:-static}}"
-#define DONT_USE_BUILTIN_SETJMP
#define JMP_BUF_SIZE 76
-/* Output any profiling code before the prologue. */
-
-#undef PROFILE_BEFORE_PROLOGUE
-#define PROFILE_BEFORE_PROLOGUE 1
-
/* Override linux.h LINK_EH_SPEC definition.
Signalize that because we have fde-glibc, we don't need all C shared libs
linked against -lgcc_s. */
@@ -98,10 +88,16 @@
(CONTEXT)->pfs_loc = &(sc_->sc_ar_pfs); \
(CONTEXT)->lc_loc = &(sc_->sc_ar_lc); \
(CONTEXT)->unat_loc = &(sc_->sc_ar_unat); \
+ (CONTEXT)->br_loc[0] = &(sc_->sc_br[0]); \
+ (CONTEXT)->bsp = sc_->sc_ar_bsp; \
(CONTEXT)->pr = sc_->sc_pr; \
(CONTEXT)->psp = sc_->sc_gr[12]; \
+ (CONTEXT)->gp = sc_->sc_gr[1]; \
+ /* Signal frame doesn't have an associated reg. stack frame \
+ other than what we adjust for below. */ \
+ (FS) -> no_reg_stack_frame = 1; \
\
- /* Don't touch the branch registers. The kernel doesn't \
+ /* Don't touch the branch registers o.t. b0. The kernel doesn't \
pass the preserved branch registers in the sigcontext but \
leaves them intact, so there's no need to do anything \
with them here. */ \
diff --git a/contrib/gcc/config/ia64/sysv4.h b/contrib/gcc/config/ia64/sysv4.h
index 1b5d469..c53a1dc 100644
--- a/contrib/gcc/config/ia64/sysv4.h
+++ b/contrib/gcc/config/ia64/sysv4.h
@@ -22,6 +22,11 @@
#undef ASCII_DATA_ASM_OP
#define ASCII_DATA_ASM_OP "\tstring\t"
+/* ia64-specific options for gas
+ ??? ia64 gas doesn't accept standard svr4 assembler options? */
+#undef ASM_SPEC
+#define ASM_SPEC "-x %{mconstant-gp} %{mauto-pic} %(asm_extra)"
+
/* ??? Unfortunately, .lcomm doesn't work, because it puts things in either
.bss or .sbss, and we can't control the decision of which is used. When
I use .lcomm, I get a cryptic "Section group has no member" error from
diff --git a/contrib/gcc/config/ia64/unwind-ia64.c b/contrib/gcc/config/ia64/unwind-ia64.c
index 99923aa..ca91539 100644
--- a/contrib/gcc/config/ia64/unwind-ia64.c
+++ b/contrib/gcc/config/ia64/unwind-ia64.c
@@ -35,6 +35,10 @@
#include "tsystem.h"
#include "unwind.h"
#include "unwind-ia64.h"
+#include "ia64intrin.h"
+
+/* This isn't thread safe, but nice for occasional tests. */
+#undef ENABLE_MALLOC_CHECKING
#ifndef __USING_SJLJ_EXCEPTIONS__
#define UNW_VER(x) ((x) >> 48)
@@ -121,13 +125,24 @@ struct unw_reg_info
int when; /* when the register gets saved */
};
+struct unw_reg_state {
+ struct unw_reg_state *next; /* next (outer) element on state stack */
+ struct unw_reg_info reg[UNW_NUM_REGS]; /* register save locations */
+};
+
+struct unw_labeled_state {
+ struct unw_labeled_state *next; /* next labeled state (or NULL) */
+ unsigned long label; /* label for this state */
+ struct unw_reg_state saved_state;
+};
+
typedef struct unw_state_record
{
unsigned int first_region : 1; /* is this the first region? */
unsigned int done : 1; /* are we done scanning descriptors? */
unsigned int any_spills : 1; /* got any register spills? */
unsigned int in_body : 1; /* are we inside a body? */
-
+ unsigned int no_reg_stack_frame : 1; /* Don't adjust bsp for i&l regs */
unsigned char *imask; /* imask of of spill_mask record or NULL */
unsigned long pr_val; /* predicate values */
unsigned long pr_mask; /* predicate mask */
@@ -141,11 +156,8 @@ typedef struct unw_state_record
unsigned char gr_save_loc; /* next general register to use for saving */
unsigned char return_link_reg; /* branch register for return link */
- struct unw_reg_state {
- struct unw_reg_state *next;
- unsigned long label; /* label of this state record */
- struct unw_reg_info reg[UNW_NUM_REGS];
- } curr, *stack, *reg_state_list;
+ struct unw_labeled_state *labeled_states; /* list of all labeled states */
+ struct unw_reg_state curr; /* current state */
_Unwind_Personality_Fn personality;
@@ -184,9 +196,12 @@ struct _Unwind_Context
void *lsda; /* language specific data area */
/* Preserved state. */
- unsigned long *bsp_loc; /* previous bsp save location */
+ unsigned long *bsp_loc; /* previous bsp save location
+ Appears to be write-only? */
unsigned long *bspstore_loc;
- unsigned long *pfs_loc;
+ unsigned long *pfs_loc; /* Save location for pfs in current
+ (corr. to sp) frame. Target
+ contains cfm for caller. */
unsigned long *pri_unat_loc;
unsigned long *unat_loc;
unsigned long *lc_loc;
@@ -226,28 +241,196 @@ static unsigned char const save_order[] =
#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
-/* Unwind decoder routines */
+/* MASK is a bitmap describing the allocation state of emergency buffers,
+ with bit set indicating free. Return >= 0 if allocation is successful;
+ < 0 if failure. */
-static void
-push (struct unw_state_record *sr)
+static inline int
+atomic_alloc (unsigned int *mask)
+{
+ unsigned int old = *mask, ret, new;
+
+ while (1)
+ {
+ if (old == 0)
+ return -1;
+ ret = old & -old;
+ new = old & ~ret;
+ new = __sync_val_compare_and_swap (mask, old, new);
+ if (old == new)
+ break;
+ old = new;
+ }
+
+ return __builtin_ffs (ret) - 1;
+}
+
+/* Similarly, free an emergency buffer. */
+
+static inline void
+atomic_free (unsigned int *mask, int bit)
+{
+ __sync_xor_and_fetch (mask, 1 << bit);
+}
+
+
+#define SIZE(X) (sizeof(X) / sizeof(*(X)))
+#define MASK_FOR(X) ((2U << (SIZE (X) - 1)) - 1)
+#define PTR_IN(X, P) ((P) >= (X) && (P) < (X) + SIZE (X))
+
+static struct unw_reg_state emergency_reg_state[32];
+static int emergency_reg_state_free = MASK_FOR (emergency_reg_state);
+
+static struct unw_labeled_state emergency_labeled_state[8];
+static int emergency_labeled_state_free = MASK_FOR (emergency_labeled_state);
+
+#ifdef ENABLE_MALLOC_CHECKING
+static int reg_state_alloced;
+static int labeled_state_alloced;
+#endif
+
+/* Allocation and deallocation of structures. */
+
+static struct unw_reg_state *
+alloc_reg_state (void)
{
struct unw_reg_state *rs;
+#ifdef ENABLE_MALLOC_CHECKING
+ reg_state_alloced++;
+#endif
+
rs = malloc (sizeof (struct unw_reg_state));
+ if (!rs)
+ {
+ int n = atomic_alloc (&emergency_reg_state_free);
+ if (n >= 0)
+ rs = &emergency_reg_state[n];
+ }
+
+ return rs;
+}
+
+static void
+free_reg_state (struct unw_reg_state *rs)
+{
+#ifdef ENABLE_MALLOC_CHECKING
+ reg_state_alloced--;
+#endif
+
+ if (PTR_IN (emergency_reg_state, rs))
+ atomic_free (&emergency_reg_state_free, rs - emergency_reg_state);
+ else
+ free (rs);
+}
+
+static struct unw_labeled_state *
+alloc_label_state (void)
+{
+ struct unw_labeled_state *ls;
+
+#ifdef ENABLE_MALLOC_CHECKING
+ labeled_state_alloced++;
+#endif
+
+ ls = malloc(sizeof(struct unw_labeled_state));
+ if (!ls)
+ {
+ int n = atomic_alloc (&emergency_labeled_state_free);
+ if (n >= 0)
+ ls = &emergency_labeled_state[n];
+ }
+
+ return ls;
+}
+
+static void
+free_label_state (struct unw_labeled_state *ls)
+{
+#ifdef ENABLE_MALLOC_CHECKING
+ labeled_state_alloced--;
+#endif
+
+ if (PTR_IN (emergency_labeled_state, ls))
+ atomic_free (&emergency_labeled_state_free, emergency_labeled_state - ls);
+ else
+ free (ls);
+}
+
+/* Routines to manipulate the state stack. */
+
+static void
+push (struct unw_state_record *sr)
+{
+ struct unw_reg_state *rs = alloc_reg_state ();
memcpy (rs, &sr->curr, sizeof (*rs));
- rs->next = sr->stack;
- sr->stack = rs;
+ sr->curr.next = rs;
}
static void
pop (struct unw_state_record *sr)
{
- struct unw_reg_state *rs;
+ struct unw_reg_state *rs = sr->curr.next;
+
+ if (!rs)
+ abort ();
+ memcpy (&sr->curr, rs, sizeof(*rs));
+ free_reg_state (rs);
+}
+
+/* Make a copy of the state stack. Non-recursive to avoid stack overflows. */
+
+static struct unw_reg_state *
+dup_state_stack (struct unw_reg_state *rs)
+{
+ struct unw_reg_state *copy, *prev = NULL, *first = NULL;
+
+ while (rs)
+ {
+ copy = alloc_reg_state ();
+ memcpy (copy, rs, sizeof(*copy));
+ if (first)
+ prev->next = copy;
+ else
+ first = copy;
+ rs = rs->next;
+ prev = copy;
+ }
+
+ return first;
+}
+
+/* Free all stacked register states (but not RS itself). */
+static void
+free_state_stack (struct unw_reg_state *rs)
+{
+ struct unw_reg_state *p, *next;
- rs = sr->stack;
- sr->stack = rs->next;
- free (rs);
+ for (p = rs->next; p != NULL; p = next)
+ {
+ next = p->next;
+ free_reg_state (p);
+ }
+ rs->next = NULL;
+}
+
+/* Free all labeled states. */
+
+static void
+free_label_states (struct unw_labeled_state *ls)
+{
+ struct unw_labeled_state *next;
+
+ for (; ls ; ls = next)
+ {
+ next = ls->next;
+
+ free_state_stack (&ls->saved_state);
+ free_label_state (ls);
+ }
}
+
+/* Unwind decoder routines */
static enum unw_register_index __attribute__((const))
decode_abreg (unsigned char abreg, int memory)
@@ -295,8 +478,8 @@ alloc_spill_area (unsigned long *offp, unsigned long regsize,
if (reg->where == UNW_WHERE_SPILL_HOME)
{
reg->where = UNW_WHERE_PSPREL;
- reg->val = 0x10 - *offp;
- *offp += regsize;
+ *offp -= regsize;
+ reg->val = *offp;
}
}
}
@@ -330,7 +513,7 @@ finish_prologue (struct unw_state_record *sr)
/* First, resolve implicit register save locations
(see Section "11.4.2.3 Rules for Using Unwind Descriptors", rule 3). */
- for (i = 0; i < (int) sizeof(save_order); ++i)
+ for (i = 0; i < (int) sizeof (save_order); ++i)
{
reg = sr->curr.reg + save_order[i];
if (reg->where == UNW_WHERE_GR_SAVE)
@@ -363,8 +546,8 @@ finish_prologue (struct unw_state_record *sr)
mask = *cp++;
kind = (mask >> 2*(3-(t & 3))) & 3;
if (kind > 0)
- spill_next_when(&regs[kind - 1], sr->curr.reg + limit[kind - 1],
- sr->region_start + t);
+ spill_next_when (&regs[kind - 1], sr->curr.reg + limit[kind - 1],
+ sr->region_start + t);
}
}
@@ -372,12 +555,12 @@ finish_prologue (struct unw_state_record *sr)
if (sr->any_spills)
{
off = sr->spill_offset;
- alloc_spill_area(&off, 16, sr->curr.reg + UNW_REG_F2,
- sr->curr.reg + UNW_REG_F31);
- alloc_spill_area(&off, 8, sr->curr.reg + UNW_REG_B1,
- sr->curr.reg + UNW_REG_B5);
- alloc_spill_area(&off, 8, sr->curr.reg + UNW_REG_R4,
- sr->curr.reg + UNW_REG_R7);
+ alloc_spill_area (&off, 16, sr->curr.reg + UNW_REG_F2,
+ sr->curr.reg + UNW_REG_F31);
+ alloc_spill_area (&off, 8, sr->curr.reg + UNW_REG_B1,
+ sr->curr.reg + UNW_REG_B5);
+ alloc_spill_area (&off, 8, sr->curr.reg + UNW_REG_R4,
+ sr->curr.reg + UNW_REG_R7);
}
}
@@ -392,23 +575,24 @@ desc_prologue (int body, unw_word rlen, unsigned char mask,
int i;
if (!(sr->in_body || sr->first_region))
- finish_prologue(sr);
+ finish_prologue (sr);
sr->first_region = 0;
/* Check if we're done. */
- if (body && sr->when_target < sr->region_start + sr->region_len)
+ if (sr->when_target < sr->region_start + sr->region_len)
{
sr->done = 1;
return;
}
for (i = 0; i < sr->epilogue_count; ++i)
- pop(sr);
+ pop (sr);
+
sr->epilogue_count = 0;
sr->epilogue_start = UNW_WHEN_NEVER;
if (!body)
- push(sr);
+ push (sr);
sr->region_start += sr->region_len;
sr->region_len = rlen;
@@ -494,7 +678,8 @@ desc_frgr_mem (unsigned char grmask, unw_word frmask,
{
if ((frmask & 1) != 0)
{
- set_reg (sr->curr.reg + UNW_REG_F2 + i, UNW_WHERE_SPILL_HOME,
+ enum unw_register_index base = i < 4 ? UNW_REG_F2 : UNW_REG_F16 - 4;
+ set_reg (sr->curr.reg + base + i, UNW_WHERE_SPILL_HOME,
sr->region_start + sr->region_len - 1, 0);
sr->any_spills = 1;
}
@@ -631,13 +816,15 @@ desc_epilogue (unw_word t, unw_word ecount, struct unw_state_record *sr)
static inline void
desc_copy_state (unw_word label, struct unw_state_record *sr)
{
- struct unw_reg_state *rs;
+ struct unw_labeled_state *ls;
- for (rs = sr->reg_state_list; rs; rs = rs->next)
+ for (ls = sr->labeled_states; ls; ls = ls->next)
{
- if (rs->label == label)
- {
- memcpy (&sr->curr, rs, sizeof(sr->curr));
+ if (ls->label == label)
+ {
+ free_state_stack (&sr->curr);
+ memcpy (&sr->curr, &ls->saved_state, sizeof (sr->curr));
+ sr->curr.next = dup_state_stack (ls->saved_state.next);
return;
}
}
@@ -647,13 +834,15 @@ desc_copy_state (unw_word label, struct unw_state_record *sr)
static inline void
desc_label_state (unw_word label, struct unw_state_record *sr)
{
- struct unw_reg_state *rs;
+ struct unw_labeled_state *ls = alloc_label_state ();
- rs = malloc (sizeof (struct unw_reg_state));
- memcpy (rs, &sr->curr, sizeof (*rs));
- rs->label = label;
- rs->next = sr->reg_state_list;
- sr->reg_state_list = rs;
+ ls->label = label;
+ memcpy (&ls->saved_state, &sr->curr, sizeof (ls->saved_state));
+ ls->saved_state.next = dup_state_stack (sr->curr.next);
+
+ /* Insert into list of labeled states. */
+ ls->next = sr->labeled_states;
+ sr->labeled_states = ls;
}
/*
@@ -1461,8 +1650,11 @@ uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
unsigned long *unw, header, length;
unsigned char *insn, *insn_end;
unsigned long segment_base;
+ struct unw_reg_info *r;
memset (fs, 0, sizeof (*fs));
+ for (r = fs->curr.reg; r < fs->curr.reg + UNW_NUM_REGS; ++r)
+ r->when = UNW_WHEN_NEVER;
context->lsda = 0;
ent = _Unwind_FindTableEntry ((void *) context->rp,
@@ -1518,6 +1710,14 @@ uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
while (!fs->done && insn < insn_end)
insn = unw_decode (insn, fs->in_body, fs);
+ free_label_states (fs->labeled_states);
+ free_state_stack (&fs->curr);
+
+#ifdef ENABLE_MALLOC_CHECKING
+ if (reg_state_alloced || labeled_state_alloced)
+ abort ();
+#endif
+
/* If we're in the epilogue, sp has been restored and all values
on the memory stack below psp also have been restored. */
if (fs->when_target > fs->epilogue_start)
@@ -1578,7 +1778,7 @@ uw_update_reg_address (struct _Unwind_Context *context,
/* Note that while RVAL can only be 1-5 from normal descriptors,
we can want to look at B0 due to having manually unwound a
signal frame. */
- if (rval >= 0 && rval <= 5)
+ if (rval <= 5)
addr = context->br_loc[rval];
else
abort ();
@@ -1677,8 +1877,7 @@ uw_update_reg_address (struct _Unwind_Context *context,
context->psp = *(unsigned long *)addr;
break;
- case UNW_REG_RNAT:
- case UNW_NUM_REGS:
+ default:
abort ();
}
}
@@ -1720,7 +1919,10 @@ uw_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
/* Unwind BSP for the local registers allocated this frame. */
/* ??? What to do with stored BSP or BSPSTORE registers. */
- if (fs->when_target > fs->curr.reg[UNW_REG_PFS].when)
+ /* We assert that we are either at a call site, or we have
+ just unwound through a signal frame. In either case
+ pfs_loc is valid. */
+ if (!(fs -> no_reg_stack_frame))
{
unsigned long pfs = *context->pfs_loc;
unsigned long sol = (pfs >> 7) & 0x7f;
diff --git a/contrib/gcc/config/libgcc-glibc.ver b/contrib/gcc/config/libgcc-glibc.ver
new file mode 100644
index 0000000..837c1a7
--- /dev/null
+++ b/contrib/gcc/config/libgcc-glibc.ver
@@ -0,0 +1,23 @@
+# In order to work around the very problems that force us to now generally
+# create a libgcc.so, glibc reexported a number of routines from libgcc.a.
+# By now choosing the same version tags for these specific routines, we
+# maintain enough binary compatibility to allow future versions of glibc
+# to defer implementation of these routines to libgcc.so via DT_AUXILIARY.
+
+%inherit GCC_3.0 GLIBC_2.0
+GLIBC_2.0 {
+ # Sampling of DImode arithmetic used by (at least) i386 and m68k.
+ __divdi3
+ __moddi3
+ __udivdi3
+ __umoddi3
+
+ # Exception handling support functions used by most everyone.
+ __register_frame
+ __register_frame_table
+ __deregister_frame
+ __register_frame_info
+ __deregister_frame_info
+ __frame_state_for
+ __register_frame_info_table
+}
diff --git a/contrib/gcc/config/netbsd.h b/contrib/gcc/config/netbsd.h
index fba341b..227942c 100644
--- a/contrib/gcc/config/netbsd.h
+++ b/contrib/gcc/config/netbsd.h
@@ -109,3 +109,16 @@
/* Handle #pragma weak and #pragma pack. */
#define HANDLE_SYSV_PRAGMA
+
+
+/* Define some types that are the same on all NetBSD platforms,
+ making them agree with <machine/ansi.h>. */
+
+#undef WCHAR_TYPE
+#define WCHAR_TYPE "int"
+
+#undef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE 32
+
+#undef WINT_TYPE
+#define WINT_TYPE "int"
diff --git a/contrib/gcc/config/rs6000/aix.h b/contrib/gcc/config/rs6000/aix.h
index 2738a37..d8dde5b 100644
--- a/contrib/gcc/config/rs6000/aix.h
+++ b/contrib/gcc/config/rs6000/aix.h
@@ -1,6 +1,6 @@
/* Definitions of target machine for GNU compiler,
for IBM RS/6000 POWER running AIX.
- Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -27,6 +27,9 @@ Boston, MA 02111-1307, USA. */
collect has a chance to see them, so scan the object files directly. */
#define COLLECT_EXPORT_LIST
+/* Handle #pragma weak and #pragma pack. */
+#define HANDLE_SYSV_PRAGMA
+
/* This is the only version of nm that collect2 can work with. */
#define REAL_NM_FILE_NAME "/usr/ucb/nm"
diff --git a/contrib/gcc/config/rs6000/aix43.h b/contrib/gcc/config/rs6000/aix43.h
index 93e186c..7aa8707 100644
--- a/contrib/gcc/config/rs6000/aix43.h
+++ b/contrib/gcc/config/rs6000/aix43.h
@@ -199,10 +199,6 @@ do { \
%{pthread:%{pg:gcrt0_r%O%s}%{!pg:%{p:mcrt0_r%O%s}%{!p:crt0_r%O%s}}}\
%{!pthread:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}}}}"
-/* Since there are separate multilibs for pthreads, determine the
- thread model based on the command-line arguments. */
-#define THREAD_MODEL_SPEC "%{pthread:posix}%{!pthread:single}"
-
/* AIX 4.3 typedefs ptrdiff_t as "long" while earlier releases used "int". */
#undef PTRDIFF_TYPE
diff --git a/contrib/gcc/config/rs6000/aix51.h b/contrib/gcc/config/rs6000/aix51.h
index ae01440..121c7ba 100644
--- a/contrib/gcc/config/rs6000/aix51.h
+++ b/contrib/gcc/config/rs6000/aix51.h
@@ -202,10 +202,6 @@ do { \
%{pthread:%{pg:gcrt0_r%O%s}%{!pg:%{p:mcrt0_r%O%s}%{!p:crt0_r%O%s}}}\
%{!pthread:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}}}}"
-/* Since there are separate multilibs for pthreads, determine the
- thread model based on the command-line arguments. */
-#define THREAD_MODEL_SPEC "%{pthread:posix}%{!pthread:single}"
-
/* AIX V5 typedefs ptrdiff_t as "long" while earlier releases used "int". */
#undef PTRDIFF_TYPE
@@ -213,10 +209,13 @@ do { \
/* __WCHAR_TYPE__ is dynamic, so do not define it statically. */
#define NO_BUILTIN_WCHAR_TYPE
-#undef WCHAR_TYPE
-#undef WCHAR_TYPE_SIZE
+
+/* Type used for wchar_t, as a string used in a declaration. */
+#undef WCHAR_TYPE
+#define WCHAR_TYPE (!TARGET_64BIT ? "short unsigned int" : "unsigned int")
/* Width of wchar_t in bits. */
+#undef WCHAR_TYPE_SIZE
#define WCHAR_TYPE_SIZE (!TARGET_64BIT ? 16 : 32)
#define MAX_WCHAR_TYPE_SIZE 32
diff --git a/contrib/gcc/config/rs6000/altivec.h b/contrib/gcc/config/rs6000/altivec.h
index 4d5b0a3..85869dc 100644
--- a/contrib/gcc/config/rs6000/altivec.h
+++ b/contrib/gcc/config/rs6000/altivec.h
@@ -35,18 +35,29 @@ Boston, MA 02111-1307, USA. */
/* Required by Motorola specs. */
#define __VEC__ 10206
+#ifndef __ALTIVEC__
#define __ALTIVEC__ 1
+#endif
#define __vector __attribute__((vector_size(16)))
-/* Dummy prototype. */
-extern void __altivec_link_error_invalid_argument ();
-
/* You are allowed to undef this for C++ compatability. */
#define vector __vector
+#define bool signed
+#define pixel short
+#define __pixel short
+
+/* Dummy prototype. */
+extern int __altivec_link_error_invalid_argument ();
+
/* Helper macros. */
+#define __CR6_EQ 0
+#define __CR6_EQ_REV 1
+#define __CR6_LT 2
+#define __CR6_LT_REV 3
+
#define __bin_args_eq(xtype, x, ytype, y) \
(__builtin_types_compatible_p (xtype, typeof (x)) \
&& __builtin_types_compatible_p (ytype, typeof (y)))
@@ -61,1398 +72,7784 @@ extern void __altivec_link_error_invalid_argument ();
#define __ch(x, y, z) __builtin_choose_expr (x, y, z)
+/* These are easy... Same exact arguments. */
+
+#define vec_vaddcuw vec_addc
+#define vec_vand vec_and
+#define vec_vandc vec_andc
+#define vec_vrfip vec_ceil
+#define vec_vcmpbfp vec_cmpb
+#define vec_vcmpgefp vec_cmpge
+#define vec_vctsxs vec_cts
+#define vec_vctuxs vec_ctu
+#define vec_vexptefp vec_expte
+#define vec_vrfim vec_floor
+#define vec_lvx vec_ld
+#define vec_lvxl vec_ldl
+#define vec_vlogefp vec_loge
+#define vec_vmaddfp vec_madd
+#define vec_vmhaddshs vec_madds
+#define vec_vmladduhm vec_mladd
+#define vec_vmhraddshs vec_mradds
+#define vec_vnmsubfp vec_nmsub
+#define vec_vnor vec_nor
+#define vec_vor vec_or
+#define vec_vpkpx vec_packpx
+#define vec_vperm vec_perm
+#define vec_vrefp vec_re
+#define vec_vrfin vec_round
+#define vec_vrsqrtefp vec_rsqrte
+#define vec_vsel vec_sel
+#define vec_vsldoi vec_sld
+#define vec_vsl vec_sll
+#define vec_vslo vec_slo
+#define vec_vspltisb vec_splat_s8
+#define vec_vspltish vec_splat_s16
+#define vec_vspltisw vec_splat_s32
+#define vec_vsr vec_srl
+#define vec_vsro vec_sro
+#define vec_stvx vec_st
+#define vec_stvxl vec_stl
+#define vec_vsubcuw vec_subc
+#define vec_vsum2sws vec_sum2s
+#define vec_vsumsws vec_sums
+#define vec_vrfiz vec_trunc
+#define vec_vxor vec_xor
+
#ifdef __cplusplus
-/* C++ stuff here. */
+/* Prototypes for builtins that take literals and must always be
+ inlined. */
+inline vector float vec_ctf (vector unsigned int, const char) __attribute__ ((always_inline));
+inline vector float vec_ctf (vector signed int, const char) __attribute__ ((always_inline));
+inline vector signed int vec_cts (vector float, const char) __attribute__ ((always_inline));
+inline vector unsigned int vec_ctu (vector float, const char) __attribute__ ((always_inline));
+inline void vec_dss (const char) __attribute__ ((always_inline));
+inline void vec_dst (void *, int, const char) __attribute__ ((always_inline));
+inline void vec_dstst (void *, int, const char) __attribute__ ((always_inline));
+inline void vec_dststt (void *, int, const char) __attribute__ ((always_inline));
+inline void vec_dstt (void *, int, const char) __attribute__ ((always_inline));
+inline vector float vec_sld (vector float, vector float, const char) __attribute__ ((always_inline));
+inline vector signed int vec_sld (vector signed int, vector signed int, const char) __attribute__ ((always_inline));
+inline vector unsigned int vec_sld (vector unsigned int, vector unsigned int, const char) __attribute__ ((always_inline));
+inline vector signed short vec_sld (vector signed short, vector signed short, const char) __attribute__ ((always_inline));
+inline vector unsigned short vec_sld (vector unsigned short, vector unsigned short, const char) __attribute__ ((always_inline));
+inline vector signed char vec_sld (vector signed char, vector signed char, const char) __attribute__ ((always_inline));
+inline vector unsigned char vec_sld (vector unsigned char, vector unsigned char, const char) __attribute__ ((always_inline));
+inline vector signed char vec_splat (vector signed char, const char) __attribute__ ((always_inline));
+inline vector unsigned char vec_splat (vector unsigned char, const char) __attribute__ ((always_inline));
+inline vector signed short vec_splat (vector signed short, const char) __attribute__ ((always_inline));
+inline vector unsigned short vec_splat (vector unsigned short, const char) __attribute__ ((always_inline));
+inline vector float vec_splat (vector float, const char) __attribute__ ((always_inline));
+inline vector signed int vec_splat (vector signed int, const char) __attribute__ ((always_inline));
+inline vector unsigned int vec_splat (vector unsigned int, const char) __attribute__ ((always_inline));
+inline vector signed char vec_splat_s8 (const char) __attribute__ ((always_inline));
+inline vector signed short vec_splat_s16 (const char) __attribute__ ((always_inline));
+inline vector signed int vec_splat_s32 (const char) __attribute__ ((always_inline));
+inline vector unsigned char vec_splat_u8 (const char) __attribute__ ((always_inline));
+inline vector unsigned short vec_splat_u16 (const char) __attribute__ ((always_inline));
+inline vector unsigned int vec_splat_u32 (const char) __attribute__ ((always_inline));
+
+/* vec_abs */
+
+inline vector signed char
+vec_abs (vector signed char a1)
+{
+ return __builtin_altivec_abs_v16qi (a1);
+}
+
+inline vector signed short
+vec_abs (vector signed short a1)
+{
+ return __builtin_altivec_abs_v8hi (a1);
+}
+
+inline vector signed int
+vec_abs (vector signed int a1)
+{
+ return __builtin_altivec_abs_v4si (a1);
+}
+
+inline vector float
+vec_abs (vector float a1)
+{
+ return __builtin_altivec_abs_v4sf (a1);
+}
+
+/* vec_abss */
+
+inline vector signed char
+vec_abss (vector signed char a1)
+{
+ return __builtin_altivec_abss_v16qi (a1);
+}
+
+inline vector signed short
+vec_abss (vector signed short a1)
+{
+ return __builtin_altivec_abss_v8hi (a1);
+}
+
+inline vector signed int
+vec_abss (vector signed int a1)
+{
+ return __builtin_altivec_abss_v4si (a1);
+}
+
+/* vec_add */
+
+inline vector signed char
+vec_add (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_add (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_add (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_add (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed short
+vec_add (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_add (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_add (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_add (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed int
+vec_add (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_add (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_add (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_add (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_add (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vaddfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_vaddfp */
+
+inline vector float
+vec_vaddfp (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vaddfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_vadduwm */
+
+inline vector signed int
+vec_vadduwm (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vadduwm (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vadduwm (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vadduwm (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vadduhm */
+
+inline vector signed short
+vec_vadduhm (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vadduhm (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vadduhm (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vadduhm (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vaddubm */
+
+inline vector signed char
+vec_vaddubm (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vaddubm (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vaddubm (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vaddubm (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_addc */
+
+inline vector unsigned int
+vec_addc (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vaddcuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_adds */
+
+inline vector unsigned char
+vec_adds (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_adds (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_adds (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed char
+vec_adds (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vaddsbs ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned short
+vec_adds (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_adds (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_adds (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed short
+vec_adds (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vaddshs ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned int
+vec_adds (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vadduws ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_adds (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vadduws ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_adds (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vadduws ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_adds (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vaddsws ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vaddsws */
+
+inline vector signed int
+vec_vaddsws (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vaddsws ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vadduws */
+
+inline vector unsigned int
+vec_vadduws (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vadduws ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vadduws (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vadduws ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vadduws (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vadduws ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vaddshs */
+inline vector signed short
+vec_vaddshs (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vaddshs ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vadduhs */
+
+inline vector unsigned short
+vec_vadduhs (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vadduhs (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vadduhs (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vaddsbs */
+
+inline vector signed char
+vec_vaddsbs (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vaddsbs ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_vaddubs */
+
+inline vector unsigned char
+vec_vaddubs (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vaddubs (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vaddubs (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_and */
+
+inline vector float
+vec_and (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_and (vector float a1, vector signed int a2)
+{
+ return (vector float) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_and (vector signed int a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_and (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_and (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_and (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_and (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_and (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_and (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_and (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_and (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_and (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_and (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_and (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_and (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_andc */
+
+inline vector float
+vec_andc (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_andc (vector float a1, vector signed int a2)
+{
+ return (vector float) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_andc (vector signed int a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_andc (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_andc (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_andc (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_andc (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_andc (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_andc (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_andc (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_andc (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_andc (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_andc (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_andc (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_andc (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_avg */
+
+inline vector unsigned char
+vec_avg (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vavgub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed char
+vec_avg (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vavgsb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned short
+vec_avg (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vavguh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed short
+vec_avg (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vavgsh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned int
+vec_avg (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vavguw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_avg (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vavgsw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vavgsw */
+
+inline vector signed int
+vec_vavgsw (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vavgsw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vavguw */
+
+inline vector unsigned int
+vec_vavguw (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vavguw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vavgsh */
+
+inline vector signed short
+vec_vavgsh (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vavgsh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vavguh */
+
+inline vector unsigned short
+vec_vavguh (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vavguh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vavgsb */
+
+inline vector signed char
+vec_vavgsb (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vavgsb ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_vavgub */
+
+inline vector unsigned char
+vec_vavgub (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vavgub ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_ceil */
+
+inline vector float
+vec_ceil (vector float a1)
+{
+ return (vector float) __builtin_altivec_vrfip ((vector float) a1);
+}
+
+/* vec_cmpb */
+
+inline vector signed int
+vec_cmpb (vector float a1, vector float a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpbfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_cmpeq */
+
+inline vector signed char
+vec_cmpeq (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vcmpequb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed char
+vec_cmpeq (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vcmpequb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed short
+vec_cmpeq (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vcmpequh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed short
+vec_cmpeq (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vcmpequh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed int
+vec_cmpeq (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpequw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_cmpeq (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpequw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_cmpeq (vector float a1, vector float a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpeqfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_vcmpeqfp */
+
+inline vector signed int
+vec_vcmpeqfp (vector float a1, vector float a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpeqfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_vcmpequw */
+
+inline vector signed int
+vec_vcmpequw (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpequw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_vcmpequw (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpequw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vcmpequh */
+
+inline vector signed short
+vec_vcmpequh (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vcmpequh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed short
+vec_vcmpequh (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vcmpequh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vcmpequb */
+
+inline vector signed char
+vec_vcmpequb (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vcmpequb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed char
+vec_vcmpequb (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vcmpequb ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_cmpge */
+
+inline vector signed int
+vec_cmpge (vector float a1, vector float a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpgefp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_cmpgt */
+
+inline vector signed char
+vec_cmpgt (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vcmpgtub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed char
+vec_cmpgt (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vcmpgtsb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed short
+vec_cmpgt (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vcmpgtuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed short
+vec_cmpgt (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vcmpgtsh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed int
+vec_cmpgt (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpgtuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_cmpgt (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpgtsw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_cmpgt (vector float a1, vector float a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpgtfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_vcmpgtfp */
+
+inline vector signed int
+vec_vcmpgtfp (vector float a1, vector float a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpgtfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_vcmpgtsw */
+
+inline vector signed int
+vec_vcmpgtsw (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpgtsw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vcmpgtuw */
+
+inline vector signed int
+vec_vcmpgtuw (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpgtuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vcmpgtsh */
+
+inline vector signed short
+vec_cmpgtsh (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vcmpgtsh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vcmpgtuh */
+
+inline vector signed short
+vec_vcmpgtuh (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vcmpgtuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vcmpgtsb */
+
+inline vector signed char
+vec_vcmpgtsb (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vcmpgtsb ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_vcmpgtub */
+
+inline vector signed char
+vec_vcmpgtub (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vcmpgtub ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_cmple */
+
+inline vector signed int
+vec_cmple (vector float a1, vector float a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpgefp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_cmplt */
+
+inline vector signed char
+vec_cmplt (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vcmpgtub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed char
+vec_cmplt (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vcmpgtsb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed short
+vec_cmplt (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vcmpgtuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed short
+vec_cmplt (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vcmpgtsh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed int
+vec_cmplt (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpgtuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_cmplt (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpgtsw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_cmplt (vector float a1, vector float a2)
+{
+ return (vector signed int) __builtin_altivec_vcmpgtfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_ctf */
+
+inline vector float
+vec_ctf (vector unsigned int a1, const char a2)
+{
+ return (vector float) __builtin_altivec_vcfux ((vector signed int) a1, a2);
+}
+
+inline vector float
+vec_ctf (vector signed int a1, const char a2)
+{
+ return (vector float) __builtin_altivec_vcfsx ((vector signed int) a1, a2);
+}
+
+/* vec_vcfsx */
+
+inline vector float
+vec_vcfsx (vector signed int a1, const char a2)
+{
+ return (vector float) __builtin_altivec_vcfsx ((vector signed int) a1, a2);
+}
+
+/* vec_vcfux */
+
+inline vector float
+vec_vcfux (vector unsigned int a1, const char a2)
+{
+ return (vector float) __builtin_altivec_vcfux ((vector signed int) a1, a2);
+}
+
+/* vec_cts */
+
+inline vector signed int
+vec_cts (vector float a1, const char a2)
+{
+ return (vector signed int) __builtin_altivec_vctsxs ((vector float) a1, a2);
+}
+
+/* vec_ctu */
+
+inline vector unsigned int
+vec_ctu (vector float a1, const char a2)
+{
+ return (vector unsigned int) __builtin_altivec_vctuxs ((vector float) a1, a2);
+}
+
+/* vec_dss */
+
+inline void
+vec_dss (const char a1)
+{
+ __builtin_altivec_dss (a1);
+}
+
+/* vec_dssall */
+
+inline void
+vec_dssall ()
+{
+ __builtin_altivec_dssall ();
+}
+
+/* vec_dst */
+
+inline void
+vec_dst (void *a1, int a2, const char a3)
+{
+ __builtin_altivec_dst ((void *) a1, a2, a3);
+}
+
+/* vec_dstst */
+
+inline void
+vec_dstst (void *a1, int a2, const char a3)
+{
+ __builtin_altivec_dstst ((void *) a1, a2, a3);
+}
+
+/* vec_dststt */
+
+inline void
+vec_dststt (void *a1, int a2, const char a3)
+{
+ __builtin_altivec_dststt ((void *) a1, a2, a3);
+}
+
+/* vec_dstt */
+
+inline void
+vec_dstt (void *a1, int a2, const char a3)
+{
+ __builtin_altivec_dstt ((void *) a1, a2, a3);
+}
+
+/* vec_expte */
+
+inline vector float
+vec_expte (vector float a1)
+{
+ return (vector float) __builtin_altivec_vexptefp ((vector float) a1);
+}
+
+/* vec_floor */
+
+inline vector float
+vec_floor (vector float a1)
+{
+ return (vector float) __builtin_altivec_vrfim ((vector float) a1);
+}
+
+/* vec_ld */
+
+inline vector float
+vec_ld (int a1, vector float *a2)
+{
+ return (vector float) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+inline vector float
+vec_ld (int a1, float *a2)
+{
+ return (vector float) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+inline vector signed int
+vec_ld (int a1, vector signed int *a2)
+{
+ return (vector signed int) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+inline vector signed int
+vec_ld (int a1, signed int *a2)
+{
+ return (vector signed int) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+inline vector unsigned int
+vec_ld (int a1, vector unsigned int *a2)
+{
+ return (vector unsigned int) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+inline vector unsigned int
+vec_ld (int a1, unsigned int *a2)
+{
+ return (vector unsigned int) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+inline vector signed short
+vec_ld (int a1, vector signed short *a2)
+{
+ return (vector signed short) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+inline vector signed short
+vec_ld (int a1, signed short *a2)
+{
+ return (vector signed short) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+inline vector unsigned short
+vec_ld (int a1, vector unsigned short *a2)
+{
+ return (vector unsigned short) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+inline vector unsigned short
+vec_ld (int a1, unsigned short *a2)
+{
+ return (vector unsigned short) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+inline vector signed char
+vec_ld (int a1, vector signed char *a2)
+{
+ return (vector signed char) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+inline vector signed char
+vec_ld (int a1, signed char *a2)
+{
+ return (vector signed char) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_ld (int a1, vector unsigned char *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_ld (int a1, unsigned char *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvx (a1, (void *) a2);
+}
+
+/* vec_lde */
+
+inline vector signed char
+vec_lde (int a1, signed char *a2)
+{
+ return (vector signed char) __builtin_altivec_lvebx (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lde (int a1, unsigned char *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvebx (a1, (void *) a2);
+}
+
+inline vector signed short
+vec_lde (int a1, signed short *a2)
+{
+ return (vector signed short) __builtin_altivec_lvehx (a1, (void *) a2);
+}
+
+inline vector unsigned short
+vec_lde (int a1, unsigned short *a2)
+{
+ return (vector unsigned short) __builtin_altivec_lvehx (a1, (void *) a2);
+}
+
+inline vector float
+vec_lde (int a1, float *a2)
+{
+ return (vector float) __builtin_altivec_lvewx (a1, (void *) a2);
+}
+
+inline vector signed int
+vec_lde (int a1, signed int *a2)
+{
+ return (vector signed int) __builtin_altivec_lvewx (a1, (void *) a2);
+}
+
+inline vector unsigned int
+vec_lde (int a1, unsigned int *a2)
+{
+ return (vector unsigned int) __builtin_altivec_lvewx (a1, (void *) a2);
+}
+
+/* vec_lvewx */
+
+inline vector float
+vec_lvewx (int a1, float *a2)
+{
+ return (vector float) __builtin_altivec_lvewx (a1, (void *) a2);
+}
+
+inline vector signed int
+vec_lvewx (int a1, signed int *a2)
+{
+ return (vector signed int) __builtin_altivec_lvewx (a1, (void *) a2);
+}
+
+inline vector unsigned int
+vec_lvewx (int a1, unsigned int *a2)
+{
+ return (vector unsigned int) __builtin_altivec_lvewx (a1, (void *) a2);
+}
+
+/* vec_lvehx */
+
+inline vector signed short
+vec_lvehx (int a1, signed short *a2)
+{
+ return (vector signed short) __builtin_altivec_lvehx (a1, (void *) a2);
+}
+
+inline vector unsigned short
+vec_lvehx (int a1, unsigned short *a2)
+{
+ return (vector unsigned short) __builtin_altivec_lvehx (a1, (void *) a2);
+}
+
+/* vec_lvebx */
+
+inline vector signed char
+vec_lvebx (int a1, signed char *a2)
+{
+ return (vector signed char) __builtin_altivec_lvebx (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lvebx (int a1, unsigned char *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvebx (a1, (void *) a2);
+}
+
+/* vec_ldl */
+
+inline vector float
+vec_ldl (int a1, vector float *a2)
+{
+ return (vector float) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+inline vector float
+vec_ldl (int a1, float *a2)
+{
+ return (vector float) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+inline vector signed int
+vec_ldl (int a1, vector signed int *a2)
+{
+ return (vector signed int) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+inline vector signed int
+vec_ldl (int a1, signed int *a2)
+{
+ return (vector signed int) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+inline vector unsigned int
+vec_ldl (int a1, vector unsigned int *a2)
+{
+ return (vector unsigned int) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+inline vector unsigned int
+vec_ldl (int a1, unsigned int *a2)
+{
+ return (vector unsigned int) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+inline vector signed short
+vec_ldl (int a1, vector signed short *a2)
+{
+ return (vector signed short) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+inline vector signed short
+vec_ldl (int a1, signed short *a2)
+{
+ return (vector signed short) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+inline vector unsigned short
+vec_ldl (int a1, vector unsigned short *a2)
+{
+ return (vector unsigned short) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+inline vector unsigned short
+vec_ldl (int a1, unsigned short *a2)
+{
+ return (vector unsigned short) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+inline vector signed char
+vec_ldl (int a1, vector signed char *a2)
+{
+ return (vector signed char) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+inline vector signed char
+vec_ldl (int a1, signed char *a2)
+{
+ return (vector signed char) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_ldl (int a1, vector unsigned char *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_ldl (int a1, unsigned char *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvxl (a1, (void *) a2);
+}
+
+/* vec_loge */
+
+inline vector float
+vec_loge (vector float a1)
+{
+ return (vector float) __builtin_altivec_vlogefp ((vector float) a1);
+}
+
+/* vec_lvsl */
+
+inline vector unsigned char
+vec_lvsl (int a1, unsigned char *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsl (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lvsl (int a1, signed char *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsl (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lvsl (int a1, unsigned short *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsl (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lvsl (int a1, signed short *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsl (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lvsl (int a1, unsigned int *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsl (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lvsl (int a1, signed int *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsl (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lvsl (int a1, float *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsl (a1, (void *) a2);
+}
+
+/* vec_lvsr */
+
+inline vector unsigned char
+vec_lvsr (int a1, unsigned char *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsr (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lvsr (int a1, signed char *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsr (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lvsr (int a1, unsigned short *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsr (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lvsr (int a1, signed short *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsr (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lvsr (int a1, unsigned int *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsr (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lvsr (int a1, signed int *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsr (a1, (void *) a2);
+}
+
+inline vector unsigned char
+vec_lvsr (int a1, float *a2)
+{
+ return (vector unsigned char) __builtin_altivec_lvsr (a1, (void *) a2);
+}
+
+/* vec_madd */
+
+inline vector float
+vec_madd (vector float a1, vector float a2, vector float a3)
+{
+ return (vector float) __builtin_altivec_vmaddfp ((vector float) a1, (vector float) a2, (vector float) a3);
+}
+
+
+/* vec_madds */
+
+inline vector signed short
+vec_madds (vector signed short a1, vector signed short a2, vector signed short a3)
+{
+ return (vector signed short) __builtin_altivec_vmhaddshs ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3);
+}
+
+/* vec_max */
+
+inline vector unsigned char
+vec_max (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_max (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_max (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed char
+vec_max (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vmaxsb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned short
+vec_max (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_max (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_max (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed short
+vec_max (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vmaxsh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned int
+vec_max (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_max (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_max (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_max (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vmaxsw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_max (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vmaxfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_vmaxfp */
+
+inline vector float
+vec_vmaxfp (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vmaxfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_vmaxsw */
+
+inline vector signed int
+vec_vmaxsw (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vmaxsw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vmaxuw */
+
+inline vector unsigned int
+vec_vmaxuw (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vmaxuw (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vmaxuw (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vmaxsh */
+
+inline vector signed short
+vec_vmaxsh (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vmaxsh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vmaxuh */
+
+inline vector unsigned short
+vec_vmaxuh (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vmaxuh (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vmaxuh (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vmaxsb */
+
+inline vector signed char
+vec_vmaxsb (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vmaxsb ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_vmaxub */
+
+inline vector unsigned char
+vec_vmaxub (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vmaxub (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vmaxub (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_mergeh */
+
+inline vector signed char
+vec_mergeh (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vmrghb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_mergeh (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vmrghb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed short
+vec_mergeh (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vmrghh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_mergeh (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmrghh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector float
+vec_mergeh (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vmrghw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_mergeh (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vmrghw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_mergeh (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmrghw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vmrghw */
+
+inline vector float
+vec_vmrghw (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vmrghw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_vmrghw (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vmrghw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vmrghw (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmrghw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vmrghh */
+
+inline vector signed short
+vec_vmrghh (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vmrghh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vmrghh (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmrghh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vmrghb */
+
+inline vector signed char
+vec_vmrghb (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vmrghb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vmrghb (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vmrghb ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_mergel */
+
+inline vector signed char
+vec_mergel (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vmrglb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_mergel (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vmrglb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed short
+vec_mergel (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vmrglh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_mergel (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmrglh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector float
+vec_mergel (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vmrglw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_mergel (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vmrglw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_mergel (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmrglw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vmrglw */
+
+inline vector float
+vec_vmrglw (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vmrglw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_vmrglw (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vmrglw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vmrglw (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmrglw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vmrglh */
+
+inline vector signed short
+vec_vmrglh (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vmrglh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vmrglh (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmrglh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vmrglb */
+
+inline vector signed char
+vec_vmrglb (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vmrglb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vmrglb (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vmrglb ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_mfvscr */
+
+inline vector unsigned short
+vec_mfvscr ()
+{
+ return (vector unsigned short) __builtin_altivec_mfvscr ();
+}
+
+/* vec_min */
+
+inline vector unsigned char
+vec_min (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vminub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_min (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vminub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_min (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vminub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed char
+vec_min (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vminsb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned short
+vec_min (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vminuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_min (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vminuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_min (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vminuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed short
+vec_min (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vminsh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned int
+vec_min (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vminuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_min (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vminuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_min (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vminuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_min (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vminsw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_min (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vminfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_vminfp */
+
+inline vector float
+vec_vminfp (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vminfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_vminsw */
+
+inline vector signed int
+vec_vminsw (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vminsw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vminuw */
+
+inline vector unsigned int
+vec_vminuw (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vminuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vminuw (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vminuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vminuw (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vminuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vminsh */
+
+inline vector signed short
+vec_vminsh (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vminsh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vminuh */
+
+inline vector unsigned short
+vec_vminuh (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vminuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vminuh (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vminuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vminuh (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vminuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vminsb */
+
+inline vector signed char
+vec_vminsb (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vminsb ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_vminub */
+
+inline vector unsigned char
+vec_vminub (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vminub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vminub (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vminub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vminub (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vminub ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_mladd */
+
+inline vector signed short
+vec_mladd (vector signed short a1, vector signed short a2, vector signed short a3)
+{
+ return (vector signed short) __builtin_altivec_vmladduhm ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3);
+}
+
+inline vector signed short
+vec_mladd (vector signed short a1, vector unsigned short a2, vector unsigned short a3)
+{
+ return (vector signed short) __builtin_altivec_vmladduhm ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3);
+}
+
+inline vector signed short
+vec_mladd (vector unsigned short a1, vector signed short a2, vector signed short a3)
+{
+ return (vector signed short) __builtin_altivec_vmladduhm ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3);
+}
+
+inline vector unsigned short
+vec_mladd (vector unsigned short a1, vector unsigned short a2, vector unsigned short a3)
+{
+ return (vector unsigned short) __builtin_altivec_vmladduhm ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3);
+}
+
+/* vec_mradds */
+
+inline vector signed short
+vec_mradds (vector signed short a1, vector signed short a2, vector signed short a3)
+{
+ return (vector signed short) __builtin_altivec_vmhraddshs ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3);
+}
+
+/* vec_msum */
+
+inline vector unsigned int
+vec_msum (vector unsigned char a1, vector unsigned char a2, vector unsigned int a3)
+{
+ return (vector unsigned int) __builtin_altivec_vmsumubm ((vector signed char) a1, (vector signed char) a2, (vector signed int) a3);
+}
+
+inline vector signed int
+vec_msum (vector signed char a1, vector unsigned char a2, vector signed int a3)
+{
+ return (vector signed int) __builtin_altivec_vmsummbm ((vector signed char) a1, (vector signed char) a2, (vector signed int) a3);
+}
+
+inline vector unsigned int
+vec_msum (vector unsigned short a1, vector unsigned short a2, vector unsigned int a3)
+{
+ return (vector unsigned int) __builtin_altivec_vmsumuhm ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3);
+}
+
+inline vector signed int
+vec_msum (vector signed short a1, vector signed short a2, vector signed int a3)
+{
+ return (vector signed int) __builtin_altivec_vmsumshm ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3);
+}
+
+/* vec_vmsumshm */
+
+inline vector signed int
+vec_vmsumshm (vector signed short a1, vector signed short a2, vector signed int a3)
+{
+ return (vector signed int) __builtin_altivec_vmsumshm ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3);
+}
+
+/* vec_vmsumuhm */
+
+inline vector unsigned int
+vec_vmsumuhm (vector unsigned short a1, vector unsigned short a2, vector unsigned int a3)
+{
+ return (vector unsigned int) __builtin_altivec_vmsumuhm ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3);
+}
+
+/* vec_vmsummbm */
+
+inline vector signed int
+vec_vmsummbm (vector signed char a1, vector unsigned char a2, vector signed int a3)
+{
+ return (vector signed int) __builtin_altivec_vmsummbm ((vector signed char) a1, (vector signed char) a2, (vector signed int) a3);
+}
+
+/* vec_vmsumubm */
+
+inline vector unsigned int
+vec_vmsumubm (vector unsigned char a1, vector unsigned char a2, vector unsigned int a3)
+{
+ return (vector unsigned int) __builtin_altivec_vmsumubm ((vector signed char) a1, (vector signed char) a2, (vector signed int) a3);
+}
+
+/* vec_msums */
+
+inline vector unsigned int
+vec_msums (vector unsigned short a1, vector unsigned short a2, vector unsigned int a3)
+{
+ return (vector unsigned int) __builtin_altivec_vmsumuhs ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3);
+}
+
+inline vector signed int
+vec_msums (vector signed short a1, vector signed short a2, vector signed int a3)
+{
+ return (vector signed int) __builtin_altivec_vmsumshs ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3);
+}
+
+/* vec_vmsumshs */
+
+inline vector signed int
+vec_vmsumshs (vector signed short a1, vector signed short a2, vector signed int a3)
+{
+ return (vector signed int) __builtin_altivec_vmsumshs ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3);
+}
+
+/* vec_vmsumuhs */
+
+inline vector unsigned int
+vec_vmsumuhs (vector unsigned short a1, vector unsigned short a2, vector unsigned int a3)
+{
+ return (vector unsigned int) __builtin_altivec_vmsumuhs ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3);
+}
+
+/* vec_mtvscr */
+
+inline void
+vec_mtvscr (vector signed int a1)
+{
+ __builtin_altivec_mtvscr ((vector signed int) a1);
+}
+
+inline void
+vec_mtvscr (vector unsigned int a1)
+{
+ __builtin_altivec_mtvscr ((vector signed int) a1);
+}
+
+inline void
+vec_mtvscr (vector signed short a1)
+{
+ __builtin_altivec_mtvscr ((vector signed int) a1);
+}
+
+inline void
+vec_mtvscr (vector unsigned short a1)
+{
+ __builtin_altivec_mtvscr ((vector signed int) a1);
+}
+
+inline void
+vec_mtvscr (vector signed char a1)
+{
+ __builtin_altivec_mtvscr ((vector signed int) a1);
+}
+
+inline void
+vec_mtvscr (vector unsigned char a1)
+{
+ __builtin_altivec_mtvscr ((vector signed int) a1);
+}
+
+/* vec_mule */
+
+inline vector unsigned short
+vec_mule (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmuleub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed short
+vec_mule (vector signed char a1, vector signed char a2)
+{
+ return (vector signed short) __builtin_altivec_vmulesb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned int
+vec_mule (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmuleuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed int
+vec_mule (vector signed short a1, vector signed short a2)
+{
+ return (vector signed int) __builtin_altivec_vmulesh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vmulesh */
+
+inline vector signed int
+vec_vmulesh (vector signed short a1, vector signed short a2)
+{
+ return (vector signed int) __builtin_altivec_vmulesh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vmuleuh */
+
+inline vector unsigned int
+vec_vmuleuh (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmuleuh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vmuleub */
+inline vector unsigned short
+vec_vmuleub (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmuleub ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_mulo */
+
+inline vector unsigned short
+vec_mulo (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmuloub ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed short
+vec_mulo (vector signed char a1, vector signed char a2)
+{
+ return (vector signed short) __builtin_altivec_vmulosb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned int
+vec_mulo (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmulouh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed int
+vec_mulo (vector signed short a1, vector signed short a2)
+{
+ return (vector signed int) __builtin_altivec_vmulosh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vmulosh */
+
+inline vector signed int
+vec_vmulosh (vector signed short a1, vector signed short a2)
+{
+ return (vector signed int) __builtin_altivec_vmulosh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vmulouh */
+
+inline vector unsigned int
+vec_vmulouh (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned int) __builtin_altivec_vmulouh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vmulosb */
+
+inline vector signed short
+vec_vmulosb (vector signed char a1, vector signed char a2)
+{
+ return (vector signed short) __builtin_altivec_vmulosb ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_vmuloub */
+
+inline vector unsigned short
+vec_vmuloub (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned short) __builtin_altivec_vmuloub ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_nmsub */
+
+inline vector float
+vec_nmsub (vector float a1, vector float a2, vector float a3)
+{
+ return (vector float) __builtin_altivec_vnmsubfp ((vector float) a1, (vector float) a2, (vector float) a3);
+}
+
+/* vec_nor */
+
+inline vector float
+vec_nor (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_nor (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_nor (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_nor (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_nor (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_nor (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_nor (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_or */
+
+inline vector float
+vec_or (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_or (vector float a1, vector signed int a2)
+{
+ return (vector float) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_or (vector signed int a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_or (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_or (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_or (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_or (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_or (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_or (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_or (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_or (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_or (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_or (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_or (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_or (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_pack */
+
+inline vector signed char
+vec_pack (vector signed short a1, vector signed short a2)
+{
+ return (vector signed char) __builtin_altivec_vpkuhum ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned char
+vec_pack (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned char) __builtin_altivec_vpkuhum ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed short
+vec_pack (vector signed int a1, vector signed int a2)
+{
+ return (vector signed short) __builtin_altivec_vpkuwum ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_pack (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned short) __builtin_altivec_vpkuwum ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vpkuwum */
+
+inline vector signed short
+vec_vpkuwum (vector signed int a1, vector signed int a2)
+{
+ return (vector signed short) __builtin_altivec_vpkuwum ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_vpkuwum (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned short) __builtin_altivec_vpkuwum ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vpkuhum */
+
+inline vector signed char
+vec_vpkuhum (vector signed short a1, vector signed short a2)
+{
+ return (vector signed char) __builtin_altivec_vpkuhum ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned char
+vec_vpkuhum (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned char) __builtin_altivec_vpkuhum ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_packpx */
+
+inline vector signed short
+vec_packpx (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector signed short) __builtin_altivec_vpkpx ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_packs */
+
+inline vector unsigned char
+vec_packs (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned char) __builtin_altivec_vpkuhus ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed char
+vec_packs (vector signed short a1, vector signed short a2)
+{
+ return (vector signed char) __builtin_altivec_vpkshss ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_packs (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned short) __builtin_altivec_vpkuwus ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_packs (vector signed int a1, vector signed int a2)
+{
+ return (vector signed short) __builtin_altivec_vpkswss ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vpkswss */
+
+inline vector signed short
+vec_vpkswss (vector signed int a1, vector signed int a2)
+{
+ return (vector signed short) __builtin_altivec_vpkswss ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vpkuwus */
+
+inline vector unsigned short
+vec_vpkuwus (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned short) __builtin_altivec_vpkuwus ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vpkshss */
+
+inline vector signed char
+vec_vpkshss (vector signed short a1, vector signed short a2)
+{
+ return (vector signed char) __builtin_altivec_vpkshss ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vpkuhus */
+
+inline vector unsigned char
+vec_vpkuhus (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned char) __builtin_altivec_vpkuhus ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_packsu */
+
+inline vector unsigned char
+vec_packsu (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned char) __builtin_altivec_vpkuhus ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned char
+vec_packsu (vector signed short a1, vector signed short a2)
+{
+ return (vector unsigned char) __builtin_altivec_vpkshus ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_packsu (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned short) __builtin_altivec_vpkuwus ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_packsu (vector signed int a1, vector signed int a2)
+{
+ return (vector unsigned short) __builtin_altivec_vpkswus ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vpkswus */
+
+inline vector unsigned short
+vec_vpkswus (vector signed int a1, vector signed int a2)
+{
+ return (vector unsigned short) __builtin_altivec_vpkswus ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vpkshus */
+
+inline vector unsigned char
+vec_vpkshus (vector signed short a1, vector signed short a2)
+{
+ return (vector unsigned char) __builtin_altivec_vpkshus ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_perm */
+
+inline vector float
+vec_perm (vector float a1, vector float a2, vector unsigned char a3)
+{
+ return (vector float) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3);
+}
+
+inline vector signed int
+vec_perm (vector signed int a1, vector signed int a2, vector unsigned char a3)
+{
+ return (vector signed int) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3);
+}
+
+inline vector unsigned int
+vec_perm (vector unsigned int a1, vector unsigned int a2, vector unsigned char a3)
+{
+ return (vector unsigned int) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3);
+}
+
+inline vector signed short
+vec_perm (vector signed short a1, vector signed short a2, vector unsigned char a3)
+{
+ return (vector signed short) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3);
+}
+
+inline vector unsigned short
+vec_perm (vector unsigned short a1, vector unsigned short a2, vector unsigned char a3)
+{
+ return (vector unsigned short) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3);
+}
+
+inline vector signed char
+vec_perm (vector signed char a1, vector signed char a2, vector unsigned char a3)
+{
+ return (vector signed char) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3);
+}
+
+inline vector unsigned char
+vec_perm (vector unsigned char a1, vector unsigned char a2, vector unsigned char a3)
+{
+ return (vector unsigned char) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3);
+}
+
+/* vec_re */
+
+inline vector float
+vec_re (vector float a1)
+{
+ return (vector float) __builtin_altivec_vrefp ((vector float) a1);
+}
+
+/* vec_rl */
+
+inline vector signed char
+vec_rl (vector signed char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vrlb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_rl (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vrlb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed short
+vec_rl (vector signed short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vrlh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_rl (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vrlh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed int
+vec_rl (vector signed int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vrlw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_rl (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vrlw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vrlw */
+
+inline vector signed int
+vec_vrlw (vector signed int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vrlw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vrlw (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vrlw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vrlh */
+
+inline vector signed short
+vec_vrlh (vector signed short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vrlh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vrlh (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vrlh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vrlb */
+
+inline vector signed char
+vec_vrlb (vector signed char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vrlb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vrlb (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vrlb ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_round */
+
+inline vector float
+vec_round (vector float a1)
+{
+ return (vector float) __builtin_altivec_vrfin ((vector float) a1);
+}
+
+/* vec_rsqrte */
+
+inline vector float
+vec_rsqrte (vector float a1)
+{
+ return (vector float) __builtin_altivec_vrsqrtefp ((vector float) a1);
+}
+
+/* vec_sel */
+
+inline vector float
+vec_sel (vector float a1, vector float a2, vector signed int a3)
+{
+ return (vector float) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+inline vector float
+vec_sel (vector float a1, vector float a2, vector unsigned int a3)
+{
+ return (vector float) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+inline vector signed int
+vec_sel (vector signed int a1, vector signed int a2, vector signed int a3)
+{
+ return (vector signed int) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+inline vector signed int
+vec_sel (vector signed int a1, vector signed int a2, vector unsigned int a3)
+{
+ return (vector signed int) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+inline vector unsigned int
+vec_sel (vector unsigned int a1, vector unsigned int a2, vector signed int a3)
+{
+ return (vector unsigned int) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+inline vector unsigned int
+vec_sel (vector unsigned int a1, vector unsigned int a2, vector unsigned int a3)
+{
+ return (vector unsigned int) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+inline vector signed short
+vec_sel (vector signed short a1, vector signed short a2, vector signed short a3)
+{
+ return (vector signed short) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+inline vector signed short
+vec_sel (vector signed short a1, vector signed short a2, vector unsigned short a3)
+{
+ return (vector signed short) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+inline vector unsigned short
+vec_sel (vector unsigned short a1, vector unsigned short a2, vector signed short a3)
+{
+ return (vector unsigned short) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+inline vector unsigned short
+vec_sel (vector unsigned short a1, vector unsigned short a2, vector unsigned short a3)
+{
+ return (vector unsigned short) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+inline vector signed char
+vec_sel (vector signed char a1, vector signed char a2, vector signed char a3)
+{
+ return (vector signed char) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+inline vector signed char
+vec_sel (vector signed char a1, vector signed char a2, vector unsigned char a3)
+{
+ return (vector signed char) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+inline vector unsigned char
+vec_sel (vector unsigned char a1, vector unsigned char a2, vector signed char a3)
+{
+ return (vector unsigned char) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+inline vector unsigned char
+vec_sel (vector unsigned char a1, vector unsigned char a2, vector unsigned char a3)
+{
+ return (vector unsigned char) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3);
+}
+
+/* vec_sl */
+
+inline vector signed char
+vec_sl (vector signed char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vslb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_sl (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vslb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed short
+vec_sl (vector signed short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vslh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_sl (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vslh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed int
+vec_sl (vector signed int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vslw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_sl (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vslw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vslw */
+
+inline vector signed int
+vec_vslw (vector signed int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vslw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vslw (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vslw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vslh */
+
+inline vector signed short
+vec_vslh (vector signed short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vslh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vslh (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vslh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vslb */
+
+inline vector signed char
+vec_vslb (vector signed char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vslb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vslb (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vslb ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_sld */
+
+inline vector float
+vec_sld (vector float a1, vector float a2, const char a3)
+{
+ return (vector float) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, a3);
+}
+
+inline vector signed int
+vec_sld (vector signed int a1, vector signed int a2, const char a3)
+{
+ return (vector signed int) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, a3);
+}
+
+inline vector unsigned int
+vec_sld (vector unsigned int a1, vector unsigned int a2, const char a3)
+{
+ return (vector unsigned int) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, a3);
+}
+
+inline vector signed short
+vec_sld (vector signed short a1, vector signed short a2, const char a3)
+{
+ return (vector signed short) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, a3);
+}
+
+inline vector unsigned short
+vec_sld (vector unsigned short a1, vector unsigned short a2, const char a3)
+{
+ return (vector unsigned short) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, a3);
+}
+
+inline vector signed char
+vec_sld (vector signed char a1, vector signed char a2, const char a3)
+{
+ return (vector signed char) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, a3);
+}
+
+inline vector unsigned char
+vec_sld (vector unsigned char a1, vector unsigned char a2, const char a3)
+{
+ return (vector unsigned char) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, a3);
+}
+
+/* vec_sll */
+
+inline vector signed int
+vec_sll (vector signed int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_sll (vector signed int a1, vector unsigned short a2)
+{
+ return (vector signed int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_sll (vector signed int a1, vector unsigned char a2)
+{
+ return (vector signed int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_sll (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_sll (vector unsigned int a1, vector unsigned short a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_sll (vector unsigned int a1, vector unsigned char a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_sll (vector signed short a1, vector unsigned int a2)
+{
+ return (vector signed short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_sll (vector signed short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_sll (vector signed short a1, vector unsigned char a2)
+{
+ return (vector signed short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_sll (vector unsigned short a1, vector unsigned int a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_sll (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_sll (vector unsigned short a1, vector unsigned char a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_sll (vector signed char a1, vector unsigned int a2)
+{
+ return (vector signed char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_sll (vector signed char a1, vector unsigned short a2)
+{
+ return (vector signed char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_sll (vector signed char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_sll (vector unsigned char a1, vector unsigned int a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_sll (vector unsigned char a1, vector unsigned short a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_sll (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_slo */
+
+inline vector float
+vec_slo (vector float a1, vector signed char a2)
+{
+ return (vector float) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_slo (vector float a1, vector unsigned char a2)
+{
+ return (vector float) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_slo (vector signed int a1, vector signed char a2)
+{
+ return (vector signed int) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_slo (vector signed int a1, vector unsigned char a2)
+{
+ return (vector signed int) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_slo (vector unsigned int a1, vector signed char a2)
+{
+ return (vector unsigned int) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_slo (vector unsigned int a1, vector unsigned char a2)
+{
+ return (vector unsigned int) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_slo (vector signed short a1, vector signed char a2)
+{
+ return (vector signed short) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_slo (vector signed short a1, vector unsigned char a2)
+{
+ return (vector signed short) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_slo (vector unsigned short a1, vector signed char a2)
+{
+ return (vector unsigned short) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_slo (vector unsigned short a1, vector unsigned char a2)
+{
+ return (vector unsigned short) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_slo (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_slo (vector signed char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_slo (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_slo (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_splat */
+
+inline vector signed char
+vec_splat (vector signed char a1, const char a2)
+{
+ return (vector signed char) __builtin_altivec_vspltb ((vector signed char) a1, a2);
+}
+
+inline vector unsigned char
+vec_splat (vector unsigned char a1, const char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vspltb ((vector signed char) a1, a2);
+}
+
+inline vector signed short
+vec_splat (vector signed short a1, const char a2)
+{
+ return (vector signed short) __builtin_altivec_vsplth ((vector signed short) a1, a2);
+}
+
+inline vector unsigned short
+vec_splat (vector unsigned short a1, const char a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsplth ((vector signed short) a1, a2);
+}
+
+inline vector float
+vec_splat (vector float a1, const char a2)
+{
+ return (vector float) __builtin_altivec_vspltw ((vector signed int) a1, a2);
+}
+
+inline vector signed int
+vec_splat (vector signed int a1, const char a2)
+{
+ return (vector signed int) __builtin_altivec_vspltw ((vector signed int) a1, a2);
+}
+
+inline vector unsigned int
+vec_splat (vector unsigned int a1, const char a2)
+{
+ return (vector unsigned int) __builtin_altivec_vspltw ((vector signed int) a1, a2);
+}
+
+/* vec_vspltw */
+
+inline vector float
+vec_vspltw (vector float a1, const char a2)
+{
+ return (vector float) __builtin_altivec_vspltw ((vector signed int) a1, a2);
+}
+
+inline vector signed int
+vec_vspltw (vector signed int a1, const char a2)
+{
+ return (vector signed int) __builtin_altivec_vspltw ((vector signed int) a1, a2);
+}
+
+inline vector unsigned int
+vec_vspltw (vector unsigned int a1, const char a2)
+{
+ return (vector unsigned int) __builtin_altivec_vspltw ((vector signed int) a1, a2);
+}
+
+/* vec_vsplth */
+
+inline vector signed short
+vec_vsplth (vector signed short a1, const char a2)
+{
+ return (vector signed short) __builtin_altivec_vsplth ((vector signed short) a1, a2);
+}
+
+inline vector unsigned short
+vec_vsplth (vector unsigned short a1, const char a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsplth ((vector signed short) a1, a2);
+}
+
+/* vec_vspltb */
+
+inline vector signed char
+vec_vspltb (vector signed char a1, const char a2)
+{
+ return (vector signed char) __builtin_altivec_vspltb ((vector signed char) a1, a2);
+}
+
+inline vector unsigned char
+vec_vspltb (vector unsigned char a1, const char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vspltb ((vector signed char) a1, a2);
+}
+
+/* vec_splat_s8 */
+
+inline vector signed char
+vec_splat_s8 (const char a1)
+{
+ return (vector signed char) __builtin_altivec_vspltisb (a1);
+}
+
+/* vec_splat_s16 */
+
+inline vector signed short
+vec_splat_s16 (const char a1)
+{
+ return (vector signed short) __builtin_altivec_vspltish (a1);
+}
+
+/* vec_splat_s32 */
+
+inline vector signed int
+vec_splat_s32 (const char a1)
+{
+ return (vector signed int) __builtin_altivec_vspltisw (a1);
+}
+
+/* vec_splat_u8 */
+
+inline vector unsigned char
+vec_splat_u8 (const char a1)
+{
+ return (vector unsigned char) __builtin_altivec_vspltisb (a1);
+}
+
+/* vec_splat_u16 */
+
+inline vector unsigned short
+vec_splat_u16 (const char a1)
+{
+ return (vector unsigned short) __builtin_altivec_vspltish (a1);
+}
+
+/* vec_splat_u32 */
+
+inline vector unsigned int
+vec_splat_u32 (const char a1)
+{
+ return (vector unsigned int) __builtin_altivec_vspltisw (a1);
+}
+
+/* vec_sr */
+
+inline vector signed char
+vec_sr (vector signed char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vsrb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_sr (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsrb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed short
+vec_sr (vector signed short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vsrh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_sr (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsrh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed int
+vec_sr (vector signed int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vsrw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_sr (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsrw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vsrw */
+
+inline vector signed int
+vec_vsrw (vector signed int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vsrw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vsrw (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsrw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vsrh */
+
+inline vector signed short
+vec_vsrh (vector signed short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vsrh ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vsrh (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsrh ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vsrb */
+
+inline vector signed char
+vec_vsrb (vector signed char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vsrb ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vsrb (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsrb ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_sra */
+
+inline vector signed char
+vec_sra (vector signed char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vsrab ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_sra (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsrab ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed short
+vec_sra (vector signed short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vsrah ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_sra (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsrah ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed int
+vec_sra (vector signed int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vsraw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_sra (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsraw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vsraw */
+
+inline vector signed int
+vec_vsraw (vector signed int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vsraw ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vsraw (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsraw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vsrah */
+
+inline vector signed short
+vec_vsrah (vector signed short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vsrah ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vsrah (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsrah ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vsrab */
+
+inline vector signed char
+vec_vsrab (vector signed char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vsrab ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vsrab (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsrab ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_srl */
+
+inline vector signed int
+vec_srl (vector signed int a1, vector unsigned int a2)
+{
+ return (vector signed int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_srl (vector signed int a1, vector unsigned short a2)
+{
+ return (vector signed int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_srl (vector signed int a1, vector unsigned char a2)
+{
+ return (vector signed int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_srl (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_srl (vector unsigned int a1, vector unsigned short a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_srl (vector unsigned int a1, vector unsigned char a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_srl (vector signed short a1, vector unsigned int a2)
+{
+ return (vector signed short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_srl (vector signed short a1, vector unsigned short a2)
+{
+ return (vector signed short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_srl (vector signed short a1, vector unsigned char a2)
+{
+ return (vector signed short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_srl (vector unsigned short a1, vector unsigned int a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_srl (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_srl (vector unsigned short a1, vector unsigned char a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_srl (vector signed char a1, vector unsigned int a2)
+{
+ return (vector signed char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_srl (vector signed char a1, vector unsigned short a2)
+{
+ return (vector signed char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_srl (vector signed char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_srl (vector unsigned char a1, vector unsigned int a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_srl (vector unsigned char a1, vector unsigned short a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_srl (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_sro */
+
+inline vector float
+vec_sro (vector float a1, vector signed char a2)
+{
+ return (vector float) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_sro (vector float a1, vector unsigned char a2)
+{
+ return (vector float) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_sro (vector signed int a1, vector signed char a2)
+{
+ return (vector signed int) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_sro (vector signed int a1, vector unsigned char a2)
+{
+ return (vector signed int) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_sro (vector unsigned int a1, vector signed char a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_sro (vector unsigned int a1, vector unsigned char a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_sro (vector signed short a1, vector signed char a2)
+{
+ return (vector signed short) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_sro (vector signed short a1, vector unsigned char a2)
+{
+ return (vector signed short) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_sro (vector unsigned short a1, vector signed char a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_sro (vector unsigned short a1, vector unsigned char a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_sro (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_sro (vector signed char a1, vector unsigned char a2)
+{
+ return (vector signed char) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_sro (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_sro (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_st */
+
+inline void
+vec_st (vector float a1, int a2, void *a3)
+{
+ __builtin_altivec_stvx ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_st (vector signed int a1, int a2, void *a3)
+{
+ __builtin_altivec_stvx ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_st (vector unsigned int a1, int a2, void *a3)
+{
+ __builtin_altivec_stvx ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_st (vector signed short a1, int a2, void *a3)
+{
+ __builtin_altivec_stvx ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_st (vector unsigned short a1, int a2, void *a3)
+{
+ __builtin_altivec_stvx ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_st (vector signed char a1, int a2, void *a3)
+{
+ __builtin_altivec_stvx ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_st (vector unsigned char a1, int a2, void *a3)
+{
+ __builtin_altivec_stvx ((vector signed int) a1, a2, (void *) a3);
+}
+
+/* vec_ste */
+
+inline void
+vec_ste (vector signed char a1, int a2, void *a3)
+{
+ __builtin_altivec_stvebx ((vector signed char) a1, a2, (void *) a3);
+}
+
+inline void
+vec_ste (vector unsigned char a1, int a2, void *a3)
+{
+ __builtin_altivec_stvebx ((vector signed char) a1, a2, (void *) a3);
+}
+
+inline void
+vec_ste (vector signed short a1, int a2, void *a3)
+{
+ __builtin_altivec_stvehx ((vector signed short) a1, a2, (void *) a3);
+}
+
+inline void
+vec_ste (vector unsigned short a1, int a2, void *a3)
+{
+ __builtin_altivec_stvehx ((vector signed short) a1, a2, (void *) a3);
+}
+
+inline void
+vec_ste (vector float a1, int a2, void *a3)
+{
+ __builtin_altivec_stvewx ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_ste (vector signed int a1, int a2, void *a3)
+{
+ __builtin_altivec_stvewx ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_ste (vector unsigned int a1, int a2, void *a3)
+{
+ __builtin_altivec_stvewx ((vector signed int) a1, a2, (void *) a3);
+}
+
+/* vec_stvewx */
+
+inline void
+vec_stvewx (vector float a1, int a2, void *a3)
+{
+ __builtin_altivec_stvewx ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_stvewx (vector signed int a1, int a2, void *a3)
+{
+ __builtin_altivec_stvewx ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_stvewx (vector unsigned int a1, int a2, void *a3)
+{
+ __builtin_altivec_stvewx ((vector signed int) a1, a2, (void *) a3);
+}
+
+/* vec_stvehx */
+
+inline void
+vec_stvehx (vector signed short a1, int a2, void *a3)
+{
+ __builtin_altivec_stvehx ((vector signed short) a1, a2, (void *) a3);
+}
+
+inline void
+vec_stvehx (vector unsigned short a1, int a2, void *a3)
+{
+ __builtin_altivec_stvehx ((vector signed short) a1, a2, (void *) a3);
+}
+
+/* vec_stvebx */
+
+inline void
+vec_stvebx (vector signed char a1, int a2, void *a3)
+{
+ __builtin_altivec_stvebx ((vector signed char) a1, a2, (void *) a3);
+}
+
+inline void
+vec_stvebx (vector unsigned char a1, int a2, void *a3)
+{
+ __builtin_altivec_stvebx ((vector signed char) a1, a2, (void *) a3);
+}
+
+/* vec_stl */
+
+inline void
+vec_stl (vector float a1, int a2, void *a3)
+{
+ __builtin_altivec_stvxl ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_stl (vector signed int a1, int a2, void *a3)
+{
+ __builtin_altivec_stvxl ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_stl (vector unsigned int a1, int a2, void *a3)
+{
+ __builtin_altivec_stvxl ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_stl (vector signed short a1, int a2, void *a3)
+{
+ __builtin_altivec_stvxl ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_stl (vector unsigned short a1, int a2, void *a3)
+{
+ __builtin_altivec_stvxl ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_stl (vector signed char a1, int a2, void *a3)
+{
+ __builtin_altivec_stvxl ((vector signed int) a1, a2, (void *) a3);
+}
+
+inline void
+vec_stl (vector unsigned char a1, int a2, void *a3)
+{
+ __builtin_altivec_stvxl ((vector signed int) a1, a2, (void *) a3);
+}
+
+/* vec_sub */
+
+inline vector signed char
+vec_sub (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_sub (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_sub (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_sub (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed short
+vec_sub (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_sub (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_sub (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_sub (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed int
+vec_sub (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_sub (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_sub (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_sub (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_sub (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vsubfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_vsubfp */
+
+inline vector float
+vec_vsubfp (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vsubfp ((vector float) a1, (vector float) a2);
+}
+
+/* vec_vsubuwm */
+
+inline vector signed int
+vec_vsubuwm (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vsubuwm (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vsubuwm (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vsubuwm (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vsubuhm */
+
+inline vector signed short
+vec_vsubuhm (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vsubuhm (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vsubuhm (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vsubuhm (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vsububm */
+
+inline vector signed char
+vec_vsububm (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vsububm (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vsububm (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vsububm (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_subc */
+
+inline vector unsigned int
+vec_subc (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsubcuw ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_subs */
+
+inline vector unsigned char
+vec_subs (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsububs ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_subs (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsububs ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_subs (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsububs ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector signed char
+vec_subs (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vsubsbs ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned short
+vec_subs (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_subs (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_subs (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector signed short
+vec_subs (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vsubshs ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned int
+vec_subs (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_subs (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_subs (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_subs (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vsubsws ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vsubsws */
+
+inline vector signed int
+vec_vsubsws (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vsubsws ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vsubuws */
+
+inline vector unsigned int
+vec_vsubuws (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vsubuws (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_vsubuws (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_vsubshs */
+
+inline vector signed short
+vec_vsubshs (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vsubshs ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vsubuhs */
+
+inline vector unsigned short
+vec_vsubuhs (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vsubuhs (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vsubuhs */
+
+inline vector unsigned short
+vec_vsubsuhs (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vsubsuhs (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+inline vector unsigned short
+vec_vsubsuhs (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2);
+}
+
+/* vec_vsubsbs */
+
+inline vector signed char
+vec_vsubsbs (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vsubsbs ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_vsububs */
+
+inline vector unsigned char
+vec_vsubsubs (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsububs ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vsubsubs (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsububs ((vector signed char) a1, (vector signed char) a2);
+}
+
+inline vector unsigned char
+vec_vsubsubs (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vsububs ((vector signed char) a1, (vector signed char) a2);
+}
+
+/* vec_sum4s */
+
+inline vector unsigned int
+vec_sum4s (vector unsigned char a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsum4ubs ((vector signed char) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_sum4s (vector signed char a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vsum4sbs ((vector signed char) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_sum4s (vector signed short a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vsum4shs ((vector signed short) a1, (vector signed int) a2);
+}
+
+/* vec_vsum4shs */
+
+inline vector signed int
+vec_vsum4shss (vector signed short a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vsum4shs ((vector signed short) a1, (vector signed int) a2);
+}
+
+/* vec_vsum4sbs */
+
+inline vector signed int
+vec_vsum4sbs (vector signed char a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vsum4sbs ((vector signed char) a1, (vector signed int) a2);
+}
+
+/* vec_vsum4ubs */
+
+inline vector unsigned int
+vec_vsum4ubs (vector unsigned char a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vsum4ubs ((vector signed char) a1, (vector signed int) a2);
+}
+
+/* vec_sum2s */
+
+inline vector signed int
+vec_sum2s (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vsum2sws ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_sums */
+
+inline vector signed int
+vec_sums (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vsumsws ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_trunc */
+
+inline vector float
+vec_trunc (vector float a1)
+{
+ return (vector float) __builtin_altivec_vrfiz ((vector float) a1);
+}
+
+/* vec_unpackh */
+
+inline vector signed short
+vec_unpackh (vector signed char a1)
+{
+ return (vector signed short) __builtin_altivec_vupkhsb ((vector signed char) a1);
+}
+
+inline vector signed int
+vec_unpackh (vector signed short a1)
+{
+ return (vector signed int) __builtin_altivec_vupkhsh ((vector signed short) a1);
+}
+
+/* vec_vupkhsh */
+
+inline vector signed int
+vec_vupkhsh (vector signed short a1)
+{
+ return (vector signed int) __builtin_altivec_vupkhsh ((vector signed short) a1);
+}
+
+/* vec_vupkhpx */
+
+inline vector unsigned int
+vec_vupkhpx (vector signed short a1)
+{
+ return (vector unsigned int) __builtin_altivec_vupkhpx ((vector signed short) a1);
+}
+
+/* vec_vupkhsb */
+
+inline vector signed short
+vec_vupkhsb (vector signed char a1)
+{
+ return (vector signed short) __builtin_altivec_vupkhsb ((vector signed char) a1);
+}
+
+/* vec_unpackl */
+
+inline vector signed short
+vec_unpackl (vector signed char a1)
+{
+ return (vector signed short) __builtin_altivec_vupklsb ((vector signed char) a1);
+}
+
+inline vector unsigned int
+vec_vupklpx (vector signed short a1)
+{
+ return (vector unsigned int) __builtin_altivec_vupklpx ((vector signed short) a1);
+}
+
+inline vector signed int
+vec_unpackl (vector signed short a1)
+{
+ return (vector signed int) __builtin_altivec_vupklsh ((vector signed short) a1);
+}
+
+/* vec_upklsh */
+
+inline vector signed int
+vec_vupklsh (vector signed short a1)
+{
+ return (vector signed int) __builtin_altivec_vupklsh ((vector signed short) a1);
+}
+
+/* vec_vupklsb */
+
+inline vector signed short
+vec_vupklsb (vector signed char a1)
+{
+ return (vector signed short) __builtin_altivec_vupklsb ((vector signed char) a1);
+}
+
+/* vec_xor */
+
+inline vector float
+vec_xor (vector float a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_xor (vector float a1, vector signed int a2)
+{
+ return (vector float) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector float
+vec_xor (vector signed int a1, vector float a2)
+{
+ return (vector float) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed int
+vec_xor (vector signed int a1, vector signed int a2)
+{
+ return (vector signed int) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_xor (vector signed int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_xor (vector unsigned int a1, vector signed int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned int
+vec_xor (vector unsigned int a1, vector unsigned int a2)
+{
+ return (vector unsigned int) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed short
+vec_xor (vector signed short a1, vector signed short a2)
+{
+ return (vector signed short) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_xor (vector signed short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_xor (vector unsigned short a1, vector signed short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned short
+vec_xor (vector unsigned short a1, vector unsigned short a2)
+{
+ return (vector unsigned short) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector signed char
+vec_xor (vector signed char a1, vector signed char a2)
+{
+ return (vector signed char) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_xor (vector signed char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_xor (vector unsigned char a1, vector signed char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+inline vector unsigned char
+vec_xor (vector unsigned char a1, vector unsigned char a2)
+{
+ return (vector unsigned char) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2);
+}
+
+/* vec_all_eq */
+
+inline int
+vec_all_eq (vector signed char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_LT, a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_eq (vector signed char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_LT, a1, a2);
+}
+
+inline int
+vec_all_eq (vector unsigned char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_LT, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_eq (vector unsigned char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_LT, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_eq (vector signed short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_LT, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_eq (vector signed short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_LT, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_eq (vector unsigned short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_LT, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_eq (vector unsigned short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_LT, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_eq (vector signed int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_LT, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_eq (vector signed int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_LT, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_eq (vector unsigned int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_LT, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_eq (vector unsigned int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_LT, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_eq (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpeqfp_p (__CR6_LT, a1, a2);
+}
+
+/* vec_all_ge */
+
+inline int
+vec_all_ge (vector signed char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_EQ, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_all_ge (vector unsigned char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_EQ, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_all_ge (vector unsigned char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_EQ, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_all_ge (vector signed char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtsb_p (__CR6_EQ, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_all_ge (vector signed short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_EQ, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_all_ge (vector unsigned short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_EQ, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_all_ge (vector unsigned short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_EQ, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_all_ge (vector signed short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtsh_p (__CR6_EQ, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_all_ge (vector signed int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_EQ, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_all_ge (vector unsigned int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_EQ, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_all_ge (vector unsigned int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_EQ, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_all_ge (vector signed int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtsw_p (__CR6_EQ, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_all_ge (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgefp_p (__CR6_EQ, a1, a2);
+}
+
+/* vec_all_gt */
+
+inline int
+vec_all_gt (vector signed char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_LT, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_gt (vector unsigned char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_LT, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_gt (vector unsigned char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_LT, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_gt (vector signed char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtsb_p (__CR6_LT, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_gt (vector signed short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_LT, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_gt (vector unsigned short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_LT, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_gt (vector unsigned short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_LT, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_gt (vector signed short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtsh_p (__CR6_LT, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_gt (vector signed int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_LT, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_gt (vector unsigned int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_LT, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_gt (vector unsigned int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_LT, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_gt (vector signed int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtsw_p (__CR6_LT, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_gt (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgtfp_p (__CR6_LT, a1, a2);
+}
+
+/* vec_all_in */
+
+inline int
+vec_all_in (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpbfp_p (__CR6_EQ, a1, a2);
+}
+
+/* vec_all_le */
+
+inline int
+vec_all_le (vector signed char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_EQ, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_le (vector unsigned char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_EQ, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_le (vector unsigned char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_EQ, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_le (vector signed char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtsb_p (__CR6_EQ, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_le (vector signed short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_EQ, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_le (vector unsigned short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_EQ, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_le (vector unsigned short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_EQ, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_le (vector signed short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtsh_p (__CR6_EQ, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_le (vector signed int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_EQ, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_le (vector unsigned int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_EQ, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_le (vector unsigned int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_EQ, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_le (vector signed int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtsw_p (__CR6_EQ, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_le (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgefp_p (__CR6_LT, a2, a1);
+}
+
+/* vec_all_lt */
+
+inline int
+vec_all_lt (vector signed char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_LT, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_all_lt (vector unsigned char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_LT, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_all_lt (vector unsigned char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_LT, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_all_lt (vector signed char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtsb_p (__CR6_LT, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_all_lt (vector signed short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_LT, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_all_lt (vector unsigned short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_LT, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_all_lt (vector unsigned short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_LT, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_all_lt (vector signed short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtsh_p (__CR6_LT, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_all_lt (vector signed int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_LT, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_all_lt (vector unsigned int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_LT, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_all_lt (vector unsigned int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_LT, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_all_lt (vector signed int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtsw_p (__CR6_LT, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_all_lt (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgtfp_p (__CR6_LT, a2, a1);
+}
+
+/* vec_all_nan */
+
+inline int
+vec_all_nan (vector float a1)
+{
+ return __builtin_altivec_vcmpeqfp_p (__CR6_EQ, a1, a1);
+}
+
+/* vec_all_ne */
+
+inline int
+vec_all_ne (vector signed char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_EQ, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_ne (vector signed char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_EQ, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_ne (vector unsigned char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_EQ, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_ne (vector unsigned char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_EQ, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_all_ne (vector signed short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_EQ, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_ne (vector signed short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_EQ, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_ne (vector unsigned short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_EQ, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_ne (vector unsigned short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_EQ, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_all_ne (vector signed int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_EQ, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_ne (vector signed int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_EQ, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_ne (vector unsigned int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_EQ, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_ne (vector unsigned int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_EQ, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_all_ne (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpeqfp_p (__CR6_EQ, a1, a2);
+}
+
+/* vec_all_nge */
+
+inline int
+vec_all_nge (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgefp_p (__CR6_EQ, a1, a2);
+}
+
+/* vec_all_ngt */
+
+inline int
+vec_all_ngt (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a1, a2);
+}
+
+/* vec_all_nle */
+
+inline int
+vec_all_nle (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgefp_p (__CR6_EQ, a2, a1);
+}
+
+/* vec_all_nlt */
+
+inline int
+vec_all_nlt (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a2, a1);
+}
+
+/* vec_all_numeric */
+
+inline int
+vec_all_numeric (vector float a1)
+{
+ return __builtin_altivec_vcmpeqfp_p (__CR6_EQ, a1, a1);
+}
+
+/* vec_any_eq */
+
+inline int
+vec_any_eq (vector signed char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_EQ_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_eq (vector signed char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_EQ_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_eq (vector unsigned char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_EQ_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_eq (vector unsigned char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_EQ_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_eq (vector signed short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_EQ_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_eq (vector signed short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_EQ_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_eq (vector unsigned short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_EQ_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_eq (vector unsigned short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_EQ_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_eq (vector signed int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_EQ_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_eq (vector signed int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_EQ_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_eq (vector unsigned int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_EQ_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_eq (vector unsigned int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_EQ_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_eq (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, a1, a2);
+}
+
+/* vec_any_ge */
+
+inline int
+vec_any_ge (vector signed char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_LT_REV, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_any_ge (vector unsigned char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_LT_REV, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_any_ge (vector unsigned char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_LT_REV, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_any_ge (vector signed char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtsb_p (__CR6_LT_REV, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_any_ge (vector signed short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_LT_REV, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_any_ge (vector unsigned short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_LT_REV, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_any_ge (vector unsigned short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_LT_REV, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_any_ge (vector signed short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtsh_p (__CR6_LT_REV, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_any_ge (vector signed int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_LT_REV, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_any_ge (vector unsigned int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_LT_REV, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_any_ge (vector unsigned int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_LT_REV, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_any_ge (vector signed int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtsw_p (__CR6_LT_REV, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_any_ge (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgefp_p (__CR6_EQ_REV, a1, a2);
+}
+
+/* vec_any_gt */
+
+inline int
+vec_any_gt (vector signed char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_EQ_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_gt (vector unsigned char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_EQ_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_gt (vector unsigned char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_EQ_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_gt (vector signed char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtsb_p (__CR6_EQ_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_gt (vector signed short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_EQ_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_gt (vector unsigned short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_EQ_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_gt (vector unsigned short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_EQ_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_gt (vector signed short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtsh_p (__CR6_EQ_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_gt (vector signed int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_EQ_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_gt (vector unsigned int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_EQ_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_gt (vector unsigned int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_EQ_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_gt (vector signed int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtsw_p (__CR6_EQ_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_gt (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgtfp_p (__CR6_EQ_REV, a1, a2);
+}
+
+/* vec_any_le */
+
+inline int
+vec_any_le (vector signed char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_LT_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_le (vector unsigned char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_LT_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_le (vector unsigned char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_LT_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_le (vector signed char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtsb_p (__CR6_LT_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_le (vector signed short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_LT_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_le (vector unsigned short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_LT_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_le (vector unsigned short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_LT_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_le (vector signed short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtsh_p (__CR6_LT_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_le (vector signed int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_LT_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_le (vector unsigned int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_LT_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_le (vector unsigned int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_LT_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_le (vector signed int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtsw_p (__CR6_LT_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_le (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a2, a1);
+}
+
+/* vec_any_lt */
+
+inline int
+vec_any_lt (vector signed char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_EQ_REV, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_any_lt (vector unsigned char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_EQ_REV, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_any_lt (vector unsigned char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpgtub_p (__CR6_EQ_REV, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_any_lt (vector signed char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpgtsb_p (__CR6_EQ_REV, (vector signed char) a2, (vector signed char) a1);
+}
+
+inline int
+vec_any_lt (vector signed short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_EQ_REV, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_any_lt (vector unsigned short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_EQ_REV, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_any_lt (vector unsigned short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpgtuh_p (__CR6_EQ_REV, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_any_lt (vector signed short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpgtsh_p (__CR6_EQ_REV, (vector signed short) a2, (vector signed short) a1);
+}
+
+inline int
+vec_any_lt (vector signed int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_EQ_REV, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_any_lt (vector unsigned int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_EQ_REV, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_any_lt (vector unsigned int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpgtuw_p (__CR6_EQ_REV, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_any_lt (vector signed int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpgtsw_p (__CR6_EQ_REV, (vector signed int) a2, (vector signed int) a1);
+}
+
+inline int
+vec_any_lt (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgtfp_p (__CR6_EQ_REV, a2, a1);
+}
+
+/* vec_any_nan */
+
+inline int
+vec_any_nan (vector float a1)
+{
+ return __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, a1, a1);
+}
+
+/* vec_any_ne */
+
+inline int
+vec_any_ne (vector signed char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_LT_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_ne (vector signed char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_LT_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_ne (vector unsigned char a1, vector signed char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_LT_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_ne (vector unsigned char a1, vector unsigned char a2)
+{
+ return __builtin_altivec_vcmpequb_p (__CR6_LT_REV, (vector signed char) a1, (vector signed char) a2);
+}
+
+inline int
+vec_any_ne (vector signed short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_LT_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_ne (vector signed short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_LT_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_ne (vector unsigned short a1, vector signed short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_LT_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_ne (vector unsigned short a1, vector unsigned short a2)
+{
+ return __builtin_altivec_vcmpequh_p (__CR6_LT_REV, (vector signed short) a1, (vector signed short) a2);
+}
+
+inline int
+vec_any_ne (vector signed int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_LT_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_ne (vector signed int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_LT_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_ne (vector unsigned int a1, vector signed int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_LT_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_ne (vector unsigned int a1, vector unsigned int a2)
+{
+ return __builtin_altivec_vcmpequw_p (__CR6_LT_REV, (vector signed int) a1, (vector signed int) a2);
+}
+
+inline int
+vec_any_ne (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, a1, a2);
+}
+
+/* vec_any_nge */
+
+inline int
+vec_any_nge (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a1, a2);
+}
+
+/* vec_any_ngt */
+
+inline int
+vec_any_ngt (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a1, a2);
+}
+
+/* vec_any_nle */
+
+inline int
+vec_any_nle (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a2, a1);
+}
+
+/* vec_any_nlt */
+
+inline int
+vec_any_nlt (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a2, a1);
+}
+
+/* vec_any_numeric */
+
+inline int
+vec_any_numeric (vector float a1)
+{
+ return __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, a1, a1);
+}
+
+/* vec_any_out */
+
+inline int
+vec_any_out (vector float a1, vector float a2)
+{
+ return __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, a1, a2);
+}
+
+/* vec_step */
+
+template<typename _Tp>
+struct __vec_step_help
+{
+ // All proper vector types will specialize _S_elem.
+};
+
+template<>
+struct __vec_step_help<vector signed short>
+{
+ static const int _S_elem = 8;
+};
+
+template<>
+struct __vec_step_help<vector unsigned short>
+{
+ static const int _S_elem = 8;
+};
+
+template<>
+struct __vec_step_help<vector signed int>
+{
+ static const int _S_elem = 4;
+};
+
+template<>
+struct __vec_step_help<vector unsigned int>
+{
+ static const int _S_elem = 4;
+};
+
+template<>
+struct __vec_step_help<vector unsigned char>
+{
+ static const int _S_elem = 16;
+};
+
+template<>
+struct __vec_step_help<vector signed char>
+{
+ static const int _S_elem = 16;
+};
+
+template<>
+struct __vec_step_help<vector float>
+{
+ static const int _S_elem = 4;
+};
+
+#define vec_step(t) __vec_step_help<t>::_S_elem
#else /* not C++ */
-/* Hairy macros that implement the AltiVec high-level programming
- interface for C. */
+/* "... and so I think no man in a century will suffer as greatly as
+ you will." */
+
+#define vec_abs(a) \
+ __ch (__un_args_eq (vector signed char, (a)), \
+ ((vector signed char) __builtin_altivec_abs_v16qi ((vector signed char) (a))), \
+ __ch (__un_args_eq (vector signed short, (a)), \
+ ((vector signed short) __builtin_altivec_abs_v8hi ((vector signed short) (a))), \
+ __ch (__un_args_eq (vector signed int, (a)), \
+ ((vector signed int) __builtin_altivec_abs_v4si ((vector signed int) (a))), \
+ __ch (__un_args_eq (vector float, (a)), \
+ ((vector float) __builtin_altivec_abs_v4sf ((vector float) (a))), \
+ __altivec_link_error_invalid_argument ()))))
+
+#define vec_abss(a) \
+ __ch (__un_args_eq (vector signed char, (a)), \
+ ((vector signed char) __builtin_altivec_abss_v16qi ((vector signed char) (a))), \
+ __ch (__un_args_eq (vector signed short, (a)), \
+ ((vector signed short) __builtin_altivec_abss_v8hi ((vector signed short) (a))), \
+ __ch (__un_args_eq (vector signed int, (a)), \
+ ((vector signed int) __builtin_altivec_abss_v4si ((vector signed int) (a))), \
+ __altivec_link_error_invalid_argument ())))
+
+#define vec_step(t) \
+ __ch (__builtin_types_compatible_p (t, vector signed int), 4, \
+ __ch (__builtin_types_compatible_p (t, vector unsigned int), 4, \
+ __ch (__builtin_types_compatible_p (t, vector signed short), 8, \
+ __ch (__builtin_types_compatible_p (t, vector unsigned short), 8, \
+ __ch (__builtin_types_compatible_p (t, vector signed char), 16, \
+ __ch (__builtin_types_compatible_p (t, vector unsigned char), 16, \
+ __ch (__builtin_types_compatible_p (t, vector float), 4, \
+ __altivec_link_error_invalid_argument ())))))))
+
+#define vec_vaddubm(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vaddubm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) (a1), (vector signed char) (a2))), \
+ __altivec_link_error_invalid_argument ()))))
+
+#define vec_vadduhm(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vadduhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) (a1), (vector signed short) (a2))), \
+ __altivec_link_error_invalid_argument ()))))
+
+#define vec_vadduwm(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vadduwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) (a1), (vector signed int) (a2))), \
+ __altivec_link_error_invalid_argument ()))))
+
+#define vec_vaddfp(a1, a2) \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vaddfp ((vector float) (a1), (vector float) (a2))), \
+ __altivec_link_error_invalid_argument ())
#define vec_add(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector float) __builtin_altivec_vaddfp ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vaddubm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vadduhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vadduwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vaddfp ((vector float) (a1), (vector float) (a2))), \
__altivec_link_error_invalid_argument ())))))))))))))
-#define vec_addc(a1, a2) __builtin_altivec_vaddcuw (a1, a2)
+#define vec_addc(a1, a2) \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vaddcuw ((vector signed int) (a1), (vector signed int) (a2))), \
+ __altivec_link_error_invalid_argument ())
#define vec_adds(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vaddsbs ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vaddshs ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vadduws ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector unsigned int) __builtin_altivec_vadduws ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vadduws ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vaddsws ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vaddsbs ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vaddshs ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vadduws ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vadduws ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vadduws ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vaddsws ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))))))))))
+#define vec_vaddsws(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vaddsws ((vector signed int) (a1), (vector signed int) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vadduws(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vadduws ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vadduws ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vadduws ((vector signed int) (a1), (vector signed int) (a2))), \
+ __altivec_link_error_invalid_argument ())))
+
+#define vec_vaddshs(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vaddshs ((vector signed short) (a1), (vector signed short) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vadduhs(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) (a1), (vector signed short) (a2))), \
+ __altivec_link_error_invalid_argument ())))
+
+#define vec_vaddsbs(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vaddsbs ((vector signed char) (a1), (vector signed char) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vaddubs(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) (a1), (vector signed char) (a2))), \
+ __altivec_link_error_invalid_argument ())))
+
#define vec_and(a1, a2) \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector float) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector signed int, a2), \
- (vector float) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector float, a2), \
- (vector float) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector unsigned int) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector unsigned short) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector unsigned char) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector signed int, (a2)), \
+ ((vector float) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vand ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ())))))))))))))))
#define vec_andc(a1, a2) \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector float) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector signed int, a2), \
- (vector float) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector float, a2), \
- (vector float) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector unsigned int) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector unsigned short) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector unsigned char) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
- __altivec_link_error_invalid_argument ())))))))))))))))
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector unsigned int, (a2)), \
+ ((vector float) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vandc ((vector signed int) (a1), (vector signed int) (a2))), \
+ __altivec_link_error_invalid_argument ()))))))))))))))))))))))
#define vec_avg(a1, a2) \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vavgub ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vavgsb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vavguh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vavgsh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vavguw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vavgsw ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vavgub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vavgsb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vavguh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vavgsh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vavguw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vavgsw ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))))
-#define vec_ceil(a1) __builtin_altivec_vrfip (a1)
+#define vec_vavgsw(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vavgsw ((vector signed int) (a1), (vector signed int) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vavguw(a1, a2) \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vavguw ((vector signed int) (a1), (vector signed int) (a2))), \
+ __altivec_link_error_invalid_argument ())
-#define vec_cmpb(a1, a2) __builtin_altivec_vcmpbfp (a1, a2)
+#define vec_vavgsh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vavgsh ((vector signed short) (a1), (vector signed short) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vavguh(a1, a2) \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vavguh ((vector signed short) (a1), (vector signed short) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vavgsb(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vavgsb ((vector signed char) (a1), (vector signed char) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vavgub(a1, a2) \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vavgub ((vector signed char) (a1), (vector signed char) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_ceil(a1) __builtin_altivec_vrfip ((a1))
+
+#define vec_cmpb(a1, a2) __builtin_altivec_vcmpbfp ((a1), (a2))
#define vec_cmpeq(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vcmpequb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed char) __builtin_altivec_vcmpequb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vcmpequh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed short) __builtin_altivec_vcmpequh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpeqfp ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vcmpequb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vcmpequb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vcmpequh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vcmpequh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpequw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpequw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpeqfp ((vector float) (a1), (vector float) (a2))), \
__altivec_link_error_invalid_argument ())))))))
-#define vec_cmpge(a1, a2) __builtin_altivec_vcmpgefp (a1, a2)
+#define vec_vcmpeqfp(a1, a2) \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpeqfp ((vector float) (a1), (vector float) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vcmpequw(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpequw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpequw ((vector signed int) (a1), (vector signed int) (a2))), \
+ __altivec_link_error_invalid_argument ()))
+
+#define vec_vcmpequh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vcmpequh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vcmpequh ((vector signed short) (a1), (vector signed short) (a2))), \
+ __altivec_link_error_invalid_argument ()))
+
+#define vec_vcmpequb(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vcmpequb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vcmpequb ((vector signed char) (a1), (vector signed char) (a2))), \
+ __altivec_link_error_invalid_argument ()))
+
+#define vec_cmpge(a1, a2) (vector signed int) __builtin_altivec_vcmpgefp ((a1), (a2))
#define vec_cmpgt(a1, a2) \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed char) __builtin_altivec_vcmpgtub ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vcmpgtsb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed short) __builtin_altivec_vcmpgtuh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vcmpgtsh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpgtfp ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vcmpgtub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vcmpgtsb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vcmpgtuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vcmpgtsh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpgtuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpgtsw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpgtfp ((vector float) (a1), (vector float) (a2))), \
__altivec_link_error_invalid_argument ())))))))
-#define vec_cmple(a1, a2) __builtin_altivec_vcmpgefp (a1, a2)
+#define vec_vcmpgtfp(a1, a2) \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpgtfp ((vector float) (a1), (vector float) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vcmpgtsw(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpgtsw ((vector signed int) (a1), (vector signed int) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vcmpgtuw(a1, a2) \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpgtuw ((vector signed int) (a1), (vector signed int) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vcmpgtsh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vcmpgtsh ((vector signed short) (a1), (vector signed short) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vcmpgtuh(a1, a2) \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vcmpgtuh ((vector signed short) (a1), (vector signed short) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vcmpgtsb(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vcmpgtsb ((vector signed char) (a1), (vector signed char) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vcmpgtub(a1, a2) \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vcmpgtub ((vector signed char) (a1), (vector signed char) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_cmple(a1, a2) __builtin_altivec_vcmpgefp ((a1), (a2))
#define vec_cmplt(a1, a2) \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed char) __builtin_altivec_vcmpgtub ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vcmpgtsb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed short) __builtin_altivec_vcmpgtuh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vcmpgtsh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpgtfp ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vcmpgtub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vcmpgtsb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vcmpgtuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vcmpgtsh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpgtuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpgtsw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector signed int) __builtin_altivec_vcmpgtfp ((vector float) (a1), (vector float) (a2))), \
__altivec_link_error_invalid_argument ())))))))
#define vec_ctf(a1, a2) \
-__ch (__bin_args_eq (vector unsigned int, a1, const char, a2), \
- (vector float) __builtin_altivec_vcfux ((vector signed int) a1, (const char) a2), \
-__ch (__bin_args_eq (vector signed int, a1, const char, a2), \
- (vector float) __builtin_altivec_vcfsx ((vector signed int) a1, (const char) a2), \
+__ch (__bin_args_eq (vector unsigned int, (a1), int, (a2)), \
+ ((vector float) __builtin_altivec_vcfux ((vector signed int) (a1), (const char) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), int, (a2)), \
+ ((vector float) __builtin_altivec_vcfsx ((vector signed int) (a1), (const char) (a2))), \
__altivec_link_error_invalid_argument ()))
-#define vec_cts(a1, a2) __builtin_altivec_vctsxs (a1, a2)
+#define vec_vcfsx(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), int, (a2)), \
+ ((vector float) __builtin_altivec_vcfsx ((vector signed int) (a1), (const char) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_vcfux(a1, a2) \
+__ch (__bin_args_eq (vector unsigned int, (a1), int, (a2)), \
+ ((vector float) __builtin_altivec_vcfux ((vector signed int) (a1), (const char) (a2))), \
+ __altivec_link_error_invalid_argument ())
+
+#define vec_cts(a1, a2) __builtin_altivec_vctsxs ((a1), (a2))
-#define vec_ctu(a1, a2) __builtin_altivec_vctuxs (a1, a2)
+#define vec_ctu(a1, a2) (vector unsigned int) __builtin_altivec_vctuxs ((a1), (a2))
-#define vec_dss(a1) __builtin_altivec_dss (a1)
+#define vec_dss(a1) __builtin_altivec_dss ((a1))
#define vec_dssall() __builtin_altivec_dssall ()
-#define vec_dst(a1, a2, a3) __builtin_altivec_dst (a1, a2, a3)
+#define vec_dst(a1, a2, a3) __builtin_altivec_dst ((a1), (a2), (a3))
-#define vec_dstst(a1, a2, a3) __builtin_altivec_dstst (a1, a2, a3)
+#define vec_dstst(a1, a2, a3) __builtin_altivec_dstst ((a1), (a2), (a3))
-#define vec_dststt(a1, a2, a3) __builtin_altivec_dststt (a1, a2, a3)
+#define vec_dststt(a1, a2, a3) __builtin_altivec_dststt ((a1), (a2), (a3))
-#define vec_dstt(a1, a2, a3) __builtin_altivec_dstt (a1, a2, a3)
+#define vec_dstt(a1, a2, a3) __builtin_altivec_dstt ((a1), (a2), (a3))
-#define vec_expte(a1) __builtin_altivec_vexptefp (a1)
+#define vec_expte(a1) __builtin_altivec_vexptefp ((a1))
#define vec_floor(a1) __builtin_altivec_vrfim (a1)
#define vec_ld(a, b) \
-__ch (__un_args_eq (vector unsigned char *, b), \
- (vector unsigned char) __builtin_altivec_lvx (a, b), \
-__ch (__un_args_eq (unsigned char *, b), \
- (vector unsigned char) __builtin_altivec_lvx (a, b), \
-__ch (__un_args_eq (vector signed char *, b), \
- (vector signed char) __builtin_altivec_lvx (a, b), \
-__ch (__un_args_eq (signed char *, b), \
- (vector signed char) __builtin_altivec_lvx (a, b), \
-__ch (__un_args_eq (vector unsigned short *, b), \
- (vector unsigned short) __builtin_altivec_lvx (a, b), \
-__ch (__un_args_eq (unsigned short *, b), \
- (vector unsigned short) __builtin_altivec_lvx (a, b), \
-__ch (__un_args_eq (vector signed short *, b), \
- (vector signed short) __builtin_altivec_lvx (a, b), \
-__ch (__un_args_eq (signed short *, b), \
- (vector signed short) __builtin_altivec_lvx (a, b), \
-__ch (__un_args_eq (vector unsigned int *, b), \
- (vector unsigned int) __builtin_altivec_lvx (a, b), \
-__ch (__un_args_eq (unsigned int *, b), \
- (vector unsigned int) __builtin_altivec_lvx (a, b), \
-__ch (__un_args_eq (vector signed int *, b), \
- (vector signed int) __builtin_altivec_lvx (a, b), \
-__ch (__un_args_eq (signed int *, b), \
- (vector signed int) __builtin_altivec_lvx (a, b), \
-__ch (__un_args_eq (vector float *, b), \
- (vector float) __builtin_altivec_lvx (a, b), \
-__ch (__un_args_eq (float *, b), \
- (vector float) __builtin_altivec_lvx (a, b), \
-__altivec_link_error_invalid_argument ()))))))))))))))
+__ch (__un_args_eq (vector unsigned char *, (b)), \
+ ((vector unsigned char) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (vector unsigned char [], (b)), \
+ ((vector unsigned char) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (unsigned char *, (b)), \
+ ((vector unsigned char) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (unsigned char [], (b)), \
+ ((vector unsigned char) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (vector signed char *, (b)), \
+ ((vector signed char) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (vector signed char [], (b)), \
+ ((vector signed char) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (signed char *, (b)), \
+ ((vector signed char) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (signed char [], (b)), \
+ ((vector signed char) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (vector unsigned short *, (b)), \
+ ((vector unsigned short) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (vector unsigned short [], (b)), \
+ ((vector unsigned short) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (unsigned short *, (b)), \
+ ((vector unsigned short) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (unsigned short [], (b)), \
+ ((vector unsigned short) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (vector signed short *, (b)), \
+ ((vector signed short) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (vector signed short [], (b)), \
+ ((vector signed short) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (signed short *, (b)), \
+ ((vector signed short) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (signed short [], (b)), \
+ ((vector signed short) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (vector unsigned int *, (b)), \
+ ((vector unsigned int) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (vector unsigned int [], (b)), \
+ ((vector unsigned int) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (unsigned int *, (b)), \
+ ((vector unsigned int) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (unsigned int [], (b)), \
+ ((vector unsigned int) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (vector signed int *, (b)), \
+ ((vector signed int) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (vector signed int [], (b)), \
+ ((vector signed int) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (signed int *, (b)), \
+ ((vector signed int) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (signed int [], (b)), \
+ ((vector signed int) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (vector float *, (b)), \
+ ((vector float) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (vector float [], (b)), \
+ ((vector float) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (float *, (b)), \
+ ((vector float) __builtin_altivec_lvx ((a), (b))), \
+__ch (__un_args_eq (float [], (b)), \
+ ((vector float) __builtin_altivec_lvx ((a), (b))), \
+__altivec_link_error_invalid_argument ()))))))))))))))))))))))))))))
#define vec_lde(a, b) \
-__ch (__un_args_eq (unsigned char *, b), \
- (vector unsigned char) __builtin_altivec_lvebx (a, b), \
-__ch (__un_args_eq (signed char *, b), \
- (vector signed char) __builtin_altivec_lvebx (a, b), \
-__ch (__un_args_eq (unsigned short *, b), \
- (vector unsigned short) __builtin_altivec_lvehx (a, b), \
-__ch (__un_args_eq (signed short *, b), \
- (vector signed short) __builtin_altivec_lvehx (a, b), \
-__ch (__un_args_eq (unsigned int *, b), \
- (vector unsigned int) __builtin_altivec_lvewx (a, b), \
-__ch (__un_args_eq (signed int *, b), \
- (vector signed int) __builtin_altivec_lvewx (a, b), \
-__altivec_link_error_invalid_argument ()))))))
-
-#define vec_ldl(a, b) \
-__ch (__un_args_eq (vector unsigned char *, b), \
- (vector unsigned char) __builtin_altivec_lvxl (a, b), \
-__ch (__un_args_eq (unsigned char *, b), \
- (vector unsigned char) __builtin_altivec_lvxl (a, b), \
-__ch (__un_args_eq (vector signed char *, b), \
- (vector signed char) __builtin_altivec_lvxl (a, b), \
-__ch (__un_args_eq (signed char *, b), \
- (vector signed char) __builtin_altivec_lvxl (a, b), \
-__ch (__un_args_eq (vector unsigned short *, b), \
- (vector unsigned short) __builtin_altivec_lvxl (a, b), \
-__ch (__un_args_eq (unsigned short *, b), \
- (vector unsigned short) __builtin_altivec_lvxl (a, b), \
-__ch (__un_args_eq (vector signed short *, b), \
- (vector signed short) __builtin_altivec_lvxl (a, b), \
-__ch (__un_args_eq (signed short *, b), \
- (vector signed short) __builtin_altivec_lvxl (a, b), \
-__ch (__un_args_eq (vector unsigned int *, b), \
- (vector unsigned int) __builtin_altivec_lvxl (a, b), \
-__ch (__un_args_eq (unsigned int *, b), \
- (vector unsigned int) __builtin_altivec_lvxl (a, b), \
-__ch (__un_args_eq (vector signed int *, b), \
- (vector signed int) __builtin_altivec_lvxl (a, b), \
-__ch (__un_args_eq (signed int *, b), \
- (vector signed int) __builtin_altivec_lvxl (a, b), \
-__ch (__un_args_eq (vector float *, b), \
- (vector float) __builtin_altivec_lvxl (a, b), \
-__ch (__un_args_eq (float *, b), \
- (vector float) __builtin_altivec_lvxl (a, b), \
+__ch (__un_args_eq (unsigned char *, (b)), \
+ ((vector unsigned char) __builtin_altivec_lvebx ((a), (b))), \
+__ch (__un_args_eq (unsigned char [], (b)), \
+ ((vector unsigned char) __builtin_altivec_lvebx ((a), (b))), \
+__ch (__un_args_eq (signed char *, (b)), \
+ ((vector signed char) __builtin_altivec_lvebx ((a), (b))), \
+__ch (__un_args_eq (signed char [], (b)), \
+ ((vector signed char) __builtin_altivec_lvebx ((a), (b))), \
+__ch (__un_args_eq (unsigned short *, (b)), \
+ ((vector unsigned short) __builtin_altivec_lvehx ((a), (b))), \
+__ch (__un_args_eq (unsigned short [], (b)), \
+ ((vector unsigned short) __builtin_altivec_lvehx ((a), (b))), \
+__ch (__un_args_eq (signed short *, (b)), \
+ ((vector signed short) __builtin_altivec_lvehx ((a), (b))), \
+__ch (__un_args_eq (signed short [], (b)), \
+ ((vector signed short) __builtin_altivec_lvehx ((a), (b))), \
+__ch (__un_args_eq (unsigned int *, (b)), \
+ ((vector unsigned int) __builtin_altivec_lvewx ((a), (b))), \
+__ch (__un_args_eq (unsigned int [], (b)), \
+ ((vector unsigned int) __builtin_altivec_lvewx ((a), (b))), \
+__ch (__un_args_eq (signed int *, (b)), \
+ ((vector signed int) __builtin_altivec_lvewx ((a), (b))), \
+__ch (__un_args_eq (signed int [], (b)), \
+ ((vector signed int) __builtin_altivec_lvewx ((a), (b))), \
+__ch (__un_args_eq (float *, (b)), \
+ ((vector float) __builtin_altivec_lvewx ((a), (b))), \
+__ch (__un_args_eq (float [], (b)), \
+ ((vector float) __builtin_altivec_lvewx ((a), (b))), \
__altivec_link_error_invalid_argument ()))))))))))))))
-#define vec_loge(a1) __builtin_altivec_vlogefp (a1)
-
-#define vec_lvsl(a1, a2) __builtin_altivec_lvsl (a1, a2)
-
-#define vec_lvsr(a1, a2) __builtin_altivec_lvsr (a1, a2)
+#define vec_lvewx(a, b) \
+__ch (__un_args_eq (unsigned int *, (b)), \
+ ((vector unsigned int) __builtin_altivec_lvewx ((a), (b))), \
+__ch (__un_args_eq (unsigned int [], (b)), \
+ ((vector unsigned int) __builtin_altivec_lvewx ((a), (b))), \
+__ch (__un_args_eq (signed int *, (b)), \
+ ((vector signed int) __builtin_altivec_lvewx ((a), (b))), \
+__ch (__un_args_eq (signed int [], (b)), \
+ ((vector signed int) __builtin_altivec_lvewx ((a), (b))), \
+__ch (__un_args_eq (float *, (b)), \
+ ((vector float) __builtin_altivec_lvewx ((a), (b))), \
+__ch (__un_args_eq (float [], (b)), \
+ ((vector float) __builtin_altivec_lvewx ((a), (b))), \
+__altivec_link_error_invalid_argument ()))))))
-#define vec_madd(a1, a2, a3) __builtin_altivec_vmaddfp (a1, a2, a3)
+#define vec_lvehx(a, b) \
+__ch (__un_args_eq (unsigned short *, (b)), \
+ ((vector unsigned short) __builtin_altivec_lvehx ((a), (b))), \
+__ch (__un_args_eq (unsigned short [], (b)), \
+ ((vector unsigned short) __builtin_altivec_lvehx ((a), (b))), \
+__ch (__un_args_eq (signed short *, (b)), \
+ ((vector signed short) __builtin_altivec_lvehx ((a), (b))), \
+__ch (__un_args_eq (signed short [], (b)), \
+ ((vector signed short) __builtin_altivec_lvehx ((a), (b))), \
+__altivec_link_error_invalid_argument ()))))
+
+#define vec_lvebx(a, b) \
+__ch (__un_args_eq (unsigned char *, (b)), \
+ ((vector unsigned char) __builtin_altivec_lvebx ((a), (b))), \
+__ch (__un_args_eq (unsigned char [], (b)), \
+ ((vector unsigned char) __builtin_altivec_lvebx ((a), (b))), \
+__ch (__un_args_eq (signed char *, (b)), \
+ ((vector signed char) __builtin_altivec_lvebx ((a), (b))), \
+__ch (__un_args_eq (signed char [], (b)), \
+ ((vector signed char) __builtin_altivec_lvebx ((a), (b))), \
+__altivec_link_error_invalid_argument ()))))
-#define vec_madds(a1, a2, a3) __builtin_altivec_vmhaddshs (a1, a2, a3)
+#define vec_ldl(a, b) \
+__ch (__un_args_eq (vector unsigned char *, (b)), \
+ ((vector unsigned char) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (vector unsigned char [], (b)), \
+ ((vector unsigned char) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (unsigned char *, (b)), \
+ ((vector unsigned char) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (unsigned char [], (b)), \
+ ((vector unsigned char) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (vector signed char *, (b)), \
+ ((vector signed char) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (vector signed char [], (b)), \
+ ((vector signed char) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (signed char *, (b)), \
+ ((vector signed char) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (signed char [], (b)), \
+ ((vector signed char) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (vector unsigned short *, (b)), \
+ ((vector unsigned short) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (vector unsigned short [], (b)), \
+ ((vector unsigned short) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (unsigned short *, (b)), \
+ ((vector unsigned short) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (unsigned short [], (b)), \
+ ((vector unsigned short) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (vector signed short *, (b)), \
+ ((vector signed short) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (vector signed short [], (b)), \
+ ((vector signed short) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (signed short *, (b)), \
+ ((vector signed short) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (signed short [], (b)), \
+ ((vector signed short) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (vector unsigned int *, (b)), \
+ ((vector unsigned int) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (vector unsigned int [], (b)), \
+ ((vector unsigned int) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (unsigned int *, (b)), \
+ ((vector unsigned int) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (unsigned int [], (b)), \
+ ((vector unsigned int) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (vector signed int *, (b)), \
+ ((vector signed int) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (vector signed int [], (b)), \
+ ((vector signed int) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (signed int *, (b)), \
+ ((vector signed int) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (signed int [], (b)), \
+ ((vector signed int) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (vector float *, (b)), \
+ ((vector float) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (vector float [], (b)), \
+ ((vector float) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (float *, (b)), \
+ ((vector float) __builtin_altivec_lvxl ((a), (b))), \
+__ch (__un_args_eq (float [], (b)), \
+ ((vector float) __builtin_altivec_lvxl ((a), (b))), \
+__altivec_link_error_invalid_argument ()))))))))))))))))))))))))))))
+
+#define vec_loge(a1) __builtin_altivec_vlogefp ((a1))
+
+#define vec_lvsl(a1, a2) ((vector unsigned char) __builtin_altivec_lvsl ((a1), (a2)))
+
+#define vec_lvsr(a1, a2) ((vector unsigned char) __builtin_altivec_lvsr ((a1), (a2)))
+
+#define vec_madd(a1, a2, a3) (__builtin_altivec_vmaddfp ((a1), (a2), (a3)))
+
+#define vec_madds(a1, a2, a3) __builtin_altivec_vmhaddshs ((a1), (a2), (a3))
#define vec_max(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vmaxsb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vmaxsh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vmaxsw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector float) __builtin_altivec_vmaxfp ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vmaxsb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vmaxsh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vmaxsw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vmaxfp ((vector float) (a1), (vector float) (a2))), \
__altivec_link_error_invalid_argument ())))))))))))))
+#define vec_vmaxfp(a1, a2) \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vmaxfp ((vector float) (a1), (vector float) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vmaxsw(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vmaxsw ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vmaxuw(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())))
+
+#define vec_vmaxsh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vmaxsh ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vmaxuh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ())))
+
+#define vec_vmaxsb(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vmaxsb ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vmaxub(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ())))
+
#define vec_mergeh(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vmrghb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vmrghb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vmrghh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vmrghh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector float) __builtin_altivec_vmrghw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vmrghw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vmrghw ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vmrghb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vmrghb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vmrghh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmrghh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vmrghw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vmrghw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmrghw ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ())))))))
+#define vec_vmrghw(a1, a2) \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vmrghw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vmrghw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmrghw ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())))
+
+#define vec_vmrghh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vmrghh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmrghh ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_vmrghb(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vmrghb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vmrghb ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
#define vec_mergel(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vmrglb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vmrglb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vmrglh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vmrglh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector float) __builtin_altivec_vmrglw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vmrglw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vmrglw ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vmrglb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vmrglb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vmrglh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmrglh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ())))))))
-#define vec_mfvscr() __builtin_altivec_mfvscr ()
+#define vec_vmrglw(a1, a2) \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())))
+
+#define vec_vmrglh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vmrglh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmrglh ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_vmrglb(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vmrglb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vmrglb ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_mfvscr() (((vector unsigned short) __builtin_altivec_mfvscr ()))
#define vec_min(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vminub ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector unsigned char) __builtin_altivec_vminub ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vminub ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vminsb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vminuh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector unsigned short) __builtin_altivec_vminuh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vminuh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vminsh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vminuw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector unsigned int) __builtin_altivec_vminuw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vminuw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vminsw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector float) __builtin_altivec_vminfp ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vminub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vminub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vminub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vminsb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vminuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vminuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vminuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vminsh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vminuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vminuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vminuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vminsw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vminfp ((vector float) (a1), (vector float) (a2))), \
__altivec_link_error_invalid_argument ())))))))))))))
+#define vec_vminfp(a1, a2) \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vminfp ((vector float) (a1), (vector float) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vminsw(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vminsw ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vminuw(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vminuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vminuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vminuw ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())))
+
+#define vec_vminsh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vminsh ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vminuh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vminuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vminuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vminuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ())))
+
+#define vec_vminsb(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vminsb ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vminub(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vminub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vminub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vminub ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ())))
+
#define vec_mladd(a1, a2, a3) \
-__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, vector signed short, a3), \
- (vector signed short) __builtin_altivec_vmladduhm ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3), \
-__ch (__tern_args_eq (vector signed short, a1, vector unsigned short, a2, vector unsigned short, a3), \
- (vector signed short) __builtin_altivec_vmladduhm ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3), \
-__ch (__tern_args_eq (vector unsigned short, a1, vector signed short, a2, vector signed short, a3), \
- (vector signed short) __builtin_altivec_vmladduhm ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3), \
-__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, vector unsigned short, a3), \
- (vector unsigned short) __builtin_altivec_vmladduhm ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3), \
+__ch (__tern_args_eq (vector signed short, (a1), vector signed short, (a2), vector signed short, (a3)), \
+ ((vector signed short) __builtin_altivec_vmladduhm ((vector signed short) (a1), (vector signed short) (a2), (vector signed short) (a3))), \
+__ch (__tern_args_eq (vector signed short, (a1), vector unsigned short, (a2), vector unsigned short, (a3)), \
+ ((vector signed short) __builtin_altivec_vmladduhm ((vector signed short) (a1), (vector signed short) (a2), (vector signed short) (a3))), \
+__ch (__tern_args_eq (vector unsigned short, (a1), vector signed short, (a2), vector signed short, (a3)), \
+ ((vector signed short) __builtin_altivec_vmladduhm ((vector signed short) (a1), (vector signed short) (a2), (vector signed short) (a3))), \
+__ch (__tern_args_eq (vector unsigned short, (a1), vector unsigned short, (a2), vector unsigned short, (a3)), \
+ ((vector unsigned short) __builtin_altivec_vmladduhm ((vector signed short) (a1), (vector signed short) (a2), (vector signed short) (a3))), \
__altivec_link_error_invalid_argument ()))))
-#define vec_mradds(a1, a2, a3) __builtin_altivec_vmhraddshs (a1, a2, a3)
+#define vec_mradds(a1, a2, a3) __builtin_altivec_vmhraddshs ((a1), (a2), (a3))
#define vec_msum(a1, a2, a3) \
-__ch (__tern_args_eq (vector unsigned char, a1, vector unsigned char, a2, vector unsigned int, a3), \
- (vector unsigned int) __builtin_altivec_vmsumubm ((vector signed char) a1, (vector signed char) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector signed char, a1, vector unsigned char, a2, vector signed int, a3), \
- (vector signed int) __builtin_altivec_vmsummbm ((vector signed char) a1, (vector signed char) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, vector unsigned int, a3), \
- (vector unsigned int) __builtin_altivec_vmsumuhm ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, vector signed int, a3), \
- (vector signed int) __builtin_altivec_vmsumshm ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3), \
+__ch (__tern_args_eq (vector unsigned char, (a1), vector unsigned char, (a2), vector unsigned int, (a3)), \
+ ((vector unsigned int) __builtin_altivec_vmsumubm ((vector signed char) (a1), (vector signed char) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector signed char, (a1), vector unsigned char, (a2), vector signed int, (a3)), \
+ ((vector signed int) __builtin_altivec_vmsummbm ((vector signed char) (a1), (vector signed char) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector unsigned short, (a1), vector unsigned short, (a2), vector unsigned int, (a3)), \
+ ((vector unsigned int) __builtin_altivec_vmsumuhm ((vector signed short) (a1), (vector signed short) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector signed short, (a1), vector signed short, (a2), vector signed int, (a3)), \
+ ((vector signed int) __builtin_altivec_vmsumshm ((vector signed short) (a1), (vector signed short) (a2), (vector signed int) (a3))), \
__altivec_link_error_invalid_argument ()))))
+#define vec_vmsumshm(a1, a2, a3) \
+__ch (__tern_args_eq (vector signed short, (a1), vector signed short, (a2), vector signed int, (a3)), \
+ ((vector signed int) __builtin_altivec_vmsumshm ((vector signed short) (a1), (vector signed short) (a2), (vector signed int) (a3))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vmsumuhm(a1, a2, a3) \
+__ch (__tern_args_eq (vector unsigned short, (a1), vector unsigned short, (a2), vector unsigned int, (a3)), \
+ ((vector unsigned int) __builtin_altivec_vmsumuhm ((vector signed short) (a1), (vector signed short) (a2), (vector signed int) (a3))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vmsummbm(a1, a2, a3) \
+__ch (__tern_args_eq (vector signed char, (a1), vector unsigned char, (a2), vector signed int, (a3)), \
+ ((vector signed int) __builtin_altivec_vmsummbm ((vector signed char) (a1), (vector signed char) (a2), (vector signed int) (a3))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_msumubm(a1, a2, a3) \
+__ch (__tern_args_eq (vector unsigned char, (a1), vector unsigned char, (a2), vector unsigned int, (a3)), \
+ ((vector unsigned int) __builtin_altivec_vmsumubm ((vector signed char) (a1), (vector signed char) (a2), (vector signed int) (a3))), \
+__altivec_link_error_invalid_argument ())
+
#define vec_msums(a1, a2, a3) \
-__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, vector unsigned int, a3), \
- (vector unsigned int) __builtin_altivec_vmsumuhs ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, vector signed int, a3), \
- (vector signed int) __builtin_altivec_vmsumshs ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3), \
+__ch (__tern_args_eq (vector unsigned short, (a1), vector unsigned short, (a2), vector unsigned int, (a3)), \
+ ((vector unsigned int) __builtin_altivec_vmsumuhs ((vector signed short) (a1), (vector signed short) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector signed short, (a1), vector signed short, (a2), vector signed int, (a3)), \
+ ((vector signed int) __builtin_altivec_vmsumshs ((vector signed short) (a1), (vector signed short) (a2), (vector signed int) (a3))), \
__altivec_link_error_invalid_argument ()))
+#define vec_vmsumshs(a1, a2, a3) \
+__ch (__tern_args_eq (vector signed short, (a1), vector signed short, (a2), vector signed int, (a3)), \
+ ((vector signed int) __builtin_altivec_vmsumshs ((vector signed short) (a1), (vector signed short) (a2), (vector signed int) (a3))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vmsumuhs(a1, a2, a3) \
+__ch (__tern_args_eq (vector unsigned short, (a1), vector unsigned short, (a2), vector unsigned int, (a3)), \
+ ((vector unsigned int) __builtin_altivec_vmsumuhs ((vector signed short) (a1), (vector signed short) (a2), (vector signed int) (a3))), \
+__altivec_link_error_invalid_argument ())
+
#define vec_mtvscr(a1) \
-__ch (__un_args_eq (vector signed int, a1), \
- __builtin_altivec_mtvscr ((vector signed int) a1), \
-__ch (__un_args_eq (vector unsigned int, a1), \
- __builtin_altivec_mtvscr ((vector signed int) a1), \
-__ch (__un_args_eq (vector signed short, a1), \
- __builtin_altivec_mtvscr ((vector signed int) a1), \
-__ch (__un_args_eq (vector unsigned short, a1), \
- __builtin_altivec_mtvscr ((vector signed int) a1), \
-__ch (__un_args_eq (vector signed char, a1), \
- __builtin_altivec_mtvscr ((vector signed int) a1), \
-__ch (__un_args_eq (vector unsigned char, a1), \
- __builtin_altivec_mtvscr ((vector signed int) a1), \
+__ch (__un_args_eq (vector signed int, (a1)), \
+ __builtin_altivec_mtvscr ((vector signed int) (a1)), \
+__ch (__un_args_eq (vector unsigned int, (a1)), \
+ __builtin_altivec_mtvscr ((vector signed int) (a1)), \
+__ch (__un_args_eq (vector signed short, (a1)), \
+ __builtin_altivec_mtvscr ((vector signed int) (a1)), \
+__ch (__un_args_eq (vector unsigned short, (a1)), \
+ __builtin_altivec_mtvscr ((vector signed int) (a1)), \
+__ch (__un_args_eq (vector signed char, (a1)), \
+ __builtin_altivec_mtvscr ((vector signed int) (a1)), \
+__ch (__un_args_eq (vector unsigned char, (a1)), \
+ __builtin_altivec_mtvscr ((vector signed int) (a1)), \
__altivec_link_error_invalid_argument ()))))))
#define vec_mule(a1, a2) \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned short) __builtin_altivec_vmuleub ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed short) __builtin_altivec_vmulesb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned int) __builtin_altivec_vmuleuh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vmulesh ((vector signed short) a1, (vector signed short) a2), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmuleub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed short) __builtin_altivec_vmulesb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmuleuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed int) __builtin_altivec_vmulesh ((vector signed short) (a1), (vector signed short) (a2))), \
__altivec_link_error_invalid_argument ()))))
+#define vec_vmulesh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed int) __builtin_altivec_vmulesh ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vmuleuh(a1, a2) \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmuleuh ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vmulesb(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed short) __builtin_altivec_vmulesb ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vmuleub(a1, a2) \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmuleub ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ())
+
#define vec_mulo(a1, a2) \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned short) __builtin_altivec_vmuloub ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed short) __builtin_altivec_vmulosb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned int) __builtin_altivec_vmulouh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vmulosh ((vector signed short) a1, (vector signed short) a2), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmuloub ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed short) __builtin_altivec_vmulosb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmulouh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed int) __builtin_altivec_vmulosh ((vector signed short) (a1), (vector signed short) (a2))), \
__altivec_link_error_invalid_argument ()))))
-#define vec_nmsub(a1, a2, a3) __builtin_altivec_vnmsubfp (a1, a2, a3)
+#define vec_vmulosh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed int) __builtin_altivec_vmulosh ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vmulouh(a1, a2) \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vmulouh ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_mulosb(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed short) __builtin_altivec_vmulosb ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vmuloub(a1, a2) \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vmuloub ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_nmsub(a1, a2, a3) \
+__ch (__tern_args_eq (vector float, ((a1)), vector float, ((a2)) , vector float, ((a3))), \
+ ((vector float) __builtin_altivec_vnmsubfp ((vector float) ((a1)), (vector float) ((a2)), (vector float)((a3)))), \
+ __altivec_link_error_invalid_argument ())
#define vec_nor(a1, a2) \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector float) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vnor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vnor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vnor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vnor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vnor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vnor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vnor ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ())))))))
#define vec_or(a1, a2) \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector float) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector signed int, a2), \
- (vector float) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector float, a2), \
- (vector float) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector unsigned int) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector unsigned short) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector unsigned char) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector signed int, (a2)), \
+ ((vector float) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vor ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ())))))))))))))))
#define vec_pack(a1, a2) \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed char) __builtin_altivec_vpkuhum ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned char) __builtin_altivec_vpkuhum ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed short) __builtin_altivec_vpkuwum ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned short) __builtin_altivec_vpkuwum ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed char) __builtin_altivec_vpkuhum ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vpkuhum ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed short) __builtin_altivec_vpkuwum ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vpkuwum ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))
-#define vec_packpx(a1, a2) __builtin_altivec_vpkpx (a1, a2)
+#define vec_vpkuwum(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed short) __builtin_altivec_vpkuwum ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vpkuwum ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_vpkuhum(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed char) __builtin_altivec_vpkuhum ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vpkuhum ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_packpx(a1, a2) __builtin_altivec_vpkpx ((a1), (a2))
#define vec_packs(a1, a2) \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned char) __builtin_altivec_vpkuhus ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed char) __builtin_altivec_vpkshss ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned short) __builtin_altivec_vpkuwus ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed short) __builtin_altivec_vpkswss ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vpkuhus ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed char) __builtin_altivec_vpkshss ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vpkuwus ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed short) __builtin_altivec_vpkswss ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))
+#define vec_vpkswss(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed short) __builtin_altivec_vpkswss ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vpkuwus(a1, a2) \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vpkuwus ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vpkshss(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed char) __builtin_altivec_vpkshss ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vpkuhus(a1, a2) \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vpkuhus ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ())
+
#define vec_packsu(a1, a2) \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned char) __builtin_altivec_vpkuhus ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector unsigned char) __builtin_altivec_vpkshus ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned short) __builtin_altivec_vpkuwus ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector unsigned short) __builtin_altivec_vpkswus ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vpkuhus ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vpkshus ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vpkuwus ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vpkswus ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))
-#define vec_perm(a1, a2, a3, a4) \
-__ch (__tern_args_eq (vector float, a1, vector float, a2, vector unsigned char, a3), \
- (vector float) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
-__ch (__tern_args_eq (vector signed int, a1, vector signed int, a2, vector unsigned char, a3), \
- (vector signed int) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
-__ch (__tern_args_eq (vector unsigned int, a1, vector unsigned int, a2, vector unsigned char, a3), \
- (vector unsigned int) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
-__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, vector unsigned char, a3), \
- (vector signed short) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
-__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, vector unsigned char, a3), \
- (vector unsigned short) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
-__ch (__tern_args_eq (vector signed char, a1, vector signed char, a2, vector unsigned char, a3), \
- (vector signed char) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
-__ch (__tern_args_eq (vector unsigned char, a1, vector unsigned char, a2, vector unsigned char, a3), \
- (vector unsigned char) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
+#define vec_vpkswus(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vpkswus ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vpkshus(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vpkshus ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_perm(a1, a2, a3) \
+__ch (__tern_args_eq (vector float, (a1), vector float, (a2), vector unsigned char, (a3)), \
+ ((vector float) __builtin_altivec_vperm_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed char) (a3))), \
+__ch (__tern_args_eq (vector signed int, (a1), vector signed int, (a2), vector unsigned char, (a3)), \
+ ((vector signed int) __builtin_altivec_vperm_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed char) (a3))), \
+__ch (__tern_args_eq (vector unsigned int, (a1), vector unsigned int, (a2), vector unsigned char, (a3)), \
+ ((vector unsigned int) __builtin_altivec_vperm_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed char) (a3))), \
+__ch (__tern_args_eq (vector signed short, (a1), vector signed short, (a2), vector unsigned char, (a3)), \
+ ((vector signed short) __builtin_altivec_vperm_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed char) (a3))), \
+__ch (__tern_args_eq (vector unsigned short, (a1), vector unsigned short, (a2), vector unsigned char, (a3)), \
+ ((vector unsigned short) __builtin_altivec_vperm_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed char) (a3))), \
+__ch (__tern_args_eq (vector signed char, (a1), vector signed char, (a2), vector unsigned char, (a3)), \
+ ((vector signed char) __builtin_altivec_vperm_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed char) (a3))), \
+__ch (__tern_args_eq (vector unsigned char, (a1), vector unsigned char, (a2), vector unsigned char, (a3)), \
+ ((vector unsigned char) __builtin_altivec_vperm_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed char) (a3))), \
__altivec_link_error_invalid_argument ())))))))
-#define vec_re(a1) __builtin_altivec_vrefp (a1)
+#define vec_re(a1) __builtin_altivec_vrefp ((a1))
#define vec_rl(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed char) __builtin_altivec_vrlb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vrlb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed short) __builtin_altivec_vrlh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vrlh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vrlw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vrlw ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vrlb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vrlb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vrlh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vrlh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vrlw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vrlw ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))))
-#define vec_round(a1) __builtin_altivec_vrfin (a1)
+#define vec_vrlw(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vrlw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vrlw ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_vrlh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vrlh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vrlh ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_vrlb(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vrlb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vrlb ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ()))
-#define vec_rsqrte(a1) __builtin_altivec_vrsqrtefp (a1)
+#define vec_round(a1) __builtin_altivec_vrfin ((a1))
+
+#define vec_rsqrte(a1) __builtin_altivec_vrsqrtefp ((a1))
#define vec_sel(a1, a2, a3) \
-__ch (__tern_args_eq (vector float, a1, vector float, a2, vector signed int, a3), \
- (vector float) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector float, a1, vector float, a2, vector unsigned int, a3), \
- (vector float) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector signed int, a1, vector signed int, a2, vector signed int, a3), \
- (vector signed int) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector signed int, a1, vector signed int, a2, vector unsigned int, a3), \
- (vector signed int) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector unsigned int, a1, vector unsigned int, a2, vector signed int, a3), \
- (vector unsigned int) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector unsigned int, a1, vector unsigned int, a2, vector unsigned int, a3), \
- (vector unsigned int) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, vector signed short, a3), \
- (vector signed short) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, vector unsigned short, a3), \
- (vector signed short) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, vector signed short, a3), \
- (vector unsigned short) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, vector unsigned short, a3), \
- (vector unsigned short) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector signed char, a1, vector signed char, a2, vector signed char, a3), \
- (vector signed char) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector signed char, a1, vector signed char, a2, vector unsigned char, a3), \
- (vector signed char) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector unsigned char, a1, vector unsigned char, a2, vector signed char, a3), \
- (vector unsigned char) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
-__ch (__tern_args_eq (vector unsigned char, a1, vector unsigned char, a2, vector unsigned char, a3), \
- (vector unsigned char) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
+__ch (__tern_args_eq (vector float, (a1), vector float, (a2), vector signed int, (a3)), \
+ ((vector float) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector float, (a1), vector float, (a2), vector unsigned int, (a3)), \
+ ((vector float) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector signed int, (a1), vector signed int, (a2), vector signed int, (a3)), \
+ ((vector signed int) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector signed int, (a1), vector signed int, (a2), vector unsigned int, (a3)), \
+ ((vector signed int) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector unsigned int, (a1), vector unsigned int, (a2), vector signed int, (a3)), \
+ ((vector unsigned int) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector unsigned int, (a1), vector unsigned int, (a2), vector unsigned int, (a3)), \
+ ((vector unsigned int) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector signed short, (a1), vector signed short, (a2), vector signed short, (a3)), \
+ ((vector signed short) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector signed short, (a1), vector signed short, (a2), vector unsigned short, (a3)), \
+ ((vector signed short) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector unsigned short, (a1), vector unsigned short, (a2), vector signed short, (a3)), \
+ ((vector unsigned short) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector unsigned short, (a1), vector unsigned short, (a2), vector unsigned short, (a3)), \
+ ((vector unsigned short) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector signed char, (a1), vector signed char, (a2), vector signed char, (a3)), \
+ ((vector signed char) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector signed char, (a1), vector signed char, (a2), vector unsigned char, (a3)), \
+ ((vector signed char) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector unsigned char, (a1), vector unsigned char, (a2), vector signed char, (a3)), \
+ ((vector unsigned char) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
+__ch (__tern_args_eq (vector unsigned char, (a1), vector unsigned char, (a2), vector unsigned char, (a3)), \
+ ((vector unsigned char) __builtin_altivec_vsel_4si ((vector signed int) (a1), (vector signed int) (a2), (vector signed int) (a3))), \
__altivec_link_error_invalid_argument ()))))))))))))))
#define vec_sl(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed char) __builtin_altivec_vslb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vslb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed short) __builtin_altivec_vslh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vslh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vslw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vslw ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vslb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vslb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vslh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vslh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vslw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vslw ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))))
+#define vec_vslw(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vslw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vslw ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_vslh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vslh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vslh ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_vslb(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vslb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vslb ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
#define vec_sld(a1, a2, a3) \
-__ch (__tern_args_eq (vector float, a1, vector float, a2, const char, a3), \
- (vector float) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
-__ch (__tern_args_eq (vector signed int, a1, vector signed int, a2, const char, a3), \
- (vector signed int) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
-__ch (__tern_args_eq (vector unsigned int, a1, vector unsigned int, a2, const char, a3), \
- (vector unsigned int) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
-__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, const char, a3), \
- (vector signed short) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
-__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, const char, a3), \
- (vector unsigned short) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
-__ch (__tern_args_eq (vector signed char, a1, vector signed char, a2, const char, a3), \
- (vector signed char) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
-__ch (__tern_args_eq (vector unsigned char, a1, vector unsigned char, a2, const char, a3), \
- (vector unsigned char) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
+__ch (__tern_args_eq (vector float, (a1), vector float, (a2), int, (a3)), \
+ ((vector float) __builtin_altivec_vsldoi_4si ((vector signed int) (a1), (vector signed int) (a2), (const char) (a3))), \
+__ch (__tern_args_eq (vector signed int, (a1), vector signed int, (a2), int, (a3)), \
+ ((vector signed int) __builtin_altivec_vsldoi_4si ((vector signed int) (a1), (vector signed int) (a2), (const char) (a3))), \
+__ch (__tern_args_eq (vector unsigned int, (a1), vector unsigned int, (a2), int, (a3)), \
+ ((vector unsigned int) __builtin_altivec_vsldoi_4si ((vector signed int) (a1), (vector signed int) (a2), (const char) (a3))), \
+__ch (__tern_args_eq (vector signed short, (a1), vector signed short, (a2), int, (a3)), \
+ ((vector signed short) __builtin_altivec_vsldoi_4si ((vector signed int) (a1), (vector signed int) (a2), (const char) (a3))), \
+__ch (__tern_args_eq (vector unsigned short, (a1), vector unsigned short, (a2), int, (a3)), \
+ ((vector unsigned short) __builtin_altivec_vsldoi_4si ((vector signed int) (a1), (vector signed int) (a2), (const char) (a3))), \
+__ch (__tern_args_eq (vector signed char, (a1), vector signed char, (a2), int, (a3)), \
+ ((vector signed char) __builtin_altivec_vsldoi_4si ((vector signed int) (a1), (vector signed int) (a2), (const char) (a3))), \
+__ch (__tern_args_eq (vector unsigned char, (a1), vector unsigned char, (a2), int, (a3)), \
+ ((vector unsigned char) __builtin_altivec_vsldoi_4si ((vector signed int) (a1), (vector signed int) (a2), (const char) (a3))), \
__altivec_link_error_invalid_argument ())))))))
#define vec_sll(a1, a2) \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned short, a2), \
- (vector unsigned int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned char, a2), \
- (vector unsigned int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned int, a2), \
- (vector signed short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned char, a2), \
- (vector signed short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned int, a2), \
- (vector unsigned short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned char, a2), \
- (vector unsigned short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned int, a2), \
- (vector signed char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned short, a2), \
- (vector signed char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned int, a2), \
- (vector unsigned char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned short, a2), \
- (vector unsigned char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned short, (a2)), \
+ ((vector signed int) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned char, (a2)), \
+ ((vector signed int) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned int, (a2)), \
+ ((vector signed short) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned char, (a2)), \
+ ((vector signed short) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned int, (a2)), \
+ ((vector signed char) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned short, (a2)), \
+ ((vector signed char) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsl ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))))))))))))))))
#define vec_slo(a1, a2) \
-__ch (__bin_args_eq (vector float, a1, vector signed char, a2), \
- (vector float) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector unsigned char, a2), \
- (vector float) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed char, a2), \
- (vector unsigned int) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned char, a2), \
- (vector unsigned int) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed char, a2), \
- (vector signed short) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned char, a2), \
- (vector signed short) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed char, a2), \
- (vector unsigned short) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned char, a2), \
- (vector unsigned short) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed char) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector unsigned char) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector float, (a1), vector signed char, (a2)), \
+ ((vector float) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector unsigned char, (a2)), \
+ ((vector float) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed char, (a2)), \
+ ((vector signed int) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned char, (a2)), \
+ ((vector signed int) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed char, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed char, (a2)), \
+ ((vector signed short) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned char, (a2)), \
+ ((vector signed short) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed char, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vslo ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))))))))))))
#define vec_splat(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, const char, a2), \
- (vector signed char) __builtin_altivec_vspltb ((vector signed char) a1, (const char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, const char, a2), \
- (vector unsigned char) __builtin_altivec_vspltb ((vector signed char) a1, (const char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, const char, a2), \
- (vector signed short) __builtin_altivec_vsplth ((vector signed short) a1, (const char) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, const char, a2), \
- (vector unsigned short) __builtin_altivec_vsplth ((vector signed short) a1, (const char) a2), \
-__ch (__bin_args_eq (vector float, a1, const char, a2), \
- (vector float) __builtin_altivec_vspltw ((vector signed int) a1, (const char) a2), \
-__ch (__bin_args_eq (vector signed int, a1, const char, a2), \
- (vector signed int) __builtin_altivec_vspltw ((vector signed int) a1, (const char) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, const char, a2), \
- (vector unsigned int) __builtin_altivec_vspltw ((vector signed int) a1, (const char) a2), \
+__ch (__bin_args_eq (vector signed char, ((a1)), int, ((a2))), \
+ ((vector signed char) __builtin_altivec_vspltb ((vector signed char) ((a1)), (const char) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned char, ((a1)), int, ((a2))), \
+ ((vector unsigned char) __builtin_altivec_vspltb ((vector signed char) ((a1)), (const char) ((a2)))), \
+__ch (__bin_args_eq (vector signed short, ((a1)), int, ((a2))), \
+ ((vector signed short) __builtin_altivec_vsplth ((vector signed short) ((a1)), (const char) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned short, ((a1)), int, ((a2))), \
+ ((vector unsigned short) __builtin_altivec_vsplth ((vector signed short) ((a1)), (const char) ((a2)))), \
+__ch (__bin_args_eq (vector float, ((a1)), int, ((a2))), \
+ ((vector float) __builtin_altivec_vspltw ((vector signed int) ((a1)), (const char) ((a2)))), \
+__ch (__bin_args_eq (vector signed int, ((a1)), int, ((a2))), \
+ ((vector signed int) __builtin_altivec_vspltw ((vector signed int) ((a1)), (const char) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned int, ((a1)), int, ((a2))), \
+ ((vector unsigned int) __builtin_altivec_vspltw ((vector signed int) (a1), (const char) ((a2)))), \
__altivec_link_error_invalid_argument ())))))))
-#define vec_splat_s8(a1) __builtin_altivec_vspltisb (a1)
+#define vec_vspltw(a1, a2) \
+__ch (__bin_args_eq (vector float, ((a1)), int, ((a2))), \
+ ((vector float) __builtin_altivec_vspltw ((vector signed int) ((a1)), (const char) ((a2)))), \
+__ch (__bin_args_eq (vector signed int, ((a1)), int, ((a2))), \
+ ((vector signed int) __builtin_altivec_vspltw ((vector signed int) ((a1)), (const char) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned int, ((a1)), int, ((a2))), \
+ ((vector unsigned int) __builtin_altivec_vspltw ((vector signed int) (a1), (const char) ((a2)))), \
+__altivec_link_error_invalid_argument ())))
+
+#define vec_vsplth(a1, a2) \
+__ch (__bin_args_eq (vector signed short, ((a1)), int, ((a2))), \
+ ((vector signed short) __builtin_altivec_vsplth ((vector signed short) ((a1)), (const char) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned short, ((a1)), int, ((a2))), \
+ ((vector unsigned short) __builtin_altivec_vsplth ((vector signed short) ((a1)), (const char) ((a2)))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_vspltb(a1, a2) \
+__ch (__bin_args_eq (vector signed char, ((a1)), int, ((a2))), \
+ ((vector signed char) __builtin_altivec_vspltb ((vector signed char) ((a1)), (const char) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned char, ((a1)), int, ((a2))), \
+ ((vector unsigned char) __builtin_altivec_vspltb ((vector signed char) ((a1)), (const char) ((a2)))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_splat_s8(a1) __builtin_altivec_vspltisb ((a1))
-#define vec_splat_s16(a1) __builtin_altivec_vspltish (a1)
+#define vec_splat_s16(a1) __builtin_altivec_vspltish ((a1))
-#define vec_splat_s32(a1) __builtin_altivec_vspltisw (a1)
+#define vec_splat_s32(a1) __builtin_altivec_vspltisw ((a1))
-#define vec_splat_u8(a1) __builtin_altivec_vspltisb (a1)
+#define vec_splat_u8(a1) ((vector unsigned char) __builtin_altivec_vspltisb ((a1)))
-#define vec_splat_u16(a1) __builtin_altivec_vspltish (a1)
+#define vec_splat_u16(a1) ((vector unsigned short) __builtin_altivec_vspltish ((a1)))
-#define vec_splat_u32(a1) __builtin_altivec_vspltisw (a1)
+#define vec_splat_u32(a1) ((vector unsigned int) __builtin_altivec_vspltisw ((a1)))
#define vec_sr(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed char) __builtin_altivec_vsrb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vsrb ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed short) __builtin_altivec_vsrh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vsrh ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vsrw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vsrw ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vsrb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsrb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vsrh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsrh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsrw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsrw ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))))
+#define vec_vsrw(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsrw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsrw ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_vsrh(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vsrh ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsrh ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_vsrb(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vsrb ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsrb ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
#define vec_sra(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed char) __builtin_altivec_vsrab ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vsrab ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed short) __builtin_altivec_vsrah ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vsrah ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vsraw ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vsraw ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vsrab ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsrab ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vsrah ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsrah ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsraw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsraw ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))))
+#define vec_vsraw(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsraw ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsraw ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_vsrah(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vsrah ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsrah ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_vsrab(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vsrab ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsrab ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ()))
+
#define vec_srl(a1, a2) \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned short, a2), \
- (vector unsigned int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned char, a2), \
- (vector unsigned int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned int, a2), \
- (vector signed short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned char, a2), \
- (vector signed short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned int, a2), \
- (vector unsigned short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned char, a2), \
- (vector unsigned short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned int, a2), \
- (vector signed char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned short, a2), \
- (vector signed char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned int, a2), \
- (vector unsigned char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned short, a2), \
- (vector unsigned char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned short, (a2)), \
+ ((vector signed int) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned char, (a2)), \
+ ((vector signed int) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned int, (a2)), \
+ ((vector signed short) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector signed short) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned char, (a2)), \
+ ((vector signed short) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned int, (a2)), \
+ ((vector signed char) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned short, (a2)), \
+ ((vector signed char) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsr ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))))))))))))))))
#define vec_sro(a1, a2) \
-__ch (__bin_args_eq (vector float, a1, vector signed char, a2), \
- (vector float) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector unsigned char, a2), \
- (vector float) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed char, a2), \
- (vector unsigned int) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned char, a2), \
- (vector unsigned int) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed char, a2), \
- (vector signed short) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned char, a2), \
- (vector signed short) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed char, a2), \
- (vector unsigned short) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned char, a2), \
- (vector unsigned short) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed char) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector unsigned char) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector float, (a1), vector signed char, (a2)), \
+ ((vector float) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector unsigned char, (a2)), \
+ ((vector float) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed char, (a2)), \
+ ((vector signed int) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned char, (a2)), \
+ ((vector signed int) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed char, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed char, (a2)), \
+ ((vector signed short) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned char, (a2)), \
+ ((vector signed short) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed char, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector signed char) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsro ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))))))))))))
#define vec_st(a1, a2, a3) \
- __builtin_altivec_stvx ((vector signed int) a1, a2, a3)
+ __builtin_altivec_stvx ((vector signed int) (a1), (a2), (a3))
#define vec_stl(a1, a2, a3) \
- __builtin_altivec_stvxl ((vector signed int) a1, a2, a3)
+ __builtin_altivec_stvxl ((vector signed int) (a1), (a2), (a3))
#define vec_ste(a, b, c) \
-__ch (__un_args_eq (vector unsigned char, a), \
- __builtin_altivec_stvebx ((vector signed char) a, b, c), \
-__ch (__un_args_eq (vector signed char, a), \
- __builtin_altivec_stvebx ((vector signed char) a, b, c), \
-__ch (__un_args_eq (vector unsigned short, a), \
- __builtin_altivec_stvehx ((vector signed short) a, b, c), \
-__ch (__un_args_eq (vector signed short, a), \
- __builtin_altivec_stvehx ((vector signed short) a, b, c), \
-__ch (__un_args_eq (vector unsigned int, a), \
- __builtin_altivec_stvewx ((vector signed int) a, b, c), \
-__ch (__un_args_eq (vector signed int, a), \
- __builtin_altivec_stvewx ((vector signed int) a, b, c), \
-__ch (__un_args_eq (vector float, a), \
- __builtin_altivec_stvewx ((vector signed int) a, b, c), \
+__ch (__un_args_eq (vector unsigned char, (a)), \
+ __builtin_altivec_stvebx ((vector signed char) (a), (b), (c)), \
+__ch (__un_args_eq (vector signed char, (a)), \
+ __builtin_altivec_stvebx ((vector signed char) (a), (b), (c)), \
+__ch (__un_args_eq (vector unsigned short, (a)), \
+ __builtin_altivec_stvehx ((vector signed short) (a), (b), (c)), \
+__ch (__un_args_eq (vector signed short, (a)), \
+ __builtin_altivec_stvehx ((vector signed short) (a), (b), (c)), \
+__ch (__un_args_eq (vector unsigned int, (a)), \
+ __builtin_altivec_stvewx ((vector signed int) (a), (b), (c)), \
+__ch (__un_args_eq (vector signed int, (a)), \
+ __builtin_altivec_stvewx ((vector signed int) (a), (b), (c)), \
+__ch (__un_args_eq (vector float, (a)), \
+ __builtin_altivec_stvewx ((vector signed int) (a), (b), (c)), \
__altivec_link_error_invalid_argument ())))))))
+#define vec_stvewx(a, b, c) \
+__ch (__un_args_eq (vector unsigned int, (a)), \
+ __builtin_altivec_stvewx ((vector signed int) (a), (b), (c)), \
+__ch (__un_args_eq (vector signed int, (a)), \
+ __builtin_altivec_stvewx ((vector signed int) (a), (b), (c)), \
+__ch (__un_args_eq (vector float, (a)), \
+ __builtin_altivec_stvewx ((vector signed int) (a), (b), (c)), \
+__altivec_link_error_invalid_argument ())))
+
+#define vec_stvehx(a, b, c) \
+__ch (__un_args_eq (vector unsigned short, (a)), \
+ __builtin_altivec_stvehx ((vector signed short) (a), (b), (c)), \
+__ch (__un_args_eq (vector signed short, (a)), \
+ __builtin_altivec_stvehx ((vector signed short) (a), (b), (c)), \
+__altivec_link_error_invalid_argument ()))
+
+#define vec_stvebx(a, b, c) \
+__ch (__un_args_eq (vector unsigned char, (a)), \
+ __builtin_altivec_stvebx ((vector signed char) (a), (b), (c)), \
+__ch (__un_args_eq (vector signed char, (a)), \
+ __builtin_altivec_stvebx ((vector signed char) (a), (b), (c)), \
+__altivec_link_error_invalid_argument ()))
+
#define vec_sub(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector unsigned char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector float) __builtin_altivec_vsubfp ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vsububm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsububm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsububm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsububm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vsubuhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsubuwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vsubfp ((vector float) (a1), (vector float) (a2))), \
__altivec_link_error_invalid_argument ())))))))))))))
-#define vec_subc(a1, a2) __builtin_altivec_vsubcuw (a1, a2)
+#define vec_vsubfp(a1, a2) \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ ((vector float) __builtin_altivec_vsubfp ((vector float) (a1), (vector float) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vsubuwm(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsubuwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ()))))
+
+#define vec_vsubuhm(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vsubuhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ()))))
+
+#define vec_vsububm(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vsububm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsububm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsububm ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsububm ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ()))))
+
+#define vec_subc(a1, a2) ((vector unsigned int) __builtin_altivec_vsubcuw ((vector unsigned int) (a1), (vector unsigned int) (a2)))
#define vec_subs(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vsububs ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector unsigned char) __builtin_altivec_vsububs ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vsububs ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vsubsbs ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vsubshs ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vsubsws ((vector signed int) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsububs ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsububs ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsububs ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vsubsbs ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vsubshs ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsubsws ((vector signed int) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ()))))))))))))
+#define vec_vsubsws(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsubsws ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vsubuws(a1, a2) \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())))
+
+#define vec_vsubshs(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ ((vector signed short) __builtin_altivec_vsubshs ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vsubuhs(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) (a1), (vector signed short) (a2))), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ ((vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) (a1), (vector signed short) (a2))), \
+__altivec_link_error_invalid_argument ())))
+
+#define vec_vsubsbs(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ ((vector signed char) __builtin_altivec_vsubsbs ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vsububs(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsububs ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsububs ((vector signed char) (a1), (vector signed char) (a2))), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ ((vector unsigned char) __builtin_altivec_vsububs ((vector signed char) (a1), (vector signed char) (a2))), \
+__altivec_link_error_invalid_argument ())))
+
#define vec_sum4s(a1, a2) \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vsum4ubs ((vector signed char) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vsum4sbs ((vector signed char) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vsum4shs ((vector signed short) a1, (vector signed int) a2), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsum4ubs ((vector signed char) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsum4sbs ((vector signed char) (a1), (vector signed int) (a2))), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsum4shs ((vector signed short) (a1), (vector signed int) (a2))), \
__altivec_link_error_invalid_argument ())))
-#define vec_sum2s(a1, a2) __builtin_altivec_vsum2sws (a1, a2)
+#define vec_vsum4shs(a1, a2) \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsum4shs ((vector signed short) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vsum4sbs(a1, a2) \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed int, (a2)), \
+ ((vector signed int) __builtin_altivec_vsum4sbs ((vector signed char) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())
-#define vec_sums(a1, a2) __builtin_altivec_vsumsws (a1, a2)
+#define vec_vsum4ubs(a1, a2) \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned int, (a2)), \
+ ((vector unsigned int) __builtin_altivec_vsum4ubs ((vector signed char) (a1), (vector signed int) (a2))), \
+__altivec_link_error_invalid_argument ())
-#define vec_trunc(a1) __builtin_altivec_vrfiz (a1)
+#define vec_sum2s(a1, a2) __builtin_altivec_vsum2sws ((a1), (a2))
+
+#define vec_sums(a1, a2) __builtin_altivec_vsumsws ((a1), (a2))
+
+#define vec_trunc(a1) __builtin_altivec_vrfiz ((a1))
#define vec_unpackh(a1) \
-__ch (__un_args_eq (vector signed char, a1), \
- (vector signed short) __builtin_altivec_vupkhsb ((vector signed char) a1), \
-__ch (__un_args_eq (vector signed short, a1), \
- (vector unsigned int) __builtin_altivec_vupkhpx ((vector signed short) a1), \
-__ch (__un_args_eq (vector signed short, a1), \
- (vector signed int) __builtin_altivec_vupkhsh ((vector signed short) a1), \
+__ch (__un_args_eq (vector signed char, (a1)), \
+ ((vector signed short) __builtin_altivec_vupkhsb ((vector signed char) (a1))), \
+__ch (__un_args_eq (vector signed short, (a1)), \
+ ((vector unsigned int) __builtin_altivec_vupkhpx ((vector signed short) (a1))), \
+__ch (__un_args_eq (vector signed short, (a1)), \
+ ((vector signed int) __builtin_altivec_vupkhsh ((vector signed short) (a1))), \
__altivec_link_error_invalid_argument ())))
+#define vec_vupkhsh(a1) \
+__ch (__un_args_eq (vector signed short, (a1)), \
+ ((vector signed int) __builtin_altivec_vupkhsh ((vector signed short) (a1))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vupkhpx(a1) \
+__ch (__un_args_eq (vector signed short, (a1)), \
+ ((vector unsigned int) __builtin_altivec_vupkhpx ((vector signed short) (a1))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vupkhsb(a1) \
+__ch (__un_args_eq (vector signed char, (a1)), \
+ ((vector signed short) __builtin_altivec_vupkhsb ((vector signed char) (a1))), \
+__altivec_link_error_invalid_argument ())
+
#define vec_unpackl(a1) \
-__ch (__un_args_eq (vector signed char, a1), \
- (vector signed short) __builtin_altivec_vupklsb ((vector signed char) a1), \
-__ch (__un_args_eq (vector signed short, a1), \
- (vector unsigned int) __builtin_altivec_vupklpx ((vector signed short) a1), \
-__ch (__un_args_eq (vector signed short, a1), \
- (vector signed int) __builtin_altivec_vupklsh ((vector signed short) a1), \
+__ch (__un_args_eq (vector signed char, (a1)), \
+ ((vector signed short) __builtin_altivec_vupklsb ((vector signed char) (a1))), \
+__ch (__un_args_eq (vector signed short, (a1)), \
+ ((vector unsigned int) __builtin_altivec_vupklpx ((vector signed short) (a1))), \
+__ch (__un_args_eq (vector signed short, (a1)), \
+ ((vector signed int) __builtin_altivec_vupklsh ((vector signed short) (a1))), \
__altivec_link_error_invalid_argument ())))
+#define vec_vupklsh(a1) \
+__ch (__un_args_eq (vector signed short, (a1)), \
+ ((vector signed int) __builtin_altivec_vupklsh ((vector signed short) (a1))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vupklpx(a1) \
+__ch (__un_args_eq (vector signed short, (a1)), \
+ ((vector unsigned int) __builtin_altivec_vupklpx ((vector signed short) (a1))), \
+__altivec_link_error_invalid_argument ())
+
+#define vec_vupklsb(a1) \
+__ch (__un_args_eq (vector signed char, (a1)), \
+ ((vector signed short) __builtin_altivec_vupklsb ((vector signed char) (a1))), \
+__altivec_link_error_invalid_argument ())
+
#define vec_xor(a1, a2) \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector float) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector signed int, a2), \
- (vector float) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector float, a2), \
- (vector float) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector unsigned int) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector unsigned int) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed short) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector unsigned short) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector unsigned short) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed char) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector unsigned char) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector unsigned char) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
- __altivec_link_error_invalid_argument ())))))))))))))))
+__ch (__bin_args_eq (vector float, ((a1)), vector float, ((a2))), \
+ ((vector float) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector float, ((a1)), vector unsigned int, ((a2))), \
+ ((vector float) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned int, ((a1)), vector float, ((a2))), \
+ ((vector float) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector signed int, ((a1)), vector signed int, ((a2))), \
+ ((vector signed int) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned int, ((a1)), vector unsigned int, ((a2))), \
+ ((vector unsigned int) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector signed int, ((a1)), vector unsigned int, ((a2))), \
+ ((vector unsigned int) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned int, ((a1)), vector signed int, ((a2))), \
+ ((vector unsigned int) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned int, ((a1)), vector unsigned int, ((a2))), \
+ ((vector unsigned int) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned short, ((a1)), vector unsigned short, ((a2))), \
+ ((vector unsigned short) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector signed short, ((a1)), vector unsigned short, ((a2))), \
+ ((vector signed short) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned short, ((a1)), vector signed short, ((a2))), \
+ ((vector signed short) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned short, ((a1)), vector unsigned short, ((a2))), \
+ ((vector signed short) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector signed short, ((a1)), vector signed short, ((a2))), \
+ ((vector signed short) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector signed short, ((a1)), vector unsigned short, ((a2))), \
+ ((vector unsigned short) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned short, ((a1)), vector signed short, ((a2))), \
+ ((vector unsigned short) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned short, ((a1)), vector unsigned short, ((a2))), \
+ ((vector unsigned short) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned char, ((a1)), vector unsigned char, ((a2))), \
+ ((vector unsigned char) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector signed char, ((a1)), vector unsigned char, ((a2))), \
+ ((vector unsigned char) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector signed char, ((a1)), vector signed char, ((a2))), \
+ ((vector signed char) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned char, ((a1)), vector unsigned char, ((a2))), \
+ ((vector signed char) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector signed char, ((a1)), vector unsigned char, ((a2))), \
+ ((vector signed char) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+__ch (__bin_args_eq (vector unsigned char, ((a1)), vector signed char, ((a2))), \
+ ((vector signed char) __builtin_altivec_vxor ((vector signed int) ((a1)), (vector signed int) ((a2)))), \
+ __altivec_link_error_invalid_argument ()))))))))))))))))))))))
+
+/* Predicates. */
#define vec_all_eq(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpeqfp_p ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_LT, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_LT, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_LT, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_LT, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_LT, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_LT, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_LT, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_LT, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_LT, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_LT, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_LT, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_LT, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ __builtin_altivec_vcmpeqfp_p (__CR6_LT, (vector float) (a1), (vector float) (a2)), \
__altivec_link_error_invalid_argument ())))))))))))))
#define vec_all_ge(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpgefp_p ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_EQ, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_EQ, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_EQ, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtsb_p (__CR6_EQ, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_EQ, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_EQ, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_EQ, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtsh_p (__CR6_EQ, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_EQ, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_EQ, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_EQ, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtsw_p (__CR6_EQ, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ __builtin_altivec_vcmpgefp_p (__CR6_EQ, (vector float) (a1), (vector float) (a2)), \
__altivec_link_error_invalid_argument ())))))))))))))
#define vec_all_gt(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpgtfp_p ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_LT, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_LT, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_LT, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtsb_p (__CR6_LT, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_LT, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_LT, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_LT, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtsh_p (__CR6_LT, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_LT, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_LT, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_LT, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtsw_p (__CR6_LT, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ __builtin_altivec_vcmpgtfp_p (__CR6_LT, (vector float) (a1), (vector float) (a2)), \
__altivec_link_error_invalid_argument ())))))))))))))
-#define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (a1, a2)
+#define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ, (a1), (a2))
#define vec_all_le(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpgefp_p ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_EQ, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_EQ, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_EQ, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtsb_p (__CR6_EQ, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_EQ, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_EQ, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_EQ, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtsh_p (__CR6_EQ, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_EQ, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_EQ, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_EQ, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtsw_p (__CR6_EQ, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ __builtin_altivec_vcmpgefp_p (__CR6_LT, (vector float) (a2), (vector float) (a1)), \
__altivec_link_error_invalid_argument ())))))))))))))
#define vec_all_lt(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpgtfp_p ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_LT, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_LT, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_LT, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtsb_p (__CR6_LT, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_LT, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_LT, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_LT, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtsh_p (__CR6_LT, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_LT, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_LT, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_LT, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtsw_p (__CR6_LT, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ __builtin_altivec_vcmpgtfp_p (__CR6_LT, (vector float) (a2), (vector float) (a1)), \
__altivec_link_error_invalid_argument ())))))))))))))
-#define vec_all_nan(a1) __builtin_altivec_vcmpeqfp_p (a1)
+#define vec_all_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ, (a1), (a1))
#define vec_all_ne(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpeqfp_p ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_EQ, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_EQ, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_EQ, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_EQ, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_EQ, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_EQ, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_EQ, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_EQ, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_EQ, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_EQ, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_EQ, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_EQ, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ __builtin_altivec_vcmpeqfp_p (__CR6_EQ, (vector float) (a1), (vector float) (a2)), \
__altivec_link_error_invalid_argument ())))))))))))))
-#define vec_all_nge(a1, a2) __builtin_altivec_vcmpgefp_p (a1, a2)
+#define vec_all_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a1), (a2))
-#define vec_all_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (a1, a2)
+#define vec_all_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a1), (a2))
-#define vec_all_nle(a1, a2) __builtin_altivec_vcmpgefp_p (a1, a2)
+#define vec_all_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a2), (a1))
-#define vec_all_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (a1, a2)
+#define vec_all_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a2), (a1))
-#define vec_all_numeric(a1) __builtin_altivec_vcmpeqfp_p (a1)
+#define vec_all_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ, (a1), (a1))
#define vec_any_eq(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpeqfp_p ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_EQ_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_EQ_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_EQ_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_EQ_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_EQ_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_EQ_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_EQ_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_EQ_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_EQ_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_EQ_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_EQ_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_EQ_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, (vector float) (a1), (vector float) (a2)), \
__altivec_link_error_invalid_argument ())))))))))))))
#define vec_any_ge(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpgefp_p ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_LT_REV, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_LT_REV, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_LT_REV, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtsb_p (__CR6_LT_REV, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_LT_REV, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_LT_REV, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_LT_REV, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtsh_p (__CR6_LT_REV, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_LT_REV, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_LT_REV, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_LT_REV, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtsw_p (__CR6_LT_REV, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ __builtin_altivec_vcmpgefp_p (__CR6_EQ_REV, (vector float) (a1), (vector float) (a2)), \
__altivec_link_error_invalid_argument ())))))))))))))
#define vec_any_gt(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpgtfp_p ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_EQ_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_EQ_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_EQ_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtsb_p (__CR6_EQ_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_EQ_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_EQ_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_EQ_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtsh_p (__CR6_EQ_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_EQ_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_EQ_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_EQ_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtsw_p (__CR6_EQ_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ __builtin_altivec_vcmpgtfp_p (__CR6_EQ_REV, (vector float) (a1), (vector float) (a2)), \
__altivec_link_error_invalid_argument ())))))))))))))
#define vec_any_le(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpgefp_p ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_LT_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_LT_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_LT_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtsb_p (__CR6_LT_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_LT_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_LT_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_LT_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtsh_p (__CR6_LT_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_LT_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_LT_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_LT_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtsw_p (__CR6_LT_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ __builtin_altivec_vcmpgefp_p (__CR6_EQ_REV, (vector float) (a2), (vector float) (a1)), \
__altivec_link_error_invalid_argument ())))))))))))))
#define vec_any_lt(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpgtfp_p ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_EQ_REV, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_EQ_REV, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpgtub_p (__CR6_EQ_REV, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpgtsb_p (__CR6_EQ_REV, (vector signed char) (a2), (vector signed char) (a1)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_EQ_REV, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_EQ_REV, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpgtuh_p (__CR6_EQ_REV, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpgtsh_p (__CR6_EQ_REV, (vector signed short) (a2), (vector signed short) (a1)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_EQ_REV, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_EQ_REV, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpgtuw_p (__CR6_EQ_REV, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpgtsw_p (__CR6_EQ_REV, (vector signed int) (a2), (vector signed int) (a1)), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ __builtin_altivec_vcmpgtfp_p (__CR6_EQ_REV, (vector float) (a2), (vector float) (a1)), \
__altivec_link_error_invalid_argument ())))))))))))))
-#define vec_any_nan(a1) __builtin_altivec_vcmpeqfp_p (a1)
+#define vec_any_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, a1, a1)
#define vec_any_ne(a1, a2) \
-__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
- (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
- (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
- (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
-__ch (__bin_args_eq (vector float, a1, vector float, a2), \
- (vector signed int) __builtin_altivec_vcmpeqfp_p ((vector float) a1, (vector float) a2), \
+__ch (__bin_args_eq (vector signed char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_LT_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_LT_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector signed char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_LT_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
+ __builtin_altivec_vcmpequb_p (__CR6_LT_REV, (vector signed char) (a1), (vector signed char) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_LT_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_LT_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector signed short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_LT_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
+ __builtin_altivec_vcmpequh_p (__CR6_LT_REV, (vector signed short) (a1), (vector signed short) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_LT_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_LT_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector signed int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_LT_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
+ __builtin_altivec_vcmpequw_p (__CR6_LT_REV, (vector signed int) (a1), (vector signed int) (a2)), \
+__ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
+ __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, (vector float) (a1), (vector float) (a2)), \
__altivec_link_error_invalid_argument ())))))))))))))
-#define vec_any_nge(a1, a2) __builtin_altivec_vcmpgefp_p (a1, a2)
+#define vec_any_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a1), (a2))
-#define vec_any_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (a1, a2)
+#define vec_any_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a1), (a2))
-#define vec_any_nle(a1, a2) __builtin_altivec_vcmpgefp_p (a1, a2)
+#define vec_any_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a2), (a1))
-#define vec_any_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (a1, a2)
+#define vec_any_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a2), (a1))
-#define vec_any_numeric(a1) __builtin_altivec_vcmpeqfp_p (a1)
+#define vec_any_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, (a1), (a1))
-#define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (a1, a2)
+#define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, (a1), (a2))
#endif /* __cplusplus */
diff --git a/contrib/gcc/config/rs6000/crtsavres.asm b/contrib/gcc/config/rs6000/crtsavres.asm
new file mode 100644
index 0000000..0c65182
--- /dev/null
+++ b/contrib/gcc/config/rs6000/crtsavres.asm
@@ -0,0 +1,407 @@
+/*
+ * Special support for eabi and SVR4
+ *
+ * Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc.
+ * Written By Michael Meissner
+ * 64-bit support written by David Edelsohn
+ *
+ * This file 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.
+ *
+ * In addition to the permissions in the GNU General Public License, the
+ * Free Software Foundation gives you unlimited permission to link the
+ * compiled version of this file with other programs, and to distribute
+ * those programs without any restriction coming from the use of this
+ * file. (The General Public License restrictions do apply in other
+ * respects; for example, they cover modification of the file, and
+ * distribution when not linked into another program.)
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * As a special exception, if you link this library with files
+ * compiled with GCC to produce an executable, this does not cause
+ * the resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why
+ * the executable file might be covered by the GNU General Public License.
+ */
+
+/* Do any initializations needed for the eabi environment */
+
+ .file "crtsavres.asm"
+ .section ".text"
+ #include "ppc-asm.h"
+
+#ifndef __powerpc64__
+
+/* Routines for saving floating point registers, called by the compiler. */
+/* Called with r11 pointing to the stack header word of the caller of the */
+/* function, just beyond the end of the floating point save area. */
+
+FUNC_START(_savefpr_14) stfd 14,-144(11) /* save fp registers */
+FUNC_START(_savefpr_15) stfd 15,-136(11)
+FUNC_START(_savefpr_16) stfd 16,-128(11)
+FUNC_START(_savefpr_17) stfd 17,-120(11)
+FUNC_START(_savefpr_18) stfd 18,-112(11)
+FUNC_START(_savefpr_19) stfd 19,-104(11)
+FUNC_START(_savefpr_20) stfd 20,-96(11)
+FUNC_START(_savefpr_21) stfd 21,-88(11)
+FUNC_START(_savefpr_22) stfd 22,-80(11)
+FUNC_START(_savefpr_23) stfd 23,-72(11)
+FUNC_START(_savefpr_24) stfd 24,-64(11)
+FUNC_START(_savefpr_25) stfd 25,-56(11)
+FUNC_START(_savefpr_26) stfd 26,-48(11)
+FUNC_START(_savefpr_27) stfd 27,-40(11)
+FUNC_START(_savefpr_28) stfd 28,-32(11)
+FUNC_START(_savefpr_29) stfd 29,-24(11)
+FUNC_START(_savefpr_30) stfd 30,-16(11)
+FUNC_START(_savefpr_31) stfd 31,-8(11)
+ blr
+FUNC_END(_savefpr_31)
+FUNC_END(_savefpr_30)
+FUNC_END(_savefpr_29)
+FUNC_END(_savefpr_28)
+FUNC_END(_savefpr_27)
+FUNC_END(_savefpr_26)
+FUNC_END(_savefpr_25)
+FUNC_END(_savefpr_24)
+FUNC_END(_savefpr_23)
+FUNC_END(_savefpr_22)
+FUNC_END(_savefpr_21)
+FUNC_END(_savefpr_20)
+FUNC_END(_savefpr_19)
+FUNC_END(_savefpr_18)
+FUNC_END(_savefpr_17)
+FUNC_END(_savefpr_16)
+FUNC_END(_savefpr_15)
+FUNC_END(_savefpr_14)
+
+/* Routines for saving integer registers, called by the compiler. */
+/* Called with r11 pointing to the stack header word of the caller of the */
+/* function, just beyond the end of the integer save area. */
+
+FUNC_START(_savegpr_14) stw 14,-72(11) /* save gp registers */
+FUNC_START(_savegpr_15) stw 15,-68(11)
+FUNC_START(_savegpr_16) stw 16,-64(11)
+FUNC_START(_savegpr_17) stw 17,-60(11)
+FUNC_START(_savegpr_18) stw 18,-56(11)
+FUNC_START(_savegpr_19) stw 19,-52(11)
+FUNC_START(_savegpr_20) stw 20,-48(11)
+FUNC_START(_savegpr_21) stw 21,-44(11)
+FUNC_START(_savegpr_22) stw 22,-40(11)
+FUNC_START(_savegpr_23) stw 23,-36(11)
+FUNC_START(_savegpr_24) stw 24,-32(11)
+FUNC_START(_savegpr_25) stw 25,-28(11)
+FUNC_START(_savegpr_26) stw 26,-24(11)
+FUNC_START(_savegpr_27) stw 27,-20(11)
+FUNC_START(_savegpr_28) stw 28,-16(11)
+FUNC_START(_savegpr_29) stw 29,-12(11)
+FUNC_START(_savegpr_30) stw 30,-8(11)
+FUNC_START(_savegpr_31) stw 31,-4(11)
+ blr
+FUNC_END(_savegpr_31)
+FUNC_END(_savegpr_30)
+FUNC_END(_savegpr_29)
+FUNC_END(_savegpr_28)
+FUNC_END(_savegpr_27)
+FUNC_END(_savegpr_26)
+FUNC_END(_savegpr_25)
+FUNC_END(_savegpr_24)
+FUNC_END(_savegpr_23)
+FUNC_END(_savegpr_22)
+FUNC_END(_savegpr_21)
+FUNC_END(_savegpr_20)
+FUNC_END(_savegpr_19)
+FUNC_END(_savegpr_18)
+FUNC_END(_savegpr_17)
+FUNC_END(_savegpr_16)
+FUNC_END(_savegpr_15)
+FUNC_END(_savegpr_14)
+
+/* Routines for restoring floating point registers, called by the compiler. */
+/* Called with r11 pointing to the stack header word of the caller of the */
+/* function, just beyond the end of the floating point save area. */
+
+FUNC_START(_restfpr_14) lfd 14,-144(11) /* restore fp registers */
+FUNC_START(_restfpr_15) lfd 15,-136(11)
+FUNC_START(_restfpr_16) lfd 16,-128(11)
+FUNC_START(_restfpr_17) lfd 17,-120(11)
+FUNC_START(_restfpr_18) lfd 18,-112(11)
+FUNC_START(_restfpr_19) lfd 19,-104(11)
+FUNC_START(_restfpr_20) lfd 20,-96(11)
+FUNC_START(_restfpr_21) lfd 21,-88(11)
+FUNC_START(_restfpr_22) lfd 22,-80(11)
+FUNC_START(_restfpr_23) lfd 23,-72(11)
+FUNC_START(_restfpr_24) lfd 24,-64(11)
+FUNC_START(_restfpr_25) lfd 25,-56(11)
+FUNC_START(_restfpr_26) lfd 26,-48(11)
+FUNC_START(_restfpr_27) lfd 27,-40(11)
+FUNC_START(_restfpr_28) lfd 28,-32(11)
+FUNC_START(_restfpr_29) lfd 29,-24(11)
+FUNC_START(_restfpr_30) lfd 30,-16(11)
+FUNC_START(_restfpr_31) lfd 31,-8(11)
+ blr
+FUNC_END(_restfpr_31)
+FUNC_END(_restfpr_30)
+FUNC_END(_restfpr_29)
+FUNC_END(_restfpr_28)
+FUNC_END(_restfpr_27)
+FUNC_END(_restfpr_26)
+FUNC_END(_restfpr_25)
+FUNC_END(_restfpr_24)
+FUNC_END(_restfpr_23)
+FUNC_END(_restfpr_22)
+FUNC_END(_restfpr_21)
+FUNC_END(_restfpr_20)
+FUNC_END(_restfpr_19)
+FUNC_END(_restfpr_18)
+FUNC_END(_restfpr_17)
+FUNC_END(_restfpr_16)
+FUNC_END(_restfpr_15)
+FUNC_END(_restfpr_14)
+
+/* Routines for restoring integer registers, called by the compiler. */
+/* Called with r11 pointing to the stack header word of the caller of the */
+/* function, just beyond the end of the integer restore area. */
+
+FUNC_START(_restgpr_14) lwz 14,-72(11) /* restore gp registers */
+FUNC_START(_restgpr_15) lwz 15,-68(11)
+FUNC_START(_restgpr_16) lwz 16,-64(11)
+FUNC_START(_restgpr_17) lwz 17,-60(11)
+FUNC_START(_restgpr_18) lwz 18,-56(11)
+FUNC_START(_restgpr_19) lwz 19,-52(11)
+FUNC_START(_restgpr_20) lwz 20,-48(11)
+FUNC_START(_restgpr_21) lwz 21,-44(11)
+FUNC_START(_restgpr_22) lwz 22,-40(11)
+FUNC_START(_restgpr_23) lwz 23,-36(11)
+FUNC_START(_restgpr_24) lwz 24,-32(11)
+FUNC_START(_restgpr_25) lwz 25,-28(11)
+FUNC_START(_restgpr_26) lwz 26,-24(11)
+FUNC_START(_restgpr_27) lwz 27,-20(11)
+FUNC_START(_restgpr_28) lwz 28,-16(11)
+FUNC_START(_restgpr_29) lwz 29,-12(11)
+FUNC_START(_restgpr_30) lwz 30,-8(11)
+FUNC_START(_restgpr_31) lwz 31,-4(11)
+ blr
+FUNC_END(_restgpr_31)
+FUNC_END(_restgpr_30)
+FUNC_END(_restgpr_29)
+FUNC_END(_restgpr_28)
+FUNC_END(_restgpr_27)
+FUNC_END(_restgpr_26)
+FUNC_END(_restgpr_25)
+FUNC_END(_restgpr_24)
+FUNC_END(_restgpr_23)
+FUNC_END(_restgpr_22)
+FUNC_END(_restgpr_21)
+FUNC_END(_restgpr_20)
+FUNC_END(_restgpr_19)
+FUNC_END(_restgpr_18)
+FUNC_END(_restgpr_17)
+FUNC_END(_restgpr_16)
+FUNC_END(_restgpr_15)
+FUNC_END(_restgpr_14)
+
+/* Routines for restoring floating point registers, called by the compiler. */
+/* Called with r11 pointing to the stack header word of the caller of the */
+/* function, just beyond the end of the floating point save area. */
+/* In addition to restoring the fp registers, it will return to the caller's */
+/* caller */
+
+FUNC_START(_restfpr_14_x) lfd 14,-144(11) /* restore fp registers */
+FUNC_START(_restfpr_15_x) lfd 15,-136(11)
+FUNC_START(_restfpr_16_x) lfd 16,-128(11)
+FUNC_START(_restfpr_17_x) lfd 17,-120(11)
+FUNC_START(_restfpr_18_x) lfd 18,-112(11)
+FUNC_START(_restfpr_19_x) lfd 19,-104(11)
+FUNC_START(_restfpr_20_x) lfd 20,-96(11)
+FUNC_START(_restfpr_21_x) lfd 21,-88(11)
+FUNC_START(_restfpr_22_x) lfd 22,-80(11)
+FUNC_START(_restfpr_23_x) lfd 23,-72(11)
+FUNC_START(_restfpr_24_x) lfd 24,-64(11)
+FUNC_START(_restfpr_25_x) lfd 25,-56(11)
+FUNC_START(_restfpr_26_x) lfd 26,-48(11)
+FUNC_START(_restfpr_27_x) lfd 27,-40(11)
+FUNC_START(_restfpr_28_x) lfd 28,-32(11)
+FUNC_START(_restfpr_29_x) lfd 29,-24(11)
+FUNC_START(_restfpr_30_x) lfd 30,-16(11)
+FUNC_START(_restfpr_31_x) lwz 0,4(11)
+ lfd 31,-8(11)
+ mtlr 0
+ mr 1,11
+ blr
+FUNC_END(_restfpr_31_x)
+FUNC_END(_restfpr_30_x)
+FUNC_END(_restfpr_29_x)
+FUNC_END(_restfpr_28_x)
+FUNC_END(_restfpr_27_x)
+FUNC_END(_restfpr_26_x)
+FUNC_END(_restfpr_25_x)
+FUNC_END(_restfpr_24_x)
+FUNC_END(_restfpr_23_x)
+FUNC_END(_restfpr_22_x)
+FUNC_END(_restfpr_21_x)
+FUNC_END(_restfpr_20_x)
+FUNC_END(_restfpr_19_x)
+FUNC_END(_restfpr_18_x)
+FUNC_END(_restfpr_17_x)
+FUNC_END(_restfpr_16_x)
+FUNC_END(_restfpr_15_x)
+FUNC_END(_restfpr_14_x)
+
+/* Routines for restoring integer registers, called by the compiler. */
+/* Called with r11 pointing to the stack header word of the caller of the */
+/* function, just beyond the end of the integer restore area. */
+
+FUNC_START(_restgpr_14_x) lwz 14,-72(11) /* restore gp registers */
+FUNC_START(_restgpr_15_x) lwz 15,-68(11)
+FUNC_START(_restgpr_16_x) lwz 16,-64(11)
+FUNC_START(_restgpr_17_x) lwz 17,-60(11)
+FUNC_START(_restgpr_18_x) lwz 18,-56(11)
+FUNC_START(_restgpr_19_x) lwz 19,-52(11)
+FUNC_START(_restgpr_20_x) lwz 20,-48(11)
+FUNC_START(_restgpr_21_x) lwz 21,-44(11)
+FUNC_START(_restgpr_22_x) lwz 22,-40(11)
+FUNC_START(_restgpr_23_x) lwz 23,-36(11)
+FUNC_START(_restgpr_24_x) lwz 24,-32(11)
+FUNC_START(_restgpr_25_x) lwz 25,-28(11)
+FUNC_START(_restgpr_26_x) lwz 26,-24(11)
+FUNC_START(_restgpr_27_x) lwz 27,-20(11)
+FUNC_START(_restgpr_28_x) lwz 28,-16(11)
+FUNC_START(_restgpr_29_x) lwz 29,-12(11)
+FUNC_START(_restgpr_30_x) lwz 30,-8(11)
+FUNC_START(_restgpr_31_x) lwz 0,4(11)
+ lwz 31,-4(11)
+ mtlr 0
+ mr 1,11
+ blr
+FUNC_END(_restgpr_31_x)
+FUNC_END(_restgpr_30_x)
+FUNC_END(_restgpr_29_x)
+FUNC_END(_restgpr_28_x)
+FUNC_END(_restgpr_27_x)
+FUNC_END(_restgpr_26_x)
+FUNC_END(_restgpr_25_x)
+FUNC_END(_restgpr_24_x)
+FUNC_END(_restgpr_23_x)
+FUNC_END(_restgpr_22_x)
+FUNC_END(_restgpr_21_x)
+FUNC_END(_restgpr_20_x)
+FUNC_END(_restgpr_19_x)
+FUNC_END(_restgpr_18_x)
+FUNC_END(_restgpr_17_x)
+FUNC_END(_restgpr_16_x)
+FUNC_END(_restgpr_15_x)
+FUNC_END(_restgpr_14_x)
+
+#else /* __powerpc64__ */
+
+ .section ".text"
+ .align 2
+
+/* Routines for saving floating point registers, called by the compiler. */
+
+.fsav:
+FUNC_START(_savef14) stfd 14,-144(1) /* save fp registers */
+FUNC_START(_savef15) stfd 15,-136(1)
+FUNC_START(_savef16) stfd 16,-128(1)
+FUNC_START(_savef17) stfd 17,-120(1)
+FUNC_START(_savef18) stfd 18,-112(1)
+FUNC_START(_savef19) stfd 19,-104(1)
+FUNC_START(_savef20) stfd 20,-96(1)
+FUNC_START(_savef21) stfd 21,-88(1)
+FUNC_START(_savef22) stfd 22,-80(1)
+FUNC_START(_savef23) stfd 23,-72(1)
+FUNC_START(_savef24) stfd 24,-64(1)
+FUNC_START(_savef25) stfd 25,-56(1)
+FUNC_START(_savef26) stfd 26,-48(1)
+FUNC_START(_savef27) stfd 27,-40(1)
+FUNC_START(_savef28) stfd 28,-32(1)
+FUNC_START(_savef29) stfd 29,-24(1)
+FUNC_START(_savef30) stfd 30,-16(1)
+FUNC_START(_savef31) stfd 31,-8(1)
+ blr
+.LTfsav:
+ .long 0
+ .byte 0,12,0,0,0,0,0,0
+ .long 0
+ .long .LTfsav-.fsav
+ .short 4
+ .ascii "fsav"
+FUNC_END(_savef31)
+FUNC_END(_savef30)
+FUNC_END(_savef29)
+FUNC_END(_savef28)
+FUNC_END(_savef27)
+FUNC_END(_savef26)
+FUNC_END(_savef25)
+FUNC_END(_savef24)
+FUNC_END(_savef23)
+FUNC_END(_savef22)
+FUNC_END(_savef21)
+FUNC_END(_savef20)
+FUNC_END(_savef19)
+FUNC_END(_savef18)
+FUNC_END(_savef17)
+FUNC_END(_savef16)
+FUNC_END(_savef15)
+FUNC_END(_savef14)
+
+/* Routines for restoring floating point registers, called by the compiler. */
+
+.fres:
+FUNC_START(_restf14) lfd 14,-144(1) /* restore fp registers */
+FUNC_START(_restf15) lfd 15,-136(1)
+FUNC_START(_restf16) lfd 16,-128(1)
+FUNC_START(_restf17) lfd 17,-120(1)
+FUNC_START(_restf18) lfd 18,-112(1)
+FUNC_START(_restf19) lfd 19,-104(1)
+FUNC_START(_restf20) lfd 20,-96(1)
+FUNC_START(_restf21) lfd 21,-88(1)
+FUNC_START(_restf22) lfd 22,-80(1)
+FUNC_START(_restf23) lfd 23,-72(1)
+FUNC_START(_restf24) lfd 24,-64(1)
+FUNC_START(_restf25) lfd 25,-56(1)
+FUNC_START(_restf26) lfd 26,-48(1)
+FUNC_START(_restf27) lfd 27,-40(1)
+FUNC_START(_restf28) lfd 28,-32(1)
+FUNC_START(_restf29) lfd 29,-24(1)
+FUNC_START(_restf30) lfd 30,-16(1)
+FUNC_START(_restf31) lfd 31,-8(1)
+ blr
+.LTfres:
+ .long 0
+ .byte 0,12,0,0,0,0,0,0
+ .long 0
+ .long .LTfres-.fres
+ .short 4
+ .ascii "fres"
+FUNC_END(_restf31)
+FUNC_END(_restf30)
+FUNC_END(_restf29)
+FUNC_END(_restf28)
+FUNC_END(_restf27)
+FUNC_END(_restf26)
+FUNC_END(_restf25)
+FUNC_END(_restf24)
+FUNC_END(_restf23)
+FUNC_END(_restf22)
+FUNC_END(_restf21)
+FUNC_END(_restf20)
+FUNC_END(_restf19)
+FUNC_END(_restf18)
+FUNC_END(_restf17)
+FUNC_END(_restf16)
+FUNC_END(_restf15)
+FUNC_END(_restf14)
+
+#endif
diff --git a/contrib/gcc/config/rs6000/darwin.h b/contrib/gcc/config/rs6000/darwin.h
index cb6b4b77..81c24e7 100644
--- a/contrib/gcc/config/rs6000/darwin.h
+++ b/contrib/gcc/config/rs6000/darwin.h
@@ -35,6 +35,9 @@ Boston, MA 02111-1307, USA. */
#define TARGET_TOC 0
#define TARGET_NO_TOC 1
+/* Handle #pragma weak and #pragma pack. */
+#define HANDLE_SYSV_PRAGMA
+
/* The Darwin ABI always includes AltiVec, can't be (validly) turned
off. */
@@ -57,8 +60,8 @@ Boston, MA 02111-1307, USA. */
#undef FRAME_POINTER_REGNUM
#define FRAME_POINTER_REGNUM 30
-#undef PIC_OFFSET_TABLE_REGNUM
-#define PIC_OFFSET_TABLE_REGNUM 31
+#undef RS6000_PIC_OFFSET_TABLE_REGNUM
+#define RS6000_PIC_OFFSET_TABLE_REGNUM 31
/* Pad the outgoing args area to 16 bytes instead of the usual 8. */
@@ -218,7 +221,10 @@ Boston, MA 02111-1307, USA. */
&& TYPE_FIELDS (STRUCT) != 0 \
&& DECL_MODE (TYPE_FIELDS (STRUCT)) == DFmode \
? MAX (MAX ((COMPUTED), (SPECIFIED)), 64) \
+ : (TARGET_ALTIVEC && TREE_CODE (STRUCT) == VECTOR_TYPE) \
+ ? MAX (MAX ((COMPUTED), (SPECIFIED)), 128) \
: MAX ((COMPUTED), (SPECIFIED)))
+
/* XXX: Darwin supports neither .quad, or .llong, but it also doesn't
support 64 bit powerpc either, so this just keeps things happy. */
#define DOUBLE_INT_ASM_OP "\t.quad\t"
@@ -227,3 +233,7 @@ Boston, MA 02111-1307, USA. */
space/speed. */
#undef MAX_LONG_TYPE_SIZE
#define MAX_LONG_TYPE_SIZE 32
+
+/* For binary compatibility with 2.95; Darwin C APIs use bool from
+ stdbool.h, which was an int-sized enum in 2.95. */
+#define BOOL_TYPE_SIZE INT_TYPE_SIZE
diff --git a/contrib/gcc/config/rs6000/eabi.asm b/contrib/gcc/config/rs6000/eabi.asm
index 85f2e1b..0808e9c 100644
--- a/contrib/gcc/config/rs6000/eabi.asm
+++ b/contrib/gcc/config/rs6000/eabi.asm
@@ -3,7 +3,6 @@
*
* Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc.
* Written By Michael Meissner
- * 64-bit support written by David Edelsohn
*
* This file is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -297,365 +296,4 @@ FUNC_START(__eabi_uconvert)
FUNC_END(__eabi_uconvert)
-/* Routines for saving floating point registers, called by the compiler. */
-/* Called with r11 pointing to the stack header word of the caller of the */
-/* function, just beyond the end of the floating point save area. */
-
-FUNC_START(_savefpr_14) stfd 14,-144(11) /* save fp registers */
-FUNC_START(_savefpr_15) stfd 15,-136(11)
-FUNC_START(_savefpr_16) stfd 16,-128(11)
-FUNC_START(_savefpr_17) stfd 17,-120(11)
-FUNC_START(_savefpr_18) stfd 18,-112(11)
-FUNC_START(_savefpr_19) stfd 19,-104(11)
-FUNC_START(_savefpr_20) stfd 20,-96(11)
-FUNC_START(_savefpr_21) stfd 21,-88(11)
-FUNC_START(_savefpr_22) stfd 22,-80(11)
-FUNC_START(_savefpr_23) stfd 23,-72(11)
-FUNC_START(_savefpr_24) stfd 24,-64(11)
-FUNC_START(_savefpr_25) stfd 25,-56(11)
-FUNC_START(_savefpr_26) stfd 26,-48(11)
-FUNC_START(_savefpr_27) stfd 27,-40(11)
-FUNC_START(_savefpr_28) stfd 28,-32(11)
-FUNC_START(_savefpr_29) stfd 29,-24(11)
-FUNC_START(_savefpr_30) stfd 30,-16(11)
-FUNC_START(_savefpr_31) stfd 31,-8(11)
- blr
-FUNC_END(_savefpr_31)
-FUNC_END(_savefpr_30)
-FUNC_END(_savefpr_29)
-FUNC_END(_savefpr_28)
-FUNC_END(_savefpr_27)
-FUNC_END(_savefpr_26)
-FUNC_END(_savefpr_25)
-FUNC_END(_savefpr_24)
-FUNC_END(_savefpr_23)
-FUNC_END(_savefpr_22)
-FUNC_END(_savefpr_21)
-FUNC_END(_savefpr_20)
-FUNC_END(_savefpr_19)
-FUNC_END(_savefpr_18)
-FUNC_END(_savefpr_17)
-FUNC_END(_savefpr_16)
-FUNC_END(_savefpr_15)
-FUNC_END(_savefpr_14)
-
-/* Routines for saving integer registers, called by the compiler. */
-/* Called with r11 pointing to the stack header word of the caller of the */
-/* function, just beyond the end of the integer save area. */
-
-FUNC_START(_savegpr_14) stw 14,-72(11) /* save gp registers */
-FUNC_START(_savegpr_15) stw 15,-68(11)
-FUNC_START(_savegpr_16) stw 16,-64(11)
-FUNC_START(_savegpr_17) stw 17,-60(11)
-FUNC_START(_savegpr_18) stw 18,-56(11)
-FUNC_START(_savegpr_19) stw 19,-52(11)
-FUNC_START(_savegpr_20) stw 20,-48(11)
-FUNC_START(_savegpr_21) stw 21,-44(11)
-FUNC_START(_savegpr_22) stw 22,-40(11)
-FUNC_START(_savegpr_23) stw 23,-36(11)
-FUNC_START(_savegpr_24) stw 24,-32(11)
-FUNC_START(_savegpr_25) stw 25,-28(11)
-FUNC_START(_savegpr_26) stw 26,-24(11)
-FUNC_START(_savegpr_27) stw 27,-20(11)
-FUNC_START(_savegpr_28) stw 28,-16(11)
-FUNC_START(_savegpr_29) stw 29,-12(11)
-FUNC_START(_savegpr_30) stw 30,-8(11)
-FUNC_START(_savegpr_31) stw 31,-4(11)
- blr
-FUNC_END(_savegpr_31)
-FUNC_END(_savegpr_30)
-FUNC_END(_savegpr_29)
-FUNC_END(_savegpr_28)
-FUNC_END(_savegpr_27)
-FUNC_END(_savegpr_26)
-FUNC_END(_savegpr_25)
-FUNC_END(_savegpr_24)
-FUNC_END(_savegpr_23)
-FUNC_END(_savegpr_22)
-FUNC_END(_savegpr_21)
-FUNC_END(_savegpr_20)
-FUNC_END(_savegpr_19)
-FUNC_END(_savegpr_18)
-FUNC_END(_savegpr_17)
-FUNC_END(_savegpr_16)
-FUNC_END(_savegpr_15)
-FUNC_END(_savegpr_14)
-
-/* Routines for restoring floating point registers, called by the compiler. */
-/* Called with r11 pointing to the stack header word of the caller of the */
-/* function, just beyond the end of the floating point save area. */
-
-FUNC_START(_restfpr_14) lfd 14,-144(11) /* restore fp registers */
-FUNC_START(_restfpr_15) lfd 15,-136(11)
-FUNC_START(_restfpr_16) lfd 16,-128(11)
-FUNC_START(_restfpr_17) lfd 17,-120(11)
-FUNC_START(_restfpr_18) lfd 18,-112(11)
-FUNC_START(_restfpr_19) lfd 19,-104(11)
-FUNC_START(_restfpr_20) lfd 20,-96(11)
-FUNC_START(_restfpr_21) lfd 21,-88(11)
-FUNC_START(_restfpr_22) lfd 22,-80(11)
-FUNC_START(_restfpr_23) lfd 23,-72(11)
-FUNC_START(_restfpr_24) lfd 24,-64(11)
-FUNC_START(_restfpr_25) lfd 25,-56(11)
-FUNC_START(_restfpr_26) lfd 26,-48(11)
-FUNC_START(_restfpr_27) lfd 27,-40(11)
-FUNC_START(_restfpr_28) lfd 28,-32(11)
-FUNC_START(_restfpr_29) lfd 29,-24(11)
-FUNC_START(_restfpr_30) lfd 30,-16(11)
-FUNC_START(_restfpr_31) lfd 31,-8(11)
- blr
-FUNC_END(_restfpr_31)
-FUNC_END(_restfpr_30)
-FUNC_END(_restfpr_29)
-FUNC_END(_restfpr_28)
-FUNC_END(_restfpr_27)
-FUNC_END(_restfpr_26)
-FUNC_END(_restfpr_25)
-FUNC_END(_restfpr_24)
-FUNC_END(_restfpr_23)
-FUNC_END(_restfpr_22)
-FUNC_END(_restfpr_21)
-FUNC_END(_restfpr_20)
-FUNC_END(_restfpr_19)
-FUNC_END(_restfpr_18)
-FUNC_END(_restfpr_17)
-FUNC_END(_restfpr_16)
-FUNC_END(_restfpr_15)
-FUNC_END(_restfpr_14)
-
-/* Routines for restoring integer registers, called by the compiler. */
-/* Called with r11 pointing to the stack header word of the caller of the */
-/* function, just beyond the end of the integer restore area. */
-
-FUNC_START(_restgpr_14) lwz 14,-72(11) /* restore gp registers */
-FUNC_START(_restgpr_15) lwz 15,-68(11)
-FUNC_START(_restgpr_16) lwz 16,-64(11)
-FUNC_START(_restgpr_17) lwz 17,-60(11)
-FUNC_START(_restgpr_18) lwz 18,-56(11)
-FUNC_START(_restgpr_19) lwz 19,-52(11)
-FUNC_START(_restgpr_20) lwz 20,-48(11)
-FUNC_START(_restgpr_21) lwz 21,-44(11)
-FUNC_START(_restgpr_22) lwz 22,-40(11)
-FUNC_START(_restgpr_23) lwz 23,-36(11)
-FUNC_START(_restgpr_24) lwz 24,-32(11)
-FUNC_START(_restgpr_25) lwz 25,-28(11)
-FUNC_START(_restgpr_26) lwz 26,-24(11)
-FUNC_START(_restgpr_27) lwz 27,-20(11)
-FUNC_START(_restgpr_28) lwz 28,-16(11)
-FUNC_START(_restgpr_29) lwz 29,-12(11)
-FUNC_START(_restgpr_30) lwz 30,-8(11)
-FUNC_START(_restgpr_31) lwz 31,-4(11)
- blr
-FUNC_END(_restgpr_31)
-FUNC_END(_restgpr_30)
-FUNC_END(_restgpr_29)
-FUNC_END(_restgpr_28)
-FUNC_END(_restgpr_27)
-FUNC_END(_restgpr_26)
-FUNC_END(_restgpr_25)
-FUNC_END(_restgpr_24)
-FUNC_END(_restgpr_23)
-FUNC_END(_restgpr_22)
-FUNC_END(_restgpr_21)
-FUNC_END(_restgpr_20)
-FUNC_END(_restgpr_19)
-FUNC_END(_restgpr_18)
-FUNC_END(_restgpr_17)
-FUNC_END(_restgpr_16)
-FUNC_END(_restgpr_15)
-FUNC_END(_restgpr_14)
-
-/* Routines for restoring floating point registers, called by the compiler. */
-/* Called with r11 pointing to the stack header word of the caller of the */
-/* function, just beyond the end of the floating point save area. */
-/* In addition to restoring the fp registers, it will return to the caller's */
-/* caller */
-
-FUNC_START(_restfpr_14_x) lfd 14,-144(11) /* restore fp registers */
-FUNC_START(_restfpr_15_x) lfd 15,-136(11)
-FUNC_START(_restfpr_16_x) lfd 16,-128(11)
-FUNC_START(_restfpr_17_x) lfd 17,-120(11)
-FUNC_START(_restfpr_18_x) lfd 18,-112(11)
-FUNC_START(_restfpr_19_x) lfd 19,-104(11)
-FUNC_START(_restfpr_20_x) lfd 20,-96(11)
-FUNC_START(_restfpr_21_x) lfd 21,-88(11)
-FUNC_START(_restfpr_22_x) lfd 22,-80(11)
-FUNC_START(_restfpr_23_x) lfd 23,-72(11)
-FUNC_START(_restfpr_24_x) lfd 24,-64(11)
-FUNC_START(_restfpr_25_x) lfd 25,-56(11)
-FUNC_START(_restfpr_26_x) lfd 26,-48(11)
-FUNC_START(_restfpr_27_x) lfd 27,-40(11)
-FUNC_START(_restfpr_28_x) lfd 28,-32(11)
-FUNC_START(_restfpr_29_x) lfd 29,-24(11)
-FUNC_START(_restfpr_30_x) lfd 30,-16(11)
-FUNC_START(_restfpr_31_x) lwz 0,4(11)
- lfd 31,-8(11)
- mtlr 0
- mr 1,11
- blr
-FUNC_END(_restfpr_31_x)
-FUNC_END(_restfpr_30_x)
-FUNC_END(_restfpr_29_x)
-FUNC_END(_restfpr_28_x)
-FUNC_END(_restfpr_27_x)
-FUNC_END(_restfpr_26_x)
-FUNC_END(_restfpr_25_x)
-FUNC_END(_restfpr_24_x)
-FUNC_END(_restfpr_23_x)
-FUNC_END(_restfpr_22_x)
-FUNC_END(_restfpr_21_x)
-FUNC_END(_restfpr_20_x)
-FUNC_END(_restfpr_19_x)
-FUNC_END(_restfpr_18_x)
-FUNC_END(_restfpr_17_x)
-FUNC_END(_restfpr_16_x)
-FUNC_END(_restfpr_15_x)
-FUNC_END(_restfpr_14_x)
-
-/* Routines for restoring integer registers, called by the compiler. */
-/* Called with r11 pointing to the stack header word of the caller of the */
-/* function, just beyond the end of the integer restore area. */
-
-FUNC_START(_restgpr_14_x) lwz 14,-72(11) /* restore gp registers */
-FUNC_START(_restgpr_15_x) lwz 15,-68(11)
-FUNC_START(_restgpr_16_x) lwz 16,-64(11)
-FUNC_START(_restgpr_17_x) lwz 17,-60(11)
-FUNC_START(_restgpr_18_x) lwz 18,-56(11)
-FUNC_START(_restgpr_19_x) lwz 19,-52(11)
-FUNC_START(_restgpr_20_x) lwz 20,-48(11)
-FUNC_START(_restgpr_21_x) lwz 21,-44(11)
-FUNC_START(_restgpr_22_x) lwz 22,-40(11)
-FUNC_START(_restgpr_23_x) lwz 23,-36(11)
-FUNC_START(_restgpr_24_x) lwz 24,-32(11)
-FUNC_START(_restgpr_25_x) lwz 25,-28(11)
-FUNC_START(_restgpr_26_x) lwz 26,-24(11)
-FUNC_START(_restgpr_27_x) lwz 27,-20(11)
-FUNC_START(_restgpr_28_x) lwz 28,-16(11)
-FUNC_START(_restgpr_29_x) lwz 29,-12(11)
-FUNC_START(_restgpr_30_x) lwz 30,-8(11)
-FUNC_START(_restgpr_31_x) lwz 0,4(11)
- lwz 31,-4(11)
- mtlr 0
- mr 1,11
- blr
-FUNC_END(_restgpr_31_x)
-FUNC_END(_restgpr_30_x)
-FUNC_END(_restgpr_29_x)
-FUNC_END(_restgpr_28_x)
-FUNC_END(_restgpr_27_x)
-FUNC_END(_restgpr_26_x)
-FUNC_END(_restgpr_25_x)
-FUNC_END(_restgpr_24_x)
-FUNC_END(_restgpr_23_x)
-FUNC_END(_restgpr_22_x)
-FUNC_END(_restgpr_21_x)
-FUNC_END(_restgpr_20_x)
-FUNC_END(_restgpr_19_x)
-FUNC_END(_restgpr_18_x)
-FUNC_END(_restgpr_17_x)
-FUNC_END(_restgpr_16_x)
-FUNC_END(_restgpr_15_x)
-FUNC_END(_restgpr_14_x)
-
-#else /* __powerpc64__ */
-
- .section ".text"
- .align 2
-
-/* Routines for saving floating point registers, called by the compiler. */
-
-.fsav:
-FUNC_START(_savef14) stfd 14,-144(1) /* save fp registers */
-FUNC_START(_savef15) stfd 15,-136(1)
-FUNC_START(_savef16) stfd 16,-128(1)
-FUNC_START(_savef17) stfd 17,-120(1)
-FUNC_START(_savef18) stfd 18,-112(1)
-FUNC_START(_savef19) stfd 19,-104(1)
-FUNC_START(_savef20) stfd 20,-96(1)
-FUNC_START(_savef21) stfd 21,-88(1)
-FUNC_START(_savef22) stfd 22,-80(1)
-FUNC_START(_savef23) stfd 23,-72(1)
-FUNC_START(_savef24) stfd 24,-64(1)
-FUNC_START(_savef25) stfd 25,-56(1)
-FUNC_START(_savef26) stfd 26,-48(1)
-FUNC_START(_savef27) stfd 27,-40(1)
-FUNC_START(_savef28) stfd 28,-32(1)
-FUNC_START(_savef29) stfd 29,-24(1)
-FUNC_START(_savef30) stfd 30,-16(1)
-FUNC_START(_savef31) stfd 31,-8(1)
- blr
-.LTfsav:
- .long 0
- .byte 0,12,0,0,0,0,0,0
- .long 0
- .long .LTfsav-.fsav
- .short 4
- .ascii "fsav"
-FUNC_END(_savef31)
-FUNC_END(_savef30)
-FUNC_END(_savef29)
-FUNC_END(_savef28)
-FUNC_END(_savef27)
-FUNC_END(_savef26)
-FUNC_END(_savef25)
-FUNC_END(_savef24)
-FUNC_END(_savef23)
-FUNC_END(_savef22)
-FUNC_END(_savef21)
-FUNC_END(_savef20)
-FUNC_END(_savef19)
-FUNC_END(_savef18)
-FUNC_END(_savef17)
-FUNC_END(_savef16)
-FUNC_END(_savef15)
-FUNC_END(_savef14)
-
-/* Routines for restoring floating point registers, called by the compiler. */
-
-.fres:
-FUNC_START(_restf14) lfd 14,-144(1) /* restore fp registers */
-FUNC_START(_restf15) lfd 15,-136(1)
-FUNC_START(_restf16) lfd 16,-128(1)
-FUNC_START(_restf17) lfd 17,-120(1)
-FUNC_START(_restf18) lfd 18,-112(1)
-FUNC_START(_restf19) lfd 19,-104(1)
-FUNC_START(_restf20) lfd 20,-96(1)
-FUNC_START(_restf21) lfd 21,-88(1)
-FUNC_START(_restf22) lfd 22,-80(1)
-FUNC_START(_restf23) lfd 23,-72(1)
-FUNC_START(_restf24) lfd 24,-64(1)
-FUNC_START(_restf25) lfd 25,-56(1)
-FUNC_START(_restf26) lfd 26,-48(1)
-FUNC_START(_restf27) lfd 27,-40(1)
-FUNC_START(_restf28) lfd 28,-32(1)
-FUNC_START(_restf29) lfd 29,-24(1)
-FUNC_START(_restf30) lfd 30,-16(1)
-FUNC_START(_restf31) lfd 31,-8(1)
- blr
-.LTfres:
- .long 0
- .byte 0,12,0,0,0,0,0,0
- .long 0
- .long .LTfres-.fres
- .short 4
- .ascii "fres"
-FUNC_END(_restf31)
-FUNC_END(_restf30)
-FUNC_END(_restf29)
-FUNC_END(_restf28)
-FUNC_END(_restf27)
-FUNC_END(_restf26)
-FUNC_END(_restf25)
-FUNC_END(_restf24)
-FUNC_END(_restf23)
-FUNC_END(_restf22)
-FUNC_END(_restf21)
-FUNC_END(_restf20)
-FUNC_END(_restf19)
-FUNC_END(_restf18)
-FUNC_END(_restf17)
-FUNC_END(_restf16)
-FUNC_END(_restf15)
-FUNC_END(_restf14)
-
#endif
diff --git a/contrib/gcc/config/rs6000/gnu.h b/contrib/gcc/config/rs6000/gnu.h
new file mode 100644
index 0000000..32bd906
--- /dev/null
+++ b/contrib/gcc/config/rs6000/gnu.h
@@ -0,0 +1,38 @@
+/* Definitions of target machine for GNU compiler,
+ for powerpc machines running GNU.
+ Copyright (C) 2001 Free Software Foundation, Inc.
+
+This file is part of GNU CC.
+
+GNU CC 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.
+
+GNU CC 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 GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#undef CPP_OS_DEFAULT_SPEC
+#define CPP_OS_DEFAULT_SPEC "%(cpp_os_gnu)"
+
+#undef STARTFILE_DEFAULT_SPEC
+#define STARTFILE_DEFAULT_SPEC "%(startfile_gnu)"
+
+#undef ENDFILE_DEFAULT_SPEC
+#define ENDFILE_DEFAULT_SPEC "%(endfile_gnu)"
+
+#undef LINK_START_DEFAULT_SPEC
+#define LINK_START_DEFAULT_SPEC "%(link_start_gnu)"
+
+#undef LINK_OS_DEFAULT_SPEC
+#define LINK_OS_DEFAULT_SPEC "%(link_os_gnu)"
+
+#undef TARGET_VERSION
+#define TARGET_VERSION fprintf (stderr, " (PowerPC GNU)");
diff --git a/contrib/gcc/config/rs6000/linux64.h b/contrib/gcc/config/rs6000/linux64.h
index d014afe..40b64dc 100644
--- a/contrib/gcc/config/rs6000/linux64.h
+++ b/contrib/gcc/config/rs6000/linux64.h
@@ -1,6 +1,6 @@
/* Definitions of target machine for GNU compiler,
for 64 bit powerpc linux.
- Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -87,10 +87,6 @@ Boston, MA 02111-1307, USA. */
#undef JUMP_TABLES_IN_TEXT_SECTION
#define JUMP_TABLES_IN_TEXT_SECTION 1
-/* Define cutoff for using external functions to save floating point. */
-#undef FP_SAVE_INLINE
-#define FP_SAVE_INLINE(FIRST_REG) ((FIRST_REG) == 62 || (FIRST_REG) == 63)
-
/* 64-bit PowerPC Linux always has GPR13 fixed. */
#define FIXED_R13 1
@@ -142,9 +138,29 @@ Boston, MA 02111-1307, USA. */
#define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
#undef LINK_OS_LINUX_SPEC
+#ifndef CROSS_COMPILE
+#define LINK_OS_LINUX_SPEC "-m elf64ppc %{!shared: %{!static: \
+ %{rdynamic:-export-dynamic} \
+ %{!dynamic-linker:-dynamic-linker /lib64/ld.so.1}}}"
+#else
#define LINK_OS_LINUX_SPEC "-m elf64ppc %{!shared: %{!static: \
%{rdynamic:-export-dynamic} \
- %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
+ %{!dynamic-linker:-dynamic-linker ld.so.1}}}"
+#endif
+
+#ifndef CROSS_COMPILE
+#undef STARTFILE_LINUX_SPEC
+#define STARTFILE_LINUX_SPEC "\
+%{!shared: %{pg:/usr/lib64/gcrt1.o%s} %{!pg:%{p:/usr/lib64/gcrt1.o%s} \
+ %{!p:/usr/lib64/crt1.o%s}}} /usr/lib64/crti.o%s \
+%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
+#endif
+
+#ifndef CROSS_COMPILE
+#undef ENDFILE_LINUX_SPEC
+#define ENDFILE_LINUX_SPEC "\
+%{!shared:crtend.o%s} %{shared:crtendS.o%s} /usr/lib64/crtn.o%s"
+#endif
#undef TOC_SECTION_ASM_OP
#define TOC_SECTION_ASM_OP "\t.section\t\".toc\",\"aw\""
@@ -208,17 +224,6 @@ Boston, MA 02111-1307, USA. */
&& ! DECL_WEAK (DECL)) \
SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1;
-/* This macro gets just the user-specified name
- out of the string in a SYMBOL_REF. Discard
- a leading * or @. */
-#define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
-do { \
- const char *_name = (SYMBOL_NAME); \
- while (*_name == '*' || *_name == '@') \
- _name++; \
- (VAR) = _name; \
-} while (0)
-
/* This is how to output a reference to a user-level label named NAME.
`assemble_name' uses this. */
@@ -245,32 +250,39 @@ do { \
fputs (DOUBLE_INT_ASM_OP, (FILE)); \
putc ('.', (FILE)); \
assemble_name ((FILE), (NAME)); \
- putc ('\n', (FILE)); \
- fputs (DOUBLE_INT_ASM_OP, (FILE)); \
- fputs (".TOC.@tocbase, 0\n\t.previous\n", (FILE)); \
- \
- if (TREE_PUBLIC (DECL)) \
+ fputs (",.TOC.@tocbase,0\n\t.previous\n\t.size\t", (FILE)); \
+ assemble_name ((FILE), (NAME)); \
+ fputs (",24\n\t.type\t.", (FILE)); \
+ assemble_name ((FILE), (NAME)); \
+ fputs (",@function\n", (FILE)); \
+ if (TREE_PUBLIC (DECL) && ! DECL_WEAK (DECL)) \
{ \
- if (DECL_WEAK (DECL)) \
- fputs ("\t.weak\t", (FILE)); \
- else \
- fputs ("\t.globl\t", (FILE)); \
- putc ('.', (FILE)); \
+ fputs ("\t.globl\t.", (FILE)); \
assemble_name ((FILE), (NAME)); \
putc ('\n', (FILE)); \
} \
- fputs (TYPE_ASM_OP, (FILE)); \
- putc ('.', (FILE)); \
- assemble_name ((FILE), (NAME)); \
- putc (',', (FILE)); \
- fprintf ((FILE), TYPE_OPERAND_FMT, "function"); \
- putc ('\n', (FILE)); \
ASM_DECLARE_RESULT ((FILE), DECL_RESULT (DECL)); \
putc ('.', (FILE)); \
ASM_OUTPUT_LABEL ((FILE), (NAME)); \
} \
while (0)
+/* This is how to declare the size of a function. */
+#undef ASM_DECLARE_FUNCTION_SIZE
+#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
+ do \
+ { \
+ if (!flag_inhibit_size_directive) \
+ { \
+ fputs ("\t.size\t.", (FILE)); \
+ assemble_name ((FILE), (FNAME)); \
+ fputs (",.-.", (FILE)); \
+ assemble_name ((FILE), (FNAME)); \
+ putc ('\n', (FILE)); \
+ } \
+ } \
+ while (0)
+
/* Return non-zero if this entry is to be written into the constant
pool in a special way. We do so if this is a SYMBOL_REF, LABEL_REF
or a CONST containing one of them. If -mfp-in-toc (the default),
diff --git a/contrib/gcc/config/rs6000/netbsd.h b/contrib/gcc/config/rs6000/netbsd.h
index 0e58a45..95f6542 100644
--- a/contrib/gcc/config/rs6000/netbsd.h
+++ b/contrib/gcc/config/rs6000/netbsd.h
@@ -64,3 +64,8 @@ Boston, MA 02111-1307, USA. */
structure return convention. */
#undef DRAFT_V4_STRUCT_RET
#define DRAFT_V4_STRUCT_RET 1
+
+/* Use STABS debugging information by default. DWARF2 makes a mess of
+ the 1.5.2 linker. */
+#undef PREFERRED_DEBUGGING_TYPE
+#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
diff --git a/contrib/gcc/config/rs6000/ppc-asm.h b/contrib/gcc/config/rs6000/ppc-asm.h
index 3a6fb2a..27f3635 100644
--- a/contrib/gcc/config/rs6000/ppc-asm.h
+++ b/contrib/gcc/config/rs6000/ppc-asm.h
@@ -161,6 +161,7 @@ GLUE(.L,name): \
#elif defined (__powerpc64__)
#define FUNC_NAME(name) GLUE(.,name)
+#define JUMP_TARGET(name) FUNC_NAME(name)
#define FUNC_START(name) \
.section ".opd","aw"; \
name: \
diff --git a/contrib/gcc/config/rs6000/rs6000-protos.h b/contrib/gcc/config/rs6000/rs6000-protos.h
index c40689e..19aeb07 100644
--- a/contrib/gcc/config/rs6000/rs6000-protos.h
+++ b/contrib/gcc/config/rs6000/rs6000-protos.h
@@ -40,6 +40,7 @@ extern int cc_reg_operand PARAMS ((rtx, enum machine_mode));
extern int cc_reg_not_cr0_operand PARAMS ((rtx, enum machine_mode));
extern int reg_or_short_operand PARAMS ((rtx, enum machine_mode));
extern int reg_or_neg_short_operand PARAMS ((rtx, enum machine_mode));
+extern int reg_or_aligned_short_operand PARAMS ((rtx, enum machine_mode));
extern int reg_or_u_short_operand PARAMS ((rtx, enum machine_mode));
extern int reg_or_cint_operand PARAMS ((rtx, enum machine_mode));
extern int reg_or_arith_cint_operand PARAMS ((rtx, enum machine_mode));
@@ -51,6 +52,7 @@ extern int got_no_const_operand PARAMS ((rtx, enum machine_mode));
extern int num_insns_constant PARAMS ((rtx, enum machine_mode));
extern int easy_fp_constant PARAMS ((rtx, enum machine_mode));
extern int zero_fp_constant PARAMS ((rtx, enum machine_mode));
+extern int zero_constant PARAMS ((rtx, enum machine_mode));
extern int volatile_mem_operand PARAMS ((rtx, enum machine_mode));
extern int offsettable_mem_operand PARAMS ((rtx, enum machine_mode));
extern int mem_or_easy_const_operand PARAMS ((rtx, enum machine_mode));
diff --git a/contrib/gcc/config/rs6000/rs6000.c b/contrib/gcc/config/rs6000/rs6000.c
index f8375a4..45d6fdf 100644
--- a/contrib/gcc/config/rs6000/rs6000.c
+++ b/contrib/gcc/config/rs6000/rs6000.c
@@ -163,6 +163,8 @@ static rtx rs6000_expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int
static rtx altivec_expand_builtin PARAMS ((tree, rtx));
static rtx altivec_expand_unop_builtin PARAMS ((enum insn_code, tree, rtx));
static rtx altivec_expand_binop_builtin PARAMS ((enum insn_code, tree, rtx));
+static rtx altivec_expand_abs_builtin PARAMS ((enum insn_code, tree, rtx));
+static rtx altivec_expand_predicate_builtin PARAMS ((enum insn_code, const char *, tree, rtx));
static rtx altivec_expand_ternop_builtin PARAMS ((enum insn_code, tree, rtx));
static rtx altivec_expand_stv_builtin PARAMS ((enum insn_code, tree));
static void rs6000_parse_abi_options PARAMS ((void));
@@ -172,6 +174,7 @@ static void is_altivec_return_reg PARAMS ((rtx, void *));
int vrsave_operation PARAMS ((rtx, enum machine_mode));
static rtx generate_set_vrsave PARAMS ((rtx, rs6000_stack_t *, int));
static void altivec_frame_fixup PARAMS ((rtx, rtx, HOST_WIDE_INT));
+static int easy_vector_constant PARAMS ((rtx));
/* Default register names. */
char rs6000_reg_names[][8] =
@@ -214,7 +217,7 @@ static const char alt_reg_names[][8] =
"%v8", "%v9", "%v10", "%v11", "%v12", "%v13", "%v14", "%v15",
"%v16", "%v17", "%v18", "%v19", "%v20", "%v21", "%v22", "%v23",
"%v24", "%v25", "%v26", "%v27", "%v28", "%v29", "%v30", "%v31",
- "%vrsave"
+ "vrsave"
};
#endif
@@ -480,11 +483,13 @@ rs6000_override_options (default_cpu)
}
}
- if (flag_pic && DEFAULT_ABI == ABI_AIX)
+ if (flag_pic != 0 && DEFAULT_ABI == ABI_AIX)
{
- warning ("-f%s ignored (all code is position independent)",
- (flag_pic > 1) ? "PIC" : "pic");
flag_pic = 0;
+
+ if (extra_warnings)
+ warning ("-f%s ignored (all code is position independent)",
+ (flag_pic > 1) ? "PIC" : "pic");
}
#ifdef XCOFF_DEBUGGING_INFO
@@ -586,6 +591,8 @@ rs6000_parse_abi_options ()
return;
else if (! strcmp (rs6000_abi_string, "altivec"))
rs6000_altivec_abi = 1;
+ else if (! strcmp (rs6000_abi_string, "no-altivec"))
+ rs6000_altivec_abi = 0;
else
error ("unknown ABI specified: '%s'", rs6000_abi_string);
}
@@ -708,6 +715,19 @@ count_register_operand (op, mode)
return 0;
}
+/* Returns 1 if op is an altivec register. */
+int
+altivec_register_operand (op, mode)
+ rtx op;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+{
+
+ return (register_operand (op, mode)
+ && (GET_CODE (op) != REG
+ || REGNO (op) > FIRST_PSEUDO_REGISTER
+ || ALTIVEC_REGNO_P (REGNO (op))));
+}
+
int
xer_operand (op, mode)
rtx op;
@@ -753,7 +773,7 @@ u_short_cint_operand (op, mode)
enum machine_mode mode ATTRIBUTE_UNUSED;
{
return (GET_CODE (op) == CONST_INT
- && CONST_OK_FOR_LETTER_P (INTVAL (op), 'K'));
+ && CONST_OK_FOR_LETTER_P (INTVAL (op) & GET_MODE_MASK (mode), 'K'));
}
/* Return 1 if OP is a CONST_INT that cannot fit in a signed D field. */
@@ -849,6 +869,24 @@ reg_or_neg_short_operand (op, mode)
return gpc_reg_operand (op, mode);
}
+/* Returns 1 if OP is either a constant integer valid for a DS-field or
+ a non-special register. If a register, it must be in the proper
+ mode unless MODE is VOIDmode. */
+
+int
+reg_or_aligned_short_operand (op, mode)
+ rtx op;
+ enum machine_mode mode;
+{
+ if (gpc_reg_operand (op, mode))
+ return 1;
+ else if (short_cint_operand (op, mode) && !(INTVAL (op) & 3))
+ return 1;
+
+ return 0;
+}
+
+
/* Return 1 if the operand is either a register or an integer whose
high-order 16 bits are zero. */
@@ -1046,7 +1084,7 @@ num_insns_constant (op, mode)
REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
REAL_VALUE_TO_TARGET_SINGLE (rv, l);
- return num_insns_constant_wide ((HOST_WIDE_INT)l);
+ return num_insns_constant_wide ((HOST_WIDE_INT) l);
}
else if (GET_CODE (op) == CONST_DOUBLE)
@@ -1076,10 +1114,10 @@ num_insns_constant (op, mode)
else
{
- if (high == 0 && (low & 0x80000000) == 0)
+ if (high == 0 && low >= 0)
return num_insns_constant_wide (low);
- else if (high == -1 && (low & 0x80000000) != 0)
+ else if (high == -1 && low < 0)
return num_insns_constant_wide (low);
else if (mask64_operand (op, mode))
@@ -1161,6 +1199,60 @@ easy_fp_constant (op, mode)
abort ();
}
+/* Return 1 if the operand is a CONST_INT and can be put into a
+ register with one instruction. */
+
+static int
+easy_vector_constant (op)
+ rtx op;
+{
+ rtx elt;
+ int units, i;
+
+ if (GET_CODE (op) != CONST_VECTOR)
+ return 0;
+
+ units = CONST_VECTOR_NUNITS (op);
+
+ /* We can generate 0 easily. Look for that. */
+ for (i = 0; i < units; ++i)
+ {
+ elt = CONST_VECTOR_ELT (op, i);
+
+ /* We could probably simplify this by just checking for equality
+ with CONST0_RTX for the current mode, but let's be safe
+ instead. */
+
+ switch (GET_CODE (elt))
+ {
+ case CONST_INT:
+ if (INTVAL (elt) != 0)
+ return 0;
+ break;
+ case CONST_DOUBLE:
+ if (CONST_DOUBLE_LOW (elt) != 0 || CONST_DOUBLE_HIGH (elt) != 0)
+ return 0;
+ break;
+ default:
+ return 0;
+ }
+ }
+
+ /* We could probably generate a few other constants trivially, but
+ gcc doesn't generate them yet. FIXME later. */
+ return 1;
+}
+
+/* Return 1 if the operand is the constant 0. This works for scalars
+ as well as vectors. */
+int
+zero_constant (op, mode)
+ rtx op;
+ enum machine_mode mode;
+{
+ return op == CONST0_RTX (mode);
+}
+
/* Return 1 if the operand is 0.0. */
int
zero_fp_constant (op, mode)
@@ -1230,8 +1322,8 @@ add_operand (op, mode)
enum machine_mode mode;
{
if (GET_CODE (op) == CONST_INT)
- return (CONST_OK_FOR_LETTER_P (INTVAL(op), 'I')
- || CONST_OK_FOR_LETTER_P (INTVAL(op), 'L'));
+ return (CONST_OK_FOR_LETTER_P (INTVAL (op), 'I')
+ || CONST_OK_FOR_LETTER_P (INTVAL (op), 'L'));
return gpc_reg_operand (op, mode);
}
@@ -1244,8 +1336,8 @@ non_add_cint_operand (op, mode)
enum machine_mode mode ATTRIBUTE_UNUSED;
{
return (GET_CODE (op) == CONST_INT
- && (unsigned HOST_WIDE_INT) (INTVAL (op) + 0x8000) >= 0x10000
- && ! CONST_OK_FOR_LETTER_P (INTVAL (op), 'L'));
+ && !CONST_OK_FOR_LETTER_P (INTVAL (op), 'I')
+ && !CONST_OK_FOR_LETTER_P (INTVAL (op), 'L'));
}
/* Return 1 if the operand is a non-special register or a constant that
@@ -1317,6 +1409,11 @@ mask_operand (op, mode)
c = INTVAL (op);
+ /* Fail in 64-bit mode if the mask wraps around because the upper
+ 32-bits of the mask will all be 1s, contrary to GCC's internal view. */
+ if (TARGET_POWERPC64 && (c & 0x80000001) == 0x80000001)
+ return 0;
+
/* We don't change the number of transitions by inverting,
so make sure we start with the LS bit zero. */
if (c & 1)
@@ -1629,8 +1726,8 @@ constant_pool_expr_1 (op, have_sym, have_toc)
return 0;
case PLUS:
case MINUS:
- return constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc) &&
- constant_pool_expr_1 (XEXP (op, 1), have_sym, have_toc);
+ return (constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc)
+ && constant_pool_expr_1 (XEXP (op, 1), have_sym, have_toc));
case CONST:
return constant_pool_expr_1 (XEXP (op, 0), have_sym, have_toc);
case CONST_INT:
@@ -1801,6 +1898,7 @@ rs6000_legitimize_reload_address (x, mode, opnum, type, ind_levels, win)
*win = 1;
return x;
}
+
#if TARGET_MACHO
if (DEFAULT_ABI == ABI_DARWIN && flag_pic
&& GET_CODE (x) == LO_SUM
@@ -1826,7 +1924,8 @@ rs6000_legitimize_reload_address (x, mode, opnum, type, ind_levels, win)
&& GET_CODE (XEXP (x, 0)) == REG
&& REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
&& REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
- && GET_CODE (XEXP (x, 1)) == CONST_INT)
+ && GET_CODE (XEXP (x, 1)) == CONST_INT
+ && !ALTIVEC_VECTOR_MODE (mode))
{
HOST_WIDE_INT val = INTVAL (XEXP (x, 1));
HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000;
@@ -1857,6 +1956,7 @@ rs6000_legitimize_reload_address (x, mode, opnum, type, ind_levels, win)
#if TARGET_MACHO
if (GET_CODE (x) == SYMBOL_REF
&& DEFAULT_ABI == ABI_DARWIN
+ && !ALTIVEC_VECTOR_MODE (mode)
&& flag_pic)
{
/* Darwin load of floating point constant. */
@@ -1875,8 +1975,8 @@ rs6000_legitimize_reload_address (x, mode, opnum, type, ind_levels, win)
}
#endif
if (TARGET_TOC
- && CONSTANT_POOL_EXPR_P (x)
- && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
+ && CONSTANT_POOL_EXPR_P (x)
+ && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
{
(x) = create_TOC_reference (x);
*win = 1;
@@ -2151,9 +2251,10 @@ rs6000_emit_move (dest, source, mode)
/* Handle the case where reload calls us with an invalid address;
and the case of CONSTANT_P_RTX. */
- if (! general_operand (operands[1], mode)
- || ! nonimmediate_operand (operands[0], mode)
- || GET_CODE (operands[1]) == CONSTANT_P_RTX)
+ if (!VECTOR_MODE_P (mode)
+ && (! general_operand (operands[1], mode)
+ || ! nonimmediate_operand (operands[0], mode)
+ || GET_CODE (operands[1]) == CONSTANT_P_RTX))
{
emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
return;
@@ -2183,8 +2284,8 @@ rs6000_emit_move (dest, source, mode)
case V8HImode:
case V4SFmode:
case V4SImode:
- /* fixme: aldyh -- allow vector constants when they are implemented. */
- if (CONSTANT_P (operands[1]))
+ if (CONSTANT_P (operands[1])
+ && !easy_vector_constant (operands[1]))
operands[1] = force_const_mem (mode, operands[1]);
break;
@@ -3013,42 +3114,7 @@ rs6000_va_arg (valist, type)
right-aligned, as if they were in fact integers. This only
matters for structures of size 1 or 2, or 4 when TARGET_64BIT. */
if (DEFAULT_ABI != ABI_V4)
- {
- HOST_WIDE_INT align, rounded_size;
- enum machine_mode mode;
- tree addr_tree;
-
- /* Compute the rounded size of the type. */
- align = PARM_BOUNDARY / BITS_PER_UNIT;
- rounded_size = (((int_size_in_bytes (type) + align - 1) / align)
- * align);
-
- addr_tree = valist;
-
- mode = TYPE_MODE (type);
- if (mode != BLKmode)
- {
- HOST_WIDE_INT adj;
- adj = TREE_INT_CST_LOW (TYPE_SIZE (type)) / BITS_PER_UNIT;
- if (rounded_size > align)
- adj = rounded_size;
-
- addr_tree = build (PLUS_EXPR, TREE_TYPE (addr_tree), addr_tree,
- build_int_2 (rounded_size - adj, 0));
- }
-
- addr_rtx = expand_expr (addr_tree, NULL_RTX, Pmode, EXPAND_NORMAL);
- addr_rtx = copy_to_reg (addr_rtx);
-
- /* Compute new value for AP. */
- t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
- build (PLUS_EXPR, TREE_TYPE (valist), valist,
- build_int_2 (rounded_size, 0)));
- TREE_SIDE_EFFECTS (t) = 1;
- expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
-
- return addr_rtx;
- }
+ return std_expand_builtin_va_arg (valist, type);
f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
f_fpr = TREE_CHAIN (f_gpr);
@@ -3072,7 +3138,8 @@ rs6000_va_arg (valist, type)
n_reg = 1;
sav_ofs = 0;
sav_scale = 4;
- size = rsize = UNITS_PER_WORD;
+ size = UNITS_PER_WORD;
+ rsize = 1;
}
else if (FLOAT_TYPE_P (type) && ! TARGET_SOFT_FLOAT)
{
@@ -3099,50 +3166,62 @@ rs6000_va_arg (valist, type)
lab_over = gen_label_rtx ();
addr_rtx = gen_reg_rtx (Pmode);
- emit_cmp_and_jump_insns (expand_expr (reg, NULL_RTX, QImode, EXPAND_NORMAL),
- GEN_INT (8 - n_reg + 1), GE, const1_rtx, QImode, 1,
- lab_false);
-
- /* Long long is aligned in the registers. */
- if (n_reg > 1)
+ /* Vectors never go in registers. */
+ if (TREE_CODE (type) != VECTOR_TYPE)
{
- u = build (BIT_AND_EXPR, TREE_TYPE (reg), reg,
- build_int_2 (n_reg - 1, 0));
- u = build (PLUS_EXPR, TREE_TYPE (reg), reg, u);
- u = build (MODIFY_EXPR, TREE_TYPE (reg), reg, u);
- TREE_SIDE_EFFECTS (u) = 1;
- expand_expr (u, const0_rtx, VOIDmode, EXPAND_NORMAL);
- }
+ TREE_THIS_VOLATILE (reg) = 1;
+ emit_cmp_and_jump_insns
+ (expand_expr (reg, NULL_RTX, QImode, EXPAND_NORMAL),
+ GEN_INT (8 - n_reg + 1), GE, const1_rtx, QImode, 1,
+ lab_false);
- if (sav_ofs)
- t = build (PLUS_EXPR, ptr_type_node, sav, build_int_2 (sav_ofs, 0));
- else
- t = sav;
+ /* Long long is aligned in the registers. */
+ if (n_reg > 1)
+ {
+ u = build (BIT_AND_EXPR, TREE_TYPE (reg), reg,
+ build_int_2 (n_reg - 1, 0));
+ u = build (PLUS_EXPR, TREE_TYPE (reg), reg, u);
+ u = build (MODIFY_EXPR, TREE_TYPE (reg), reg, u);
+ TREE_SIDE_EFFECTS (u) = 1;
+ expand_expr (u, const0_rtx, VOIDmode, EXPAND_NORMAL);
+ }
- u = build (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg, build_int_2 (n_reg, 0));
- TREE_SIDE_EFFECTS (u) = 1;
+ if (sav_ofs)
+ t = build (PLUS_EXPR, ptr_type_node, sav, build_int_2 (sav_ofs, 0));
+ else
+ t = sav;
- u = build1 (CONVERT_EXPR, integer_type_node, u);
- TREE_SIDE_EFFECTS (u) = 1;
+ u = build (POSTINCREMENT_EXPR, TREE_TYPE (reg), reg,
+ build_int_2 (n_reg, 0));
+ TREE_SIDE_EFFECTS (u) = 1;
- u = build (MULT_EXPR, integer_type_node, u, build_int_2 (sav_scale, 0));
- TREE_SIDE_EFFECTS (u) = 1;
+ u = build1 (CONVERT_EXPR, integer_type_node, u);
+ TREE_SIDE_EFFECTS (u) = 1;
- t = build (PLUS_EXPR, ptr_type_node, t, u);
- TREE_SIDE_EFFECTS (t) = 1;
+ u = build (MULT_EXPR, integer_type_node, u, build_int_2 (sav_scale, 0));
+ TREE_SIDE_EFFECTS (u) = 1;
- r = expand_expr (t, addr_rtx, Pmode, EXPAND_NORMAL);
- if (r != addr_rtx)
- emit_move_insn (addr_rtx, r);
+ t = build (PLUS_EXPR, ptr_type_node, t, u);
+ TREE_SIDE_EFFECTS (t) = 1;
+
+ r = expand_expr (t, addr_rtx, Pmode, EXPAND_NORMAL);
+ if (r != addr_rtx)
+ emit_move_insn (addr_rtx, r);
+
+ emit_jump_insn (gen_jump (lab_over));
+ emit_barrier ();
+ }
- emit_jump_insn (gen_jump (lab_over));
- emit_barrier ();
emit_label (lab_false);
/* ... otherwise out of the overflow area. */
- /* Make sure we don't find reg 7 for the next int arg. */
- if (n_reg > 1)
+ /* Make sure we don't find reg 7 for the next int arg.
+
+ All AltiVec vectors go in the overflow area. So in the AltiVec
+ case we need to get the vectors from the overflow area, but
+ remember where the GPRs and FPRs are. */
+ if (n_reg > 1 && TREE_CODE (type) != VECTOR_TYPE)
{
t = build (MODIFY_EXPR, TREE_TYPE (reg), reg, build_int_2 (8, 0));
TREE_SIDE_EFFECTS (t) = 1;
@@ -3154,8 +3233,16 @@ rs6000_va_arg (valist, type)
t = ovf;
else
{
- t = build (PLUS_EXPR, TREE_TYPE (ovf), ovf, build_int_2 (7, 0));
- t = build (BIT_AND_EXPR, TREE_TYPE (t), t, build_int_2 (-8, -1));
+ int align;
+
+ /* Vectors are 16 byte aligned. */
+ if (TREE_CODE (type) == VECTOR_TYPE)
+ align = 15;
+ else
+ align = 7;
+
+ t = build (PLUS_EXPR, TREE_TYPE (ovf), ovf, build_int_2 (align, 0));
+ t = build (BIT_AND_EXPR, TREE_TYPE (t), t, build_int_2 (-align-1, -1));
}
t = save_expr (t);
@@ -3352,19 +3439,47 @@ static const struct builtin_description bdesc_2arg[] =
{ MASK_ALTIVEC, CODE_FOR_altivec_vsum2sws, "__builtin_altivec_vsum2sws", ALTIVEC_BUILTIN_VSUM2SWS },
{ MASK_ALTIVEC, CODE_FOR_altivec_vsumsws, "__builtin_altivec_vsumsws", ALTIVEC_BUILTIN_VSUMSWS },
{ MASK_ALTIVEC, CODE_FOR_xorv4si3, "__builtin_altivec_vxor", ALTIVEC_BUILTIN_VXOR },
- { MASK_ALTIVEC, CODE_FOR_altivec_vcmpbfp_p, "__builtin_altivec_vcmpbfp_p", ALTIVEC_BUILTIN_VCMPBFP_P },
- { MASK_ALTIVEC, CODE_FOR_altivec_vcmpeqfp_p, "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
- { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequb_p, "__builtin_altivec_vcmpequb_p", ALTIVEC_BUILTIN_VCMPEQUB_P },
- { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequh_p, "__builtin_altivec_vcmpequh_p", ALTIVEC_BUILTIN_VCMPEQUH_P },
- { MASK_ALTIVEC, CODE_FOR_altivec_vcmpequw_p, "__builtin_altivec_vcmpequw_p", ALTIVEC_BUILTIN_VCMPEQUW_P },
- { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgefp_p, "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
- { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtfp_p, "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
- { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsb_p, "__builtin_altivec_vcmpgtsb_p", ALTIVEC_BUILTIN_VCMPGTSB_P },
- { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsh_p, "__builtin_altivec_vcmpgtsh_p", ALTIVEC_BUILTIN_VCMPGTSH_P },
- { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtsw_p, "__builtin_altivec_vcmpgtsw_p", ALTIVEC_BUILTIN_VCMPGTSW_P },
- { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtub_p, "__builtin_altivec_vcmpgtub_p", ALTIVEC_BUILTIN_VCMPGTUB_P },
- { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuh_p, "__builtin_altivec_vcmpgtuh_p", ALTIVEC_BUILTIN_VCMPGTUH_P },
- { MASK_ALTIVEC, CODE_FOR_altivec_vcmpgtuw_p, "__builtin_altivec_vcmpgtuw_p", ALTIVEC_BUILTIN_VCMPGTUW_P },
+};
+
+/* AltiVec predicates. */
+
+struct builtin_description_predicates
+{
+ const unsigned int mask;
+ const enum insn_code icode;
+ const char *opcode;
+ const char *const name;
+ const enum rs6000_builtins code;
+};
+
+static const struct builtin_description_predicates bdesc_altivec_preds[] =
+{
+ { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpbfp.", "__builtin_altivec_vcmpbfp_p", ALTIVEC_BUILTIN_VCMPBFP_P },
+ { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpeqfp.", "__builtin_altivec_vcmpeqfp_p", ALTIVEC_BUILTIN_VCMPEQFP_P },
+ { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgefp.", "__builtin_altivec_vcmpgefp_p", ALTIVEC_BUILTIN_VCMPGEFP_P },
+ { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4sf, "*vcmpgtfp.", "__builtin_altivec_vcmpgtfp_p", ALTIVEC_BUILTIN_VCMPGTFP_P },
+ { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpequw.", "__builtin_altivec_vcmpequw_p", ALTIVEC_BUILTIN_VCMPEQUW_P },
+ { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtsw.", "__builtin_altivec_vcmpgtsw_p", ALTIVEC_BUILTIN_VCMPGTSW_P },
+ { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v4si, "*vcmpgtuw.", "__builtin_altivec_vcmpgtuw_p", ALTIVEC_BUILTIN_VCMPGTUW_P },
+ { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtuh.", "__builtin_altivec_vcmpgtuh_p", ALTIVEC_BUILTIN_VCMPGTUH_P },
+ { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpgtsh.", "__builtin_altivec_vcmpgtsh_p", ALTIVEC_BUILTIN_VCMPGTSH_P },
+ { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v8hi, "*vcmpequh.", "__builtin_altivec_vcmpequh_p", ALTIVEC_BUILTIN_VCMPEQUH_P },
+ { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpequb.", "__builtin_altivec_vcmpequb_p", ALTIVEC_BUILTIN_VCMPEQUB_P },
+ { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtsb.", "__builtin_altivec_vcmpgtsb_p", ALTIVEC_BUILTIN_VCMPGTSB_P },
+ { MASK_ALTIVEC, CODE_FOR_altivec_predicate_v16qi, "*vcmpgtub.", "__builtin_altivec_vcmpgtub_p", ALTIVEC_BUILTIN_VCMPGTUB_P }
+};
+
+/* ABS* opreations. */
+
+static const struct builtin_description bdesc_abs[] =
+{
+ { MASK_ALTIVEC, CODE_FOR_absv4si2, "__builtin_altivec_abs_v4si", ALTIVEC_BUILTIN_ABS_V4SI },
+ { MASK_ALTIVEC, CODE_FOR_absv8hi2, "__builtin_altivec_abs_v8hi", ALTIVEC_BUILTIN_ABS_V8HI },
+ { MASK_ALTIVEC, CODE_FOR_absv4sf2, "__builtin_altivec_abs_v4sf", ALTIVEC_BUILTIN_ABS_V4SF },
+ { MASK_ALTIVEC, CODE_FOR_absv16qi2, "__builtin_altivec_abs_v16qi", ALTIVEC_BUILTIN_ABS_V16QI },
+ { MASK_ALTIVEC, CODE_FOR_altivec_abss_v4si, "__builtin_altivec_abss_v4si", ALTIVEC_BUILTIN_ABSS_V4SI },
+ { MASK_ALTIVEC, CODE_FOR_altivec_abss_v8hi, "__builtin_altivec_abss_v8hi", ALTIVEC_BUILTIN_ABSS_V8HI },
+ { MASK_ALTIVEC, CODE_FOR_altivec_abss_v16qi, "__builtin_altivec_abss_v16qi", ALTIVEC_BUILTIN_ABSS_V16QI }
};
/* Simple unary operations: VECb = foo (unsigned literal) or VECb =
@@ -3422,6 +3537,42 @@ altivec_expand_unop_builtin (icode, arglist, target)
return target;
}
+
+static rtx
+altivec_expand_abs_builtin (icode, arglist, target)
+ enum insn_code icode;
+ tree arglist;
+ rtx target;
+{
+ rtx pat, scratch1, scratch2;
+ tree arg0 = TREE_VALUE (arglist);
+ rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
+ enum machine_mode tmode = insn_data[icode].operand[0].mode;
+ enum machine_mode mode0 = insn_data[icode].operand[1].mode;
+
+ /* If we have invalid arguments, bail out before generating bad rtl. */
+ if (arg0 == error_mark_node)
+ return NULL_RTX;
+
+ if (target == 0
+ || GET_MODE (target) != tmode
+ || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
+ target = gen_reg_rtx (tmode);
+
+ if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
+ op0 = copy_to_mode_reg (mode0, op0);
+
+ scratch1 = gen_reg_rtx (mode0);
+ scratch2 = gen_reg_rtx (mode0);
+
+ pat = GEN_FCN (icode) (target, op0, scratch1, scratch2);
+ if (! pat)
+ return 0;
+ emit_insn (pat);
+
+ return target;
+}
+
static rtx
altivec_expand_binop_builtin (icode, arglist, target)
enum insn_code icode;
@@ -3460,6 +3611,87 @@ altivec_expand_binop_builtin (icode, arglist, target)
}
static rtx
+altivec_expand_predicate_builtin (icode, opcode, arglist, target)
+ enum insn_code icode;
+ const char *opcode;
+ tree arglist;
+ rtx target;
+{
+ rtx pat, scratch;
+ tree cr6_form = TREE_VALUE (arglist);
+ tree arg0 = TREE_VALUE (TREE_CHAIN (arglist));
+ tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
+ rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
+ rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
+ enum machine_mode tmode = SImode;
+ enum machine_mode mode0 = insn_data[icode].operand[1].mode;
+ enum machine_mode mode1 = insn_data[icode].operand[2].mode;
+ int cr6_form_int;
+
+ if (TREE_CODE (cr6_form) != INTEGER_CST)
+ {
+ error ("argument 1 of __builtin_altivec_predicate must be a constant");
+ return NULL_RTX;
+ }
+ else
+ cr6_form_int = TREE_INT_CST_LOW (cr6_form);
+
+ if (mode0 != mode1)
+ abort ();
+
+ /* If we have invalid arguments, bail out before generating bad rtl. */
+ if (arg0 == error_mark_node || arg1 == error_mark_node)
+ return NULL_RTX;
+
+ if (target == 0
+ || GET_MODE (target) != tmode
+ || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
+ target = gen_reg_rtx (tmode);
+
+ if (! (*insn_data[icode].operand[1].predicate) (op0, mode0))
+ op0 = copy_to_mode_reg (mode0, op0);
+ if (! (*insn_data[icode].operand[2].predicate) (op1, mode1))
+ op1 = copy_to_mode_reg (mode1, op1);
+
+ scratch = gen_reg_rtx (mode0);
+
+ pat = GEN_FCN (icode) (scratch, op0, op1,
+ gen_rtx (SYMBOL_REF, Pmode, opcode));
+ if (! pat)
+ return 0;
+ emit_insn (pat);
+
+ /* The vec_any* and vec_all* predicates use the same opcodes for two
+ different operations, but the bits in CR6 will be different
+ depending on what information we want. So we have to play tricks
+ with CR6 to get the right bits out.
+
+ If you think this is disgusting, look at the specs for the
+ AltiVec predicates. */
+
+ switch (cr6_form_int)
+ {
+ case 0:
+ emit_insn (gen_cr6_test_for_zero (target));
+ break;
+ case 1:
+ emit_insn (gen_cr6_test_for_zero_reverse (target));
+ break;
+ case 2:
+ emit_insn (gen_cr6_test_for_lt (target));
+ break;
+ case 3:
+ emit_insn (gen_cr6_test_for_lt_reverse (target));
+ break;
+ default:
+ error ("argument 1 of __builtin_altivec_predicate is out of range");
+ break;
+ }
+
+ return target;
+}
+
+static rtx
altivec_expand_stv_builtin (icode, arglist)
enum insn_code icode;
tree arglist;
@@ -3543,6 +3775,7 @@ altivec_expand_builtin (exp, target)
rtx target;
{
struct builtin_description *d;
+ struct builtin_description_predicates *dp;
size_t i;
enum insn_code icode;
tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
@@ -3818,6 +4051,12 @@ altivec_expand_builtin (exp, target)
return NULL_RTX;
}
+ /* Expand abs* operations. */
+ d = (struct builtin_description *) bdesc_abs;
+ for (i = 0; i < sizeof (bdesc_abs) / sizeof *d; i++, d++)
+ if (d->code == fcode)
+ return altivec_expand_abs_builtin (d->icode, arglist, target);
+
/* Handle simple unary operations. */
d = (struct builtin_description *) bdesc_1arg;
for (i = 0; i < sizeof (bdesc_1arg) / sizeof *d; i++, d++)
@@ -3830,6 +4069,12 @@ altivec_expand_builtin (exp, target)
if (d->code == fcode)
return altivec_expand_binop_builtin (d->icode, arglist, target);
+ /* Expand the AltiVec predicates. */
+ dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
+ for (i = 0; i < sizeof (bdesc_altivec_preds) / sizeof *dp; i++, dp++)
+ if (dp->code == fcode)
+ return altivec_expand_predicate_builtin (dp->icode, dp->opcode, arglist, target);
+
/* LV* are funky. We initialized them differently. */
switch (fcode)
{
@@ -3899,7 +4144,8 @@ rs6000_init_builtins ()
static void
altivec_init_builtins (void)
{
- struct builtin_description * d;
+ struct builtin_description *d;
+ struct builtin_description_predicates *dp;
size_t i;
tree endlink = void_list_node;
@@ -4055,15 +4301,11 @@ altivec_init_builtins (void)
/* void foo (void). */
tree void_ftype_void
- = build_function_type (void_type_node,
- tree_cons (NULL_TREE, void_type_node,
- endlink));
+ = build_function_type (void_type_node, void_list_node);
/* vshort foo (void). */
tree v8hi_ftype_void
- = build_function_type (V8HI_type_node,
- tree_cons (NULL_TREE, void_type_node,
- endlink));
+ = build_function_type (V8HI_type_node, void_list_node);
tree v4si_ftype_v4si_v4si
= build_function_type (V4SI_type_node,
@@ -4201,6 +4443,18 @@ altivec_init_builtins (void)
tree_cons (NULL_TREE, V4SF_type_node,
endlink)));
+ tree v4si_ftype_v4si
+ = build_function_type (V4SI_type_node,
+ tree_cons (NULL_TREE, V4SI_type_node, endlink));
+
+ tree v8hi_ftype_v8hi
+ = build_function_type (V8HI_type_node,
+ tree_cons (NULL_TREE, V8HI_type_node, endlink));
+
+ tree v16qi_ftype_v16qi
+ = build_function_type (V16QI_type_node,
+ tree_cons (NULL_TREE, V16QI_type_node, endlink));
+
tree v8hi_ftype_v16qi_v16qi
= build_function_type (V8HI_type_node,
tree_cons (NULL_TREE, V16QI_type_node,
@@ -4265,6 +4519,38 @@ altivec_init_builtins (void)
tree_cons (NULL_TREE, V16QI_type_node,
endlink)));
+ tree int_ftype_int_v4si_v4si
+ = build_function_type
+ (integer_type_node,
+ tree_cons (NULL_TREE, integer_type_node,
+ tree_cons (NULL_TREE, V4SI_type_node,
+ tree_cons (NULL_TREE, V4SI_type_node,
+ endlink))));
+
+ tree int_ftype_int_v4sf_v4sf
+ = build_function_type
+ (integer_type_node,
+ tree_cons (NULL_TREE, integer_type_node,
+ tree_cons (NULL_TREE, V4SF_type_node,
+ tree_cons (NULL_TREE, V4SF_type_node,
+ endlink))));
+
+ tree int_ftype_int_v8hi_v8hi
+ = build_function_type
+ (integer_type_node,
+ tree_cons (NULL_TREE, integer_type_node,
+ tree_cons (NULL_TREE, V8HI_type_node,
+ tree_cons (NULL_TREE, V8HI_type_node,
+ endlink))));
+
+ tree int_ftype_int_v16qi_v16qi
+ = build_function_type
+ (integer_type_node,
+ tree_cons (NULL_TREE, integer_type_node,
+ tree_cons (NULL_TREE, V16QI_type_node,
+ tree_cons (NULL_TREE, V16QI_type_node,
+ endlink))));
+
tree v16qi_ftype_int_pvoid
= build_function_type (V16QI_type_node,
tree_cons (NULL_TREE, integer_type_node,
@@ -4313,7 +4599,7 @@ altivec_init_builtins (void)
def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvehx", void_ftype_v8hi_int_pvoid, ALTIVEC_BUILTIN_STVEHX);
def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvewx", void_ftype_v4si_int_pvoid, ALTIVEC_BUILTIN_STVEWX);
def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvxl", void_ftype_v4si_int_pvoid, ALTIVEC_BUILTIN_STVXL);
-
+
/* Add the simple ternary operators. */
d = (struct builtin_description *) bdesc_3arg;
for (i = 0; i < sizeof (bdesc_3arg) / sizeof *d; i++, d++)
@@ -4412,6 +4698,36 @@ altivec_init_builtins (void)
for (i = 0; i < sizeof (bdesc_dst) / sizeof *d; i++, d++)
def_builtin (d->mask, d->name, void_ftype_pvoid_int_char, d->code);
+ /* Initialize the predicates. */
+ dp = (struct builtin_description_predicates *) bdesc_altivec_preds;
+ for (i = 0; i < sizeof (bdesc_altivec_preds) / sizeof *dp; i++, dp++)
+ {
+ enum machine_mode mode1;
+ tree type;
+
+ mode1 = insn_data[dp->icode].operand[1].mode;
+
+ switch (mode1)
+ {
+ case V4SImode:
+ type = int_ftype_int_v4si_v4si;
+ break;
+ case V8HImode:
+ type = int_ftype_int_v8hi_v8hi;
+ break;
+ case V16QImode:
+ type = int_ftype_int_v16qi_v16qi;
+ break;
+ case V4SFmode:
+ type = int_ftype_int_v4sf_v4sf;
+ break;
+ default:
+ abort ();
+ }
+
+ def_builtin (dp->mask, dp->name, type, dp->code);
+ }
+
/* Add the simple binary operators. */
d = (struct builtin_description *) bdesc_2arg;
for (i = 0; i < sizeof (bdesc_2arg) / sizeof *d; i++, d++)
@@ -4530,6 +4846,36 @@ altivec_init_builtins (void)
def_builtin (d->mask, d->name, type, d->code);
}
+ /* Initialize the abs* operators. */
+ d = (struct builtin_description *) bdesc_abs;
+ for (i = 0; i < sizeof (bdesc_abs) / sizeof *d; i++, d++)
+ {
+ enum machine_mode mode0;
+ tree type;
+
+ mode0 = insn_data[d->icode].operand[0].mode;
+
+ switch (mode0)
+ {
+ case V4SImode:
+ type = v4si_ftype_v4si;
+ break;
+ case V8HImode:
+ type = v8hi_ftype_v8hi;
+ break;
+ case V16QImode:
+ type = v16qi_ftype_v16qi;
+ break;
+ case V4SFmode:
+ type = v4sf_ftype_v4sf;
+ break;
+ default:
+ abort ();
+ }
+
+ def_builtin (d->mask, d->name, type, d->code);
+ }
+
/* Add the simple unary operators. */
d = (struct builtin_description *) bdesc_1arg;
for (i = 0; i < sizeof (bdesc_1arg) / sizeof *d; i++, d++)
@@ -5358,7 +5704,7 @@ min_max_operator (op, mode)
/* Return 1 if ANDOP is a mask that has no bits on that are not in the
mask required to convert the result of a rotate insn into a shift
- left insn of SHIFTOP bits. Both are known to be CONST_INT. */
+ left insn of SHIFTOP bits. Both are known to be SImode CONST_INT. */
int
includes_lshift_p (shiftop, andop)
@@ -5369,7 +5715,7 @@ includes_lshift_p (shiftop, andop)
shift_mask <<= INTVAL (shiftop);
- return (INTVAL (andop) & ~shift_mask) == 0;
+ return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
}
/* Similar, but for right shift. */
@@ -5383,7 +5729,7 @@ includes_rshift_p (shiftop, andop)
shift_mask >>= INTVAL (shiftop);
- return (INTVAL (andop) & ~shift_mask) == 0;
+ return (INTVAL (andop) & 0xffffffff & ~shift_mask) == 0;
}
/* Return 1 if ANDOP is a mask suitable for use with an rldic insn
@@ -5769,8 +6115,8 @@ rs6000_got_register (value)
/* The second flow pass currently (June 1999) can't update
regs_ever_live without disturbing other parts of the compiler, so
update it here to make the prolog/epilogue code happy. */
- if (no_new_pseudos && ! regs_ever_live[PIC_OFFSET_TABLE_REGNUM])
- regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
+ if (no_new_pseudos && ! regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM])
+ regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
current_function_uses_pic_offset_table = 1;
@@ -6033,7 +6379,7 @@ print_operand (file, x, code)
case 'm':
/* MB value for a mask operand. */
- if (! mask_operand (x, VOIDmode))
+ if (! mask_operand (x, SImode))
output_operand_lossage ("invalid %%m value");
val = INT_LOWPART (x);
@@ -6068,7 +6414,7 @@ print_operand (file, x, code)
case 'M':
/* ME value for a mask operand. */
- if (! mask_operand (x, VOIDmode))
+ if (! mask_operand (x, SImode))
output_operand_lossage ("invalid %%M value");
val = INT_LOWPART (x);
@@ -6198,7 +6544,7 @@ print_operand (file, x, code)
/* PowerPC64 mask position. All 0's and all 1's are excluded.
CONST_INT 32-bit mask is considered sign-extended so any
transition must occur within the CONST_INT, not on the boundary. */
- if (! mask64_operand (x, VOIDmode))
+ if (! mask64_operand (x, DImode))
output_operand_lossage ("invalid %%S value");
val = INT_LOWPART (x);
@@ -6898,9 +7244,18 @@ rs6000_emit_cmove (dest, op, true_cond, false_cond)
rtx op0 = rs6000_compare_op0;
rtx op1 = rs6000_compare_op1;
REAL_VALUE_TYPE c1;
- enum machine_mode mode = GET_MODE (op0);
+ enum machine_mode compare_mode = GET_MODE (op0);
+ enum machine_mode result_mode = GET_MODE (dest);
rtx temp;
+ /* These modes should always match. */
+ if (GET_MODE (op1) != compare_mode)
+ return 0;
+ if (GET_MODE (true_cond) != result_mode)
+ return 0;
+ if (GET_MODE (false_cond) != result_mode)
+ return 0;
+
/* First, work out if the hardware can do this at all, or
if it's too slow... */
/* If the comparison is an integer one, since we only have fsel
@@ -6943,11 +7298,11 @@ rs6000_emit_cmove (dest, op, true_cond, false_cond)
/* At this point we know we can use fsel. */
/* Reduce the comparison to a comparison against zero. */
- temp = gen_reg_rtx (mode);
+ temp = gen_reg_rtx (compare_mode);
emit_insn (gen_rtx_SET (VOIDmode, temp,
- gen_rtx_MINUS (mode, op0, op1)));
+ gen_rtx_MINUS (compare_mode, op0, op1)));
op0 = temp;
- op1 = CONST0_RTX (mode);
+ op1 = CONST0_RTX (compare_mode);
/* If we don't care about NaNs we can reduce some of the comparisons
down to faster ones. */
@@ -6977,52 +7332,52 @@ rs6000_emit_cmove (dest, op, true_cond, false_cond)
break;
case LE:
- temp = gen_reg_rtx (mode);
- emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (mode, op0)));
+ temp = gen_reg_rtx (compare_mode);
+ emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
op0 = temp;
break;
case ORDERED:
- temp = gen_reg_rtx (mode);
- emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (mode, op0)));
+ temp = gen_reg_rtx (compare_mode);
+ emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
op0 = temp;
break;
case EQ:
- temp = gen_reg_rtx (mode);
+ temp = gen_reg_rtx (compare_mode);
emit_insn (gen_rtx_SET (VOIDmode, temp,
- gen_rtx_NEG (mode,
- gen_rtx_ABS (mode, op0))));
+ gen_rtx_NEG (compare_mode,
+ gen_rtx_ABS (compare_mode, op0))));
op0 = temp;
break;
case UNGE:
- temp = gen_reg_rtx (mode);
+ temp = gen_reg_rtx (result_mode);
emit_insn (gen_rtx_SET (VOIDmode, temp,
- gen_rtx_IF_THEN_ELSE (mode,
+ gen_rtx_IF_THEN_ELSE (result_mode,
gen_rtx_GE (VOIDmode,
op0, op1),
true_cond, false_cond)));
false_cond = temp;
true_cond = false_cond;
- temp = gen_reg_rtx (mode);
- emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (mode, op0)));
+ temp = gen_reg_rtx (compare_mode);
+ emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
op0 = temp;
break;
case GT:
- temp = gen_reg_rtx (mode);
+ temp = gen_reg_rtx (result_mode);
emit_insn (gen_rtx_SET (VOIDmode, temp,
- gen_rtx_IF_THEN_ELSE (mode,
+ gen_rtx_IF_THEN_ELSE (result_mode,
gen_rtx_GE (VOIDmode,
op0, op1),
true_cond, false_cond)));
true_cond = temp;
false_cond = true_cond;
- temp = gen_reg_rtx (mode);
- emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (mode, op0)));
+ temp = gen_reg_rtx (compare_mode);
+ emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
op0 = temp;
break;
@@ -7031,7 +7386,7 @@ rs6000_emit_cmove (dest, op, true_cond, false_cond)
}
emit_insn (gen_rtx_SET (VOIDmode, dest,
- gen_rtx_IF_THEN_ELSE (GET_MODE (dest),
+ gen_rtx_IF_THEN_ELSE (result_mode,
gen_rtx_GE (VOIDmode,
op0, op1),
true_cond, false_cond)));
@@ -7074,7 +7429,7 @@ first_reg_to_save ()
for (first_reg = 13; first_reg <= 31; first_reg++)
if (regs_ever_live[first_reg]
&& (! call_used_regs[first_reg]
- || (first_reg == PIC_OFFSET_TABLE_REGNUM
+ || (first_reg == RS6000_PIC_OFFSET_TABLE_REGNUM
&& ((DEFAULT_ABI == ABI_V4 && flag_pic == 1)
|| (DEFAULT_ABI == ABI_DARWIN && flag_pic)))))
break;
@@ -7128,8 +7483,8 @@ first_reg_to_save ()
#if TARGET_MACHO
if (flag_pic && current_function_uses_pic_offset_table &&
- (first_reg > PIC_OFFSET_TABLE_REGNUM))
- return PIC_OFFSET_TABLE_REGNUM;
+ (first_reg > RS6000_PIC_OFFSET_TABLE_REGNUM))
+ return RS6000_PIC_OFFSET_TABLE_REGNUM;
#endif
return first_reg;
@@ -7341,13 +7696,13 @@ rs6000_stack_info ()
/* Calculate which registers need to be saved & save area size. */
info_ptr->first_gp_reg_save = first_reg_to_save ();
- /* Assume that we will have to save PIC_OFFSET_TABLE_REGNUM,
+ /* Assume that we will have to save RS6000_PIC_OFFSET_TABLE_REGNUM,
even if it currently looks like we won't. */
if (((TARGET_TOC && TARGET_MINIMAL_TOC)
|| (flag_pic == 1 && abi == ABI_V4)
|| (flag_pic && abi == ABI_DARWIN))
- && info_ptr->first_gp_reg_save > PIC_OFFSET_TABLE_REGNUM)
- info_ptr->gp_size = reg_size * (32 - PIC_OFFSET_TABLE_REGNUM);
+ && info_ptr->first_gp_reg_save > RS6000_PIC_OFFSET_TABLE_REGNUM)
+ info_ptr->gp_size = reg_size * (32 - RS6000_PIC_OFFSET_TABLE_REGNUM);
else
info_ptr->gp_size = reg_size * (32 - info_ptr->first_gp_reg_save);
@@ -7533,8 +7888,7 @@ rs6000_stack_info ()
info_ptr->push_p = 1;
else if (abi == ABI_V4)
- info_ptr->push_p = (total_raw_size > info_ptr->fixed_size
- || info_ptr->calls_p);
+ info_ptr->push_p = total_raw_size > info_ptr->fixed_size;
else
info_ptr->push_p = (frame_pointer_needed
@@ -7768,7 +8122,7 @@ rs6000_emit_load_toc_table (fromprolog)
int fromprolog;
{
rtx dest;
- dest = gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM);
+ dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
if (TARGET_ELF && DEFAULT_ABI != ABI_AIX)
{
@@ -8390,7 +8744,10 @@ rs6000_emit_prologue ()
/* Get VRSAVE onto a GPR. */
reg = gen_rtx_REG (SImode, 12);
vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
- emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
+ if (TARGET_MACHO)
+ emit_insn (gen_get_vrsave_internal (reg));
+ else
+ emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
/* Save VRSAVE. */
offset = info->vrsave_save_offset + sp_offset;
@@ -8506,7 +8863,7 @@ rs6000_emit_prologue ()
for (i = 0; i < 32 - info->first_gp_reg_save; i++)
if ((regs_ever_live[info->first_gp_reg_save+i]
&& ! call_used_regs[info->first_gp_reg_save+i])
- || (i+info->first_gp_reg_save == PIC_OFFSET_TABLE_REGNUM
+ || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
&& ((DEFAULT_ABI == ABI_V4 && flag_pic == 1)
|| (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
{
@@ -8608,10 +8965,10 @@ rs6000_emit_prologue ()
RTX_FRAME_RELATED_P (insn) = 1;
}
- /* If we are using PIC_OFFSET_TABLE_REGNUM, we need to set it up. */
+ /* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up. */
if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
|| (DEFAULT_ABI == ABI_V4 && flag_pic == 1
- && regs_ever_live[PIC_OFFSET_TABLE_REGNUM]))
+ && regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM]))
{
/* If emit_load_toc_table will use the link register, we need to save
it. We use R11 for this purpose because emit_load_toc_table
@@ -8639,7 +8996,7 @@ rs6000_emit_prologue ()
rs6000_maybe_dead (emit_insn (gen_load_macho_picbase (dest)));
rs6000_maybe_dead (
- emit_move_insn (gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM),
+ emit_move_insn (gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM),
gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)));
}
}
@@ -8680,13 +9037,24 @@ rs6000_output_function_prologue (file, size)
if (! HAVE_prologue)
{
start_sequence ();
-
+
/* A NOTE_INSN_DELETED is supposed to be at the start and end of
the "toplevel" insn chain. */
emit_note (0, NOTE_INSN_DELETED);
rs6000_emit_prologue ();
emit_note (0, NOTE_INSN_DELETED);
-
+
+ /* Expand INSN_ADDRESSES so final() doesn't crash. */
+ {
+ rtx insn;
+ unsigned addr = 0;
+ for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
+ {
+ INSN_ADDRESSES_NEW (insn, addr);
+ addr += 4;
+ }
+ }
+
if (TARGET_DEBUG_STACK)
debug_rtx_list (get_insns (), 100);
final (get_insns (), file, FALSE, FALSE);
@@ -8881,7 +9249,7 @@ rs6000_emit_epilogue (sibcall)
for (i = 0; i < 32 - info->first_gp_reg_save; i++)
if ((regs_ever_live[info->first_gp_reg_save+i]
&& ! call_used_regs[info->first_gp_reg_save+i])
- || (i+info->first_gp_reg_save == PIC_OFFSET_TABLE_REGNUM
+ || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
&& ((DEFAULT_ABI == ABI_V4 && flag_pic == 1)
|| (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
{
@@ -9074,6 +9442,17 @@ rs6000_output_function_epilogue (file, size)
rs6000_emit_epilogue (FALSE);
emit_note (0, NOTE_INSN_DELETED);
+ /* Expand INSN_ADDRESSES so final() doesn't crash. */
+ {
+ rtx insn;
+ unsigned addr = 0;
+ for (insn = get_insns (); insn != 0; insn = NEXT_INSN (insn))
+ {
+ INSN_ADDRESSES_NEW (insn, addr);
+ addr += 4;
+ }
+ }
+
if (TARGET_DEBUG_STACK)
debug_rtx_list (get_insns (), 100);
final (get_insns (), file, FALSE, FALSE);
@@ -9291,6 +9670,8 @@ rs6000_output_function_epilogue (file, size)
Only emit this if the alloca bit was set above. */
if (frame_pointer_needed)
fputs ("\t.byte 31\n", file);
+
+ fputs ("\t.align 2\n", file);
}
return;
}
@@ -9863,7 +10244,7 @@ output_toc (file, x, labelno, mode)
if (TARGET_MINIMAL_TOC)
fputs (DOUBLE_INT_ASM_OP, file);
else
- fprintf (file, "\t.tc ID_%lx_%lx[TC],", (long)high, (long)low);
+ fprintf (file, "\t.tc ID_%lx_%lx[TC],", (long) high, (long) low);
fprintf (file, "0x%lx%08lx\n", (long) high, (long) low);
return;
}
@@ -9875,7 +10256,7 @@ output_toc (file, x, labelno, mode)
fputs ("\t.long ", file);
else
fprintf (file, "\t.tc ID_%lx_%lx[TC],",
- (long)high, (long)low);
+ (long) high, (long) low);
fprintf (file, "0x%lx,0x%lx\n", (long) high, (long) low);
}
else
@@ -10079,8 +10460,6 @@ output_profile_hook (labelno)
const char *label_name;
rtx fun;
- labelno += 1;
-
ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
STRIP_NAME_ENCODING (label_name, ggc_strdup (buf));
fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
@@ -10463,6 +10842,11 @@ rs6000_select_rtx_section (mode, x)
{
if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (x, mode))
toc_section ();
+ else if (flag_pic
+ && (GET_CODE (x) == SYMBOL_REF
+ || GET_CODE (x) == LABEL_REF
+ || GET_CODE (x) == CONST))
+ data_section ();
else
const_section ();
}
diff --git a/contrib/gcc/config/rs6000/rs6000.h b/contrib/gcc/config/rs6000/rs6000.h
index 2deaf75..3e4c5f2 100644
--- a/contrib/gcc/config/rs6000/rs6000.h
+++ b/contrib/gcc/config/rs6000/rs6000.h
@@ -191,7 +191,7 @@ extern int target_flags;
function, and one less allocable register. */
#define MASK_MINIMAL_TOC 0x00000200
-/* Nonzero for the 64bit model: ints, longs, and pointers are 64 bits. */
+/* Nonzero for the 64bit model: longs and pointers are 64 bits. */
#define MASK_64BIT 0x00000400
/* Disable use of FPRs. */
@@ -604,6 +604,9 @@ extern int rs6000_altivec_abi;
#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64
#endif
+/* Work around rs6000_long_double_type_size dependency in ada/targtyps.c. */
+#define WIDEST_HARDWARE_FP_SIZE 64
+
/* Width in bits of a pointer.
See also the macro `Pmode' defined below. */
#define POINTER_SIZE (TARGET_32BIT ? 32 : 64)
@@ -626,9 +629,6 @@ extern int rs6000_altivec_abi;
#define LOCAL_ALIGNMENT(TYPE, ALIGN) \
((TARGET_ALTIVEC && TREE_CODE (TYPE) == VECTOR_TYPE) ? 128 : ALIGN)
-/* Handle #pragma pack. */
-#define HANDLE_PRAGMA_PACK 1
-
/* Alignment of field after `int : 0' in a structure. */
#define EMPTY_FIELD_BOUNDARY 32
@@ -638,10 +638,13 @@ extern int rs6000_altivec_abi;
/* A bitfield declared as `int' forces `int' alignment for the struct. */
#define PCC_BITFIELD_TYPE_MATTERS 1
-/* Make strings word-aligned so strcpy from constants will be faster. */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN) \
- (TREE_CODE (EXP) == STRING_CST \
- && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
+/* Make strings word-aligned so strcpy from constants will be faster.
+ Make vector constants quadword aligned. */
+#define CONSTANT_ALIGNMENT(EXP, ALIGN) \
+ (TREE_CODE (EXP) == STRING_CST \
+ && (ALIGN) < BITS_PER_WORD \
+ ? BITS_PER_WORD \
+ : (ALIGN))
/* Make arrays of chars word-aligned for the same reasons.
Align vectors to 128 bits. */
@@ -759,7 +762,7 @@ extern int rs6000_altivec_abi;
#define XER_REGNO 76
#define FIRST_ALTIVEC_REGNO 77
#define LAST_ALTIVEC_REGNO 108
-#define TOTAL_ALTIVEC_REGS (LAST_ALTIVEC_REGNO - FIRST_ALTIVEC_REGNO)
+#define TOTAL_ALTIVEC_REGS (LAST_ALTIVEC_REGNO - FIRST_ALTIVEC_REGNO + 1)
#define VRSAVE_REGNO 109
/* List the order in which to allocate registers. Each register must be
@@ -957,18 +960,24 @@ extern int rs6000_altivec_abi;
for (i = 32; i < 64; i++) \
fixed_regs[i] = call_used_regs[i] \
= call_really_used_regs[i] = 1; \
- if (DEFAULT_ABI == ABI_V4 && flag_pic == 1) \
- fixed_regs[PIC_OFFSET_TABLE_REGNUM] \
- = call_used_regs[PIC_OFFSET_TABLE_REGNUM] \
- = call_really_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
- if (DEFAULT_ABI == ABI_DARWIN && flag_pic) \
- global_regs[PIC_OFFSET_TABLE_REGNUM] \
- = fixed_regs[PIC_OFFSET_TABLE_REGNUM] \
- = call_used_regs[PIC_OFFSET_TABLE_REGNUM] \
- = call_really_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
+ if (DEFAULT_ABI == ABI_V4 \
+ && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM \
+ && flag_pic == 1) \
+ fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] \
+ = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] \
+ = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1; \
+ if (DEFAULT_ABI == ABI_DARWIN \
+ && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM) \
+ global_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] \
+ = fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] \
+ = call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] \
+ = call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1; \
if (! TARGET_ALTIVEC) \
- for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i) \
- fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1; \
+ { \
+ for (i = FIRST_ALTIVEC_REGNO; i <= LAST_ALTIVEC_REGNO; ++i) \
+ fixed_regs[i] = call_used_regs[i] = call_really_used_regs[i] = 1; \
+ call_really_used_regs[VRSAVE_REGNO] = 1; \
+ } \
if (TARGET_ALTIVEC_ABI) \
for (i = FIRST_ALTIVEC_REGNO; i < FIRST_ALTIVEC_REGNO + 20; ++i) \
call_used_regs[i] = call_really_used_regs[i] = 1; \
@@ -1199,14 +1208,14 @@ enum reg_class
'Q' means that is a memory operand that is just an offset from a reg.
'R' is for AIX TOC entries.
'S' is a constant that can be placed into a 64-bit mask operand
- 'T' is a consatnt that can be placed into a 32-bit mask operand
+ 'T' is a constant that can be placed into a 32-bit mask operand
'U' is for V.4 small data references. */
#define EXTRA_CONSTRAINT(OP, C) \
((C) == 'Q' ? GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) == REG \
: (C) == 'R' ? LEGITIMATE_CONSTANT_POOL_ADDRESS_P (OP) \
- : (C) == 'S' ? mask64_operand (OP, VOIDmode) \
- : (C) == 'T' ? mask_operand (OP, VOIDmode) \
+ : (C) == 'S' ? mask64_operand (OP, DImode) \
+ : (C) == 'T' ? mask_operand (OP, SImode) \
: (C) == 'U' ? (DEFAULT_ABI == ABI_V4 \
&& small_data_operand (OP, GET_MODE (OP))) \
: 0)
@@ -1539,7 +1548,7 @@ typedef struct rs6000_stack {
On RS/6000, these are r3-r10 and fp1-fp13.
On AltiVec, v2 - v13 are used for passing vectors. */
#define FUNCTION_ARG_REGNO_P(N) \
- ((unsigned)(((N) - GP_ARG_MIN_REG) < (unsigned)(GP_ARG_NUM_REG)) \
+ (((unsigned)((N) - GP_ARG_MIN_REG) < (unsigned)(GP_ARG_NUM_REG)) \
|| (TARGET_ALTIVEC && \
(unsigned)((N) - ALTIVEC_ARG_MIN_REG) < (unsigned)(ALTIVEC_ARG_NUM_REG)) \
|| ((unsigned)((N) - FP_ARG_MIN_REG) < (unsigned)(FP_ARG_NUM_REG)))
@@ -1591,8 +1600,7 @@ typedef struct rs6000_args
#define RS6000_ARG_SIZE(MODE, TYPE) \
((MODE) != BLKmode \
? (GET_MODE_SIZE (MODE) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD \
- : ((unsigned HOST_WIDE_INT) int_size_in_bytes (TYPE) \
- + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
+ : (int_size_in_bytes (TYPE) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
/* Initialize a variable CUM of type CUMULATIVE_ARGS
for a call to a function whose data type is FNTYPE.
@@ -1711,6 +1719,14 @@ typedef struct rs6000_args
#define EXPAND_BUILTIN_VA_ARG(valist, type) \
rs6000_va_arg (valist, type)
+/* For AIX, the rule is that structures are passed left-aligned in
+ their stack slot. However, GCC does not presently do this:
+ structures which are the same size as integer types are passed
+ right-aligned, as if they were in fact integers. This only
+ matters for structures of size 1 or 2, or 4 when TARGET_64BIT.
+ ABI_V4 does not use std_expand_builtin_va_arg. */
+#define PAD_VARARGS_DOWN (TYPE_MODE (type) != BLKmode)
+
/* Define this macro to be a nonzero value if the location where a function
argument is passed depends on whether or not it is a named argument. */
#define STRICT_ARGUMENT_NAMING 1
@@ -1736,7 +1752,7 @@ typedef struct rs6000_args
#define EPILOGUE_USES(REGNO) \
((reload_completed && (REGNO) == LINK_REGISTER_REGNUM) \
- || (REGNO) == VRSAVE_REGNO \
+ || (TARGET_ALTIVEC && (REGNO) == VRSAVE_REGNO) \
|| (current_function_calls_eh_return \
&& TARGET_AIX \
&& (REGNO) == TOC_REGISTER))
@@ -1968,7 +1984,8 @@ typedef struct rs6000_args
&& GET_CODE (XEXP (X, 0)) == REG \
&& INT_REG_OK_FOR_BASE_P (XEXP (X, 0), (STRICT)) \
&& LEGITIMATE_ADDRESS_INTEGER_P (XEXP (X, 1), 0) \
- && (! ALTIVEC_VECTOR_MODE (MODE) || INTVAL (X) == 0) \
+ && (! ALTIVEC_VECTOR_MODE (MODE) \
+ || (GET_CODE (XEXP (X,1)) == CONST_INT && INTVAL (XEXP (X,1)) == 0)) \
&& (((MODE) != DFmode && (MODE) != DImode) \
|| (TARGET_32BIT \
? LEGITIMATE_ADDRESS_INTEGER_P (XEXP (X, 1), 4) \
@@ -2086,7 +2103,8 @@ do { \
this macro is not defined, it is up to the machine-dependent files
to allocate such a register (if necessary). */
-#define PIC_OFFSET_TABLE_REGNUM 30
+#define RS6000_PIC_OFFSET_TABLE_REGNUM 30
+#define PIC_OFFSET_TABLE_REGNUM (flag_pic ? RS6000_PIC_OFFSET_TABLE_REGNUM : INVALID_REGNUM)
#define TOC_REGISTER (TARGET_MINIMAL_TOC ? 30 : 2)
@@ -2415,43 +2433,71 @@ extern int toc_initialized;
#define RS6000_WEAK 0
#endif
-/* This implementes the `alias' attribute. */
-#define ASM_OUTPUT_DEF_FROM_DECLS(FILE,decl,target) \
-do { \
- const char * alias = XSTR (XEXP (DECL_RTL (decl), 0), 0); \
- char * name = IDENTIFIER_POINTER (target); \
- if (TREE_CODE (decl) == FUNCTION_DECL \
- && DEFAULT_ABI == ABI_AIX) \
- { \
- if (TREE_PUBLIC (decl)) \
- { \
- if (RS6000_WEAK && DECL_WEAK (decl)) \
- { \
- fputs ("\t.weak .", FILE); \
- assemble_name (FILE, alias); \
- putc ('\n', FILE); \
- } \
- else \
- { \
- fputs ("\t.globl .", FILE); \
- assemble_name (FILE, alias); \
- putc ('\n', FILE); \
- } \
- } \
- else \
- { \
- fputs ("\t.lglobl .", FILE); \
- assemble_name (FILE, alias); \
- putc ('\n', FILE); \
- } \
- fputs ("\t.set .", FILE); \
- assemble_name (FILE, alias); \
- fputs (",.", FILE); \
- assemble_name (FILE, name); \
- fputc ('\n', FILE); \
- } \
- ASM_OUTPUT_DEF (FILE, alias, name); \
-} while (0)
+#if RS6000_WEAK
+/* Used in lieu of ASM_WEAKEN_LABEL. */
+#define ASM_WEAKEN_DECL(FILE, DECL, NAME, VAL) \
+ do \
+ { \
+ fputs ("\t.weak\t", (FILE)); \
+ assemble_name ((FILE), (NAME)); \
+ if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL \
+ && DEFAULT_ABI == ABI_AIX) \
+ { \
+ fputs ("\n\t.weak\t.", (FILE)); \
+ assemble_name ((FILE), (NAME)); \
+ } \
+ fputc ('\n', (FILE)); \
+ if (VAL) \
+ { \
+ ASM_OUTPUT_DEF ((FILE), (NAME), (VAL)); \
+ if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL \
+ && DEFAULT_ABI == ABI_AIX) \
+ { \
+ fputs ("\t.set\t.", (FILE)); \
+ assemble_name ((FILE), (NAME)); \
+ fputs (",.", (FILE)); \
+ assemble_name ((FILE), (VAL)); \
+ fputc ('\n', (FILE)); \
+ } \
+ } \
+ } \
+ while (0)
+#endif
+
+/* This implements the `alias' attribute. */
+#undef ASM_OUTPUT_DEF_FROM_DECLS
+#define ASM_OUTPUT_DEF_FROM_DECLS(FILE, DECL, TARGET) \
+ do \
+ { \
+ const char *alias = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
+ const char *name = IDENTIFIER_POINTER (TARGET); \
+ if (TREE_CODE (DECL) == FUNCTION_DECL \
+ && DEFAULT_ABI == ABI_AIX) \
+ { \
+ if (TREE_PUBLIC (DECL)) \
+ { \
+ if (!RS6000_WEAK || !DECL_WEAK (DECL)) \
+ { \
+ fputs ("\t.globl\t.", FILE); \
+ assemble_name (FILE, alias); \
+ putc ('\n', FILE); \
+ } \
+ } \
+ else if (TARGET_XCOFF) \
+ { \
+ fputs ("\t.lglobl\t.", FILE); \
+ assemble_name (FILE, alias); \
+ putc ('\n', FILE); \
+ } \
+ fputs ("\t.set\t.", FILE); \
+ assemble_name (FILE, alias); \
+ fputs (",.", FILE); \
+ assemble_name (FILE, name); \
+ fputc ('\n', FILE); \
+ } \
+ ASM_OUTPUT_DEF (FILE, alias, name); \
+ } \
+ while (0)
/* Output to assembler file text saying following lines
may contain character constants, extra white space, comments, etc. */
@@ -2706,6 +2752,10 @@ extern char rs6000_reg_names[][8]; /* register names (0 vs. %r0). */
/* Define the codes that are matched by predicates in rs6000.c. */
#define PREDICATE_CODES \
+ {"any_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF, \
+ LABEL_REF, SUBREG, REG, MEM, PARALLEL}}, \
+ {"zero_constant", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF, \
+ LABEL_REF, SUBREG, REG, MEM}}, \
{"short_cint_operand", {CONST_INT}}, \
{"u_short_cint_operand", {CONST_INT}}, \
{"non_short_cint_operand", {CONST_INT}}, \
@@ -2715,6 +2765,7 @@ extern char rs6000_reg_names[][8]; /* register names (0 vs. %r0). */
{"cc_reg_not_cr0_operand", {SUBREG, REG}}, \
{"reg_or_short_operand", {SUBREG, REG, CONST_INT}}, \
{"reg_or_neg_short_operand", {SUBREG, REG, CONST_INT}}, \
+ {"reg_or_aligned_short_operand", {SUBREG, REG, CONST_INT}}, \
{"reg_or_u_short_operand", {SUBREG, REG, CONST_INT}}, \
{"reg_or_cint_operand", {SUBREG, REG, CONST_INT}}, \
{"reg_or_arith_cint_operand", {SUBREG, REG, CONST_INT}}, \
@@ -2761,6 +2812,7 @@ extern char rs6000_reg_names[][8]; /* register names (0 vs. %r0). */
GT, LEU, LTU, GEU, GTU}}, \
{"boolean_operator", {AND, IOR, XOR}}, \
{"boolean_or_operator", {IOR, XOR}}, \
+ {"altivec_register_operand", {REG}}, \
{"min_max_operator", {SMIN, SMAX, UMIN, UMAX}},
/* uncomment for disabling the corresponding default options */
@@ -2938,19 +2990,6 @@ enum rs6000_builtins
ALTIVEC_BUILTIN_VUPKLSB,
ALTIVEC_BUILTIN_VUPKLPX,
ALTIVEC_BUILTIN_VUPKLSH,
- ALTIVEC_BUILTIN_VCMPBFP_P,
- ALTIVEC_BUILTIN_VCMPEQFP_P,
- ALTIVEC_BUILTIN_VCMPEQUB_P,
- ALTIVEC_BUILTIN_VCMPEQUH_P,
- ALTIVEC_BUILTIN_VCMPEQUW_P,
- ALTIVEC_BUILTIN_VCMPGEFP_P,
- ALTIVEC_BUILTIN_VCMPGTFP_P,
- ALTIVEC_BUILTIN_VCMPGTSB_P,
- ALTIVEC_BUILTIN_VCMPGTSH_P,
- ALTIVEC_BUILTIN_VCMPGTSW_P,
- ALTIVEC_BUILTIN_VCMPGTUB_P,
- ALTIVEC_BUILTIN_VCMPGTUH_P,
- ALTIVEC_BUILTIN_VCMPGTUW_P,
ALTIVEC_BUILTIN_MTVSCR,
ALTIVEC_BUILTIN_MFVSCR,
ALTIVEC_BUILTIN_DSSALL,
@@ -2970,5 +3009,25 @@ enum rs6000_builtins
ALTIVEC_BUILTIN_STVEBX,
ALTIVEC_BUILTIN_STVEHX,
ALTIVEC_BUILTIN_STVEWX,
- ALTIVEC_BUILTIN_STVXL
+ ALTIVEC_BUILTIN_STVXL,
+ ALTIVEC_BUILTIN_VCMPBFP_P,
+ ALTIVEC_BUILTIN_VCMPEQFP_P,
+ ALTIVEC_BUILTIN_VCMPEQUB_P,
+ ALTIVEC_BUILTIN_VCMPEQUH_P,
+ ALTIVEC_BUILTIN_VCMPEQUW_P,
+ ALTIVEC_BUILTIN_VCMPGEFP_P,
+ ALTIVEC_BUILTIN_VCMPGTFP_P,
+ ALTIVEC_BUILTIN_VCMPGTSB_P,
+ ALTIVEC_BUILTIN_VCMPGTSH_P,
+ ALTIVEC_BUILTIN_VCMPGTSW_P,
+ ALTIVEC_BUILTIN_VCMPGTUB_P,
+ ALTIVEC_BUILTIN_VCMPGTUH_P,
+ ALTIVEC_BUILTIN_VCMPGTUW_P,
+ ALTIVEC_BUILTIN_ABSS_V4SI,
+ ALTIVEC_BUILTIN_ABSS_V8HI,
+ ALTIVEC_BUILTIN_ABSS_V16QI,
+ ALTIVEC_BUILTIN_ABS_V4SI,
+ ALTIVEC_BUILTIN_ABS_V4SF,
+ ALTIVEC_BUILTIN_ABS_V8HI,
+ ALTIVEC_BUILTIN_ABS_V16QI
};
diff --git a/contrib/gcc/config/rs6000/rs6000.md b/contrib/gcc/config/rs6000/rs6000.md
index 8fb45ff..93c6fc3 100644
--- a/contrib/gcc/config/rs6000/rs6000.md
+++ b/contrib/gcc/config/rs6000/rs6000.md
@@ -2982,7 +2982,7 @@
(set_attr "length" "4,8")])
(define_split
- [(set (match_operand:CC 3 "cc_reg_operand" "")
+ [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
(compare:CC (match_operator:SI 4 "boolean_operator"
[(match_operand:SI 1 "gpc_reg_operand" "")
(match_operand:SI 2 "gpc_reg_operand" "")])
@@ -3070,7 +3070,7 @@
(set_attr "length" "4,8")])
(define_split
- [(set (match_operand:CC 3 "cc_reg_operand" "")
+ [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
(compare:CC (match_operator:SI 4 "boolean_operator"
[(not:SI (match_operand:SI 1 "gpc_reg_operand" ""))
(match_operand:SI 2 "gpc_reg_operand" "")])
@@ -3136,7 +3136,7 @@
(set_attr "length" "4,8")])
(define_split
- [(set (match_operand:CC 3 "cc_reg_operand" "")
+ [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
(compare:CC (match_operator:SI 4 "boolean_operator"
[(not:SI (match_operand:SI 1 "gpc_reg_operand" ""))
(not:SI (match_operand:SI 2 "gpc_reg_operand" ""))])
@@ -7295,7 +7295,7 @@
(set_attr "length" "4,8")])
(define_split
- [(set (match_operand:CC 3 "cc_reg_operand" "")
+ [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
(compare:CC (match_operator:DI 4 "boolean_operator"
[(match_operand:DI 1 "gpc_reg_operand" "")
(match_operand:DI 2 "gpc_reg_operand" "")])
@@ -7395,7 +7395,7 @@
(set_attr "length" "4,8")])
(define_split
- [(set (match_operand:CC 3 "cc_reg_operand" "")
+ [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
(compare:CC (match_operator:DI 4 "boolean_operator"
[(not:DI (match_operand:DI 1 "gpc_reg_operand" ""))
(match_operand:DI 2 "gpc_reg_operand" "")])
@@ -7461,7 +7461,7 @@
(set_attr "length" "4,8")])
(define_split
- [(set (match_operand:CC 3 "cc_reg_operand" "")
+ [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
(compare:CC (match_operator:DI 4 "boolean_operator"
[(not:DI (match_operand:DI 1 "gpc_reg_operand" ""))
(not:DI (match_operand:DI 2 "gpc_reg_operand" ""))])
@@ -7606,7 +7606,7 @@
operands2[0] = operands[0];
operands2[1] = operands[1];
operands2[2] = operands[2];
- operands2[3] = gen_rtx_REG (SImode, PIC_OFFSET_TABLE_REGNUM);
+ operands2[3] = gen_rtx_REG (SImode, RS6000_PIC_OFFSET_TABLE_REGNUM);
output_asm_insn (\"{l|lwz} %0,lo16(%2)(%1)\", operands);
/* We cannot rely on ha16(low half)==ha16(high half), alas,
although in practice it almost always is. */
@@ -9173,7 +9173,7 @@
(define_insn "*movdi_update1"
[(set (match_operand:DI 3 "gpc_reg_operand" "=r,r")
(mem:DI (plus:DI (match_operand:DI 1 "gpc_reg_operand" "0,0")
- (match_operand:DI 2 "reg_or_short_operand" "r,I"))))
+ (match_operand:DI 2 "reg_or_aligned_short_operand" "r,I"))))
(set (match_operand:DI 0 "gpc_reg_operand" "=b,b")
(plus:DI (match_dup 1) (match_dup 2)))]
"TARGET_POWERPC64 && TARGET_UPDATE"
@@ -9195,7 +9195,7 @@
(define_insn "movdi_update"
[(set (mem:DI (plus:DI (match_operand:DI 1 "gpc_reg_operand" "0,0")
- (match_operand:DI 2 "reg_or_short_operand" "r,I")))
+ (match_operand:DI 2 "reg_or_aligned_short_operand" "r,I")))
(match_operand:DI 3 "gpc_reg_operand" "r,r"))
(set (match_operand:DI 0 "gpc_reg_operand" "=b,b")
(plus:DI (match_dup 1) (match_dup 2)))]
@@ -9544,7 +9544,7 @@
;; Code to initialize the TOC register...
(define_insn "load_toc_aix_si"
- [(parallel [(set (match_operand:SI 0 "register_operand" "=r")
+ [(parallel [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
(unspec:SI [(const_int 0)] 7))
(use (reg:SI 2))])]
"DEFAULT_ABI == ABI_AIX && TARGET_32BIT"
@@ -9559,14 +9559,19 @@
[(set_attr "type" "load")])
(define_insn "load_toc_aix_di"
- [(parallel [(set (match_operand:DI 0 "register_operand" "=r")
+ [(parallel [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
(unspec:DI [(const_int 0)] 7))
(use (reg:DI 2))])]
"DEFAULT_ABI == ABI_AIX && TARGET_64BIT"
"*
{
char buf[30];
+#ifdef TARGET_RELOCATABLE
+ ASM_GENERATE_INTERNAL_LABEL (buf, \"LCTOC\",
+ !TARGET_MINIMAL_TOC || TARGET_RELOCATABLE);
+#else
ASM_GENERATE_INTERNAL_LABEL (buf, \"LCTOC\", 1);
+#endif
if (TARGET_ELF)
strcat (buf, \"@toc\");
operands[1] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
@@ -10841,18 +10846,17 @@
(match_dup 4)))])
(define_insn ""
- [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r")
+ [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r,&r,&r,&r")
(plus:SI (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r")
(match_operand:SI 2 "reg_or_cint_operand" "r,O,K,L,I"))
- (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r,r")))
- (clobber (match_scratch:SI 4 "=&r,&r,&r,&r,&r"))]
+ (match_operand:SI 3 "gpc_reg_operand" "r,r,r,r,r")))]
"! TARGET_POWERPC64"
"@
- xor %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze|addze} %0,%3
- {sfi|subfic} %4,%1,0\;{aze|addze} %0,%3
- {xoril|xori} %4,%1,%b2\;{sfi|subfic} %4,%4,0\;{aze|addze} %0,%3
- {xoriu|xoris} %4,%1,%u2\;{sfi|subfic} %4,%4,0\;{aze|addze} %0,%3
- {sfi|subfic} %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze|addze} %0,%3"
+ xor %0,%1,%2\;{sfi|subfic} %0,%0,0\;{aze|addze} %0,%3
+ {sfi|subfic} %0,%1,0\;{aze|addze} %0,%3
+ {xoril|xori} %0,%1,%b2\;{sfi|subfic} %0,%0,0\;{aze|addze} %0,%3
+ {xoriu|xoris} %0,%1,%u2\;{sfi|subfic} %0,%0,0\;{aze|addze} %0,%3
+ {sfi|subfic} %0,%1,%2\;{sfi|subfic} %0,%0,0\;{aze|addze} %0,%3"
[(set_attr "length" "12,8,12,12,12")])
(define_insn ""
@@ -10899,23 +10903,22 @@
"")
(define_insn ""
- [(set (match_operand:CC 5 "cc_reg_operand" "=x,x,x,x,x,?y,?y,?y,?y,?y")
+ [(set (match_operand:CC 4 "cc_reg_operand" "=x,x,x,x,x,?y,?y,?y,?y,?y")
(compare:CC
(plus:SI
(eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r,r,r,r,r,r")
(match_operand:SI 2 "reg_or_cint_operand" "r,O,K,L,I,r,O,K,L,I"))
(match_operand:SI 3 "gpc_reg_operand" "r,r,r,r,r,r,r,r,r,r"))
(const_int 0)))
- (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r,r,r,r,r,r")
- (plus:SI (eq:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
- (clobber (match_scratch:SI 4 "=&r,&r,&r,&r,&r,&r,&r,&r,&r,&r"))]
+ (set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r,&r,&r,&r,&r,&r,&r,&r,&r")
+ (plus:SI (eq:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
"! TARGET_POWERPC64"
"@
- xor %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %0,%3
- {sfi|subfic} %4,%1,0\;{aze.|addze.} %0,%3
- {xoril|xori} %4,%1,%b2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %0,%3
- {xoriu|xoris} %4,%1,%u2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %0,%3
- {sfi|subfic} %4,%1,%2\;{sfi|subfic} %4,%4,0\;{aze.|addze.} %0,%3
+ xor %0,%1,%2\;{sfi|subfic} %0,%0,0\;{aze.|addze.} %0,%3
+ {sfi|subfic} %0,%1,0\;{aze.|addze.} %0,%3
+ {xoril|xori} %0,%1,%b2\;{sfi|subfic} %0,%0,0\;{aze.|addze.} %0,%3
+ {xoriu|xoris} %0,%1,%u2\;{sfi|subfic} %0,%0,0\;{aze.|addze.} %0,%3
+ {sfi|subfic} %0,%1,%2\;{sfi|subfic} %0,%0,0\;{aze.|addze.} %0,%3
#
#
#
@@ -10925,7 +10928,7 @@
(set_attr "length" "12,8,12,12,12,16,12,16,16,16")])
(define_split
- [(set (match_operand:CC 5 "cc_reg_not_cr0_operand" "")
+ [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
(compare:CC
(plus:SI
(eq:SI (match_operand:SI 1 "gpc_reg_operand" "")
@@ -10933,13 +10936,11 @@
(match_operand:SI 3 "gpc_reg_operand" ""))
(const_int 0)))
(set (match_operand:SI 0 "gpc_reg_operand" "")
- (plus:SI (eq:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
- (clobber (match_scratch:SI 4 ""))]
+ (plus:SI (eq:SI (match_dup 1) (match_dup 2)) (match_dup 3)))]
"! TARGET_POWERPC64 && reload_completed"
- [(parallel [(set (match_dup 0)
+ [(set (match_dup 0)
(plus:SI (eq:SI (match_dup 1) (match_dup 2)) (match_dup 3)))
- (clobber (match_dup 4))])
- (set (match_dup 5)
+ (set (match_dup 4)
(compare:CC (match_dup 0)
(const_int 0)))]
"")
@@ -11008,7 +11009,8 @@
(const_int 31))
(match_operand:SI 2 "gpc_reg_operand" "r,r"))
(const_int 0)))
- (clobber (match_scratch:SI 3 "=&r,&r"))]
+ (clobber (match_scratch:SI 3 "=&r,&r"))
+ (clobber (match_scratch:SI 4 "=X,&r"))]
"! TARGET_POWERPC64"
"@
{ai|addic} %3,%1,-1\;{aze.|addze.} %3,%2
@@ -11024,12 +11026,14 @@
(const_int 31))
(match_operand:SI 2 "gpc_reg_operand" ""))
(const_int 0)))
- (clobber (match_scratch:SI 3 ""))]
+ (clobber (match_scratch:SI 3 ""))
+ (clobber (match_scratch:SI 4 ""))]
"! TARGET_POWERPC64 && reload_completed"
- [(set (match_dup 3)
- (plus:SI (lshiftrt:SI (neg:SI (abs:SI (match_dup 1)))
- (const_int 31))
- (match_dup 2)))
+ [(parallel [(set (match_dup 3)
+ (plus:SI (lshiftrt:SI (neg:SI (abs:SI (match_dup 1)))
+ (const_int 31))
+ (match_dup 2)))
+ (clobber (match_dup 4))])
(set (match_dup 0)
(compare:CC (match_dup 3)
(const_int 0)))]
@@ -11387,13 +11391,12 @@
(set_attr "length" "12,16")])
(define_insn ""
- [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
+ [(set (match_operand:SI 0 "gpc_reg_operand" "=&r")
(plus:SI (leu:SI (match_operand:SI 1 "gpc_reg_operand" "r")
(match_operand:SI 2 "reg_or_short_operand" "rI"))
- (match_operand:SI 3 "gpc_reg_operand" "r")))
- (clobber (match_scratch:SI 4 "=&r"))]
+ (match_operand:SI 3 "gpc_reg_operand" "r")))]
"! TARGET_POWERPC64"
- "{sf%I2|subf%I2c} %4,%1,%2\;{aze|addze} %0,%3"
+ "{sf%I2|subf%I2c} %0,%1,%2\;{aze|addze} %0,%3"
[(set_attr "length" "8")])
(define_insn ""
@@ -11725,15 +11728,14 @@
"")
(define_insn ""
- [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
+ [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r")
(plus:SI (ltu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
(match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
- (match_operand:SI 3 "reg_or_short_operand" "rI,rI")))
- (clobber (match_scratch:SI 4 "=&r,&r"))]
+ (match_operand:SI 3 "reg_or_short_operand" "rI,rI")))]
"! TARGET_POWERPC64"
"@
- {sf|subfc} %4,%2,%1\;{sfe|subfe} %4,%4,%4\;{sf%I3|subf%I3c} %0,%4,%3
- {ai|addic} %4,%1,%n2\;{sfe|subfe} %4,%4,%4\;{sf%I3|subf%I3c} %0,%4,%3"
+ {sf|subfc} %0,%2,%1\;{sfe|subfe} %0,%0,%0\;{sf%I3|subf%I3c} %0,%0,%3
+ {ai|addic} %0,%1,%n2\;{sfe|subfe} %0,%0,%0\;{sf%I3|subf%I3c} %0,%0,%3"
[(set_attr "length" "12")])
(define_insn ""
@@ -12034,15 +12036,14 @@
"")
(define_insn ""
- [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
+ [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r")
(plus:SI (geu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
(match_operand:SI 2 "reg_or_neg_short_operand" "r,P"))
- (match_operand:SI 3 "gpc_reg_operand" "r,r")))
- (clobber (match_scratch:SI 4 "=&r,&r"))]
+ (match_operand:SI 3 "gpc_reg_operand" "r,r")))]
"! TARGET_POWERPC64"
"@
- {sf|subfc} %4,%2,%1\;{aze|addze} %0,%3
- {ai|addic} %4,%1,%n2\;{aze|addze} %0,%3"
+ {sf|subfc} %0,%2,%1\;{aze|addze} %0,%3
+ {ai|addic} %0,%1,%n2\;{aze|addze} %0,%3"
[(set_attr "length" "8")])
(define_insn ""
@@ -12335,13 +12336,12 @@
"")
(define_insn ""
- [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
+ [(set (match_operand:SI 0 "gpc_reg_operand" "=&r")
(plus:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "r")
(const_int 0))
- (match_operand:SI 2 "gpc_reg_operand" "r")))
- (clobber (match_scratch:SI 3 "=&r"))]
+ (match_operand:SI 2 "gpc_reg_operand" "r")))]
"! TARGET_POWERPC64"
- "{a|addc} %3,%1,%1\;{sfe|subfe} %3,%1,%3\;{aze|addze} %0,%2"
+ "{a|addc} %0,%1,%1\;{sfe|subfe} %0,%1,%0\;{aze|addze} %0,%2"
[(set_attr "length" "12")])
(define_insn ""
@@ -12671,15 +12671,14 @@
"")
(define_insn ""
- [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
+ [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r")
(plus:SI (gtu:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
(match_operand:SI 2 "reg_or_short_operand" "I,rI"))
- (match_operand:SI 3 "reg_or_short_operand" "r,rI")))
- (clobber (match_scratch:SI 4 "=&r,&r"))]
+ (match_operand:SI 3 "reg_or_short_operand" "r,rI")))]
"! TARGET_POWERPC64"
"@
- {ai|addic} %4,%1,%k2\;{aze|addze} %0,%3
- {sf%I2|subf%I2c} %4,%1,%2\;{sfe|subfe} %4,%4,%4\;{sf%I3|subf%I3c} %0,%4,%3"
+ {ai|addic} %0,%1,%k2\;{aze|addze} %0,%3
+ {sf%I2|subf%I2c} %0,%1,%2\;{sfe|subfe} %0,%0,%0\;{sf%I3|subf%I3c} %0,%0,%3"
[(set_attr "length" "8,12")])
(define_insn ""
@@ -13256,15 +13255,15 @@
(define_insn "*ctrdi_internal1"
[(set (pc)
- (if_then_else (ne (match_operand:DI 1 "register_operand" "c,*r,*r")
+ (if_then_else (ne (match_operand:DI 1 "register_operand" "c,*r,*r,!*f")
(const_int 1))
(label_ref (match_operand 0 "" ""))
(pc)))
- (set (match_operand:DI 2 "register_operand" "=1,*r,m*q*c*l")
+ (set (match_operand:DI 2 "register_operand" "=1,*r,m*c*l,!*f")
(plus:DI (match_dup 1)
(const_int -1)))
- (clobber (match_scratch:CC 3 "=X,&x,&x"))
- (clobber (match_scratch:DI 4 "=X,X,r"))]
+ (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
+ (clobber (match_scratch:DI 4 "=X,X,r,r"))]
"TARGET_POWERPC64"
"*
{
@@ -13276,19 +13275,19 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "*,12,16,24")])
(define_insn "*ctrdi_internal2"
[(set (pc)
- (if_then_else (ne (match_operand:DI 1 "register_operand" "c,*r,*r")
+ (if_then_else (ne (match_operand:DI 1 "register_operand" "c,*r,*r,!*f")
(const_int 1))
(pc)
(label_ref (match_operand 0 "" ""))))
- (set (match_operand:DI 2 "register_operand" "=1,*r,m*q*c*l")
+ (set (match_operand:DI 2 "register_operand" "=1,*r,m*c*l,!*f")
(plus:DI (match_dup 1)
(const_int -1)))
- (clobber (match_scratch:CC 3 "=X,&x,&x"))
- (clobber (match_scratch:DI 4 "=X,X,r"))]
+ (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
+ (clobber (match_scratch:DI 4 "=X,X,r,r"))]
"TARGET_POWERPC64"
"*
{
@@ -13300,7 +13299,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "*,12,16,24")])
;; Similar, but we can use GE since we have a REG_NONNEG.
@@ -13354,15 +13353,15 @@
(define_insn "*ctrdi_internal3"
[(set (pc)
- (if_then_else (ge (match_operand:DI 1 "register_operand" "c,*r,*r")
+ (if_then_else (ge (match_operand:DI 1 "register_operand" "c,*r,*r,!*f")
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))
- (set (match_operand:DI 2 "register_operand" "=1,*r,m*q*c*l")
+ (set (match_operand:DI 2 "register_operand" "=1,*r,m*c*l,!*f")
(plus:DI (match_dup 1)
(const_int -1)))
- (clobber (match_scratch:CC 3 "=X,&x,&X"))
- (clobber (match_scratch:DI 4 "=X,X,r"))]
+ (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
+ (clobber (match_scratch:DI 4 "=X,X,r,r"))]
"TARGET_POWERPC64 && find_reg_note (insn, REG_NONNEG, 0)"
"*
{
@@ -13374,19 +13373,19 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "*,12,16,24")])
(define_insn "*ctrdi_internal4"
[(set (pc)
- (if_then_else (ge (match_operand:DI 1 "register_operand" "c,*r,*r")
+ (if_then_else (ge (match_operand:DI 1 "register_operand" "c,*r,*r,!*f")
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))
- (set (match_operand:DI 2 "register_operand" "=1,*r,m*q*c*l")
+ (set (match_operand:DI 2 "register_operand" "=1,*r,m*c*l,!*f")
(plus:DI (match_dup 1)
(const_int -1)))
- (clobber (match_scratch:CC 3 "=X,&x,&X"))
- (clobber (match_scratch:DI 4 "=X,X,r"))]
+ (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
+ (clobber (match_scratch:DI 4 "=X,X,r,r"))]
"TARGET_POWERPC64 && find_reg_note (insn, REG_NONNEG, 0)"
"*
{
@@ -13398,7 +13397,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "*,12,16,24")])
;; Similar but use EQ
@@ -13452,15 +13451,15 @@
(define_insn "*ctrdi_internal5"
[(set (pc)
- (if_then_else (eq (match_operand:DI 1 "register_operand" "c,*r,*r")
+ (if_then_else (eq (match_operand:DI 1 "register_operand" "c,*r,*r,!*f")
(const_int 1))
(label_ref (match_operand 0 "" ""))
(pc)))
- (set (match_operand:DI 2 "register_operand" "=1,*r,m*q*c*l")
+ (set (match_operand:DI 2 "register_operand" "=1,*r,m*c*l,!*f")
(plus:DI (match_dup 1)
(const_int -1)))
- (clobber (match_scratch:CC 3 "=X,&x,&x"))
- (clobber (match_scratch:DI 4 "=X,X,r"))]
+ (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
+ (clobber (match_scratch:DI 4 "=X,X,r,r"))]
"TARGET_POWERPC64"
"*
{
@@ -13472,19 +13471,19 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "*,12,16,24")])
(define_insn "*ctrdi_internal6"
[(set (pc)
- (if_then_else (eq (match_operand:DI 1 "register_operand" "c,*r,*r")
+ (if_then_else (eq (match_operand:DI 1 "register_operand" "c,*r,*r,!*f")
(const_int 1))
(pc)
(label_ref (match_operand 0 "" ""))))
- (set (match_operand:DI 2 "register_operand" "=1,*r,m*q*c*l")
+ (set (match_operand:DI 2 "register_operand" "=1,*r,m*c*l,!*f")
(plus:DI (match_dup 1)
(const_int -1)))
- (clobber (match_scratch:CC 3 "=X,&x,&x"))
- (clobber (match_scratch:DI 4 "=X,X,r"))]
+ (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
+ (clobber (match_scratch:DI 4 "=X,X,r,r"))]
"TARGET_POWERPC64"
"*
{
@@ -13496,7 +13495,7 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
- (set_attr "length" "*,12,16")])
+ (set_attr "length" "*,12,16,24")])
;; Now the splitters if we could not allocate the CTR register
@@ -13567,7 +13566,7 @@
(const_int -1)))
(clobber (match_scratch:CC 3 ""))
(clobber (match_scratch:DI 4 ""))]
- "TARGET_POWERPC64 && reload_completed"
+ "TARGET_POWERPC64 && reload_completed && INT_REGNO_P (REGNO (operands[0]))"
[(parallel [(set (match_dup 3)
(compare:CC (plus:DI (match_dup 1)
(const_int -1))
@@ -13610,6 +13609,45 @@
"
{ operands[7] = gen_rtx (GET_CODE (operands[2]), VOIDmode, operands[3],
const0_rtx); }")
+
+(define_split
+ [(set (pc)
+ (if_then_else (match_operator 2 "comparison_operator"
+ [(match_operand:DI 1 "gpc_reg_operand" "")
+ (const_int 1)])
+ (match_operand 5 "" "")
+ (match_operand 6 "" "")))
+ (set (match_operand:DI 0 "gpc_reg_operand" "")
+ (plus:DI (match_dup 1)
+ (const_int -1)))
+ (clobber (match_scratch:CC 3 ""))
+ (clobber (match_scratch:DI 4 ""))]
+ "TARGET_POWERPC64 && reload_completed && FP_REGNO_P (REGNO (operands[0]))"
+ [(set (match_dup 8)
+ (match_dup 1))
+ (set (match_dup 4)
+ (match_dup 8))
+ (parallel [(set (match_dup 3)
+ (compare:CC (plus:DI (match_dup 4)
+ (const_int -1))
+ (const_int 0)))
+ (set (match_dup 4)
+ (plus:DI (match_dup 4)
+ (const_int -1)))])
+ (set (match_dup 8)
+ (match_dup 4))
+ (set (match_dup 0)
+ (match_dup 8))
+ (set (pc) (if_then_else (match_dup 7)
+ (match_dup 5)
+ (match_dup 6)))]
+ "
+{
+ operands[7] = gen_rtx (GET_CODE (operands[2]), VOIDmode, operands[3],
+ const0_rtx);
+ operands[8] = assign_stack_temp (DImode, GET_MODE_SIZE (DImode), 0);
+}")
+
(define_insn "trap"
[(trap_if (const_int 1) (const_int 0))]
@@ -13871,28 +13909,28 @@
;; Generic LVX load instruction.
(define_insn "altivec_lvx_4si"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
+ [(set (match_operand:V4SI 0 "altivec_register_operand" "=v")
(match_operand:V4SI 1 "memory_operand" "m"))]
"TARGET_ALTIVEC"
"lvx %0,%y1"
[(set_attr "type" "vecload")])
(define_insn "altivec_lvx_8hi"
- [(set (match_operand:V8HI 0 "register_operand" "=v")
+ [(set (match_operand:V8HI 0 "altivec_register_operand" "=v")
(match_operand:V8HI 1 "memory_operand" "m"))]
"TARGET_ALTIVEC"
"lvx %0,%y1"
[(set_attr "type" "vecload")])
(define_insn "altivec_lvx_16qi"
- [(set (match_operand:V16QI 0 "register_operand" "=v")
+ [(set (match_operand:V16QI 0 "altivec_register_operand" "=v")
(match_operand:V16QI 1 "memory_operand" "m"))]
"TARGET_ALTIVEC"
"lvx %0,%y1"
[(set_attr "type" "vecload")])
(define_insn "altivec_lvx_4sf"
- [(set (match_operand:V4SF 0 "register_operand" "=v")
+ [(set (match_operand:V4SF 0 "altivec_register_operand" "=v")
(match_operand:V4SF 1 "memory_operand" "m"))]
"TARGET_ALTIVEC"
"lvx %0,%y1"
@@ -13901,28 +13939,28 @@
;; Generic STVX store instruction.
(define_insn "altivec_stvx_4si"
[(set (match_operand:V4SI 0 "memory_operand" "=m")
- (match_operand:V4SI 1 "register_operand" "v"))]
+ (match_operand:V4SI 1 "altivec_register_operand" "v"))]
"TARGET_ALTIVEC"
"stvx %1,%y0"
[(set_attr "type" "vecstore")])
(define_insn "altivec_stvx_8hi"
[(set (match_operand:V8HI 0 "memory_operand" "=m")
- (match_operand:V8HI 1 "register_operand" "v"))]
+ (match_operand:V8HI 1 "altivec_register_operand" "v"))]
"TARGET_ALTIVEC"
"stvx %1,%y0"
[(set_attr "type" "vecstore")])
(define_insn "altivec_stvx_16qi"
[(set (match_operand:V16QI 0 "memory_operand" "=m")
- (match_operand:V16QI 1 "register_operand" "v"))]
+ (match_operand:V16QI 1 "altivec_register_operand" "v"))]
"TARGET_ALTIVEC"
"stvx %1,%y0"
[(set_attr "type" "vecstore")])
(define_insn "altivec_stvx_4sf"
[(set (match_operand:V4SF 0 "memory_operand" "=m")
- (match_operand:V4SF 1 "register_operand" "v"))]
+ (match_operand:V4SF 1 "altivec_register_operand" "v"))]
"TARGET_ALTIVEC"
"stvx %1,%y0"
[(set_attr "type" "vecstore")])
@@ -13935,14 +13973,18 @@
"{ rs6000_emit_move (operands[0], operands[1], V4SImode); DONE; }")
(define_insn "*movv4si_internal"
- [(set (match_operand:V4SI 0 "nonimmediate_operand" "=m,v,v")
- (match_operand:V4SI 1 "input_operand" "v,m,v"))]
+ [(set (match_operand:V4SI 0 "nonimmediate_operand" "=m,v,v,o,r,r")
+ (match_operand:V4SI 1 "input_operand" "v,m,v,r,o,r"))]
"TARGET_ALTIVEC"
"@
stvx %1,%y0
lvx %0,%y1
- vor %0,%1,%1"
- [(set_attr "type" "altivec")])
+ vor %0,%1,%1
+ stw%U0 %1,%0\;stw %L1,%L0\;stw %Y1,%Y0\;stw %Z1,%Z0
+ lwz%U1 %0,%1\;lwz %L0,%L1\;lwz %Y0,%Y1\;lwz %Z0,%Z1
+ mr %0,%1\;mr %L0,%L1\;mr %Y0,%Y1\;mr %Z0,%Z1"
+ [(set_attr "type" "altivec")
+ (set_attr "length" "*,*,*,16,16,16")])
(define_expand "movv8hi"
[(set (match_operand:V8HI 0 "nonimmediate_operand" "")
@@ -13951,14 +13993,18 @@
"{ rs6000_emit_move (operands[0], operands[1], V8HImode); DONE; }")
(define_insn "*movv8hi_internal1"
- [(set (match_operand:V8HI 0 "nonimmediate_operand" "=m,v,v")
- (match_operand:V8HI 1 "input_operand" "v,m,v"))]
+ [(set (match_operand:V8HI 0 "nonimmediate_operand" "=m,v,v,o,r,r")
+ (match_operand:V8HI 1 "input_operand" "v,m,v,r,o,r"))]
"TARGET_ALTIVEC"
"@
stvx %1,%y0
lvx %0,%y1
- vor %0,%1,%1"
- [(set_attr "type" "altivec")])
+ vor %0,%1,%1
+ stw%U0 %1,%0\;stw %L1,%L0\;stw %Y1,%Y0\;stw %Z1,%Z0
+ lwz%U1 %0,%1\;lwz %L0,%L1\;lwz %Y0,%Y1\;lwz %Z0,%Z1
+ mr %0,%1\;mr %L0,%L1\;mr %Y0,%Y1\;mr %Z0,%Z1"
+ [(set_attr "type" "altivec")
+ (set_attr "length" "*,*,*,16,16,16")])
(define_expand "movv16qi"
[(set (match_operand:V16QI 0 "nonimmediate_operand" "")
@@ -13967,14 +14013,18 @@
"{ rs6000_emit_move (operands[0], operands[1], V16QImode); DONE; }")
(define_insn "*movv16qi_internal1"
- [(set (match_operand:V16QI 0 "nonimmediate_operand" "=m,v,v")
- (match_operand:V16QI 1 "input_operand" "v,m,v"))]
+ [(set (match_operand:V16QI 0 "nonimmediate_operand" "=m,v,v,o,r,r")
+ (match_operand:V16QI 1 "input_operand" "v,m,v,r,o,r"))]
"TARGET_ALTIVEC"
"@
stvx %1,%y0
lvx %0,%y1
- vor %0,%1,%1"
- [(set_attr "type" "altivec")])
+ vor %0,%1,%1
+ stw%U0 %1,%0\;stw %L1,%L0\;stw %Y1,%Y0\;stw %Z1,%Z0
+ lwz%U1 %0,%1\;lwz %L0,%L1\;lwz %Y0,%Y1\;lwz %Z0,%Z1
+ mr %0,%1\;mr %L0,%L1\;mr %Y0,%Y1\;mr %Z0,%Z1"
+ [(set_attr "type" "altivec")
+ (set_attr "length" "*,*,*,16,16,16")])
(define_expand "movv4sf"
[(set (match_operand:V4SF 0 "nonimmediate_operand" "")
@@ -13983,13 +14033,30 @@
"{ rs6000_emit_move (operands[0], operands[1], V4SFmode); DONE; }")
(define_insn "*movv4sf_internal1"
- [(set (match_operand:V4SF 0 "nonimmediate_operand" "=m,v,v")
- (match_operand:V4SF 1 "input_operand" "v,m,v"))]
+ [(set (match_operand:V4SF 0 "nonimmediate_operand" "=m,v,v,o,r,r")
+ (match_operand:V4SF 1 "input_operand" "v,m,v,r,o,r"))]
"TARGET_ALTIVEC"
"@
stvx %1,%y0
lvx %0,%y1
- vor %0,%1,%1"
+ vor %0,%1,%1
+ stw%U0 %1,%0\;stw %L1,%L0\;stw %Y1,%Y0\;stw %Z1,%Z0
+ lwz%U1 %0,%1\;lwz %L0,%L1\;lwz %Y0,%Y1\;lwz %Z0,%Z1
+ mr %0,%1\;mr %L0,%L1\;mr %Y0,%Y1\;mr %Z0,%Z1"
+ [(set_attr "type" "altivec")
+ (set_attr "length" "*,*,*,16,16,16")])
+
+(define_insn "get_vrsave_internal"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (unspec:SI [(reg:SI 109)] 214))]
+ "TARGET_ALTIVEC"
+ "*
+{
+ if (TARGET_MACHO)
+ return \"mtspr 256,%0\";
+ else
+ return \"mtvrsave %0\";
+}"
[(set_attr "type" "altivec")])
(define_insn "*set_vrsave_internal"
@@ -13998,9 +14065,45 @@
(unspec_volatile:SI [(match_operand:SI 1 "register_operand" "r")
(reg:SI 109)] 30))])]
"TARGET_ALTIVEC"
- "mtvrsave %1"
+ "*
+{
+ if (TARGET_MACHO)
+ return \"mfspr %1,256\";
+ else
+ return \"mtvrsave %1\";
+}"
[(set_attr "type" "altivec")])
+;; Vector clears
+(define_insn "*movv4si_const0"
+ [(set (match_operand:V4SI 0 "altivec_register_operand" "=v")
+ (match_operand:V4SI 1 "zero_constant" ""))]
+ "TARGET_ALTIVEC"
+ "vxor %0,%0,%0"
+ [(set_attr "type" "vecsimple")])
+
+(define_insn "*movv4sf_const0"
+ [(set (match_operand:V4SF 0 "altivec_register_operand" "=v")
+ (match_operand:V4SF 1 "zero_constant" ""))]
+
+ "TARGET_ALTIVEC"
+ "vxor %0,%0,%0"
+ [(set_attr "type" "vecsimple")])
+
+(define_insn "*movv8hi_const0"
+ [(set (match_operand:V8HI 0 "altivec_register_operand" "=v")
+ (match_operand:V8HI 1 "zero_constant" ""))]
+ "TARGET_ALTIVEC"
+ "vxor %0,%0,%0"
+ [(set_attr "type" "vecsimple")])
+
+(define_insn "*movv16qi_const0"
+ [(set (match_operand:V16QI 0 "altivec_register_operand" "=v")
+ (match_operand:V16QI 1 "zero_constant" ""))]
+ "TARGET_ALTIVEC"
+ "vxor %0,%0,%0"
+ [(set_attr "type" "vecsimple")])
+
;; Simple binary operations.
(define_insn "addv16qi3"
@@ -15033,6 +15136,7 @@
"TARGET_ALTIVEC"
"vspltb %0,%1,%2"
[(set_attr "type" "vecperm")])
+
(define_insn "altivec_vsplth"
[(set (match_operand:V8HI 0 "register_operand" "=v")
(unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
@@ -15318,110 +15422,79 @@
;; AltiVec predicates.
-(define_insn "altivec_vcmpequb_p"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:V16QI 1 "register_operand" "v")
- (match_operand:V16QI 2 "register_operand" "v")] 173))]
- "TARGET_ALTIVEC"
- "vcmpequb. %0,%1,%2"
-[(set_attr "type" "veccmp")])
-
-(define_insn "altivec_vcmpequh_p"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
- (match_operand:V8HI 2 "register_operand" "v")] 174))]
+(define_expand "cr6_test_for_zero"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (eq:SI (reg:CC 74)
+ (const_int 0)))]
"TARGET_ALTIVEC"
- "vcmpequh. %0,%1,%2"
-[(set_attr "type" "veccmp")])
+ "")
-(define_insn "altivec_vcmpequw_p"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
- (match_operand:V4SI 2 "register_operand" "v")] 175))]
+(define_expand "cr6_test_for_zero_reverse"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (eq:SI (reg:CC 74)
+ (const_int 0)))
+ (set (match_dup 0) (minus:SI (const_int 1) (match_dup 0)))]
"TARGET_ALTIVEC"
- "vcmpequw. %0,%1,%2"
-[(set_attr "type" "veccmp")])
+ "")
-(define_insn "altivec_vcmpeqfp_p"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
- (match_operand:V4SF 2 "register_operand" "v")] 176))]
+(define_expand "cr6_test_for_lt"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (lt:SI (reg:CC 74)
+ (const_int 0)))]
"TARGET_ALTIVEC"
- "vcmpeqfp. %0,%1,%2"
-[(set_attr "type" "veccmp")])
+ "")
-(define_insn "altivec_vcmpgtub_p"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:V16QI 1 "register_operand" "v")
- (match_operand:V16QI 2 "register_operand" "v")] 177))]
+(define_expand "cr6_test_for_lt_reverse"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (lt:SI (reg:CC 74)
+ (const_int 0)))
+ (set (match_dup 0) (minus:SI (const_int 1) (match_dup 0)))]
"TARGET_ALTIVEC"
- "vcmpgtub. %0,%1,%2"
-[(set_attr "type" "veccmp")])
+ "")
-(define_insn "altivec_vcmpgtsb_p"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:V16QI 1 "register_operand" "v")
- (match_operand:V16QI 2 "register_operand" "v")] 178))]
- "TARGET_ALTIVEC"
- "vcmpgtsb. %0,%1,%2"
-[(set_attr "type" "veccmp")])
+;; We can get away with generating the opcode on the fly (%3 below)
+;; because all the predicates have the same scheduling parameters.
-(define_insn "altivec_vcmpgtuw_p"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
- (match_operand:V4SI 2 "register_operand" "v")] 179))]
+(define_insn "altivec_predicate_v4si"
+ [(set (reg:CC 74)
+ (unspec:CC [(match_operand:V4SI 1 "register_operand" "v")
+ (match_operand:V4SI 2 "register_operand" "v")
+ (match_operand 3 "any_operand" "")] 173))
+ (clobber (match_scratch:V4SI 0 "=v"))]
"TARGET_ALTIVEC"
- "vcmpgtuw. %0,%1,%2"
+ "%3 %0,%1,%2"
[(set_attr "type" "veccmp")])
-(define_insn "altivec_vcmpgtsw_p"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
- (match_operand:V4SI 2 "register_operand" "v")] 180))]
+(define_insn "altivec_predicate_v4sf"
+ [(set (reg:CC 74)
+ (unspec:CC [(match_operand:V4SF 1 "register_operand" "v")
+ (match_operand:V4SF 2 "register_operand" "v")
+ (match_operand 3 "any_operand" "")] 174))
+ (clobber (match_scratch:V4SF 0 "=v"))]
"TARGET_ALTIVEC"
- "vcmpgtsw. %0,%1,%2"
+ "%3 %0,%1,%2"
[(set_attr "type" "veccmp")])
-(define_insn "altivec_vcmpgefp_p"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
- (match_operand:V4SF 2 "register_operand" "v")] 181))]
+(define_insn "altivec_predicate_v8hi"
+ [(set (reg:CC 74)
+ (unspec:CC [(match_operand:V8HI 1 "register_operand" "v")
+ (match_operand:V8HI 2 "register_operand" "v")
+ (match_operand 3 "any_operand" "")] 175))
+ (clobber (match_scratch:V8HI 0 "=v"))]
"TARGET_ALTIVEC"
- "vcmpgefp. %0,%1,%2"
+ "%3 %0,%1,%2"
[(set_attr "type" "veccmp")])
-(define_insn "altivec_vcmpgtfp_p"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
- (match_operand:V4SF 2 "register_operand" "v")] 182))]
+(define_insn "altivec_predicate_v16qi"
+ [(set (reg:CC 74)
+ (unspec:CC [(match_operand:V16QI 1 "register_operand" "v")
+ (match_operand:V16QI 2 "register_operand" "v")
+ (match_operand 3 "any_operand" "")] 175))
+ (clobber (match_scratch:V16QI 0 "=v"))]
"TARGET_ALTIVEC"
- "vcmpgtfp. %0,%1,%2"
+ "%3 %0,%1,%2"
[(set_attr "type" "veccmp")])
-(define_insn "altivec_vcmpbfp_p"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
- (match_operand:V4SF 2 "register_operand" "v")] 183))]
- "TARGET_ALTIVEC"
- "vcmpbfp. %0,%1,%2"
-[(set_attr "type" "veccmp")])
-
-(define_insn "altivec_vcmpgtuh_p"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
- (match_operand:V8HI 2 "register_operand" "v")] 184))]
- "TARGET_ALTIVEC"
- "vcmpgtuh. %0,%1,%2"
-[(set_attr "type" "veccmp")])
-
-(define_insn "altivec_vcmpgtsh_p"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
- (match_operand:V8HI 2 "register_operand" "v")] 185))]
- "TARGET_ALTIVEC"
- "vcmpgtsh. %0,%1,%2"
- [(set_attr "type" "veccmp")])
-
(define_insn "altivec_mtvscr"
[(unspec [(match_operand:V4SI 0 "register_operand" "v")] 186)]
"TARGET_ALTIVEC"
@@ -15495,49 +15568,61 @@
"lvsr %0,%1,%2"
[(set_attr "type" "vecload")])
+;; Parallel some of the LVE* and STV*'s with unspecs because some have
+;; identical rtl but different instructions-- and gcc gets confused.
+
(define_insn "altivec_lvebx"
- [(set (match_operand:V16QI 0 "register_operand" "=v")
- (unspec:V16QI [(match_operand:SI 1 "register_operand" "b")
- (match_operand:SI 2 "register_operand" "r")] 196))]
+ [(parallel
+ [(set (match_operand:V16QI 0 "register_operand" "=v")
+ (mem:V16QI (plus:SI (match_operand:SI 1 "register_operand" "b")
+ (match_operand:SI 2 "register_operand" "r"))))
+ (unspec [(const_int 0)] 196)])]
"TARGET_ALTIVEC"
"lvebx %0,%1,%2"
[(set_attr "type" "vecload")])
(define_insn "altivec_lvehx"
- [(set (match_operand:V8HI 0 "register_operand" "=v")
- (unspec:V8HI [(match_operand:SI 1 "register_operand" "b")
- (match_operand:SI 2 "register_operand" "r")] 197))]
+ [(parallel
+ [(set (match_operand:V8HI 0 "register_operand" "=v")
+ (mem:V8HI
+ (and:SI (plus:SI (match_operand:SI 1 "register_operand" "b")
+ (match_operand:SI 2 "register_operand" "r"))
+ (const_int -2))))
+ (unspec [(const_int 0)] 197)])]
"TARGET_ALTIVEC"
"lvehx %0,%1,%2"
[(set_attr "type" "vecload")])
(define_insn "altivec_lvewx"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:SI 1 "register_operand" "b")
- (match_operand:SI 2 "register_operand" "r")] 198))]
+ [(parallel
+ [(set (match_operand:V4SI 0 "register_operand" "=v")
+ (mem:V4SI
+ (and:SI (plus:SI (match_operand:SI 1 "register_operand" "b")
+ (match_operand:SI 2 "register_operand" "r"))
+ (const_int -4))))
+ (unspec [(const_int 0)] 198)])]
"TARGET_ALTIVEC"
"lvewx %0,%1,%2"
[(set_attr "type" "vecload")])
(define_insn "altivec_lvxl"
- [(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:SI 1 "register_operand" "b")
- (match_operand:SI 2 "register_operand" "r")] 199))]
+ [(parallel
+ [(set (match_operand:V4SI 0 "register_operand" "=v")
+ (mem:V4SI (plus:SI (match_operand:SI 1 "register_operand" "b")
+ (match_operand:SI 2 "register_operand" "r"))))
+ (unspec [(const_int 0)] 213)])]
"TARGET_ALTIVEC"
"lvxl %0,%1,%2"
[(set_attr "type" "vecload")])
(define_insn "altivec_lvx"
[(set (match_operand:V4SI 0 "register_operand" "=v")
- (unspec:V4SI [(match_operand:SI 1 "register_operand" "b")
- (match_operand:SI 2 "register_operand" "r")] 200))]
+ (mem:V4SI (plus:SI (match_operand:SI 1 "register_operand" "b")
+ (match_operand:SI 2 "register_operand" "r"))))]
"TARGET_ALTIVEC"
"lvx %0,%1,%2"
[(set_attr "type" "vecload")])
-;; Parallel the STV*'s with unspecs because some of them have
-;; identical rtl but are different instructions-- and gcc gets confused.
-
(define_insn "altivec_stvx"
[(parallel
[(set (mem:V4SI
@@ -15596,3 +15681,73 @@
"TARGET_ALTIVEC"
"stvewx %2,%0,%1"
[(set_attr "type" "vecstore")])
+
+(define_insn "absv16qi2"
+ [(set (match_operand:V16QI 0 "register_operand" "=v")
+ (abs:V16QI (match_operand:V16QI 1 "register_operand" "v")))
+ (clobber (match_scratch:V16QI 2 "=v"))
+ (clobber (match_scratch:V16QI 3 "=v"))]
+ "TARGET_ALTIVEC"
+ "vspltisb %2,0\;vsububm %3,%2,%1\;vmaxsb %0,%1,%3"
+ [(set_attr "type" "altivec")
+ (set_attr "length" "12")])
+
+(define_insn "absv8hi2"
+ [(set (match_operand:V8HI 0 "register_operand" "=v")
+ (abs:V8HI (match_operand:V8HI 1 "register_operand" "v")))
+ (clobber (match_scratch:V8HI 2 "=v"))
+ (clobber (match_scratch:V8HI 3 "=v"))]
+ "TARGET_ALTIVEC"
+ "vspltisb %2,0\;vsubuhm %3,%2,%1\;vmaxsh %0,%1,%3"
+ [(set_attr "type" "altivec")
+ (set_attr "length" "12")])
+
+(define_insn "absv4si2"
+ [(set (match_operand:V4SI 0 "register_operand" "=v")
+ (abs:V4SI (match_operand:V4SI 1 "register_operand" "v")))
+ (clobber (match_scratch:V4SI 2 "=v"))
+ (clobber (match_scratch:V4SI 3 "=v"))]
+ "TARGET_ALTIVEC"
+ "vspltisb %2,0\;vsubuwm %3,%2,%1\;vmaxsw %0,%1,%3"
+ [(set_attr "type" "altivec")
+ (set_attr "length" "12")])
+
+(define_insn "absv4sf2"
+ [(set (match_operand:V4SF 0 "register_operand" "=v")
+ (abs:V4SF (match_operand:V4SF 1 "register_operand" "v")))
+ (clobber (match_scratch:V4SF 2 "=v"))
+ (clobber (match_scratch:V4SF 3 "=v"))]
+ "TARGET_ALTIVEC"
+ "vspltisw %2, -1\;vslw %3,%2,%2\;vandc %0,%1,%3"
+ [(set_attr "type" "altivec")
+ (set_attr "length" "12")])
+
+(define_insn "altivec_abss_v16qi"
+ [(set (match_operand:V16QI 0 "register_operand" "=v")
+ (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")] 210))
+ (clobber (match_scratch:V16QI 2 "=v"))
+ (clobber (match_scratch:V16QI 3 "=v"))]
+ "TARGET_ALTIVEC"
+ "vspltisb %2,0\;vsubsbs %3,%2,%1\;vmaxsb %0,%1,%3"
+ [(set_attr "type" "altivec")
+ (set_attr "length" "12")])
+
+(define_insn "altivec_abss_v8hi"
+ [(set (match_operand:V8HI 0 "register_operand" "=v")
+ (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")] 211))
+ (clobber (match_scratch:V8HI 2 "=v"))
+ (clobber (match_scratch:V8HI 3 "=v"))]
+ "TARGET_ALTIVEC"
+ "vspltisb %2,0\;vsubshs %3,%2,%1\;vmaxsh %0,%1,%3"
+ [(set_attr "type" "altivec")
+ (set_attr "length" "12")])
+
+(define_insn "altivec_abss_v4si"
+ [(set (match_operand:V4SI 0 "register_operand" "=v")
+ (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")] 212))
+ (clobber (match_scratch:V4SI 2 "=v"))
+ (clobber (match_scratch:V4SI 3 "=v"))]
+ "TARGET_ALTIVEC"
+ "vspltisb %2,0\;vsubsws %3,%2,%1\;vmaxsw %0,%1,%3"
+ [(set_attr "type" "altivec")
+ (set_attr "length" "12")])
diff --git a/contrib/gcc/config/rs6000/rtems.h b/contrib/gcc/config/rs6000/rtems.h
index 6810d38..aa68130 100644
--- a/contrib/gcc/config/rs6000/rtems.h
+++ b/contrib/gcc/config/rs6000/rtems.h
@@ -1,5 +1,5 @@
/* Definitions for rtems targeting a PowerPC using elf.
- Copyright (C) 1996, 1997, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 2000, 2001, 2002 Free Software Foundation, Inc.
Contributed by Joel Sherrill (joel@OARcorp.com).
This file is part of GNU CC.
@@ -22,13 +22,5 @@ Boston, MA 02111-1307, USA. */
/* Specify predefined symbols in preprocessor. */
#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-DPPC -Drtems -D__rtems__ \
+#define CPP_PREDEFINES "-DPPC -D__rtems__ \
-Asystem=rtems -Acpu=powerpc -Amachine=powerpc"
-
-/* Generate calls to memcpy, memcmp and memset. */
-#ifndef TARGET_MEM_FUNCTIONS
-#define TARGET_MEM_FUNCTIONS
-#endif
-
-#undef STARTFILE_DEFAULT_SPEC
-#define STARTFILE_DEFAULT_SPEC "crt0.o%s"
diff --git a/contrib/gcc/config/rs6000/sysv4.h b/contrib/gcc/config/rs6000/sysv4.h
index c20eaa0..b807bb7 100644
--- a/contrib/gcc/config/rs6000/sysv4.h
+++ b/contrib/gcc/config/rs6000/sysv4.h
@@ -197,6 +197,8 @@ do { \
rs6000_current_abi = ABI_V4; \
else if (!strcmp (rs6000_abi_name, "linux")) \
rs6000_current_abi = ABI_V4; \
+ else if (!strcmp (rs6000_abi_name, "gnu")) \
+ rs6000_current_abi = ABI_V4; \
else if (!strcmp (rs6000_abi_name, "netbsd")) \
rs6000_current_abi = ABI_V4; \
else if (!strcmp (rs6000_abi_name, "i960-old")) \
@@ -383,7 +385,7 @@ do { \
/* No data type wants to be aligned rounder than this. */
#undef BIGGEST_ALIGNMENT
-#define BIGGEST_ALIGNMENT (TARGET_EABI ? 64 : 128)
+#define BIGGEST_ALIGNMENT ((TARGET_EABI && !TARGET_ALTIVEC) ? 64 : 128)
/* An expression for the alignment of a structure field FIELD if the
alignment computed in the usual way is COMPUTED. */
@@ -397,7 +399,8 @@ do { \
SPECIFIED. */
#define ROUND_TYPE_ALIGN(TYPE, COMPUTED, SPECIFIED) \
((TARGET_ALTIVEC && TREE_CODE (TYPE) == VECTOR_TYPE) \
- ? 128 : MAX (COMPUTED, SPECIFIED))
+ ? MAX (MAX ((COMPUTED), (SPECIFIED)), 128) \
+ : MAX (COMPUTED, SPECIFIED))
#undef BIGGEST_FIELD_ALIGNMENT
#undef ADJUST_FIELD_ALIGN
@@ -877,6 +880,7 @@ do { \
%{mcall-freebsd: -mbig} \
%{mcall-i960-old: -mlittle} \
%{mcall-linux: -mbig} \
+ %{mcall-gnu: -mbig} \
%{mcall-netbsd: -mbig} \
}}}}"
@@ -889,7 +893,7 @@ do { \
} \
}}"
-#define CC1_ENDIAN_DEFAULT_SPEC "%(cc1_endian_big_spec)"
+#define CC1_ENDIAN_DEFAULT_SPEC "%(cc1_endian_big)"
/* Pass -G xxx to the compiler and set correct endian mode. */
#define CC1_SPEC "%{G*} \
@@ -900,10 +904,11 @@ do { \
%{mcall-freebsd: -mbig %(cc1_endian_big) } \
%{mcall-i960-old: -mlittle %(cc1_endian_little) } \
%{mcall-linux: -mbig %(cc1_endian_big) } \
+ %{mcall-gnu: -mbig %(cc1_endian_big) } \
%{mcall-netbsd: -mbig %(cc1_endian_big) } \
- %{!mcall-aixdesc: %{!mcall-freebsd: %{!mcall-i960-old: %{!mcall-linux: %{!mcall-netbsd: \
+ %{!mcall-aixdesc: %{!mcall-freebsd: %{!mcall-i960-old: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: \
%(cc1_endian_default) \
- }}}}} \
+ }}}}}} \
}}}} \
%{mno-sdata: -msdata=none } \
%{meabi: %{!mcall-*: -mcall-sysv }} \
@@ -912,6 +917,7 @@ do { \
%{mcall-freebsd: -mno-eabi } \
%{mcall-i960-old: -meabi } \
%{mcall-linux: -mno-eabi } \
+ %{mcall-gnu: -mno-eabi } \
%{mcall-netbsd: -mno-eabi }}} \
%{msdata: -msdata=default} \
%{mno-sdata: -msdata=none} \
@@ -942,9 +948,10 @@ do { \
%{msim: %(link_start_sim) } \
%{mcall-freebsd: %(link_start_freebsd) } \
%{mcall-linux: %(link_start_linux) } \
+%{mcall-gnu: %(link_start_gnu) } \
%{mcall-netbsd: %(link_start_netbsd) } \
-%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-linux: \
- %{!mcall-netbsd: %{!mcall-freebsd: %(link_start_default) }}}}}}}"
+%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-linux: %{!mcall-gnu: \
+ %{!mcall-netbsd: %{!mcall-freebsd: %(link_start_default) }}}}}}}}"
#define LINK_START_DEFAULT_SPEC ""
@@ -998,8 +1005,9 @@ do { \
%{msim: %(link_os_sim) } \
%{mcall-freebsd: %(link_os_freebsd) } \
%{mcall-linux: %(link_os_linux) } \
+%{mcall-gnu: %(link_os_gnu) } \
%{mcall-netbsd: %(link_os_netbsd) } \
-%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-netbsd: %(link_os_default) }}}}}}}"
+%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(link_os_default) }}}}}}}}"
#define LINK_OS_DEFAULT_SPEC ""
@@ -1044,10 +1052,11 @@ do { \
%{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
%{mcall-freebsd: %(cpp_endian_big) } \
%{mcall-linux: %(cpp_endian_big) } \
+ %{mcall-gnu: %(cpp_endian_big) } \
%{mcall-netbsd: %(cpp_endian_big) } \
%{mcall-i960-old: %(cpp_endian_little) } \
%{mcall-aixdesc: %(cpp_endian_big) } \
- %{!mcall-linux: %{!mcall-freebsd: %{!mcall-netbsd: %{!mcall-aixdesc: %(cpp_endian_default) }}}}}}}}"
+ %{!mcall-linux: %{!mcall-gnu: %{!mcall-freebsd: %{!mcall-netbsd: %{!mcall-aixdesc: %(cpp_endian_default) }}}}}}}}}"
#define CPP_ENDIAN_DEFAULT_SPEC "%(cpp_endian_big)"
@@ -1060,8 +1069,9 @@ do { \
%{msim: %(cpp_os_sim) } \
%{mcall-freebsd: %(cpp_os_freebsd) } \
%{mcall-linux: %(cpp_os_linux) } \
+%{mcall-gnu: %(cpp_os_gnu) } \
%{mcall-netbsd: %(cpp_os_netbsd) } \
-%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-netbsd: %(cpp_os_default) }}}}}}}"
+%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(cpp_os_default) }}}}}}}}"
#define CPP_OS_DEFAULT_SPEC ""
@@ -1074,8 +1084,9 @@ do { \
%{msim: %(startfile_sim) } \
%{mcall-freebsd: %(startfile_freebsd) } \
%{mcall-linux: %(startfile_linux) } \
+%{mcall-gnu: %(startfile_gnu) } \
%{mcall-netbsd: %(startfile_netbsd) } \
-%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-netbsd: %(startfile_default) }}}}}}}"
+%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(startfile_default) }}}}}}}}"
#define STARTFILE_DEFAULT_SPEC ""
@@ -1088,23 +1099,25 @@ do { \
%{msim: %(lib_sim) } \
%{mcall-freebsd: %(lib_freebsd) } \
%{mcall-linux: %(lib_linux) } \
+%{mcall-gnu: %(lib_gnu) } \
%{mcall-netbsd: %(lib_netbsd) } \
-%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-netbsd: %(lib_default) }}}}}}}"
+%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(lib_default) }}}}}}}}"
#define LIB_DEFAULT_SPEC ""
/* Override svr4.h definition. */
#undef ENDFILE_SPEC
-#define ENDFILE_SPEC "\
+#define ENDFILE_SPEC "crtsavres.o%s \
%{mads: %(endfile_ads)} \
%{myellowknife: %(endfile_yellowknife)} \
%{mmvme: %(endfile_mvme)} \
%{msim: %(endfile_sim)} \
%{mcall-freebsd: %(endfile_freebsd) } \
%{mcall-linux: %(endfile_linux) } \
+%{mcall-gnu: %(endfile_gnu) } \
%{mcall-netbsd: %(endfile_netbsd) } \
%{mvxworks: %(endfile_vxworks) } \
-%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-netbsd: %{!mvxworks: %(endfile_default) }}}}}}}}"
+%{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mvxworks: %(endfile_default) }}}}}}}}}"
#define ENDFILE_DEFAULT_SPEC ""
@@ -1184,10 +1197,18 @@ do { \
%{profile:-lc_p} %{!profile:-lc}}}"
#endif
+#ifdef USE_GNULIBC_1
#define STARTFILE_LINUX_SPEC "\
%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \
%{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} \
%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
+#else
+#define STARTFILE_LINUX_SPEC "\
+%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \
+%{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} \
+%{static:crtbeginT.o%s} \
+%{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
+#endif
#define ENDFILE_LINUX_SPEC "%{!shared:crtend.o%s} %{shared:crtendS.o%s} \
%{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s}"
@@ -1198,22 +1219,51 @@ do { \
%{rdynamic:-export-dynamic} \
%{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
+#if !defined(USE_GNULIBC_1) && defined(HAVE_LD_EH_FRAME_HDR)
+# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
+#endif
+
#ifdef USE_GNULIBC_1
-#define CPP_OS_LINUX_SPEC "-D__unix__ -D__linux__ \
-%{!undef: \
- %{!ansi: \
- %{!std=*:-Dunix -D__unix -Dlinux -D__linux} \
- %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}} \
+#define CPP_OS_LINUX_SPEC "-D__unix__ -D__gnu_linux__ -D__linux__ \
+%{!undef: \
+ %{!ansi: \
+ %{!std=*:-Dunix -D__unix -Dlinux -D__linux} \
+ %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}} \
-Asystem=unix -Asystem=posix"
#else
-#define CPP_OS_LINUX_SPEC "-D__unix__ -D__linux__ \
-%{!undef: \
- %{!ansi: \
- %{!std=*:-Dunix -D__unix -Dlinux -D__linux} \
- %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}} \
+#define CPP_OS_LINUX_SPEC "-D__unix__ -D__gnu_linux__ -D__linux__ \
+%{!undef: \
+ %{!ansi: \
+ %{!std=*:-Dunix -D__unix -Dlinux -D__linux} \
+ %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}} \
-Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT}"
#endif
+/* GNU/Hurd support. */
+#define LIB_GNU_SPEC "%{mnewlib: --start-group -lgnu -lc --end-group } \
+%{!mnewlib: %{shared:-lc} %{!shared: %{pthread:-lpthread } \
+%{profile:-lc_p} %{!profile:-lc}}}"
+
+#define STARTFILE_GNU_SPEC "\
+%{!shared: %{!static: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}} \
+%{static: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} \
+%{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} \
+%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
+
+#define ENDFILE_GNU_SPEC "%{!shared:crtend.o%s} %{shared:crtendS.o%s} \
+%{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s}"
+
+#define LINK_START_GNU_SPEC ""
+
+#define LINK_OS_GNU_SPEC "-m elf32ppclinux %{!shared: %{!static: \
+ %{rdynamic:-export-dynamic} \
+ %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
+
+#define CPP_OS_GNU_SPEC "-D__unix__ -D__gnu_hurd__ -D__GNU__ \
+%{!undef: \
+ %{!ansi: -Dunix -D__unix}} \
+-Asystem=gnu -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT}"
+
/* NetBSD support. */
#define LIB_NETBSD_SPEC "\
%{profile:-lgmon -lc_p} %{!profile:-lc}"
@@ -1292,6 +1342,7 @@ ncrtn.o%s"
{ "lib_mvme", LIB_MVME_SPEC }, \
{ "lib_sim", LIB_SIM_SPEC }, \
{ "lib_freebsd", LIB_FREEBSD_SPEC }, \
+ { "lib_gnu", LIB_GNU_SPEC }, \
{ "lib_linux", LIB_LINUX_SPEC }, \
{ "lib_netbsd", LIB_NETBSD_SPEC }, \
{ "lib_vxworks", LIB_VXWORKS_SPEC }, \
@@ -1301,6 +1352,7 @@ ncrtn.o%s"
{ "startfile_mvme", STARTFILE_MVME_SPEC }, \
{ "startfile_sim", STARTFILE_SIM_SPEC }, \
{ "startfile_freebsd", STARTFILE_FREEBSD_SPEC }, \
+ { "startfile_gnu", STARTFILE_GNU_SPEC }, \
{ "startfile_linux", STARTFILE_LINUX_SPEC }, \
{ "startfile_netbsd", STARTFILE_NETBSD_SPEC }, \
{ "startfile_vxworks", STARTFILE_VXWORKS_SPEC }, \
@@ -1310,6 +1362,7 @@ ncrtn.o%s"
{ "endfile_mvme", ENDFILE_MVME_SPEC }, \
{ "endfile_sim", ENDFILE_SIM_SPEC }, \
{ "endfile_freebsd", ENDFILE_FREEBSD_SPEC }, \
+ { "endfile_gnu", ENDFILE_GNU_SPEC }, \
{ "endfile_linux", ENDFILE_LINUX_SPEC }, \
{ "endfile_netbsd", ENDFILE_NETBSD_SPEC }, \
{ "endfile_vxworks", ENDFILE_VXWORKS_SPEC }, \
@@ -1323,6 +1376,7 @@ ncrtn.o%s"
{ "link_start_mvme", LINK_START_MVME_SPEC }, \
{ "link_start_sim", LINK_START_SIM_SPEC }, \
{ "link_start_freebsd", LINK_START_FREEBSD_SPEC }, \
+ { "link_start_gnu", LINK_START_GNU_SPEC }, \
{ "link_start_linux", LINK_START_LINUX_SPEC }, \
{ "link_start_netbsd", LINK_START_NETBSD_SPEC }, \
{ "link_start_vxworks", LINK_START_VXWORKS_SPEC }, \
@@ -1334,6 +1388,7 @@ ncrtn.o%s"
{ "link_os_sim", LINK_OS_SIM_SPEC }, \
{ "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \
{ "link_os_linux", LINK_OS_LINUX_SPEC }, \
+ { "link_os_gnu", LINK_OS_GNU_SPEC }, \
{ "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \
{ "link_os_vxworks", LINK_OS_VXWORKS_SPEC }, \
{ "link_os_default", LINK_OS_DEFAULT_SPEC }, \
@@ -1349,6 +1404,7 @@ ncrtn.o%s"
{ "cpp_os_mvme", CPP_OS_MVME_SPEC }, \
{ "cpp_os_sim", CPP_OS_SIM_SPEC }, \
{ "cpp_os_freebsd", CPP_OS_FREEBSD_SPEC }, \
+ { "cpp_os_gnu", CPP_OS_GNU_SPEC }, \
{ "cpp_os_linux", CPP_OS_LINUX_SPEC }, \
{ "cpp_os_netbsd", CPP_OS_NETBSD_SPEC }, \
{ "cpp_os_vxworks", CPP_OS_VXWORKS_SPEC }, \
diff --git a/contrib/gcc/config/rs6000/t-aix43 b/contrib/gcc/config/rs6000/t-aix43
index 209a763..7be8ebc 100644
--- a/contrib/gcc/config/rs6000/t-aix43
+++ b/contrib/gcc/config/rs6000/t-aix43
@@ -62,7 +62,7 @@ SHLIB_INSTALL = $(INSTALL_DATA) @shlib_base_name@.a $$(slibdir)/
SHLIB_LIBS = -lc `case @shlib_base_name@ in *pthread*) echo -lpthread ;; esac`
SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
-SHLIB_NM_FLAGS = -Bpg
+SHLIB_NM_FLAGS = -Bpg -X32_64
# Either 32-bit and 64-bit objects in archives.
AR_FLAGS_FOR_TARGET = -X32_64
diff --git a/contrib/gcc/config/rs6000/t-linux64 b/contrib/gcc/config/rs6000/t-linux64
new file mode 100644
index 0000000..48b6150
--- /dev/null
+++ b/contrib/gcc/config/rs6000/t-linux64
@@ -0,0 +1,16 @@
+# Override t-linux. We don't want -fPIC.
+CRTSTUFF_T_CFLAGS_S =
+TARGET_LIBGCC2_CFLAGS =
+
+EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o \
+ crtsavres.o
+
+# ld provides these functions as needed.
+crtsavres.S:
+ echo >crtsavres.S
+
+$(T)crtsavres.o: crtsavres.S
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c crtsavres.S -o $(T)crtsavres.o
+
+# Modify the shared lib version file
+SHLIB_MKMAP_OPTS = -v dotsyms=1
diff --git a/contrib/gcc/config/rs6000/t-ppccomm b/contrib/gcc/config/rs6000/t-ppccomm
index e264586..7570af4 100644
--- a/contrib/gcc/config/rs6000/t-ppccomm
+++ b/contrib/gcc/config/rs6000/t-ppccomm
@@ -38,9 +38,10 @@ MULTILIB_MATCHES_SYSV = mcall-sysv=mcall-sysv-eabi mcall-sysv=mcall-sysv-noeabi
LIBGCC = stmp-multilib
INSTALL_LIBGCC = install-multilib
EXTRA_MULTILIB_PARTS = crtbegin$(objext) crtend$(objext) \
- crtbeginS$(objext) crtendS$(objext) \
+ crtbeginS$(objext) crtendS$(objext) crtbeginT$(objext) \
ecrti$(objext) ecrtn$(objext) \
- ncrti$(objext) ncrtn$(objext)
+ ncrti$(objext) ncrtn$(objext) \
+ crtsavres$(objext)
# We build {e,n}crti.o and {e,n}crtn.o, which serve to add begin and
# end labels to all of the special sections used when we link using gcc.
@@ -58,6 +59,9 @@ ncrti.S: $(srcdir)/config/rs6000/sol-ci.asm
ncrtn.S: $(srcdir)/config/rs6000/sol-cn.asm
cat $(srcdir)/config/rs6000/sol-cn.asm >ncrtn.S
+crtsavres.S: $(srcdir)/config/rs6000/crtsavres.asm
+ cat $(srcdir)/config/rs6000/crtsavres.asm >crtsavres.S
+
# Build multiple copies of ?crt{i,n}.o, one for each target switch.
$(T)ecrti$(objext): ecrti.S
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrti.S -o $(T)ecrti$(objext)
@@ -71,6 +75,9 @@ $(T)ncrti$(objext): ncrti.S
$(T)ncrtn$(objext): ncrtn.S
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ncrtn.S -o $(T)ncrtn$(objext)
+$(T)crtsavres$(objext): crtsavres.S
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c crtsavres.S -o $(T)crtsavres$(objext)
+
# It is important that crtbegin.o, etc., aren't surprised by stuff in .sdata.
CRTSTUFF_T_CFLAGS = -msdata=none
# Make sure crt*.o are built with -fPIC even if configured with
diff --git a/contrib/gcc/config/rs6000/xcoff.h b/contrib/gcc/config/rs6000/xcoff.h
index e60f3fe..4a51b04 100644
--- a/contrib/gcc/config/rs6000/xcoff.h
+++ b/contrib/gcc/config/rs6000/xcoff.h
@@ -1,6 +1,6 @@
/* Definitions of target machine for GNU compiler,
for some generic XCOFF file format
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -22,10 +22,6 @@ Boston, MA 02111-1307, USA. */
#define TARGET_OBJECT_FORMAT OBJECT_XCOFF
-/* The AIX linker will discard static constructors in object files before
- collect has a chance to see them, so scan the object files directly. */
-#define COLLECT_EXPORT_LIST
-
/* The RS/6000 uses the XCOFF format. */
#define XCOFF_DEBUGGING_INFO
@@ -345,13 +341,7 @@ toc_section () \
SYMBOL_REF_FLAG (sym_ref) = 1; \
if (TREE_PUBLIC (DECL)) \
{ \
- if (RS6000_WEAK && DECL_WEAK (decl)) \
- { \
- fputs ("\t.weak .", FILE); \
- RS6000_OUTPUT_BASENAME (FILE, NAME); \
- putc ('\n', FILE); \
- } \
- else \
+ if (!RS6000_WEAK || !DECL_WEAK (decl)) \
{ \
fputs ("\t.globl .", FILE); \
RS6000_OUTPUT_BASENAME (FILE, NAME); \
@@ -464,20 +454,6 @@ toc_section () \
xcoff_bss_section_name); \
} while (0)
-/* Output a weak symbol, if weak support present. */
-#ifdef HAVE_GAS_WEAK
-#define HANDLE_PRAGMA_WEAK 1
-
-#define ASM_WEAKEN_LABEL(FILE, NAME) \
- do \
- { \
- fputs ("\t.weak ", (FILE)); \
- assemble_name ((FILE), (NAME)); \
- fputc ('\n', (FILE)); \
- } \
- while (0)
-#endif /* HAVE_GAS_WEAK */
-
/* This is how we tell the assembler that two symbols have the same value. */
#define SET_ASM_OP "\t.set "
diff --git a/contrib/gcc/config/rtems.h b/contrib/gcc/config/rtems.h
index a5ac8a7..a3f9ba3 100644
--- a/contrib/gcc/config/rtems.h
+++ b/contrib/gcc/config/rtems.h
@@ -1,5 +1,5 @@
/* Configuration common to all targets running RTEMS.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -20,3 +20,18 @@ Boston, MA 02111-1307, USA. */
/* The system headers under RTEMS are C++-aware. */
#define NO_IMPLICIT_EXTERN_C
+
+/* Generate calls to memcpy, memcmp and memset. */
+#ifndef TARGET_MEM_FUNCTIONS
+#define TARGET_MEM_FUNCTIONS
+#endif
+
+/*
+ * Dummy start/end specification to let linker work as
+ * needed by autoconf scripts using this compiler.
+ */
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC "crt0.o%s"
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC ""
diff --git a/contrib/gcc/config/sparc/aout.h b/contrib/gcc/config/sparc/aout.h
index fd84d75..3a2273f 100644
--- a/contrib/gcc/config/sparc/aout.h
+++ b/contrib/gcc/config/sparc/aout.h
@@ -88,7 +88,7 @@ do { \
pointer is really %i7. */
#define DBX_REGISTER_NUMBER(REGNO) \
- (TARGET_FLAT && REGNO == FRAME_POINTER_REGNUM ? 31 : REGNO)
+ (TARGET_FLAT && (REGNO) == HARD_FRAME_POINTER_REGNUM ? 31 : REGNO)
/* This is how to output a note to DBX telling it the line number
to which the following sequence of instructions corresponds.
diff --git a/contrib/gcc/config/sparc/crtfastmath.c b/contrib/gcc/config/sparc/crtfastmath.c
new file mode 100644
index 0000000..df3f907
--- /dev/null
+++ b/contrib/gcc/config/sparc/crtfastmath.c
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ * Contributed by David S. Miller (davem@redhat.com)
+ *
+ * This file 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.
+ *
+ * In addition to the permissions in the GNU General Public License, the
+ * Free Software Foundation gives you unlimited permission to link the
+ * compiled version of this file with other programs, and to distribute
+ * those programs without any restriction coming from the use of this
+ * file. (The General Public License restrictions do apply in other
+ * respects; for example, they cover modification of the file, and
+ * distribution when not linked into another program.)
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * As a special exception, if you link this library with files
+ * compiled with GCC to produce an executable, this does not cause
+ * the resulting executable to be covered by the GNU General Public License.
+ * This exception does not however invalidate any other reasons why
+ * the executable file might be covered by the GNU General Public License.
+ */
+
+#define FPRS_NS (1 << 22) /* Non-Standard fpu results */
+
+static void __attribute__((constructor))
+set_fast_math (void)
+{
+ unsigned int fsr;
+
+ /* This works for the 64-bit case because, even if 32-bit ld/st of
+ the fsr register modified the upper 32-bit, the only thing up there
+ are the 3 other condition codes which are "do not care" at the time
+ that this runs. */
+
+ __asm__("st %%fsr, %0"
+ : "=m" (fsr));
+
+ fsr |= FPRS_NS;
+
+ __asm__("ld %0, %%fsr"
+ : : "m" (fsr));
+}
diff --git a/contrib/gcc/config/sparc/elf.h b/contrib/gcc/config/sparc/elf.h
index 20bea82..d2d3a0b 100644
--- a/contrib/gcc/config/sparc/elf.h
+++ b/contrib/gcc/config/sparc/elf.h
@@ -26,7 +26,9 @@ Boston, MA 02111-1307, USA. */
#define STARTFILE_SPEC "crt0.o%s crti.o%s crtbegin.o%s"
#undef ENDFILE_SPEC
-#define ENDFILE_SPEC "crtend.o%s crtn.o%s"
+#define ENDFILE_SPEC \
+ "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
+ crtend.o%s crtn.o%s"
/* Use the default. */
#undef LINK_SPEC
diff --git a/contrib/gcc/config/sparc/freebsd.h b/contrib/gcc/config/sparc/freebsd.h
index 314b07b..54b5f0a 100644
--- a/contrib/gcc/config/sparc/freebsd.h
+++ b/contrib/gcc/config/sparc/freebsd.h
@@ -1,5 +1,5 @@
/* Definitions for Sun Sparc64 running FreeBSD using the ELF format
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002 Free Software Foundation, Inc.
Contributed by David E. O'Brien <obrien@FreeBSD.org> and BSDi.
This file is part of GNU CC.
@@ -26,8 +26,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#undef CPP_PREDEFINES
#define CPP_PREDEFINES FBSD_CPP_PREDEFINES
-#define LINK_SPEC "-m elf64_sparc %(link_arch) \
- %{!mno-relax:%{!r:-relax} \
+#define LINK_SPEC "%(link_arch) \
+ %{!mno-relax:%{!r:-relax}} \
%{p:%e`-p' not supported; use `-pg' and gprof(1)} \
%{Wl,*:%*} \
%{assert*} %{R*} %{rpath*} %{defsym*} \
@@ -91,22 +91,19 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#undef TARGET_DEFAULT
#define TARGET_DEFAULT \
- (MASK_V9 + MASK_64BIT + MASK_PTR64 + MASK_VIS + MASK_FASTER_STRUCTS \
- + MASK_STACK_BIAS + MASK_APP_REGS /* + MASK_EPILOGUE */ + MASK_FPU \
+ (MASK_V9 + MASK_64BIT + MASK_PTR64 /* + MASK_FASTER_STRUCTS */ \
+ + MASK_STACK_BIAS + MASK_APP_REGS + MASK_FPU \
+ MASK_LONG_DOUBLE_128 /* + MASK_HARD_QUAD */)
/* The default code model. */
#undef SPARC_DEFAULT_CMODEL
-#define SPARC_DEFAULT_CMODEL CM_MEDMID
+#define SPARC_DEFAULT_CMODEL CM_MEDLOW
/************************[ Assembler stuff ]********************************/
-/* XXX */
-#if 0
-#undef ASM_CPU_DEFAULT_SPEC
-#define ASM_CPU_DEFAULT_SPEC "-Av9a"
-#endif
+#undef LOCAL_LABEL_PREFIX
+#define LOCAL_LABEL_PREFIX "."
/* XXX2 */
/* This is how to output a definition of an internal numbered label where
@@ -151,3 +148,12 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
RELATIVE relocations. */
/* #define DWARF_OFFSET_SIZE PTR_SIZE */
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC \
+ "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s}" \
+ FBSD_ENDFILE_SPEC
+
+/* We use GNU ld so undefine this so that attribute((init_priority)) works. */
+#undef CTORS_SECTION_ASM_OP
+#undef DTORS_SECTION_ASM_OP
diff --git a/contrib/gcc/config/sparc/gmon-sol2.c b/contrib/gcc/config/sparc/gmon-sol2.c
index 6d66966..bcb0c06 100644
--- a/contrib/gcc/config/sparc/gmon-sol2.c
+++ b/contrib/gcc/config/sparc/gmon-sol2.c
@@ -291,8 +291,10 @@ static void internal_mcount(selfpc, frompcindex)
if(!already_setup) {
extern char etext[];
+ extern char _start[];
+ extern char _init[];
already_setup = 1;
- monstartup(0, (char *)etext);
+ monstartup(_start < _init ? _start : _init, etext);
#ifdef USE_ONEXIT
on_exit(_mcleanup, 0);
#else
diff --git a/contrib/gcc/config/sparc/libgcc-sparc-glibc.ver b/contrib/gcc/config/sparc/libgcc-sparc-glibc.ver
new file mode 100644
index 0000000..e3ba0bb
--- /dev/null
+++ b/contrib/gcc/config/sparc/libgcc-sparc-glibc.ver
@@ -0,0 +1,28 @@
+# In order to work around the very problems that force us to now generally
+# create a libgcc.so, glibc reexported a number of routines from libgcc.a.
+# By now choosing the same version tags for these specific routines, we
+# maintain enough binary compatibility to allow future versions of glibc
+# to defer implementation of these routines to libgcc.so via DT_AUXILIARY.
+
+%ifdef __arch64__
+%define GLIBC_VER GLIBC_2.2
+%else
+%define GLIBC_VER GLIBC_2.0
+%endif
+%inherit GCC_3.0 GLIBC_VER
+GLIBC_VER {
+ # Sampling of DImode arithmetic used by (at least) i386 and m68k.
+ __divdi3
+ __moddi3
+ __udivdi3
+ __umoddi3
+
+ # Exception handling support functions used by most everyone.
+ __register_frame
+ __register_frame_table
+ __deregister_frame
+ __register_frame_info
+ __deregister_frame_info
+ __frame_state_for
+ __register_frame_info_table
+}
diff --git a/contrib/gcc/config/sparc/linux-aout.h b/contrib/gcc/config/sparc/linux-aout.h
index 55c833f..41d3877 100644
--- a/contrib/gcc/config/sparc/linux-aout.h
+++ b/contrib/gcc/config/sparc/linux-aout.h
@@ -1,5 +1,5 @@
/* Definitions for SPARC running Linux-based GNU systems with a.out.
- Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1999, 2002 Free Software Foundation, Inc.
Contributed by Eddie C. Dost (ecd@skynet.be)
This file is part of GNU CC.
@@ -59,10 +59,8 @@ Boston, MA 02111-1307, USA. */
#undef WCHAR_TYPE_SIZE
#define WCHAR_TYPE_SIZE 32
-#undef MAX_WCHAR_TYPE_SIZE
-
#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dunix -Dsparc -Dlinux -Asystem=unix -Asystem=posix"
+#define CPP_PREDEFINES "-Dunix -Dsparc -D__gnu_linux__ -Dlinux -Asystem=unix -Asystem=posix"
#undef CPP_SUBTARGET_SPEC
#define CPP_SUBTARGET_SPEC \
diff --git a/contrib/gcc/config/sparc/linux.h b/contrib/gcc/config/sparc/linux.h
index d464133..b93b46c 100644
--- a/contrib/gcc/config/sparc/linux.h
+++ b/contrib/gcc/config/sparc/linux.h
@@ -1,5 +1,5 @@
/* Definitions for SPARC running Linux-based GNU systems with ELF.
- Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
Contributed by Eddie C. Dost (ecd@skynet.be)
This file is part of GNU CC.
@@ -62,7 +62,8 @@ Boston, MA 02111-1307, USA. */
#undef ENDFILE_SPEC
#define ENDFILE_SPEC \
- "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
+ "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
+ %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
/* This is for -profile to use -lc_p instead of -lc. */
#undef CC1_SPEC
@@ -97,10 +98,8 @@ Boston, MA 02111-1307, USA. */
#undef WCHAR_TYPE_SIZE
#define WCHAR_TYPE_SIZE 32
-#undef MAX_WCHAR_TYPE_SIZE
-
#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-D__ELF__ -Dunix -D__sparc__ -Dlinux -Asystem=unix -Asystem=posix"
+#define CPP_PREDEFINES "-D__ELF__ -Dunix -D__sparc__ -D__gnu_linux__ -Dlinux -Asystem=unix -Asystem=posix"
#undef CPP_SUBTARGET_SPEC
#ifdef USE_GNULIBC_1
@@ -186,7 +185,7 @@ Boston, MA 02111-1307, USA. */
#undef ASM_SPEC
#define ASM_SPEC \
"%{V} %{v:%{!V:-V}} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Wa,*:%*} -s %{fpic:-K PIC} \
- %{fPIC:-K PIC} %(asm_relax)"
+ %{fPIC:-K PIC} %(asm_cpu) %(asm_relax)"
/* Same as sparc.h */
#undef DBX_REGISTER_NUMBER
@@ -204,6 +203,9 @@ do { \
#undef COMMON_ASM_OP
#define COMMON_ASM_OP "\t.common\t"
+#undef LOCAL_LABEL_PREFIX
+#define LOCAL_LABEL_PREFIX "."
+
/* This is how to output a definition of an internal numbered label where
PREFIX is the class of label and NUM is the number within the class. */
@@ -247,3 +249,73 @@ do { \
#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
#endif
+/* Don't be different from other Linux platforms in this regard. */
+#define HANDLE_PRAGMA_PACK_PUSH_POP
+
+/* We use GNU ld so undefine this so that attribute((init_priority)) works. */
+#undef CTORS_SECTION_ASM_OP
+#undef DTORS_SECTION_ASM_OP
+
+/* Do code reading to identify a signal frame, and set the frame
+ state data appropriately. See unwind-dw2.c for the structs. */
+
+#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \
+ do { \
+ unsigned int *pc_ = (CONTEXT)->ra; \
+ int new_cfa_, i_, oldstyle_; \
+ int regs_off_, fpu_save_off_; \
+ int fpu_save_, this_cfa_; \
+ \
+ if (pc_[1] != 0x91d02010) /* ta 0x10 */ \
+ break; \
+ if (pc_[0] == 0x821020d8) /* mov NR_sigreturn, %g1 */ \
+ oldstyle_ = 1; \
+ else if (pc_[0] == 0x82102065) /* mov NR_rt_sigreturn, %g1 */ \
+ oldstyle_ = 0; \
+ else \
+ break; \
+ if (oldstyle_) \
+ { \
+ regs_off_ = 96; \
+ fpu_save_off_ = regs_off_ + (4 * 4) + (16 * 4); \
+ } \
+ else \
+ { \
+ regs_off_ = 96 + 128; \
+ fpu_save_off_ = regs_off_ + (4 * 4) + (16 * 4) + (2 * 4); \
+ } \
+ this_cfa_ = (int) (CONTEXT)->cfa; \
+ new_cfa_ = *(int *)(((CONTEXT)->cfa) + (regs_off_+(4*4)+(14 * 4))); \
+ fpu_save_ = *(int *)((this_cfa_) + (fpu_save_off_)); \
+ (FS)->cfa_how = CFA_REG_OFFSET; \
+ (FS)->cfa_reg = 14; \
+ (FS)->cfa_offset = new_cfa_ - (int) (CONTEXT)->cfa; \
+ for (i_ = 1; i_ < 16; ++i_) \
+ { \
+ if (i_ == 14) \
+ continue; \
+ (FS)->regs.reg[i_].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[i_].loc.offset = \
+ this_cfa_ + (regs_off_+(4 * 4)+(i_ * 4)) - new_cfa_; \
+ } \
+ for (i_ = 0; i_ < 16; ++i_) \
+ { \
+ (FS)->regs.reg[i_ + 16].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[i_ + 16].loc.offset = \
+ this_cfa_ + (i_ * 4) - new_cfa_; \
+ } \
+ if (fpu_save_) \
+ { \
+ for (i_ = 0; i_ < 32; ++i_) \
+ { \
+ (FS)->regs.reg[i_ + 32].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[i_ + 32].loc.offset = \
+ (fpu_save_ + (i_ * 4)) - new_cfa_; \
+ } \
+ } \
+ /* Stick return address into %g0, same trick Alpha uses. */ \
+ (FS)->regs.reg[0].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[0].loc.offset = this_cfa_+(regs_off_+4)-new_cfa_; \
+ (FS)->retaddr_column = 0; \
+ goto SUCCESS; \
+ } while (0)
diff --git a/contrib/gcc/config/sparc/linux64.h b/contrib/gcc/config/sparc/linux64.h
index 31d8204..33c3f54 100644
--- a/contrib/gcc/config/sparc/linux64.h
+++ b/contrib/gcc/config/sparc/linux64.h
@@ -34,7 +34,7 @@ Boston, MA 02111-1307, USA. */
#undef TARGET_DEFAULT
#define TARGET_DEFAULT \
(MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ \
- + MASK_STACK_BIAS + MASK_APP_REGS + MASK_EPILOGUE + MASK_FPU + MASK_LONG_DOUBLE_128)
+ + MASK_STACK_BIAS + MASK_APP_REGS + MASK_FPU + MASK_LONG_DOUBLE_128)
#endif
#undef ASM_CPU_DEFAULT_SPEC
@@ -58,8 +58,8 @@ Boston, MA 02111-1307, USA. */
#define STARTFILE_SPEC32 \
"%{!shared: \
- %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}\
- crti.o%s %{static:crtbeginT.o%s}\
+ %{pg:/usr/lib/gcrt1.o%s} %{!pg:%{/usr/lib/p:gcrt1.o%s} %{!p:/usr/lib/crt1.o%s}}}\
+ /usr/lib/crti.o%s %{static:crtbeginT.o%s}\
%{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
#define STARTFILE_SPEC64 \
@@ -97,28 +97,33 @@ Boston, MA 02111-1307, USA. */
#undef ENDFILE_SPEC
#define ENDFILE_SPEC32 \
- "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
+ "%{!shared:crtend.o%s} %{shared:crtendS.o%s} /usr/lib/crtn.o%s"
#define ENDFILE_SPEC64 \
"%{!shared:crtend.o%s} %{shared:crtendS.o%s} /usr/lib64/crtn.o%s"
+#define ENDFILE_SPEC_COMMON \
+ "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s}"
+
#ifdef SPARC_BI_ARCH
#if DEFAULT_ARCH32_P
#define ENDFILE_SPEC "\
%{m32:" ENDFILE_SPEC32 "} \
%{m64:" ENDFILE_SPEC64 "} \
-%{!m32:%{!m64:" ENDFILE_SPEC32 "}}"
+%{!m32:%{!m64:" ENDFILE_SPEC32 "}} " \
+ENDFILE_SPEC_COMMON
#else
#define ENDFILE_SPEC "\
%{m32:" ENDFILE_SPEC32 "} \
%{m64:" ENDFILE_SPEC64 "} \
-%{!m32:%{!m64:" ENDFILE_SPEC64 "}}"
+%{!m32:%{!m64:" ENDFILE_SPEC64 "}} " \
+ENDFILE_SPEC_COMMON
#endif
#else
-#define ENDFILE_SPEC ENDFILE_SPEC64
+#define ENDFILE_SPEC ENDFILE_SPEC64 " " ENDFILE_SPEC_COMMON
#endif
@@ -144,8 +149,6 @@ Boston, MA 02111-1307, USA. */
#undef WCHAR_TYPE_SIZE
#define WCHAR_TYPE_SIZE 32
-#undef MAX_WCHAR_TYPE_SIZE
-
/* Define for support of TFmode long double and REAL_ARITHMETIC.
Sparc ABI says that long double is 4 words. */
#undef LONG_DOUBLE_TYPE_SIZE
@@ -164,7 +167,7 @@ Boston, MA 02111-1307, USA. */
#endif
#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-D__ELF__ -Dunix -D_LONGLONG -D__sparc__ -Dlinux -Asystem=unix -Asystem=posix"
+#define CPP_PREDEFINES "-D__ELF__ -Dunix -D_LONGLONG -D__sparc__ -D__gnu_linux__ -Dlinux -Asystem=unix -Asystem=posix"
#undef CPP_SUBTARGET_SPEC
#define CPP_SUBTARGET_SPEC "\
@@ -246,6 +249,7 @@ Boston, MA 02111-1307, USA. */
%{mcypress:-mcpu=cypress} \
%{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \
%{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \
+%{m32:%{m64:%emay not use both -m32 and -m64}} \
%{m64:-mptr64 -mstack-bias -mlong-double-128 \
%{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:-mcpu=ultrasparc}}}}}}} \
%{!mno-vis:%{!mcpu=v9:-mvis}}} \
@@ -256,6 +260,7 @@ Boston, MA 02111-1307, USA. */
%{mcypress:-mcpu=cypress} \
%{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \
%{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \
+%{m32:%{m64:%emay not use both -m32 and -m64}} \
%{m32:-mptr32 -mno-stack-bias %{!mlong-double-128:-mlong-double-64} \
%{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:-mcpu=cypress}}}}}}}} \
%{!m32:%{!mcpu*:-mcpu=ultrasparc}} \
@@ -325,6 +330,9 @@ do { \
#undef COMMON_ASM_OP
#define COMMON_ASM_OP "\t.common\t"
+#undef LOCAL_LABEL_PREFIX
+#define LOCAL_LABEL_PREFIX "."
+
/* This is how to output a definition of an internal numbered label where
PREFIX is the class of label and NUM is the number within the class. */
@@ -361,3 +369,128 @@ do { \
#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
#endif
+/* Don't be different from other Linux platforms in this regard. */
+#define HANDLE_PRAGMA_PACK_PUSH_POP
+
+/* We use GNU ld so undefine this so that attribute((init_priority)) works. */
+#undef CTORS_SECTION_ASM_OP
+#undef DTORS_SECTION_ASM_OP
+
+/* Do code reading to identify a signal frame, and set the frame
+ state data appropriately. See unwind-dw2.c for the structs. */
+
+/* Handle multilib correctly. */
+#if defined(__arch64__)
+/* 64-bit Sparc version */
+#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \
+ do { \
+ unsigned int *pc_ = (CONTEXT)->ra; \
+ long new_cfa_, i_; \
+ long regs_off_, fpu_save_off_; \
+ long this_cfa_, fpu_save_; \
+ \
+ if (pc_[0] != 0x82102065 /* mov NR_rt_sigreturn, %g1 */ \
+ || pc_[1] != 0x91d0206d) /* ta 0x6d */ \
+ break; \
+ regs_off_ = 192 + 128; \
+ fpu_save_off_ = regs_off_ + (16 * 8) + (3 * 8) + (2 * 4); \
+ this_cfa_ = (long) (CONTEXT)->cfa; \
+ new_cfa_ = *(long *)(((CONTEXT)->cfa) + (regs_off_ + (14 * 8))); \
+ new_cfa_ += 2047; /* Stack bias */ \
+ fpu_save_ = *(long *)((this_cfa_) + (fpu_save_off_)); \
+ (FS)->cfa_how = CFA_REG_OFFSET; \
+ (FS)->cfa_reg = 14; \
+ (FS)->cfa_offset = new_cfa_ - (long) (CONTEXT)->cfa; \
+ for (i_ = 1; i_ < 16; ++i_) \
+ { \
+ (FS)->regs.reg[i_].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[i_].loc.offset = \
+ this_cfa_ + (regs_off_ + (i_ * 8)) - new_cfa_; \
+ } \
+ for (i_ = 0; i_ < 16; ++i_) \
+ { \
+ (FS)->regs.reg[i_ + 16].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[i_ + 16].loc.offset = \
+ this_cfa_ + (i_ * 8) - new_cfa_; \
+ } \
+ if (fpu_save_) \
+ { \
+ for (i_ = 0; i_ < 64; ++i_) \
+ { \
+ if (i_ > 32 && (i_ & 0x1)) \
+ continue; \
+ (FS)->regs.reg[i_ + 32].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[i_ + 32].loc.offset = \
+ (fpu_save_ + (i_ * 4)) - new_cfa_; \
+ } \
+ } \
+ /* Stick return address into %g0, same trick Alpha uses. */ \
+ (FS)->regs.reg[0].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[0].loc.offset = \
+ this_cfa_ + (regs_off_ + (16 * 8) + 8) - new_cfa_; \
+ (FS)->retaddr_column = 0; \
+ goto SUCCESS; \
+ } while (0)
+#else
+/* 32-bit Sparc version */
+#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \
+ do { \
+ unsigned int *pc_ = (CONTEXT)->ra; \
+ int new_cfa_, i_, oldstyle_; \
+ int regs_off_, fpu_save_off_; \
+ int fpu_save_, this_cfa_; \
+ \
+ if (pc_[1] != 0x91d02010) /* ta 0x10 */ \
+ break; \
+ if (pc_[0] == 0x821020d8) /* mov NR_sigreturn, %g1 */ \
+ oldstyle_ = 1; \
+ else if (pc_[0] == 0x82102065) /* mov NR_rt_sigreturn, %g1 */ \
+ oldstyle_ = 0; \
+ else \
+ break; \
+ if (oldstyle_) \
+ { \
+ regs_off_ = 96; \
+ fpu_save_off_ = regs_off_ + (4 * 4) + (16 * 4); \
+ } \
+ else \
+ { \
+ regs_off_ = 96 + 128; \
+ fpu_save_off_ = regs_off_ + (4 * 4) + (16 * 4) + (2 * 4); \
+ } \
+ this_cfa_ = (int) (CONTEXT)->cfa; \
+ new_cfa_ = *(int *)(((CONTEXT)->cfa) + (regs_off_+(4*4)+(14 * 4))); \
+ fpu_save_ = *(int *)((this_cfa_) + (fpu_save_off_)); \
+ (FS)->cfa_how = CFA_REG_OFFSET; \
+ (FS)->cfa_reg = 14; \
+ (FS)->cfa_offset = new_cfa_ - (int) (CONTEXT)->cfa; \
+ for (i_ = 1; i_ < 16; ++i_) \
+ { \
+ if (i_ == 14) \
+ continue; \
+ (FS)->regs.reg[i_].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[i_].loc.offset = \
+ this_cfa_ + (regs_off_+(4 * 4)+(i_ * 4)) - new_cfa_; \
+ } \
+ for (i_ = 0; i_ < 16; ++i_) \
+ { \
+ (FS)->regs.reg[i_ + 16].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[i_ + 16].loc.offset = \
+ this_cfa_ + (i_ * 4) - new_cfa_; \
+ } \
+ if (fpu_save_) \
+ { \
+ for (i_ = 0; i_ < 32; ++i_) \
+ { \
+ (FS)->regs.reg[i_ + 32].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[i_ + 32].loc.offset = \
+ (fpu_save_ + (i_ * 4)) - new_cfa_; \
+ } \
+ } \
+ /* Stick return address into %g0, same trick Alpha uses. */ \
+ (FS)->regs.reg[0].how = REG_SAVED_OFFSET; \
+ (FS)->regs.reg[0].loc.offset = this_cfa_+(regs_off_+4)-new_cfa_; \
+ (FS)->retaddr_column = 0; \
+ goto SUCCESS; \
+ } while (0)
+#endif
diff --git a/contrib/gcc/config/sparc/lite.h b/contrib/gcc/config/sparc/lite.h
index f740443..95da781 100644
--- a/contrib/gcc/config/sparc/lite.h
+++ b/contrib/gcc/config/sparc/lite.h
@@ -28,7 +28,7 @@ Boston, MA 02111-1307, USA. */
/* Enable app-regs and epilogue options. Do not enable the fpu. */
#undef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_APP_REGS + MASK_EPILOGUE)
+#define TARGET_DEFAULT MASK_APP_REGS
/* US Software GOFAST library support. */
#undef INIT_SUBTARGET_OPTABS
diff --git a/contrib/gcc/config/sparc/litecoff.h b/contrib/gcc/config/sparc/litecoff.h
index dede792..ad0e1225 100644
--- a/contrib/gcc/config/sparc/litecoff.h
+++ b/contrib/gcc/config/sparc/litecoff.h
@@ -73,4 +73,4 @@ do { \
pointer is really %i7. */
#define DBX_REGISTER_NUMBER(REGNO) \
- (TARGET_FLAT && REGNO == FRAME_POINTER_REGNUM ? 31 : REGNO)
+ (TARGET_FLAT && (REGNO) == HARD_FRAME_POINTER_REGNUM ? 31 : REGNO)
diff --git a/contrib/gcc/config/sparc/liteelf.h b/contrib/gcc/config/sparc/liteelf.h
index d7c88b5..5c93c2d 100644
--- a/contrib/gcc/config/sparc/liteelf.h
+++ b/contrib/gcc/config/sparc/liteelf.h
@@ -38,7 +38,7 @@ Boston, MA 02111-1307, USA. */
/* Enable app-regs and epilogue options. Do not enable the fpu. */
#undef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_APP_REGS + MASK_EPILOGUE)
+#define TARGET_DEFAULT MASK_APP_REGS
/* US Software GOFAST library support. */
#undef INIT_SUBTARGET_OPTABS
diff --git a/contrib/gcc/config/sparc/netbsd-elf.h b/contrib/gcc/config/sparc/netbsd-elf.h
new file mode 100644
index 0000000..b4bbf71
--- /dev/null
+++ b/contrib/gcc/config/sparc/netbsd-elf.h
@@ -0,0 +1,344 @@
+/* Definitions of target machine for GNU compiler, for ELF on NetBSD/sparc
+ and NetBSD/sparc64.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ Contributed by Matthew Green (mrg@eterna.com.au).
+
+This file is part of GNU CC.
+
+GNU CC 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.
+
+GNU CC 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 GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Make sure these are undefined. */
+#undef MD_EXEC_PREFIX
+#undef MD_STARTFILE_PREFIX
+
+#undef CPP_PREDEFINES
+#define CPP_PREDEFINES "-D__sparc__ -D__NetBSD__ -D__ELF__ \
+-Asystem=unix -Asystem=NetBSD"
+
+/* CPP defines used for 64 bit code. */
+#undef CPP_SUBTARGET_SPEC64
+#define CPP_SUBTARGET_SPEC64 \
+ "-D__sparc64__ -D__arch64__ -D__sparc_v9__ %{posix:-D_POSIX_SOURCE}"
+
+/* CPP defines used for 32 bit code. */
+#undef CPP_SUBTARGET_SPEC32
+#define CPP_SUBTARGET_SPEC32 "-D__sparc %{posix:-D_POSIX_SOURCE}"
+
+/* SIZE_TYPE and PTRDIFF_TYPE are wrong from sparc/sparc.h. */
+#undef SIZE_TYPE
+#define SIZE_TYPE "long unsigned int"
+
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "long int"
+
+#undef PREFERRED_DEBUGGING_TYPE
+#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
+
+/* This is the char to use for continuation (in case we need to turn
+ continuation back on). */
+#undef DBX_CONTIN_CHAR
+#define DBX_CONTIN_CHAR '?'
+
+#undef DBX_REGISTER_NUMBER
+#define DBX_REGISTER_NUMBER(REGNO) \
+ (TARGET_FLAT && REGNO == HARD_FRAME_POINTER_REGNUM ? 31 : REGNO)
+
+#undef LOCAL_LABEL_PREFIX
+#define LOCAL_LABEL_PREFIX "."
+
+/* This is how to output a definition of an internal numbered label where
+ PREFIX is the class of label and NUM is the number within the class. */
+
+#undef ASM_OUTPUT_INTERNAL_LABEL
+#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
+ fprintf (FILE, ".L%s%d:\n", PREFIX, NUM)
+
+/* This is how to output a reference to an internal numbered label where
+ PREFIX is the class of label and NUM is the number within the class. */
+
+#undef ASM_OUTPUT_INTERNAL_LABELREF
+#define ASM_OUTPUT_INTERNAL_LABELREF(FILE,PREFIX,NUM) \
+ fprintf (FILE, ".L%s%d", PREFIX, NUM)
+
+/* This is how to store into the string LABEL
+ the symbol_ref name of an internal numbered label where
+ PREFIX is the class of label and NUM is the number within the class.
+ This is suitable for output with `assemble_name'. */
+
+#undef ASM_GENERATE_INTERNAL_LABEL
+#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
+ sprintf ((LABEL), "*.L%s%ld", (PREFIX), (long)(NUM))
+
+#undef USER_LABEL_PREFIX
+#define USER_LABEL_PREFIX ""
+
+#undef ASM_SPEC
+#define ASM_SPEC "%{fpic:-K PIC} %{fPIC:-K PIC} %{V} %{v:%{!V:-V}} \
+%{mlittle-endian:-EL} \
+%(asm_cpu) %(asm_arch) %(asm_relax)"
+
+#undef STDC_0_IN_SYSTEM_HEADERS
+
+#undef TARGET_VERSION
+#define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME);
+
+/*
+ * Clean up afterwards generic SPARC ELF configuration.
+ */
+
+#undef TRANSFER_FROM_TRAMPOLINE
+#define TRANSFER_FROM_TRAMPOLINE
+
+/* FIXME: Aren't these supposed to be available for SPARC ELF? */
+#undef MULDI3_LIBCALL
+#undef DIVDI3_LIBCALL
+#undef UDIVDI3_LIBCALL
+#undef MODDI3_LIBCALL
+#undef UMODDI3_LIBCALL
+#undef INIT_SUBTARGET_OPTABS
+#define INIT_SUBTARGET_OPTABS
+
+/* Below here exists the merged NetBSD/sparc & NetBSD/sparc64 compiler
+ description, allowing one to build 32 bit or 64 bit applications
+ on either. We define the sparc & sparc64 versions of things,
+ occasionally a neutral version (should be the same as "netbsd-elf.h")
+ and then based on SPARC_BI_ARCH, DEFAULT_ARCH32_P, and TARGET_CPU_DEFAULT,
+ we choose the correct version. */
+
+/* We use the default NetBSD ELF STARTFILE_SPEC and ENDFILE_SPEC
+ definitions, even for the SPARC_BI_ARCH compiler, because NetBSD does
+ not have a default place to find these libraries.. */
+
+/* Name the port(s). */
+#define TARGET_NAME64 "NetBSD/sparc64 ELF"
+#define TARGET_NAME32 "NetBSD/sparc ELF"
+
+/* TARGET_CPU_DEFAULT is set in Makefile.in. We test for 64-bit default
+ platform here. */
+
+#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \
+ || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc
+/* A 64 bit v9 compiler with stack-bias,
+ in a Medium/Low code model environment. */
+
+#undef TARGET_DEFAULT
+#define TARGET_DEFAULT \
+ (MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ \
+ + MASK_STACK_BIAS + MASK_APP_REGS + MASK_FPU + MASK_LONG_DOUBLE_128)
+
+#undef SPARC_DEFAULT_CMODEL
+#define SPARC_DEFAULT_CMODEL CM_MEDANY
+
+#endif
+
+/* CC1_SPEC for NetBSD/sparc. */
+#define CC1_SPEC32 \
+ "%{sun4:} %{target:} \
+ %{mcypress:-mcpu=cypress} \
+ %{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \
+ %{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \
+ %{m32:%{m64:%emay not use both -m32 and -m64}} \
+ %{m64: \
+ -mptr64 -mstack-bias -mno-v8plus -mlong-double-128 \
+ %{!mcpu*: \
+ %{!mcypress: \
+ %{!msparclite: \
+ %{!mf930: \
+ %{!mf934: \
+ %{!mv8*: \
+ %{!msupersparc:-mcpu=ultrasparc}}}}}}} \
+ %{!mno-vis:%{!mcpu=v9:-mvis}} \
+ %{p:-mcmodel=medlow} \
+ %{pg:-mcmodel=medlow}}"
+
+#define CC1_SPEC64 \
+ "%{sun4:} %{target:} \
+ %{mcypress:-mcpu=cypress} \
+ %{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \
+ %{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \
+ %{m32:%{m64:%emay not use both -m32 and -m64}} \
+ %{m32: \
+ -mptr32 -mno-stack-bias \
+ %{!mlong-double-128:-mlong-double-64} \
+ %{!mcpu*: \
+ %{!mcypress: \
+ %{!msparclite: \
+ %{!mf930: \
+ %{!mf934: \
+ %{!mv8*: \
+ %{!msupersparc:-mcpu=cypress}}}}}}}} \
+ %{!m32: \
+ %{p:-mcmodel=medlow} \
+ %{pg:-mcmodel=medlow}}"
+
+/* Make sure we use the right output format. Pick a default and then
+ make sure -m32/-m64 switch to the right one. */
+
+#define LINK_ARCH32_SPEC \
+ "%-m elf32_sparc \
+ %{assert*} %{R*} %{V} %{v:%{!V:-V}} \
+ %{shared:-shared} \
+ %{!shared: \
+ -dp \
+ %{!nostdlib:%{!r*:%{!e*:-e __start}}} \
+ %{!static: \
+ -dy %{rdynamic:-export-dynamic} \
+ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
+ %{static:-static}}"
+
+#define LINK_ARCH64_SPEC \
+ "%-m elf64_sparc \
+ %{assert*} %{R*} %{V} %{v:%{!V:-V}} \
+ %{shared:-shared} \
+ %{!shared: \
+ -dp \
+ %{!nostdlib:%{!r*:%{!e*:-e __start}}} \
+ %{!static: \
+ -dy %{rdynamic:-export-dynamic} \
+ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
+ %{static:-static}}"
+
+#define LINK_ARCH_SPEC "\
+%{m32:%(link_arch32)} \
+%{m64:%(link_arch64)} \
+%{!m32:%{!m64:%(link_arch_default)}} \
+"
+
+#if DEFAULT_ARCH32_P
+#define LINK_ARCH_DEFAULT_SPEC LINK_ARCH32_SPEC
+#else
+#define LINK_ARCH_DEFAULT_SPEC LINK_ARCH64_SPEC
+#endif
+
+/* What extra spec entries do we need? */
+#undef SUBTARGET_EXTRA_SPECS
+#define SUBTARGET_EXTRA_SPECS \
+ { "link_arch32", LINK_ARCH32_SPEC }, \
+ { "link_arch64", LINK_ARCH64_SPEC }, \
+ { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \
+ { "link_arch", LINK_ARCH_SPEC }, \
+ { "cpp_subtarget_spec32", CPP_SUBTARGET_SPEC32 }, \
+ { "cpp_subtarget_spec64", CPP_SUBTARGET_SPEC64 },
+
+
+/* What extra switches do we need? */
+#undef SUBTARGET_SWITCHES
+#define SUBTARGET_SWITCHES \
+ {"long-double-64", -MASK_LONG_DOUBLE_128, N_("Use 64 bit long doubles") }, \
+ {"long-double-128", MASK_LONG_DOUBLE_128, N_("Use 128 bit long doubles") },
+
+
+/* Build a compiler that supports -m32 and -m64? */
+
+#ifdef SPARC_BI_ARCH
+
+#undef LONG_DOUBLE_TYPE_SIZE
+#define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64)
+
+#undef MAX_LONG_DOUBLE_TYPE_SIZE
+#define MAX_LONG_DOUBLE_TYPE_SIZE 128
+
+#if defined(__arch64__) || defined(__LONG_DOUBLE_128__)
+#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128
+#else
+#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64
+#endif
+
+#undef CC1_SPEC
+#if DEFAULT_ARCH32_P
+#define CC1_SPEC CC1_SPEC32
+#else
+#define CC1_SPEC CC1_SPEC64
+#endif
+
+#if DEFAULT_ARCH32_P
+#define MULTILIB_DEFAULTS { "m32" }
+#else
+#define MULTILIB_DEFAULTS { "m64" }
+#endif
+
+#undef CPP_SUBTARGET_SPEC
+#if DEFAULT_ARCH32_P
+#define CPP_SUBTARGET_SPEC \
+ "%{m64:%(cpp_subtarget_spec64)}%{!m64:%(cpp_subtarget_spec32)}"
+#else
+#define CPP_SUBTARGET_SPEC \
+ "%{!m32:%(cpp_subtarget_spec64)}%{m32:%(cpp_subtarget_spec32)}"
+#endif
+
+/* Restore this from sparc/sparc.h, netbsd.h changes it. */
+#undef CPP_SPEC
+#define CPP_SPEC "%(cpp_cpu) %(cpp_arch) %(cpp_endian) %(cpp_subtarget)"
+
+/* Name the port. */
+#undef TARGET_NAME
+#define TARGET_NAME (DEFAULT_ARCH32_P ? TARGET_NAME32 : TARGET_NAME64)
+
+#else /* SPARC_BI_ARCH */
+
+#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \
+ || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc
+
+#undef LONG_DOUBLE_TYPE_SIZE
+#define LONG_DOUBLE_TYPE_SIZE 128
+
+#undef MAX_LONG_DOUBLE_TYPE_SIZE
+#define MAX_LONG_DOUBLE_TYPE_SIZE 128
+
+#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
+#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128
+
+#undef CC1_SPEC
+#define CC1_SPEC CC1_SPEC64
+
+#undef CPP_SUBTARGET_SPEC
+#define CPP_SUBTARGET_SPEC CPP_SUBTARGET_SPEC64
+
+#undef TARGET_NAME
+#define TARGET_NAME TARGET_NAME64
+
+#else /* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \
+ || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */
+
+/* A 32-bit only compiler. NetBSD don't support 128 bit `long double'
+ for 32-bit code, unlike Solaris. */
+
+#undef LONG_DOUBLE_TYPE_SIZE
+#define LONG_DOUBLE_TYPE_SIZE 64
+
+#undef MAX_LONG_DOUBLE_TYPE_SIZE
+#define MAX_LONG_DOUBLE_TYPE_SIZE 64
+
+#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
+#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64
+
+#undef CPP_SUBTARGET_SPEC
+#define CPP_SUBTARGET_SPEC CPP_SUBTARGET_SPEC32
+
+#undef CC1_SPEC
+#define CC1_SPEC CC1_SPEC32
+
+#undef TARGET_NAME
+#define TARGET_NAME TARGET_NAME32
+
+#endif /* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \
+ || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */
+
+#endif /* SPARC_BI_ARCH */
+
+/* We use GNU ld so undefine this so that attribute((init_priority)) works. */
+#undef CTORS_SECTION_ASM_OP
+#undef DTORS_SECTION_ASM_OP
diff --git a/contrib/gcc/config/sparc/netbsd.h b/contrib/gcc/config/sparc/netbsd.h
index 4be5b6b..b7b4440 100644
--- a/contrib/gcc/config/sparc/netbsd.h
+++ b/contrib/gcc/config/sparc/netbsd.h
@@ -11,15 +11,6 @@
#undef PTRDIFF_TYPE
#define PTRDIFF_TYPE "int"
-#undef WCHAR_TYPE
-#define WCHAR_TYPE "int"
-
-#undef WCHAR_UNSIGNED
-#define WCHAR_UNSIGNED 0
-
-#undef WCHAR_TYPE_SIZE
-#define WCHAR_TYPE_SIZE 32
-
/* This is BSD, so it wants DBX format. */
#define DBX_DEBUGGING_INFO
diff --git a/contrib/gcc/config/sparc/pbd.h b/contrib/gcc/config/sparc/pbd.h
index 27dfa96..9d267a5 100644
--- a/contrib/gcc/config/sparc/pbd.h
+++ b/contrib/gcc/config/sparc/pbd.h
@@ -111,6 +111,9 @@ Boston, MA 02111-1307, USA. */
* Internal labels are prefixed with a period.
*/
+#undef LOCAL_LABEL_PREFIX
+#define LOCAL_LABEL_PREFIX "."
+
/* This is how to store into the string LABEL
the symbol_ref name of an internal numbered label where
PREFIX is the class of label and NUM is the number within the class.
diff --git a/contrib/gcc/config/sparc/rtems.h b/contrib/gcc/config/sparc/rtems.h
index 9db8049..e537f1c 100644
--- a/contrib/gcc/config/sparc/rtems.h
+++ b/contrib/gcc/config/sparc/rtems.h
@@ -1,5 +1,5 @@
/* Definitions for rtems targeting a SPARC using a.out.
- Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 2000, 2002 Free Software Foundation, Inc.
Contributed by Joel Sherrill (joel@OARcorp.com).
This file is part of GNU CC.
@@ -23,10 +23,5 @@ Boston, MA 02111-1307, USA. */
/* Specify predefined symbols in preprocessor. */
#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dsparc -D__GCC_NEW_VARARGS__ -Drtems -D__rtems__ \
+#define CPP_PREDEFINES "-Dsparc -D__GCC_NEW_VARARGS__ -D__rtems__ \
-Asystem=rtems"
-
-/* Generate calls to memcpy, memcmp and memset. */
-#ifndef TARGET_MEM_FUNCTIONS
-#define TARGET_MEM_FUNCTIONS
-#endif
diff --git a/contrib/gcc/config/sparc/rtemself.h b/contrib/gcc/config/sparc/rtemself.h
index 108ff33..4f2cc66 100644
--- a/contrib/gcc/config/sparc/rtemself.h
+++ b/contrib/gcc/config/sparc/rtemself.h
@@ -1,5 +1,5 @@
/* Definitions for rtems targeting a SPARC using ELF.
- Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 2000, 2002 Free Software Foundation, Inc.
Contributed by Joel Sherrill (joel@OARcorp.com).
This file is part of GNU CC.
@@ -22,10 +22,5 @@ Boston, MA 02111-1307, USA. */
/* Specify predefined symbols in preprocessor. */
#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dsparc -D__GCC_NEW_VARARGS__ -Drtems -D__rtems__ \
- -Asystem=rtems"
-
-/* Generate calls to memcpy, memcmp and memset. */
-#ifndef TARGET_MEM_FUNCTIONS
-#define TARGET_MEM_FUNCTIONS
-#endif
+#define CPP_PREDEFINES "-Dsparc -D__GCC_NEW_VARARGS__ -D__rtems__ \
+ -D__USE_INIT_FINI__ -Asystem=rtems"
diff --git a/contrib/gcc/config/sparc/sol2-64.h b/contrib/gcc/config/sparc/sol2-64.h
index 40db497..ccdc8f3 100644
--- a/contrib/gcc/config/sparc/sol2-64.h
+++ b/contrib/gcc/config/sparc/sol2-64.h
@@ -1,20 +1,7 @@
-/* Definitions of target machine for GNU compiler, for 64-bit SPARC
- running Solaris 2 using the GNU linker. */
+/* Definitions of target machine for GNU compiler, for bi-arch SPARC
+ running Solaris 2, defaulting to 64-bit code generation. */
-#ifdef LINKER_DOES_NOT_WORK_WITH_DWARF2
-#undef LINKER_DOES_NOT_WORK_WITH_DWARF2
-#endif
-
-#ifdef AS_SPARC64_FLAG
-
-#ifdef LINK_ARCH_SPEC
-#undef LINK_ARCH_SPEC
-#endif
-
-#define LINK_ARCH_SPEC "\
-%{m32:-m elf32_sparc %(link_arch32)} \
-%{m64:-m elf64_sparc %(link_arch64)} \
-%{!m32:%{!m64:%(link_arch_default)}} \
-"
-
-#endif
+#undef TARGET_DEFAULT
+#define TARGET_DEFAULT \
+ (MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ + \
+ MASK_STACK_BIAS + MASK_FPU + MASK_LONG_DOUBLE_128)
diff --git a/contrib/gcc/config/sparc/sol2-bi.h b/contrib/gcc/config/sparc/sol2-bi.h
new file mode 100644
index 0000000..9828d63
--- /dev/null
+++ b/contrib/gcc/config/sparc/sol2-bi.h
@@ -0,0 +1,279 @@
+/* Definitions of target machine for GNU compiler, for bi-arch SPARC
+ running Solaris 2 using the system assembler and linker. */
+
+/* The default code model. */
+#undef SPARC_DEFAULT_CMODEL
+#define SPARC_DEFAULT_CMODEL CM_MEDANY
+
+#undef LONG_DOUBLE_TYPE_SIZE
+#define LONG_DOUBLE_TYPE_SIZE 128
+
+#define AS_SPARC64_FLAG "-xarch=v9"
+
+#undef ASM_CPU32_DEFAULT_SPEC
+#define ASM_CPU32_DEFAULT_SPEC ""
+#undef ASM_CPU64_DEFAULT_SPEC
+#define ASM_CPU64_DEFAULT_SPEC AS_SPARC64_FLAG
+
+#if TARGET_CPU_DEFAULT == TARGET_CPU_v9
+#undef CPP_CPU64_DEFAULT_SPEC
+#define CPP_CPU64_DEFAULT_SPEC ""
+#undef ASM_CPU32_DEFAULT_SPEC
+#define ASM_CPU32_DEFAULT_SPEC "-xarch=v8plus"
+#endif
+#if TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc
+#undef CPP_CPU64_DEFAULT_SPEC
+#define CPP_CPU64_DEFAULT_SPEC ""
+#undef ASM_CPU32_DEFAULT_SPEC
+#define ASM_CPU32_DEFAULT_SPEC "-xarch=v8plusa"
+#undef ASM_CPU64_DEFAULT_SPEC
+#define ASM_CPU64_DEFAULT_SPEC AS_SPARC64_FLAG "a"
+#endif
+
+/* The sun bundled assembler doesn't accept -Yd, (and neither does gas).
+ It's safe to pass -s always, even if -g is not used. */
+#undef ASM_SPEC
+#define ASM_SPEC "\
+%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Wa,*:%*} -s \
+%{fpic:-K PIC} %{fPIC:-K PIC} \
+%(asm_cpu)\
+"
+
+#if DEFAULT_ARCH32_P
+#define DEF_ARCH32_SPEC(__str) "%{!m64:" __str "}"
+#define DEF_ARCH64_SPEC(__str) "%{m64:" __str "}"
+#else
+#define DEF_ARCH32_SPEC(__str) "%{m32:" __str "}"
+#define DEF_ARCH64_SPEC(__str) "%{!m32:" __str "}"
+#endif
+
+#undef CPP_CPU_SPEC
+#define CPP_CPU_SPEC "\
+%{mcypress:} \
+%{msparclite:-D__sparclite__} \
+%{mf930:-D__sparclite__} %{mf934:-D__sparclite__} \
+%{mv8:" DEF_ARCH32_SPEC("-D__sparcv8") "} \
+%{msupersparc:-D__supersparc__ " DEF_ARCH32_SPEC("-D__sparcv8") "} \
+%{mcpu=sparclet:-D__sparclet__} %{mcpu=tsc701:-D__sparclet__} \
+%{mcpu=sparclite:-D__sparclite__} \
+%{mcpu=f930:-D__sparclite__} %{mcpu=f934:-D__sparclite__} \
+%{mcpu=v8:" DEF_ARCH32_SPEC("-D__sparcv8") "} \
+%{mcpu=supersparc:-D__supersparc__ " DEF_ARCH32_SPEC("-D__sparcv8") "} \
+%{mcpu=v9:" DEF_ARCH32_SPEC("-D__sparcv8") "} \
+%{mcpu=ultrasparc:" DEF_ARCH32_SPEC("-D__sparcv8") "} \
+%{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:%(cpp_cpu_default)}}}}}}} \
+"
+
+#undef ASM_CPU_SPEC
+#define ASM_CPU_SPEC "\
+%{mcpu=ultrasparc:" DEF_ARCH32_SPEC("-xarch=v8plusa") DEF_ARCH64_SPEC(AS_SPARC64_FLAG "a") "} \
+%{mcpu=v9:" DEF_ARCH32_SPEC("-xarch=v8plus") DEF_ARCH64_SPEC(AS_SPARC64_FLAG) "} \
+%{!mcpu=ultrasparc:%{!mcpu=v9:%{mcpu*:" DEF_ARCH32_SPEC("-xarch=v8") DEF_ARCH64_SPEC(AS_SPARC64_FLAG) "}}} \
+%{!mcpu*:%(asm_cpu_default)} \
+"
+
+#define STARTFILE_SPEC32 "\
+%{ansi:values-Xc.o%s} \
+%{!ansi: \
+ %{traditional:values-Xt.o%s} \
+ %{!traditional:values-Xa.o%s}}"
+
+#define STARTFILE_SPEC64 "\
+%{ansi:/usr/lib/sparcv9/values-Xc.o%s} \
+%{!ansi: \
+ %{traditional:/usr/lib/sparcv9/values-Xt.o%s} \
+ %{!traditional:/usr/lib/sparcv9/values-Xa.o%s}}"
+
+#if DEFAULT_ARCH32_P
+#define STARTFILE_ARCH_SPEC "\
+%{m32:" STARTFILE_SPEC32 "} \
+%{m64:" STARTFILE_SPEC64 "} \
+%{!m32:%{!m64:" STARTFILE_SPEC32 "}}"
+#else
+#define STARTFILE_ARCH_SPEC "\
+%{m32:" STARTFILE_SPEC32 "} \
+%{m64:" STARTFILE_SPEC64 "} \
+%{!m32:%{!m64:" STARTFILE_SPEC64 "}}"
+#endif
+
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC "%{!shared: \
+ %{!symbolic: \
+ %{p:mcrt1.o%s} \
+ %{!p: \
+ %{pg:gcrt1.o%s gmon.o%s} \
+ %{!pg:crt1.o%s}}}} \
+ crti.o%s " STARTFILE_ARCH_SPEC " \
+ crtbegin.o%s"
+
+#undef CPP_CPU_DEFAULT_SPEC
+#define CPP_CPU_DEFAULT_SPEC \
+(DEFAULT_ARCH32_P ? "\
+%{m64:" CPP_CPU64_DEFAULT_SPEC "} \
+%{!m64:" CPP_CPU32_DEFAULT_SPEC "} \
+" : "\
+%{m32:" CPP_CPU32_DEFAULT_SPEC "} \
+%{!m32:" CPP_CPU64_DEFAULT_SPEC "} \
+")
+
+#undef ASM_CPU_DEFAULT_SPEC
+#define ASM_CPU_DEFAULT_SPEC \
+(DEFAULT_ARCH32_P ? "\
+%{m64:" ASM_CPU64_DEFAULT_SPEC "} \
+%{!m64:" ASM_CPU32_DEFAULT_SPEC "} \
+" : "\
+%{m32:" ASM_CPU32_DEFAULT_SPEC "} \
+%{!m32:" ASM_CPU64_DEFAULT_SPEC "} \
+")
+
+/* wchar_t is called differently in <wchar.h> for 32 and 64-bit
+ compilations. This is called for by SCD 2.4.1, p. 6-83, Figure 6-65
+ (32-bit) and p. 6P-10, Figure 6.38 (64-bit). */
+#define NO_BUILTIN_WCHAR_TYPE
+
+#undef WCHAR_TYPE
+#define WCHAR_TYPE (TARGET_ARCH64 ? "int" : "long int")
+
+#undef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE 32
+
+/* Same for wint_t. See SCD 2.4.1, p. 6-83, Figure 6-66 (32-bit). There's
+ no corresponding 64-bit definition, but this is what Solaris 8
+ <iso/wchar_iso.h> uses. */
+#define NO_BUILTIN_WINT_TYPE
+
+#undef WINT_TYPE
+#define WINT_TYPE (TARGET_ARCH64 ? "int" : "long int")
+
+#undef WINT_TYPE_SIZE
+#define WINT_TYPE_SIZE 32
+
+#undef CPP_ARCH32_SPEC
+#define CPP_ARCH32_SPEC "-D__SIZE_TYPE__=unsigned\\ int -D__PTRDIFF_TYPE__=int \
+-D__WCHAR_TYPE__=long\\ int -D__WINT_TYPE__=long\\ int \
+-D__GCC_NEW_VARARGS__ -Acpu=sparc -Amachine=sparc"
+#undef CPP_ARCH64_SPEC
+#define CPP_ARCH64_SPEC "-D__SIZE_TYPE__=long\\ unsigned\\ int -D__PTRDIFF_TYPE__=long\\ int \
+-D__WCHAR_TYPE__=int -D__WINT_TYPE__=int \
+-D__arch64__ -Acpu=sparc64 -Amachine=sparcv9 -D__sparcv9"
+
+#undef CPP_ARCH_SPEC
+#define CPP_ARCH_SPEC "\
+%{m32:%(cpp_arch32)} \
+%{m64:%(cpp_arch64)} \
+%{!m32:%{!m64:%(cpp_arch_default)}} \
+"
+
+#undef ASM_ARCH_SPEC
+#define ASM_ARCH_SPEC ""
+
+#undef ASM_ARCH32_SPEC
+#define ASM_ARCH32_SPEC ""
+
+#undef ASM_ARCH64_SPEC
+#define ASM_ARCH64_SPEC ""
+
+#undef ASM_ARCH_DEFAULT_SPEC
+#define ASM_ARCH_DEFAULT_SPEC ""
+
+#undef SUBTARGET_EXTRA_SPECS
+#define SUBTARGET_EXTRA_SPECS \
+ { "link_arch32", LINK_ARCH32_SPEC }, \
+ { "link_arch64", LINK_ARCH64_SPEC }, \
+ { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \
+ { "link_arch", LINK_ARCH_SPEC },
+
+/* This should be the same as in svr4.h, except with -R added. */
+#define LINK_ARCH32_SPEC \
+ "%{G:-G} \
+ %{YP,*} \
+ %{R*} \
+ %{compat-bsd: \
+ %{!YP,*:%{p:-Y P,/usr/ucblib:/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
+ %{pg:-Y P,/usr/ucblib:/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
+ %{!p:%{!pg:-Y P,/usr/ucblib:/usr/ccs/lib:/usr/lib}}} \
+ -R /usr/ucblib} \
+ %{!compat-bsd: \
+ %{!YP,*:%{p:-Y P,/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
+ %{pg:-Y P,/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
+ %{!p:%{!pg:-Y P,/usr/ccs/lib:/usr/lib}}}}"
+
+#define LINK_ARCH64_SPEC \
+ "%{mcmodel=medlow:-M /usr/lib/ld/sparcv9/map.below4G} \
+ %{G:-G} \
+ %{YP,*} \
+ %{R*} \
+ %{compat-bsd: \
+ %{!YP,*:%{p:-Y P,/usr/ucblib/sparcv9:/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \
+ %{pg:-Y P,/usr/ucblib/sparcv9:/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \
+ %{!p:%{!pg:-Y P,/usr/ucblib/sparcv9:/usr/lib/sparcv9}}} \
+ -R /usr/ucblib} \
+ %{!compat-bsd: \
+ %{!YP,*:%{p:-Y P,/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \
+ %{pg:-Y P,/usr/lib/libp/sparcv9:/usr/lib/sparcv9} \
+ %{!p:%{!pg:-Y P,/usr/lib/sparcv9}}}}"
+
+#define LINK_ARCH_SPEC "\
+%{m32:%(link_arch32)} \
+%{m64:%(link_arch64)} \
+%{!m32:%{!m64:%(link_arch_default)}} \
+"
+
+#define LINK_ARCH_DEFAULT_SPEC \
+(DEFAULT_ARCH32_P ? LINK_ARCH32_SPEC : LINK_ARCH64_SPEC)
+
+#undef LINK_SPEC
+#define LINK_SPEC \
+ "%{h*} %{v:-V} \
+ %{b} %{Wl,*:%*} \
+ %{static:-dn -Bstatic} \
+ %{shared:-G -dy %{!mimpure-text:-z text}} \
+ %{symbolic:-Bsymbolic -G -dy -z text} \
+ %(link_arch) \
+ %{Qy:} %{!Qn:-Qy}"
+
+#undef CC1_SPEC
+#if DEFAULT_ARCH32_P
+#define CC1_SPEC "\
+%{sun4:} %{target:} \
+%{mcypress:-mcpu=cypress} \
+%{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \
+%{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \
+%{m32:%{m64:%emay not use both -m32 and -m64}} \
+%{m64:-mptr64 -mstack-bias -mno-v8plus \
+ %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8*:%{!msupersparc:-mcpu=v9}}}}}}}} \
+"
+#else
+#define CC1_SPEC "\
+%{sun4:} %{target:} \
+%{mcypress:-mcpu=cypress} \
+%{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \
+%{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \
+%{m32:%{m64:%emay not use both -m32 and -m64}} \
+%{m32:-mptr32 -mno-stack-bias \
+ %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8*:%{!msupersparc:-mcpu=cypress}}}}}}}} \
+%{mv8plus:-m32 -mptr32 -mno-stack-bias \
+ %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:-mcpu=v9}}}}}}}} \
+"
+#endif
+
+#if DEFAULT_ARCH32_P
+#define MULTILIB_DEFAULTS { "m32" }
+#else
+#define MULTILIB_DEFAULTS { "m64" }
+#endif
+
+/* We use stabs-in-elf in 32-bit mode, because that is what the native
+ toolchain uses. But gdb can't handle truncated 32-bit stabs so we
+ use dwarf2 in 64-bit mode. */
+#undef PREFERRED_DEBUGGING_TYPE
+#define PREFERRED_DEBUGGING_TYPE (TARGET_ARCH32 ? DBX_DEBUG : DWARF2_DEBUG)
+
+/* We can't use the above definition for the purposes of specs. */
+#if defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
+# if DEFAULT_ARCH32_P
+# define ASM_DEBUG_SPEC "%{gdwarf-2*:--gdwarf2}%{!gdwarf-2*:%{g*:--gstabs}}"
+# else
+# define ASM_DEBUG_SPEC "%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}"
+# endif
+#endif
diff --git a/contrib/gcc/config/sparc/sol2-gas-bi.h b/contrib/gcc/config/sparc/sol2-gas-bi.h
new file mode 100644
index 0000000..0b6cb61
--- /dev/null
+++ b/contrib/gcc/config/sparc/sol2-gas-bi.h
@@ -0,0 +1,5 @@
+/* Definitions of target machine for GNU compiler, for bi-arch SPARC
+ running Solaris 2 using the GNU assembler. */
+
+#undef AS_SPARC64_FLAG
+#define AS_SPARC64_FLAG "-64 -Av9"
diff --git a/contrib/gcc/config/sparc/sol2-gld-bi.h b/contrib/gcc/config/sparc/sol2-gld-bi.h
new file mode 100644
index 0000000..81a1ff2
--- /dev/null
+++ b/contrib/gcc/config/sparc/sol2-gld-bi.h
@@ -0,0 +1,9 @@
+/* Definitions of target machine for GNU compiler, for bi-arch SPARC
+ running Solaris 2 using the GNU linker. */
+
+#undef LINK_ARCH_SPEC
+#define LINK_ARCH_SPEC "\
+%{m32:-m elf32_sparc %(link_arch32)} \
+%{m64:-m elf64_sparc %(link_arch64)} \
+%{!m32:%{!m64:%(link_arch_default)}} \
+"
diff --git a/contrib/gcc/config/sparc/sol2-gld.h b/contrib/gcc/config/sparc/sol2-gld.h
new file mode 100644
index 0000000..76e034e
--- /dev/null
+++ b/contrib/gcc/config/sparc/sol2-gld.h
@@ -0,0 +1,6 @@
+/* Definitions of target machine for GNU compiler, for SPARC running Solaris 2
+ using the GNU linker. */
+
+/* Undefine this so that attribute((init_priority)) works. */
+#undef CTORS_SECTION_ASM_OP
+#undef DTORS_SECTION_ASM_OP
diff --git a/contrib/gcc/config/sparc/sol2.h b/contrib/gcc/config/sparc/sol2.h
index 46e80c1..67e064d 100644
--- a/contrib/gcc/config/sparc/sol2.h
+++ b/contrib/gcc/config/sparc/sol2.h
@@ -1,6 +1,6 @@
/* Definitions of target machine for GNU compiler, for SPARC running Solaris 2
- Copyright 1992, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001 Free Software Foundation, Inc.
+ Copyright 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+ Free Software Foundation, Inc.
Contributed by Ron Guilmette (rfg@netcom.com).
Additional changes by David V. Henkel-Wallace (gumby@cygnus.com).
@@ -23,17 +23,26 @@ Boston, MA 02111-1307, USA. */
/* Supposedly the same as vanilla sparc svr4, except for the stuff below: */
+/* Solaris 2 (at least as of 2.5.1) uses a 32-bit wchar_t. */
+#undef WCHAR_TYPE
+#define WCHAR_TYPE "long int"
+
+#undef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE 32
+
/* Solaris 2 uses a wint_t different from the default. This is required
by the SCD 2.4.1, p. 6-83, Figure 6-66. */
#undef WINT_TYPE
#define WINT_TYPE "long int"
#undef WINT_TYPE_SIZE
-#define WINT_TYPE_SIZE BITS_PER_WORD
+#define WINT_TYPE_SIZE 32
+
+#define HANDLE_PRAGMA_REDEFINE_EXTNAME 1
#undef CPP_PREDEFINES
#define CPP_PREDEFINES \
-"-Dsparc -Dsun -Dunix -D__svr4__ -D__SVR4 \
+"-Dsparc -Dsun -Dunix -D__svr4__ -D__SVR4 -D__PRAGMA_REDEFINE_EXTNAME \
-Asystem=unix -Asystem=svr4"
#undef CPP_SUBTARGET_SPEC
@@ -80,12 +89,12 @@ Boston, MA 02111-1307, USA. */
/* However it appears that Solaris 2.0 uses the same reg numbering as
the old BSD-style system did. */
-#undef DBX_REGISTER_NUMBER
/* Same as sparc.h */
+#undef DBX_REGISTER_NUMBER
#define DBX_REGISTER_NUMBER(REGNO) \
- (TARGET_FLAT && REGNO == FRAME_POINTER_REGNUM ? 31 : REGNO)
+ (TARGET_FLAT && (REGNO) == HARD_FRAME_POINTER_REGNUM ? 31 : REGNO)
-/* We use stabs-in-elf for debugging, because that is what the native
+/* We use stabs-in-elf by default, because that is what the native
toolchain uses. */
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
@@ -95,6 +104,9 @@ Boston, MA 02111-1307, USA. */
#define ASM_OUTPUT_SKIP(FILE,SIZE) \
fprintf (FILE, "\t.skip %u\n", (SIZE))
+#undef LOCAL_LABEL_PREFIX
+#define LOCAL_LABEL_PREFIX "."
+
/* This is how to output a definition of an internal numbered label where
PREFIX is the class of label and NUM is the number within the class. */
@@ -150,7 +162,9 @@ Boston, MA 02111-1307, USA. */
%{p|pg:-ldl} -lc}}"
#undef ENDFILE_SPEC
-#define ENDFILE_SPEC "crtend.o%s crtn.o%s"
+#define ENDFILE_SPEC \
+ "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
+ crtend.o%s crtn.o%s"
/* This should be the same as in svr4.h, except with -R added. */
#undef LINK_SPEC
@@ -227,7 +241,7 @@ Boston, MA 02111-1307, USA. */
/* Solaris allows 64 bit out and global registers in 32 bit mode.
sparc_override_options will disable V8+ if not generating V9 code. */
#undef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_EPILOGUE + MASK_FPU + MASK_V8PLUS + MASK_LONG_DOUBLE_128)
+#define TARGET_DEFAULT (MASK_FPU + MASK_V8PLUS + MASK_LONG_DOUBLE_128)
/*
* Attempt to turn on access permissions for the stack.
@@ -243,7 +257,9 @@ Boston, MA 02111-1307, USA. */
/* This declares mprotect (used in TRANSFER_FROM_TRAMPOLINE) for
libgcc2.c. */
-#ifdef L_trampoline
+/* We don't want to include this because sys/mman.h is not present on
+ some non-Solaris configurations that use sol2.h. */
+#if 0 /* def L_trampoline */
#include <sys/mman.h>
#endif
diff --git a/contrib/gcc/config/sparc/sol27-sld.h b/contrib/gcc/config/sparc/sol27-sld.h
new file mode 100644
index 0000000..fb47b61
--- /dev/null
+++ b/contrib/gcc/config/sparc/sol27-sld.h
@@ -0,0 +1,8 @@
+/* Up through Solaris 2.7, the system linker does not work with DWARF
+ or DWARF2, since it does not have working support for relocations
+ to unaligned data. */
+
+#undef DWARF_DEBUGGING_INFO
+#undef DWARF2_DEBUGGING_INFO
+#undef PREFERRED_DEBUGGING_TYPE
+#undef ASM_DEBUG_SPEC
diff --git a/contrib/gcc/config/sparc/sp64-aout.h b/contrib/gcc/config/sparc/sp64-aout.h
index 669adc3..1af9dea 100644
--- a/contrib/gcc/config/sparc/sp64-aout.h
+++ b/contrib/gcc/config/sparc/sp64-aout.h
@@ -26,7 +26,7 @@ Boston, MA 02111-1307, USA. */
#undef TARGET_DEFAULT
#define TARGET_DEFAULT \
(MASK_V9 + MASK_PTR64 + MASK_64BIT + MASK_HARD_QUAD \
- + MASK_APP_REGS + MASK_EPILOGUE + MASK_FPU + MASK_STACK_BIAS)
+ + MASK_APP_REGS + MASK_FPU + MASK_STACK_BIAS)
/* The only code model supported is Medium/Low. */
#undef SPARC_DEFAULT_CMODEL
diff --git a/contrib/gcc/config/sparc/sp64-elf.h b/contrib/gcc/config/sparc/sp64-elf.h
index 3bd2a53..caf944b 100644
--- a/contrib/gcc/config/sparc/sp64-elf.h
+++ b/contrib/gcc/config/sparc/sp64-elf.h
@@ -33,7 +33,7 @@ Boston, MA 02111-1307, USA. */
#undef TARGET_DEFAULT
#define TARGET_DEFAULT \
(MASK_V9 + MASK_PTR64 + MASK_64BIT + MASK_HARD_QUAD \
- + MASK_APP_REGS + MASK_EPILOGUE + MASK_FPU + MASK_STACK_BIAS + MASK_LONG_DOUBLE_128)
+ + MASK_APP_REGS + MASK_FPU + MASK_STACK_BIAS + MASK_LONG_DOUBLE_128)
#undef SPARC_DEFAULT_CMODEL
#define SPARC_DEFAULT_CMODEL CM_EMBMEDANY
@@ -71,7 +71,9 @@ crtbegin.o%s \
"
#undef ENDFILE_SPEC
-#define ENDFILE_SPEC "crtend.o%s"
+#define ENDFILE_SPEC \
+ "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
+ crtend.o%s"
/* Use the default (for now). */
#undef LIB_SPEC
diff --git a/contrib/gcc/config/sparc/sp86x-aout.h b/contrib/gcc/config/sparc/sp86x-aout.h
index ed31925..74607d3 100644
--- a/contrib/gcc/config/sparc/sp86x-aout.h
+++ b/contrib/gcc/config/sparc/sp86x-aout.h
@@ -28,7 +28,7 @@ Boston, MA 02111-1307, USA. */
/* Enable app-regs and epilogue options. Do not enable the fpu. */
#undef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_APP_REGS + MASK_EPILOGUE)
+#define TARGET_DEFAULT MASK_APP_REGS
#undef ASM_SPEC
#define ASM_SPEC "%{v:-v} %{mlittle-endian-data:--little-endian-data} %(asm_cpu)"
diff --git a/contrib/gcc/config/sparc/sp86x-elf.h b/contrib/gcc/config/sparc/sp86x-elf.h
index 40ecd55..42239a9 100644
--- a/contrib/gcc/config/sparc/sp86x-elf.h
+++ b/contrib/gcc/config/sparc/sp86x-elf.h
@@ -38,7 +38,7 @@ Boston, MA 02111-1307, USA. */
/* Enable app-regs and epilogue options. Do not enable the fpu. */
#undef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_APP_REGS + MASK_EPILOGUE)
+#define TARGET_DEFAULT MASK_APP_REGS
#undef ASM_SPEC
#define ASM_SPEC "%{v:-V} %{mlittle-endian-data:--little-endian-data} %(asm_cpu)"
diff --git a/contrib/gcc/config/sparc/sparc-protos.h b/contrib/gcc/config/sparc/sparc-protos.h
index c0f3edc..fd372de 100644
--- a/contrib/gcc/config/sparc/sparc-protos.h
+++ b/contrib/gcc/config/sparc/sparc-protos.h
@@ -24,6 +24,8 @@ Boston, MA 02111-1307, USA. */
#ifndef __SPARC_PROTOS_H__
#define __SPARC_PROTOS_H__
+extern bool sparc_emitting_epilogue;
+
#ifdef TREE_CODE
extern struct rtx_def *function_value PARAMS ((tree, enum machine_mode, int));
extern void function_arg_advance PARAMS ((CUMULATIVE_ARGS *,
@@ -57,10 +59,7 @@ extern int check_pic PARAMS ((int));
extern int short_branch PARAMS ((int, int));
extern int sparc_flat_epilogue_delay_slots PARAMS ((void));
extern unsigned long sparc_flat_compute_frame_size PARAMS ((int));
-extern void sparc_function_profiler PARAMS ((FILE *, int));
-extern void sparc_function_block_profiler PARAMS ((FILE *, int));
-extern void sparc_block_profiler PARAMS ((FILE *, int));
-extern void sparc_function_block_profiler_exit PARAMS ((FILE *));
+extern void sparc_profile_hook PARAMS ((int));
extern void sparc_override_options PARAMS ((void));
extern int leaf_return_peephole_ok PARAMS ((void));
extern void sparc_output_scratch_registers PARAMS ((FILE *));
@@ -74,6 +73,10 @@ extern enum machine_mode select_cc_mode PARAMS ((enum rtx_code, rtx, rtx));
/* Define the function that build the compare insn for scc and bcc. */
extern rtx gen_compare_reg PARAMS ((enum rtx_code code, rtx, rtx));
extern void sparc_emit_float_lib_cmp PARAMS ((rtx, rtx, enum rtx_code));
+extern void sparc_emit_floatunsdi PARAMS ((rtx [2]));
+extern void emit_tfmode_binop PARAMS ((enum rtx_code, rtx *));
+extern void emit_tfmode_unop PARAMS ((enum rtx_code, rtx *));
+extern void emit_tfmode_cvt PARAMS ((enum rtx_code, rtx *));
/* This function handles all v9 scc insns */
extern int gen_v9_scc PARAMS ((enum rtx_code, rtx *));
extern void sparc_initialize_trampoline PARAMS ((rtx, rtx, rtx));
@@ -85,10 +88,10 @@ extern void sparc_emit_set_const64 PARAMS ((rtx, rtx));
extern void sparc_emit_set_symbolic_const64 PARAMS ((rtx, rtx, rtx));
extern int sparc_splitdi_legitimate PARAMS ((rtx, rtx));
extern int sparc_absnegfloat_split_legitimate PARAMS ((rtx, rtx));
-extern char *output_cbranch PARAMS ((rtx, int, int, int, int, rtx));
-extern const char *output_return PARAMS ((rtx *));
+extern char *output_cbranch PARAMS ((rtx, rtx, int, int, int, int, rtx));
extern const char *output_sibcall PARAMS ((rtx, rtx));
-extern char *output_v9branch PARAMS ((rtx, int, int, int, int, int, rtx));
+extern char *output_v9branch PARAMS ((rtx, rtx, int, int, int, int, int,
+ rtx));
extern void emit_v9_brxx_insn PARAMS ((enum rtx_code, rtx, rtx));
extern void print_operand PARAMS ((FILE *, rtx, int));
extern int mems_ok_for_ldd_peep PARAMS ((rtx, rtx, rtx));
@@ -97,6 +100,7 @@ extern int arith_4096_operand PARAMS ((rtx, enum machine_mode));
extern int zero_operand PARAMS ((rtx, enum machine_mode));
extern int fp_zero_operand PARAMS ((rtx, enum machine_mode));
extern int reg_or_0_operand PARAMS ((rtx, enum machine_mode));
+extern int empty_delay_slot PARAMS ((rtx));
extern int eligible_for_epilogue_delay PARAMS ((rtx, int));
extern int eligible_for_return_delay PARAMS ((rtx));
extern int eligible_for_sibcall_delay PARAMS ((rtx));
@@ -115,8 +119,8 @@ extern char *sparc_v8plus_shift PARAMS ((rtx *, rtx, const char *));
/* Function used for V8+ code generation. Returns 1 if the high
32 bits of REG are 0 before INSN. */
extern int sparc_check_64 PARAMS ((rtx, rtx));
-extern int sparc_return_peephole_ok PARAMS ((rtx, rtx));
extern rtx gen_df_reg PARAMS ((rtx, int));
+extern int sparc_extra_constraint_check PARAMS ((rtx, int, int));
#endif /* RTX_CODE */
#endif /* __SPARC_PROTOS_H__ */
diff --git a/contrib/gcc/config/sparc/sparc.c b/contrib/gcc/config/sparc/sparc.c
index 8cc4449..28bbcec 100644
--- a/contrib/gcc/config/sparc/sparc.c
+++ b/contrib/gcc/config/sparc/sparc.c
@@ -68,26 +68,24 @@ Boston, MA 02111-1307, USA. */
static int apparent_fsize;
static int actual_fsize;
-/* Number of live general or floating point registers needed to be saved
- (as 4-byte quantities). This is only done if TARGET_EPILOGUE. */
+/* Number of live general or floating point registers needed to be
+ saved (as 4-byte quantities). */
static int num_gfregs;
/* Save the operands last given to a compare for use when we
generate a scc or bcc insn. */
-
rtx sparc_compare_op0, sparc_compare_op1;
-/* We may need an epilogue if we spill too many registers.
- If this is non-zero, then we branch here for the epilogue. */
-static rtx leaf_label;
+/* Coordinate with the md file wrt special insns created by
+ sparc_nonflat_function_epilogue. */
+bool sparc_emitting_epilogue;
#ifdef LEAF_REGISTERS
-/* Vector to say how input registers are mapped to output
- registers. FRAME_POINTER_REGNUM cannot be remapped by
- this function to eliminate it. You must use -fomit-frame-pointer
- to get that. */
-const char leaf_reg_remap[] =
+/* Vector to say how input registers are mapped to output registers.
+ HARD_FRAME_POINTER_REGNUM cannot be remapped by this function to
+ eliminate it. You must use -fomit-frame-pointer to get that. */
+char leaf_reg_remap[] =
{ 0, 1, 2, 3, 4, 5, 6, 7,
-1, -1, -1, -1, -1, -1, 14, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
@@ -180,6 +178,12 @@ static int sparc_issue_rate PARAMS ((void));
static int sparc_variable_issue PARAMS ((FILE *, int, rtx, int));
static void sparc_sched_init PARAMS ((FILE *, int, int));
static int sparc_sched_reorder PARAMS ((FILE *, int, rtx *, int *, int));
+
+static void emit_soft_tfmode_libcall PARAMS ((const char *, int, rtx *));
+static void emit_soft_tfmode_binop PARAMS ((enum rtx_code, rtx *));
+static void emit_soft_tfmode_unop PARAMS ((enum rtx_code, rtx *));
+static void emit_soft_tfmode_cvt PARAMS ((enum rtx_code, rtx *));
+static void emit_hard_tfmode_operation PARAMS ((enum rtx_code, rtx *));
/* Option handling. */
@@ -433,12 +437,6 @@ sparc_override_options ()
/* Do various machine dependent initializations. */
sparc_init_modes ();
- if ((profile_flag)
- && sparc_cmodel != CM_32 && sparc_cmodel != CM_MEDLOW)
- {
- error ("profiling does not support code models other than medlow");
- }
-
/* Register global variables with the garbage collector. */
sparc_add_gc_roots ();
}
@@ -492,6 +490,20 @@ fp_zero_operand (op, mode)
return op == CONST0_RTX (mode);
}
+/* Nonzero if OP is a register operand in floating point register. */
+
+int
+fp_register_operand (op, mode)
+ rtx op;
+ enum machine_mode mode;
+{
+ if (! register_operand (op, mode))
+ return 0;
+ if (GET_CODE (op) == SUBREG)
+ op = SUBREG_REG (op);
+ return GET_CODE (op) == REG && SPARC_FP_REG_P (REGNO (op));
+}
+
/* Nonzero if OP is a floating point constant which can
be loaded into an integer register using a single
sethi instruction. */
@@ -609,6 +621,27 @@ fcc_reg_operand (op, mode)
#endif
}
+/* Nonzero if OP is a floating point condition code fcc0 register. */
+
+int
+fcc0_reg_operand (op, mode)
+ rtx op;
+ enum machine_mode mode;
+{
+ /* This can happen when recog is called from combine. Op may be a MEM.
+ Fail instead of calling abort in this case. */
+ if (GET_CODE (op) != REG)
+ return 0;
+
+ if (mode != VOIDmode && mode != GET_MODE (op))
+ return 0;
+ if (mode == VOIDmode
+ && (GET_MODE (op) != CCFPmode && GET_MODE (op) != CCFPEmode))
+ return 0;
+
+ return REGNO (op) == SPARC_FCC_REG;
+}
+
/* Nonzero if OP is an integer or floating point condition code register. */
int
@@ -879,12 +912,35 @@ noov_compare_op (op, mode)
if (GET_RTX_CLASS (code) != '<')
return 0;
- if (GET_MODE (XEXP (op, 0)) == CC_NOOVmode)
+ if (GET_MODE (XEXP (op, 0)) == CC_NOOVmode
+ || GET_MODE (XEXP (op, 0)) == CCX_NOOVmode)
/* These are the only branches which work with CC_NOOVmode. */
return (code == EQ || code == NE || code == GE || code == LT);
return 1;
}
+/* Return 1 if this is a 64-bit comparison operator. This allows the use of
+ MATCH_OPERATOR to recognize all the branch insns. */
+
+int
+noov_compare64_op (op, mode)
+ register rtx op;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+{
+ enum rtx_code code = GET_CODE (op);
+
+ if (! TARGET_V9)
+ return 0;
+
+ if (GET_RTX_CLASS (code) != '<')
+ return 0;
+
+ if (GET_MODE (XEXP (op, 0)) == CCX_NOOVmode)
+ /* These are the only branches which work with CCX_NOOVmode. */
+ return (code == EQ || code == NE || code == GE || code == LT);
+ return (GET_MODE (XEXP (op, 0)) == CCXmode);
+}
+
/* Nonzero if OP is a comparison operator suitable for use in v9
conditional move or branch on register contents instructions. */
@@ -951,13 +1007,11 @@ arith_operand (op, mode)
rtx op;
enum machine_mode mode;
{
- int val;
if (register_operand (op, mode))
return 1;
if (GET_CODE (op) != CONST_INT)
return 0;
- val = INTVAL (op) & 0xffffffff;
- return SPARC_SIMM13_P (val);
+ return SMALL_INT32 (op);
}
/* Return true if OP is a constant 4096 */
@@ -967,11 +1021,10 @@ arith_4096_operand (op, mode)
rtx op;
enum machine_mode mode ATTRIBUTE_UNUSED;
{
- int val;
if (GET_CODE (op) != CONST_INT)
return 0;
- val = INTVAL (op) & 0xffffffff;
- return val == 4096;
+ else
+ return INTVAL (op) == 4096;
}
/* Return true if OP is suitable as second operand for add/sub */
@@ -999,7 +1052,7 @@ const64_operand (op, mode)
&& SPARC_SIMM13_P (CONST_DOUBLE_LOW (op))
&& (CONST_DOUBLE_HIGH (op) ==
((CONST_DOUBLE_LOW (op) & 0x80000000) != 0 ?
- (HOST_WIDE_INT)0xffffffff : 0)))
+ (HOST_WIDE_INT)-1 : 0)))
#endif
);
}
@@ -1008,21 +1061,15 @@ const64_operand (op, mode)
int
const64_high_operand (op, mode)
rtx op;
- enum machine_mode mode ATTRIBUTE_UNUSED;
+ enum machine_mode mode;
{
return ((GET_CODE (op) == CONST_INT
- && (INTVAL (op) & 0xfffffc00) != 0
- && SPARC_SETHI_P (INTVAL (op))
-#if HOST_BITS_PER_WIDE_INT != 64
- /* Must be positive on non-64bit host else the
- optimizer is fooled into thinking that sethi
- sign extends, even though it does not. */
- && INTVAL (op) >= 0
-#endif
+ && (INTVAL (op) & ~(HOST_WIDE_INT)0x3ff) != 0
+ && SPARC_SETHI_P (INTVAL (op) & GET_MODE_MASK (mode))
)
|| (GET_CODE (op) == CONST_DOUBLE
&& CONST_DOUBLE_HIGH (op) == 0
- && (CONST_DOUBLE_LOW (op) & 0xfffffc00) != 0
+ && (CONST_DOUBLE_LOW (op) & ~(HOST_WIDE_INT)0x3ff) != 0
&& SPARC_SETHI_P (CONST_DOUBLE_LOW (op))));
}
@@ -1231,12 +1278,7 @@ input_operand (op, mode)
variants when we are working in DImode and !arch64. */
if (GET_MODE_CLASS (mode) == MODE_INT
&& ((GET_CODE (op) == CONST_INT
- && ((SPARC_SETHI_P (INTVAL (op))
- && (! TARGET_ARCH64
- || (INTVAL (op) >= 0)
- || mode == SImode
- || mode == HImode
- || mode == QImode))
+ && (SPARC_SETHI_P (INTVAL (op) & GET_MODE_MASK (mode))
|| SPARC_SIMM13_P (INTVAL (op))
|| (mode == DImode
&& ! TARGET_ARCH64)))
@@ -1315,7 +1357,7 @@ sparc_emit_set_const32 (op0, op1)
{
HOST_WIDE_INT value = INTVAL (op1);
- if (SPARC_SETHI_P (value)
+ if (SPARC_SETHI_P (value & GET_MODE_MASK (mode))
|| SPARC_SIMM13_P (value))
abort ();
}
@@ -1336,11 +1378,13 @@ sparc_emit_set_const32 (op0, op1)
&& (INTVAL (op1) & 0x80000000) != 0)
emit_insn (gen_rtx_SET
(VOIDmode, temp,
- gen_rtx_CONST_DOUBLE (VOIDmode, INTVAL (op1) & 0xfffffc00,
+ gen_rtx_CONST_DOUBLE (VOIDmode,
+ INTVAL (op1) & ~(HOST_WIDE_INT)0x3ff,
0)));
else
emit_insn (gen_rtx_SET (VOIDmode, temp,
- GEN_INT (INTVAL (op1) & 0xfffffc00)));
+ GEN_INT (INTVAL (op1)
+ & ~(HOST_WIDE_INT)0x3ff)));
emit_insn (gen_rtx_SET (VOIDmode,
op0,
@@ -1366,6 +1410,14 @@ sparc_emit_set_symbolic_const64 (op0, op1, temp1)
rtx op1;
rtx temp1;
{
+ rtx ti_temp1 = 0;
+
+ if (temp1 && GET_MODE (temp1) == TImode)
+ {
+ ti_temp1 = temp1;
+ temp1 = gen_rtx_REG (DImode, REGNO (temp1));
+ }
+
switch (sparc_cmodel)
{
case CM_MEDLOW:
@@ -1419,12 +1471,16 @@ sparc_emit_set_symbolic_const64 (op0, op1, temp1)
sllx %temp3, 32, %temp5
or %temp4, %temp5, %reg */
- /* Getting this right wrt. reloading is really tricky.
- We _MUST_ have a separate temporary at this point,
- if we don't barf immediately instead of generating
- incorrect code. */
+ /* It is possible that one of the registers we got for operands[2]
+ might coincide with that of operands[0] (which is why we made
+ it TImode). Pick the other one to use as our scratch. */
if (rtx_equal_p (temp1, op0))
- abort ();
+ {
+ if (ti_temp1)
+ temp1 = gen_rtx_REG (DImode, REGNO (temp1) + 1);
+ else
+ abort();
+ }
emit_insn (gen_sethh (op0, op1));
emit_insn (gen_setlm (temp1, op1));
@@ -1462,12 +1518,16 @@ sparc_emit_set_symbolic_const64 (op0, op1, temp1)
}
else
{
- /* Getting this right wrt. reloading is really tricky.
- We _MUST_ have a separate temporary at this point,
- so we barf immediately instead of generating
- incorrect code. */
- if (temp1 == op0)
- abort ();
+ /* It is possible that one of the registers we got for operands[2]
+ might coincide with that of operands[0] (which is why we made
+ it TImode). Pick the other one to use as our scratch. */
+ if (rtx_equal_p (temp1, op0))
+ {
+ if (ti_temp1)
+ temp1 = gen_rtx_REG (DImode, REGNO (temp1) + 1);
+ else
+ abort();
+ }
emit_insn (gen_embmedany_textuhi (op0, op1));
emit_insn (gen_embmedany_texthi (temp1, op1));
@@ -1494,15 +1554,15 @@ static rtx gen_safe_OR64 PARAMS ((rtx, HOST_WIDE_INT));
static rtx gen_safe_XOR64 PARAMS ((rtx, HOST_WIDE_INT));
#if HOST_BITS_PER_WIDE_INT == 64
-#define GEN_HIGHINT64(__x) GEN_INT ((__x) & 0xfffffc00)
+#define GEN_HIGHINT64(__x) GEN_INT ((__x) & ~(HOST_WIDE_INT)0x3ff)
#define GEN_INT64(__x) GEN_INT (__x)
#else
#define GEN_HIGHINT64(__x) \
- gen_rtx_CONST_DOUBLE (VOIDmode, (__x) & 0xfffffc00, 0)
+ gen_rtx_CONST_DOUBLE (VOIDmode, (__x) & ~(HOST_WIDE_INT)0x3ff, 0)
#define GEN_INT64(__x) \
gen_rtx_CONST_DOUBLE (VOIDmode, (__x) & 0xffffffff, \
((__x) & 0x80000000 \
- ? 0xffffffff : 0))
+ ? -1 : 0))
#endif
/* The optimizer is not to assume anything about exactly
@@ -1587,7 +1647,8 @@ sparc_emit_set_const64_quick1 (op0, temp, low_bits, is_neg)
{
emit_insn (gen_rtx_SET (VOIDmode, op0,
gen_safe_XOR64 (temp,
- (-0x400 | (low_bits & 0x3ff)))));
+ (-(HOST_WIDE_INT)0x400
+ | (low_bits & 0x3ff)))));
}
}
}
@@ -2295,16 +2356,7 @@ gen_v9_scc (compare_code, operands)
|| GET_MODE (operands[0]) == DImode))
return 0;
- /* Handle the case where operands[0] == sparc_compare_op0.
- We "early clobber" the result. */
- if (REGNO (operands[0]) == REGNO (sparc_compare_op0))
- {
- op0 = gen_reg_rtx (GET_MODE (sparc_compare_op0));
- emit_move_insn (op0, sparc_compare_op0);
- }
- else
- op0 = sparc_compare_op0;
- /* For consistency in the following. */
+ op0 = sparc_compare_op0;
op1 = sparc_compare_op1;
/* Try to use the movrCC insns. */
@@ -2314,14 +2366,12 @@ gen_v9_scc (compare_code, operands)
&& v9_regcmp_p (compare_code))
{
/* Special case for op0 != 0. This can be done with one instruction if
- operands[0] == sparc_compare_op0. We don't assume they are equal
- now though. */
+ operands[0] == sparc_compare_op0. */
if (compare_code == NE
&& GET_MODE (operands[0]) == DImode
- && GET_MODE (op0) == DImode)
+ && rtx_equal_p (op0, operands[0]))
{
- emit_insn (gen_rtx_SET (VOIDmode, operands[0], op0));
emit_insn (gen_rtx_SET (VOIDmode, operands[0],
gen_rtx_IF_THEN_ELSE (DImode,
gen_rtx_fmt_ee (compare_code, DImode,
@@ -2331,6 +2381,14 @@ gen_v9_scc (compare_code, operands)
return 1;
}
+ if (reg_overlap_mentioned_p (operands[0], op0))
+ {
+ /* Handle the case where operands[0] == sparc_compare_op0.
+ We "early clobber" the result. */
+ op0 = gen_reg_rtx (GET_MODE (sparc_compare_op0));
+ emit_move_insn (op0, sparc_compare_op0);
+ }
+
emit_insn (gen_rtx_SET (VOIDmode, operands[0], const0_rtx));
if (GET_MODE (op0) != DImode)
{
@@ -2406,6 +2464,304 @@ gen_df_reg (reg, low)
return gen_rtx_REG (DFmode, regno);
}
+/* Generate a call to FUNC with OPERANDS. Operand 0 is the return value.
+ Unlike normal calls, TFmode operands are passed by reference. It is
+ assumed that no more than 3 operands are required. */
+
+static void
+emit_soft_tfmode_libcall (func_name, nargs, operands)
+ const char *func_name;
+ int nargs;
+ rtx *operands;
+{
+ rtx ret_slot = NULL, arg[3], func_sym;
+ int i;
+
+ /* We only expect to be called for conversions, unary, and binary ops. */
+ if (nargs < 2 || nargs > 3)
+ abort ();
+
+ for (i = 0; i < nargs; ++i)
+ {
+ rtx this_arg = operands[i];
+ rtx this_slot;
+
+ /* TFmode arguments and return values are passed by reference. */
+ if (GET_MODE (this_arg) == TFmode)
+ {
+ if (GET_CODE (this_arg) == MEM)
+ this_arg = XEXP (this_arg, 0);
+ else if (CONSTANT_P (this_arg))
+ {
+ this_slot = force_const_mem (TFmode, this_arg);
+ this_arg = XEXP (this_slot, 0);
+ }
+ else
+ {
+ this_slot = assign_stack_temp (TFmode, GET_MODE_SIZE (TFmode), 0);
+
+ /* Operand 0 is the return value. We'll copy it out later. */
+ if (i > 0)
+ emit_move_insn (this_slot, this_arg);
+ else
+ ret_slot = this_slot;
+
+ this_arg = XEXP (this_slot, 0);
+ }
+ }
+
+ arg[i] = this_arg;
+ }
+
+ func_sym = gen_rtx_SYMBOL_REF (Pmode, func_name);
+
+ if (GET_MODE (operands[0]) == TFmode)
+ {
+ if (nargs == 2)
+ emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 2,
+ arg[0], GET_MODE (arg[0]),
+ arg[1], GET_MODE (arg[1]));
+ else
+ emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 3,
+ arg[0], GET_MODE (arg[0]),
+ arg[1], GET_MODE (arg[1]),
+ arg[2], GET_MODE (arg[2]));
+
+ if (ret_slot)
+ emit_move_insn (operands[0], ret_slot);
+ }
+ else
+ {
+ rtx ret;
+
+ if (nargs != 2)
+ abort ();
+
+ ret = emit_library_call_value (func_sym, operands[0], LCT_NORMAL,
+ GET_MODE (operands[0]), 1,
+ arg[1], GET_MODE (arg[1]));
+
+ if (ret != operands[0])
+ emit_move_insn (operands[0], ret);
+ }
+}
+
+/* Expand soft-float TFmode calls to sparc abi routines. */
+
+static void
+emit_soft_tfmode_binop (code, operands)
+ enum rtx_code code;
+ rtx *operands;
+{
+ const char *func;
+
+ switch (code)
+ {
+ case PLUS:
+ func = "_Qp_add";
+ break;
+ case MINUS:
+ func = "_Qp_sub";
+ break;
+ case MULT:
+ func = "_Qp_mul";
+ break;
+ case DIV:
+ func = "_Qp_div";
+ break;
+ default:
+ abort ();
+ }
+
+ emit_soft_tfmode_libcall (func, 3, operands);
+}
+
+static void
+emit_soft_tfmode_unop (code, operands)
+ enum rtx_code code;
+ rtx *operands;
+{
+ const char *func;
+
+ switch (code)
+ {
+ case SQRT:
+ func = "_Qp_sqrt";
+ break;
+ default:
+ abort ();
+ }
+
+ emit_soft_tfmode_libcall (func, 2, operands);
+}
+
+static void
+emit_soft_tfmode_cvt (code, operands)
+ enum rtx_code code;
+ rtx *operands;
+{
+ const char *func;
+
+ switch (code)
+ {
+ case FLOAT_EXTEND:
+ switch (GET_MODE (operands[1]))
+ {
+ case SFmode:
+ func = "_Qp_stoq";
+ break;
+ case DFmode:
+ func = "_Qp_dtoq";
+ break;
+ default:
+ abort ();
+ }
+ break;
+
+ case FLOAT_TRUNCATE:
+ switch (GET_MODE (operands[0]))
+ {
+ case SFmode:
+ func = "_Qp_qtos";
+ break;
+ case DFmode:
+ func = "_Qp_qtod";
+ break;
+ default:
+ abort ();
+ }
+ break;
+
+ case FLOAT:
+ switch (GET_MODE (operands[1]))
+ {
+ case SImode:
+ func = "_Qp_itoq";
+ break;
+ case DImode:
+ func = "_Qp_xtoq";
+ break;
+ default:
+ abort ();
+ }
+ break;
+
+ case UNSIGNED_FLOAT:
+ switch (GET_MODE (operands[1]))
+ {
+ case SImode:
+ func = "_Qp_uitoq";
+ break;
+ case DImode:
+ func = "_Qp_uxtoq";
+ break;
+ default:
+ abort ();
+ }
+ break;
+
+ case FIX:
+ switch (GET_MODE (operands[0]))
+ {
+ case SImode:
+ func = "_Qp_qtoi";
+ break;
+ case DImode:
+ func = "_Qp_qtox";
+ break;
+ default:
+ abort ();
+ }
+ break;
+
+ case UNSIGNED_FIX:
+ switch (GET_MODE (operands[0]))
+ {
+ case SImode:
+ func = "_Qp_qtoui";
+ break;
+ case DImode:
+ func = "_Qp_qtoux";
+ break;
+ default:
+ abort ();
+ }
+ break;
+
+ default:
+ abort ();
+ }
+
+ emit_soft_tfmode_libcall (func, 2, operands);
+}
+
+/* Expand a hard-float tfmode operation. All arguments must be in
+ registers. */
+
+static void
+emit_hard_tfmode_operation (code, operands)
+ enum rtx_code code;
+ rtx *operands;
+{
+ rtx op, dest;
+
+ if (GET_RTX_CLASS (code) == '1')
+ {
+ operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
+ op = gen_rtx_fmt_e (code, GET_MODE (operands[0]), operands[1]);
+ }
+ else
+ {
+ operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
+ operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
+ op = gen_rtx_fmt_ee (code, GET_MODE (operands[0]),
+ operands[1], operands[2]);
+ }
+
+ if (register_operand (operands[0], VOIDmode))
+ dest = operands[0];
+ else
+ dest = gen_reg_rtx (GET_MODE (operands[0]));
+
+ emit_insn (gen_rtx_SET (VOIDmode, dest, op));
+
+ if (dest != operands[0])
+ emit_move_insn (operands[0], dest);
+}
+
+void
+emit_tfmode_binop (code, operands)
+ enum rtx_code code;
+ rtx *operands;
+{
+ if (TARGET_HARD_QUAD)
+ emit_hard_tfmode_operation (code, operands);
+ else
+ emit_soft_tfmode_binop (code, operands);
+}
+
+void
+emit_tfmode_unop (code, operands)
+ enum rtx_code code;
+ rtx *operands;
+{
+ if (TARGET_HARD_QUAD)
+ emit_hard_tfmode_operation (code, operands);
+ else
+ emit_soft_tfmode_unop (code, operands);
+}
+
+void
+emit_tfmode_cvt (code, operands)
+ enum rtx_code code;
+ rtx *operands;
+{
+ if (TARGET_HARD_QUAD)
+ emit_hard_tfmode_operation (code, operands);
+ else
+ emit_soft_tfmode_cvt (code, operands);
+}
+
/* Return nonzero if a return peephole merging return with
setting of output register is ok. */
int
@@ -2414,6 +2770,26 @@ leaf_return_peephole_ok ()
return (actual_fsize == 0);
}
+/* Return nonzero if a branch/jump/call instruction will be emitting
+ nop into its delay slot. */
+
+int
+empty_delay_slot (insn)
+ rtx insn;
+{
+ rtx seq;
+
+ /* If no previous instruction (should not happen), return true. */
+ if (PREV_INSN (insn) == NULL)
+ return 1;
+
+ seq = NEXT_INSN (PREV_INSN (insn));
+ if (GET_CODE (PATTERN (seq)) == SEQUENCE)
+ return 0;
+
+ return 1;
+}
+
/* Return nonzero if TRIAL can go into the function epilogue's
delay slot. SLOT is the slot we are trying to fill. */
@@ -2931,7 +3307,7 @@ load_pic_register ()
}
/* Return 1 if RTX is a MEM which is known to be aligned to at
- least an 8 byte boundary. */
+ least a DESIRED byte boundary. */
int
mem_min_alignment (mem, desired)
@@ -2972,8 +3348,7 @@ mem_min_alignment (mem, desired)
{
int regno = REGNO (base);
- if (regno != FRAME_POINTER_REGNUM
- && regno != STACK_POINTER_REGNUM)
+ if (regno != HARD_FRAME_POINTER_REGNUM && regno != STACK_POINTER_REGNUM)
{
/* Check if the compiler has recorded some information
about the alignment of the base REG. If reload has
@@ -3190,7 +3565,7 @@ sparc_init_modes ()
{
if (i < 16 && TARGET_V8PLUS)
sparc_regno_reg_class[i] = I64_REGS;
- else if (i < 32)
+ else if (i < 32 || i == FRAME_POINTER_REGNUM)
sparc_regno_reg_class[i] = GENERAL_REGS;
else if (i < 64)
sparc_regno_reg_class[i] = FP_REGS;
@@ -3334,31 +3709,28 @@ compute_frame_size (size, leaf_function)
int outgoing_args_size = (current_function_outgoing_args_size
+ REG_PARM_STACK_SPACE (current_function_decl));
- if (TARGET_EPILOGUE)
- {
- /* N_REGS is the number of 4-byte regs saved thus far. This applies
- even to v9 int regs to be consistent with save_regs/restore_regs. */
+ /* N_REGS is the number of 4-byte regs saved thus far. This applies
+ even to v9 int regs to be consistent with save_regs/restore_regs. */
- if (TARGET_ARCH64)
- {
- for (i = 0; i < 8; i++)
- if (regs_ever_live[i] && ! call_used_regs[i])
- n_regs += 2;
- }
- else
- {
- for (i = 0; i < 8; i += 2)
- if ((regs_ever_live[i] && ! call_used_regs[i])
- || (regs_ever_live[i+1] && ! call_used_regs[i+1]))
- n_regs += 2;
- }
-
- for (i = 32; i < (TARGET_V9 ? 96 : 64); i += 2)
+ if (TARGET_ARCH64)
+ {
+ for (i = 0; i < 8; i++)
+ if (regs_ever_live[i] && ! call_used_regs[i])
+ n_regs += 2;
+ }
+ else
+ {
+ for (i = 0; i < 8; i += 2)
if ((regs_ever_live[i] && ! call_used_regs[i])
|| (regs_ever_live[i+1] && ! call_used_regs[i+1]))
n_regs += 2;
}
+ for (i = 32; i < (TARGET_V9 ? 96 : 64); i += 2)
+ if ((regs_ever_live[i] && ! call_used_regs[i])
+ || (regs_ever_live[i+1] && ! call_used_regs[i+1]))
+ n_regs += 2;
+
/* Set up values for use in `function_epilogue'. */
num_gfregs = n_regs;
@@ -3369,9 +3741,8 @@ compute_frame_size (size, leaf_function)
}
else
{
- /* We subtract STARTING_FRAME_OFFSET, remember it's negative.
- The stack bias (if any) is taken out to undo its effects. */
- apparent_fsize = (size - STARTING_FRAME_OFFSET + SPARC_STACK_BIAS + 7) & -8;
+ /* We subtract STARTING_FRAME_OFFSET, remember it's negative. */
+ apparent_fsize = (size - STARTING_FRAME_OFFSET + 7) & -8;
apparent_fsize += n_regs * 4;
actual_fsize = apparent_fsize + ((outgoing_args_size + 7) & -8);
}
@@ -3538,7 +3909,7 @@ sparc_nonflat_function_prologue (file, size, leaf_function)
/* The canonical frame address refers to the top of the frame. */
dwarf2out_def_cfa (label, (leaf_function ? STACK_POINTER_REGNUM
- : FRAME_POINTER_REGNUM),
+ : HARD_FRAME_POINTER_REGNUM),
frame_base_offset);
if (! leaf_function)
@@ -3583,24 +3954,9 @@ sparc_nonflat_function_prologue (file, size, leaf_function)
base = frame_base_name;
}
- n_regs = 0;
- if (TARGET_EPILOGUE && ! leaf_function)
- /* ??? Originally saved regs 0-15 here. */
- n_regs = save_regs (file, 0, 8, base, offset, 0, real_offset);
- else if (leaf_function)
- /* ??? Originally saved regs 0-31 here. */
- n_regs = save_regs (file, 0, 8, base, offset, 0, real_offset);
- if (TARGET_EPILOGUE)
- save_regs (file, 32, TARGET_V9 ? 96 : 64, base, offset, n_regs,
- real_offset);
- }
-
- leaf_label = 0;
- if (leaf_function && actual_fsize != 0)
- {
- /* warning ("leaf procedure with frame size %d", actual_fsize); */
- if (! TARGET_EPILOGUE)
- leaf_label = gen_label_rtx ();
+ n_regs = save_regs (file, 0, 8, base, offset, 0, real_offset);
+ save_regs (file, 32, TARGET_V9 ? 96 : 64, base, offset, n_regs,
+ real_offset);
}
}
@@ -3609,7 +3965,7 @@ sparc_nonflat_function_prologue (file, size, leaf_function)
static void
output_restore_regs (file, leaf_function)
FILE *file;
- int leaf_function;
+ int leaf_function ATTRIBUTE_UNUSED;
{
int offset, n_regs;
const char *base;
@@ -3627,15 +3983,8 @@ output_restore_regs (file, leaf_function)
base = frame_base_name;
}
- n_regs = 0;
- if (TARGET_EPILOGUE && ! leaf_function)
- /* ??? Originally saved regs 0-15 here. */
- n_regs = restore_regs (file, 0, 8, base, offset, 0);
- else if (leaf_function)
- /* ??? Originally saved regs 0-31 here. */
- n_regs = restore_regs (file, 0, 8, base, offset, 0);
- if (TARGET_EPILOGUE)
- restore_regs (file, 32, TARGET_V9 ? 96 : 64, base, offset, n_regs);
+ n_regs = restore_regs (file, 0, 8, base, offset, 0);
+ restore_regs (file, 32, TARGET_V9 ? 96 : 64, base, offset, n_regs);
}
/* This function generates the assembly code for function exit,
@@ -3668,21 +4017,25 @@ sparc_nonflat_function_epilogue (file, size, leaf_function)
{
const char *ret;
- if (leaf_label)
- {
- emit_label_after (leaf_label, get_last_insn ());
- final_scan_insn (get_last_insn (), file, 0, 0, 1);
- }
-
if (current_function_epilogue_delay_list == 0)
{
/* If code does not drop into the epilogue, we need
- do nothing except output pending case vectors. */
- rtx insn = get_last_insn ();
- if (GET_CODE (insn) == NOTE)
- insn = prev_nonnote_insn (insn);
- if (insn && GET_CODE (insn) == BARRIER)
- goto output_vectors;
+ do nothing except output pending case vectors.
+
+ We have to still output a dummy nop for the sake of
+ sane backtraces. Otherwise, if the last two instructions
+ of a function were call foo; dslot; this can make the return
+ PC of foo (ie. address of call instruction plus 8) point to
+ the first instruction in the next function. */
+ rtx insn;
+
+ fputs("\tnop\n", file);
+
+ insn = get_last_insn ();
+ if (GET_CODE (insn) == NOTE)
+ insn = prev_nonnote_insn (insn);
+ if (insn && GET_CODE (insn) == BARRIER)
+ goto output_vectors;
}
if (num_gfregs)
@@ -3694,95 +4047,93 @@ sparc_nonflat_function_epilogue (file, size, leaf_function)
else
ret = (SKIP_CALLERS_UNIMP_P ? "jmp\t%i7+12" : "ret");
- if (TARGET_EPILOGUE || leaf_label)
+ if (! leaf_function)
{
- int old_target_epilogue = TARGET_EPILOGUE;
- target_flags &= ~old_target_epilogue;
+ if (current_function_calls_eh_return)
+ {
+ if (current_function_epilogue_delay_list)
+ abort ();
+ if (SKIP_CALLERS_UNIMP_P)
+ abort ();
- if (! leaf_function)
+ fputs ("\trestore\n\tretl\n\tadd\t%sp, %g1, %sp\n", file);
+ }
+ /* If we wound up with things in our delay slot, flush them here. */
+ else if (current_function_epilogue_delay_list)
{
- if (current_function_calls_eh_return)
- {
- if (current_function_epilogue_delay_list)
- abort ();
- if (SKIP_CALLERS_UNIMP_P)
- abort ();
+ rtx delay = PATTERN (XEXP (current_function_epilogue_delay_list, 0));
- fputs ("\trestore\n\tretl\n\tadd\t%sp, %g1, %sp\n", file);
+ if (TARGET_V9 && ! epilogue_renumber (&delay, 1))
+ {
+ epilogue_renumber (&delay, 0);
+ fputs (SKIP_CALLERS_UNIMP_P
+ ? "\treturn\t%i7+12\n"
+ : "\treturn\t%i7+8\n", file);
+ final_scan_insn (XEXP (current_function_epilogue_delay_list, 0),
+ file, 1, 0, 0);
}
- /* If we wound up with things in our delay slot, flush them here. */
- else if (current_function_epilogue_delay_list)
+ else
{
- rtx delay = PATTERN (XEXP (current_function_epilogue_delay_list, 0));
+ rtx insn, src;
- if (TARGET_V9 && ! epilogue_renumber (&delay, 1))
- {
- epilogue_renumber (&delay, 0);
- fputs (SKIP_CALLERS_UNIMP_P
- ? "\treturn\t%i7+12\n"
- : "\treturn\t%i7+8\n", file);
- final_scan_insn (XEXP (current_function_epilogue_delay_list, 0), file, 1, 0, 0);
- }
- else
- {
- rtx insn = emit_jump_insn_after (gen_rtx_RETURN (VOIDmode),
- get_last_insn ());
- rtx src;
+ if (GET_CODE (delay) != SET)
+ abort();
- if (GET_CODE (delay) != SET)
+ src = SET_SRC (delay);
+ if (GET_CODE (src) == ASHIFT)
+ {
+ if (XEXP (src, 1) != const1_rtx)
abort();
+ SET_SRC (delay)
+ = gen_rtx_PLUS (GET_MODE (src), XEXP (src, 0),
+ XEXP (src, 0));
+ }
- src = SET_SRC (delay);
- if (GET_CODE (src) == ASHIFT)
- {
- if (XEXP (src, 1) != const1_rtx)
- abort();
- SET_SRC (delay) = gen_rtx_PLUS (GET_MODE (src), XEXP (src, 0),
- XEXP (src, 0));
- }
+ insn = gen_rtx_PARALLEL (VOIDmode,
+ gen_rtvec (2, delay,
+ gen_rtx_RETURN (VOIDmode)));
+ insn = emit_jump_insn (insn);
- PATTERN (insn) = gen_rtx_PARALLEL (VOIDmode,
- gen_rtvec (2, delay, PATTERN (insn)));
- final_scan_insn (insn, file, 1, 0, 1);
- }
+ sparc_emitting_epilogue = true;
+ final_scan_insn (insn, file, 1, 0, 1);
+ sparc_emitting_epilogue = false;
}
- else if (TARGET_V9 && ! SKIP_CALLERS_UNIMP_P)
- fputs ("\treturn\t%i7+8\n\tnop\n", file);
- else
- fprintf (file, "\t%s\n\trestore\n", ret);
}
- else if (current_function_calls_eh_return)
+ else if (TARGET_V9 && ! SKIP_CALLERS_UNIMP_P)
+ fputs ("\treturn\t%i7+8\n\tnop\n", file);
+ else
+ fprintf (file, "\t%s\n\trestore\n", ret);
+ }
+ /* All of the following cases are for leaf functions. */
+ else if (current_function_calls_eh_return)
+ abort ();
+ else if (current_function_epilogue_delay_list)
+ {
+ /* eligible_for_epilogue_delay_slot ensures that if this is a
+ leaf function, then we will only have insn in the delay slot
+ if the frame size is zero, thus no adjust for the stack is
+ needed here. */
+ if (actual_fsize != 0)
abort ();
- /* All of the following cases are for leaf functions. */
- else if (current_function_epilogue_delay_list)
- {
- /* eligible_for_epilogue_delay_slot ensures that if this is a
- leaf function, then we will only have insn in the delay slot
- if the frame size is zero, thus no adjust for the stack is
- needed here. */
- if (actual_fsize != 0)
- abort ();
- fprintf (file, "\t%s\n", ret);
- final_scan_insn (XEXP (current_function_epilogue_delay_list, 0),
- file, 1, 0, 1);
- }
- /* Output 'nop' instead of 'sub %sp,-0,%sp' when no frame, so as to
- avoid generating confusing assembly language output. */
- else if (actual_fsize == 0)
- fprintf (file, "\t%s\n\tnop\n", ret);
- else if (actual_fsize <= 4096)
- fprintf (file, "\t%s\n\tsub\t%%sp, -%d, %%sp\n", ret, actual_fsize);
- else if (actual_fsize <= 8192)
- fprintf (file, "\tsub\t%%sp, -4096, %%sp\n\t%s\n\tsub\t%%sp, -%d, %%sp\n",
- ret, actual_fsize - 4096);
- else if ((actual_fsize & 0x3ff) == 0)
- fprintf (file, "\tsethi\t%%hi(%d), %%g1\n\t%s\n\tadd\t%%sp, %%g1, %%sp\n",
- actual_fsize, ret);
- else
- fprintf (file, "\tsethi\t%%hi(%d), %%g1\n\tor\t%%g1, %%lo(%d), %%g1\n\t%s\n\tadd\t%%sp, %%g1, %%sp\n",
- actual_fsize, actual_fsize, ret);
- target_flags |= old_target_epilogue;
+ fprintf (file, "\t%s\n", ret);
+ final_scan_insn (XEXP (current_function_epilogue_delay_list, 0),
+ file, 1, 0, 1);
}
+ /* Output 'nop' instead of 'sub %sp,-0,%sp' when no frame, so as to
+ avoid generating confusing assembly language output. */
+ else if (actual_fsize == 0)
+ fprintf (file, "\t%s\n\tnop\n", ret);
+ else if (actual_fsize <= 4096)
+ fprintf (file, "\t%s\n\tsub\t%%sp, -%d, %%sp\n", ret, actual_fsize);
+ else if (actual_fsize <= 8192)
+ fprintf (file, "\tsub\t%%sp, -4096, %%sp\n\t%s\n\tsub\t%%sp, -%d, %%sp\n",
+ ret, actual_fsize - 4096);
+ else if ((actual_fsize & 0x3ff) == 0)
+ fprintf (file, "\tsethi\t%%hi(%d), %%g1\n\t%s\n\tadd\t%%sp, %%g1, %%sp\n",
+ actual_fsize, ret);
+ else
+ fprintf (file, "\tsethi\t%%hi(%d), %%g1\n\tor\t%%g1, %%lo(%d), %%g1\n\t%s\n\tadd\t%%sp, %%g1, %%sp\n",
+ actual_fsize, actual_fsize, ret);
output_vectors:
sparc_output_deferred_case_vectors ();
@@ -4222,7 +4573,10 @@ function_arg_record_value_1 (type, startbitpos, parms)
if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
function_arg_record_value_1 (TREE_TYPE (field), bitpos, parms);
- else if (TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
+ else if ((TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
+ || (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE
+ && (TREE_CODE (TREE_TYPE (TREE_TYPE (field)))
+ == REAL_TYPE)))
&& TARGET_FPU
&& ! packed_p
&& parms->named)
@@ -4245,6 +4599,8 @@ function_arg_record_value_1 (type, startbitpos, parms)
/* There's no need to check this_slotno < SPARC_FP_ARG MAX.
If it wasn't true we wouldn't be here. */
parms->nregs += 1;
+ if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
+ parms->nregs += 1;
}
else
{
@@ -4348,24 +4704,45 @@ function_arg_record_value_2 (type, startbitpos, parms)
if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
function_arg_record_value_2 (TREE_TYPE (field), bitpos, parms);
- else if (TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
+ else if ((TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
+ || (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE
+ && (TREE_CODE (TREE_TYPE (TREE_TYPE (field)))
+ == REAL_TYPE)))
&& TARGET_FPU
&& ! packed_p
&& parms->named)
{
int this_slotno = parms->slotno + bitpos / BITS_PER_WORD;
+ int regno;
+ enum machine_mode mode = DECL_MODE (field);
rtx reg;
function_arg_record_value_3 (bitpos, parms);
-
- reg = gen_rtx_REG (DECL_MODE (field),
- (SPARC_FP_ARG_FIRST + this_slotno * 2
- + (DECL_MODE (field) == SFmode
- && (bitpos & 32) != 0)));
+ regno = SPARC_FP_ARG_FIRST + this_slotno * 2
+ + ((mode == SFmode || mode == SCmode)
+ && (bitpos & 32) != 0);
+ switch (mode)
+ {
+ case SCmode: mode = SFmode; break;
+ case DCmode: mode = DFmode; break;
+ case TCmode: mode = TFmode; break;
+ default: break;
+ }
+ reg = gen_rtx_REG (mode, regno);
XVECEXP (parms->ret, 0, parms->nregs)
= gen_rtx_EXPR_LIST (VOIDmode, reg,
GEN_INT (bitpos / BITS_PER_UNIT));
parms->nregs += 1;
+ if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
+ {
+ regno += GET_MODE_SIZE (mode) / 4;
+ reg = gen_rtx_REG (mode, regno);
+ XVECEXP (parms->ret, 0, parms->nregs)
+ = gen_rtx_EXPR_LIST (VOIDmode, reg,
+ GEN_INT ((bitpos + GET_MODE_BITSIZE (mode))
+ / BITS_PER_UNIT));
+ parms->nregs += 1;
+ }
}
else
{
@@ -4693,8 +5070,9 @@ function_arg_pass_by_reference (cum, mode, type, named)
return ((type && TREE_CODE (type) == ARRAY_TYPE)
/* Consider complex values as aggregates, so care for TCmode. */
|| GET_MODE_SIZE (mode) > 16
- || (type && AGGREGATE_TYPE_P (type)
- && int_size_in_bytes (type) > 16));
+ || (type
+ && AGGREGATE_TYPE_P (type)
+ && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 16));
}
}
@@ -4846,7 +5224,7 @@ sparc_builtin_saveregs ()
emit_move_insn (gen_rtx_MEM (word_mode,
gen_rtx_PLUS (Pmode,
frame_pointer_rtx,
- GEN_INT (STACK_POINTER_OFFSET
+ GEN_INT (FIRST_PARM_OFFSET (0)
+ (UNITS_PER_WORD
* regno)))),
gen_rtx_REG (word_mode,
@@ -4854,7 +5232,7 @@ sparc_builtin_saveregs ()
address = gen_rtx_PLUS (Pmode,
frame_pointer_rtx,
- GEN_INT (STACK_POINTER_OFFSET
+ GEN_INT (FIRST_PARM_OFFSET (0)
+ UNITS_PER_WORD * first_reg));
return address;
@@ -4895,11 +5273,15 @@ sparc_va_arg (valist, type)
if (AGGREGATE_TYPE_P (type))
{
- if (size > 16)
+ if ((unsigned HOST_WIDE_INT) size > 16)
{
indirect = 1;
size = rsize = UNITS_PER_WORD;
}
+ /* SPARC v9 ABI states that structures up to 8 bytes in size are
+ given one 8 byte slot. */
+ else if (size == 0)
+ size = rsize = UNITS_PER_WORD;
else
size = rsize;
}
@@ -4994,25 +5376,43 @@ sparc_va_arg (valist, type)
INSN, if set, is the insn. */
char *
-output_cbranch (op, label, reversed, annul, noop, insn)
- rtx op;
+output_cbranch (op, dest, label, reversed, annul, noop, insn)
+ rtx op, dest;
int label;
int reversed, annul, noop;
rtx insn;
{
- static char string[32];
+ static char string[50];
enum rtx_code code = GET_CODE (op);
rtx cc_reg = XEXP (op, 0);
enum machine_mode mode = GET_MODE (cc_reg);
- static char v8_labelno[] = "%lX";
- static char v9_icc_labelno[] = "%%icc, %lX";
- static char v9_xcc_labelno[] = "%%xcc, %lX";
- static char v9_fcc_labelno[] = "%%fccX, %lY";
- char *labelno;
- const char *branch;
- int labeloff, spaces = 8;
+ const char *labelno, *branch;
+ int spaces = 8, far;
+ char *p;
+
+ /* v9 branches are limited to +-1MB. If it is too far away,
+ change
+
+ bne,pt %xcc, .LC30
+
+ to
+
+ be,pn %xcc, .+12
+ nop
+ ba .LC30
+
+ and
+
+ fbne,a,pn %fcc2, .LC29
+
+ to
- if (reversed)
+ fbe,pt %fcc2, .+16
+ nop
+ ba .LC29 */
+
+ far = get_attr_length (insn) >= 3;
+ if (reversed ^ far)
{
/* Reversal of FP compares takes care -- an ordered compare
becomes an unordered compare and vice versa. */
@@ -5095,7 +5495,7 @@ output_cbranch (op, label, reversed, annul, noop, insn)
branch = "be";
break;
case GE:
- if (mode == CC_NOOVmode)
+ if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
branch = "bpos";
else
branch = "bge";
@@ -5107,7 +5507,7 @@ output_cbranch (op, label, reversed, annul, noop, insn)
branch = "ble";
break;
case LT:
- if (mode == CC_NOOVmode)
+ if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
branch = "bneg";
else
branch = "bl";
@@ -5131,54 +5531,89 @@ output_cbranch (op, label, reversed, annul, noop, insn)
strcpy (string, branch);
}
spaces -= strlen (branch);
+ p = strchr (string, '\0');
/* Now add the annulling, the label, and a possible noop. */
- if (annul)
+ if (annul && ! far)
{
- strcat (string, ",a");
+ strcpy (p, ",a");
+ p += 2;
spaces -= 2;
}
if (! TARGET_V9)
- {
- labeloff = 2;
- labelno = v8_labelno;
- }
+ labelno = "";
else
{
rtx note;
+ int v8 = 0;
- if (insn && (note = find_reg_note (insn, REG_BR_PRED, NULL_RTX)))
+ if (! far && insn && INSN_ADDRESSES_SET_P ())
{
- strcat (string,
- INTVAL (XEXP (note, 0)) & ATTR_FLAG_likely ? ",pt" : ",pn");
- spaces -= 3;
+ int delta = (INSN_ADDRESSES (INSN_UID (dest))
+ - INSN_ADDRESSES (INSN_UID (insn)));
+ /* Leave some instructions for "slop". */
+ if (delta < -260000 || delta >= 260000)
+ v8 = 1;
}
- labeloff = 9;
if (mode == CCFPmode || mode == CCFPEmode)
{
- labeloff = 10;
- labelno = v9_fcc_labelno;
+ static char v9_fcc_labelno[] = "%%fccX, ";
/* Set the char indicating the number of the fcc reg to use. */
- labelno[5] = REGNO (cc_reg) - SPARC_FIRST_V9_FCC_REG + '0';
+ v9_fcc_labelno[5] = REGNO (cc_reg) - SPARC_FIRST_V9_FCC_REG + '0';
+ labelno = v9_fcc_labelno;
+ if (v8)
+ {
+ if (REGNO (cc_reg) == SPARC_FCC_REG)
+ labelno = "";
+ else
+ abort ();
+ }
}
else if (mode == CCXmode || mode == CCX_NOOVmode)
- labelno = v9_xcc_labelno;
+ {
+ labelno = "%%xcc, ";
+ if (v8)
+ abort ();
+ }
else
- labelno = v9_icc_labelno;
+ {
+ labelno = "%%icc, ";
+ if (v8)
+ labelno = "";
+ }
+
+ if (*labelno && insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
+ {
+ strcpy (p,
+ ((INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ^ far)
+ ? ",pt" : ",pn");
+ p += 3;
+ spaces -= 3;
+ }
}
- /* Set the char indicating the number of the operand containing the
- label_ref. */
- labelno[labeloff] = label + '0';
if (spaces > 0)
- strcat (string, "\t");
+ *p++ = '\t';
else
- strcat (string, " ");
- strcat (string, labelno);
-
+ *p++ = ' ';
+ strcpy (p, labelno);
+ p = strchr (p, '\0');
+ if (far)
+ {
+ strcpy (p, ".+12\n\tnop\n\tb\t");
+ if (annul || noop)
+ p[3] = '6';
+ p += 13;
+ }
+ *p++ = '%';
+ *p++ = 'l';
+ /* Set the char indicating the number of the operand containing the
+ label_ref. */
+ *p++ = label + '0';
+ *p = '\0';
if (noop)
- strcat (string, "\n\tnop");
+ strcpy (p, "\n\tnop");
return string;
}
@@ -5257,7 +5692,7 @@ sparc_emit_float_lib_cmp (x, y, comparison)
else
slot1 = y;
- emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), 1,
+ emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), LCT_NORMAL,
DImode, 2,
XEXP (slot0, 0), Pmode,
XEXP (slot1, 0), Pmode);
@@ -5266,7 +5701,7 @@ sparc_emit_float_lib_cmp (x, y, comparison)
}
else
{
- emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), 1,
+ emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), LCT_NORMAL,
SImode, 2,
x, TFmode, y, TFmode);
@@ -5324,6 +5759,42 @@ sparc_emit_float_lib_cmp (x, y, comparison)
}
}
+/* Generate an unsigned DImode to FP conversion. This is the same code
+ optabs would emit if we didn't have TFmode patterns. */
+
+void
+sparc_emit_floatunsdi (operands)
+ rtx operands[2];
+{
+ rtx neglab, donelab, i0, i1, f0, in, out;
+ enum machine_mode mode;
+
+ out = operands[0];
+ in = force_reg (DImode, operands[1]);
+ mode = GET_MODE (out);
+ neglab = gen_label_rtx ();
+ donelab = gen_label_rtx ();
+ i0 = gen_reg_rtx (DImode);
+ i1 = gen_reg_rtx (DImode);
+ f0 = gen_reg_rtx (mode);
+
+ emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, DImode, 0, neglab);
+
+ emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_FLOAT (mode, in)));
+ emit_jump_insn (gen_jump (donelab));
+ emit_barrier ();
+
+ emit_label (neglab);
+
+ emit_insn (gen_lshrdi3 (i0, in, const1_rtx));
+ emit_insn (gen_anddi3 (i1, in, const1_rtx));
+ emit_insn (gen_iordi3 (i0, i0, i1));
+ emit_insn (gen_rtx_SET (VOIDmode, f0, gen_rtx_FLOAT (mode, i0)));
+ emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
+
+ emit_label (donelab);
+}
+
/* Return the string to output a conditional branch to LABEL, testing
register REG. LABEL is the operand number of the label; REG is the
operand number of the reg. OP is the conditional expression. The mode
@@ -5336,22 +5807,45 @@ sparc_emit_float_lib_cmp (x, y, comparison)
NOOP is non-zero if we have to follow this branch by a noop. */
char *
-output_v9branch (op, reg, label, reversed, annul, noop, insn)
- rtx op;
+output_v9branch (op, dest, reg, label, reversed, annul, noop, insn)
+ rtx op, dest;
int reg, label;
int reversed, annul, noop;
rtx insn;
{
- static char string[20];
+ static char string[50];
enum rtx_code code = GET_CODE (op);
enum machine_mode mode = GET_MODE (XEXP (op, 0));
- static char labelno[] = "%X, %lX";
rtx note;
- int spaces = 8;
+ int far;
+ char *p;
+
+ /* branch on register are limited to +-128KB. If it is too far away,
+ change
+
+ brnz,pt %g1, .LC30
+
+ to
+
+ brz,pn %g1, .+12
+ nop
+ ba,pt %xcc, .LC30
+
+ and
+
+ brgez,a,pn %o1, .LC29
+
+ to
+
+ brlz,pt %o1, .+16
+ nop
+ ba,pt %xcc, .LC29 */
+
+ far = get_attr_length (insn) >= 3;
/* If not floating-point or if EQ or NE, we can just reverse the code. */
- if (reversed)
- code = reverse_condition (code), reversed = 0;
+ if (reversed ^ far)
+ code = reverse_condition (code);
/* Only 64 bit versions of these instructions exist. */
if (mode != DImode)
@@ -5363,62 +5857,90 @@ output_v9branch (op, reg, label, reversed, annul, noop, insn)
{
case NE:
strcpy (string, "brnz");
- spaces -= 4;
break;
case EQ:
strcpy (string, "brz");
- spaces -= 3;
break;
case GE:
strcpy (string, "brgez");
- spaces -= 5;
break;
case LT:
strcpy (string, "brlz");
- spaces -= 4;
break;
case LE:
strcpy (string, "brlez");
- spaces -= 5;
break;
case GT:
strcpy (string, "brgz");
- spaces -= 4;
break;
default:
abort ();
}
+ p = strchr (string, '\0');
+
/* Now add the annulling, reg, label, and nop. */
- if (annul)
+ if (annul && ! far)
{
- strcat (string, ",a");
- spaces -= 2;
+ strcpy (p, ",a");
+ p += 2;
}
- if (insn && (note = find_reg_note (insn, REG_BR_PRED, NULL_RTX)))
+ if (insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
{
- strcat (string,
- INTVAL (XEXP (note, 0)) & ATTR_FLAG_likely ? ",pt" : ",pn");
- spaces -= 3;
+ strcpy (p,
+ ((INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ^ far)
+ ? ",pt" : ",pn");
+ p += 3;
}
- labelno[1] = reg + '0';
- labelno[6] = label + '0';
- if (spaces > 0)
- strcat (string, "\t");
- else
- strcat (string, " ");
- strcat (string, labelno);
+ *p = p < string + 8 ? '\t' : ' ';
+ p++;
+ *p++ = '%';
+ *p++ = '0' + reg;
+ *p++ = ',';
+ *p++ = ' ';
+ if (far)
+ {
+ int veryfar = 1, delta;
+
+ if (INSN_ADDRESSES_SET_P ())
+ {
+ delta = (INSN_ADDRESSES (INSN_UID (dest))
+ - INSN_ADDRESSES (INSN_UID (insn)));
+ /* Leave some instructions for "slop". */
+ if (delta >= -260000 && delta < 260000)
+ veryfar = 0;
+ }
+
+ strcpy (p, ".+12\n\tnop\n\t");
+ if (annul || noop)
+ p[3] = '6';
+ p += 11;
+ if (veryfar)
+ {
+ strcpy (p, "b\t");
+ p += 2;
+ }
+ else
+ {
+ strcpy (p, "ba,pt\t%%xcc, ");
+ p += 13;
+ }
+ }
+ *p++ = '%';
+ *p++ = 'l';
+ *p++ = '0' + label;
+ *p = '\0';
if (noop)
- strcat (string, "\n\tnop");
+ strcpy (p, "\n\tnop");
return string;
}
@@ -5467,7 +5989,7 @@ epilogue_renumber (where, test)
are in the return delayed slot. */
case PLUS:
if (GET_CODE (XEXP (*where, 0)) == REG
- && REGNO (XEXP (*where, 0)) == FRAME_POINTER_REGNUM
+ && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM
&& (GET_CODE (XEXP (*where, 1)) != CONST_INT
|| INTVAL (XEXP (*where, 1)) < SPARC_STACK_BIAS))
return 1;
@@ -5476,7 +5998,7 @@ epilogue_renumber (where, test)
case MEM:
if (SPARC_STACK_BIAS
&& GET_CODE (XEXP (*where, 0)) == REG
- && REGNO (XEXP (*where, 0)) == FRAME_POINTER_REGNUM)
+ && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM)
return 1;
break;
@@ -5501,87 +6023,6 @@ epilogue_renumber (where, test)
}
return 0;
}
-
-/* Output assembler code to return from a function. */
-
-const char *
-output_return (operands)
- rtx *operands;
-{
- rtx delay = final_sequence ? XVECEXP (final_sequence, 0, 1) : 0;
-
- if (leaf_label)
- {
- operands[0] = leaf_label;
- return "b%* %l0%(";
- }
- else if (current_function_uses_only_leaf_regs)
- {
- /* No delay slot in a leaf function. */
- if (delay)
- abort ();
-
- /* If we didn't allocate a frame pointer for the current function,
- the stack pointer might have been adjusted. Output code to
- restore it now. */
-
- operands[0] = GEN_INT (actual_fsize);
-
- /* Use sub of negated value in first two cases instead of add to
- allow actual_fsize == 4096. */
-
- if (actual_fsize <= 4096)
- {
- if (SKIP_CALLERS_UNIMP_P)
- return "jmp\t%%o7+12\n\tsub\t%%sp, -%0, %%sp";
- else
- return "retl\n\tsub\t%%sp, -%0, %%sp";
- }
- else if (actual_fsize <= 8192)
- {
- operands[0] = GEN_INT (actual_fsize - 4096);
- if (SKIP_CALLERS_UNIMP_P)
- return "sub\t%%sp, -4096, %%sp\n\tjmp\t%%o7+12\n\tsub\t%%sp, -%0, %%sp";
- else
- return "sub\t%%sp, -4096, %%sp\n\tretl\n\tsub\t%%sp, -%0, %%sp";
- }
- else if (SKIP_CALLERS_UNIMP_P)
- {
- if ((actual_fsize & 0x3ff) != 0)
- return "sethi\t%%hi(%a0), %%g1\n\tor\t%%g1, %%lo(%a0), %%g1\n\tjmp\t%%o7+12\n\tadd\t%%sp, %%g1, %%sp";
- else
- return "sethi\t%%hi(%a0), %%g1\n\tjmp\t%%o7+12\n\tadd\t%%sp, %%g1, %%sp";
- }
- else
- {
- if ((actual_fsize & 0x3ff) != 0)
- return "sethi\t%%hi(%a0), %%g1\n\tor\t%%g1, %%lo(%a0), %%g1\n\tretl\n\tadd\t%%sp, %%g1, %%sp";
- else
- return "sethi\t%%hi(%a0), %%g1\n\tretl\n\tadd\t%%sp, %%g1, %%sp";
- }
- }
- else if (TARGET_V9)
- {
- if (delay)
- {
- epilogue_renumber (&SET_DEST (PATTERN (delay)), 0);
- epilogue_renumber (&SET_SRC (PATTERN (delay)), 0);
- }
- if (SKIP_CALLERS_UNIMP_P)
- return "return\t%%i7+12%#";
- else
- return "return\t%%i7+8%#";
- }
- else
- {
- if (delay)
- abort ();
- if (SKIP_CALLERS_UNIMP_P)
- return "jmp\t%%i7+12\n\trestore";
- else
- return "ret\n\trestore";
- }
-}
/* Leaf functions and non-leaf functions have different needs. */
@@ -5689,6 +6130,20 @@ registers_ok_for_ldd_peep (reg1, reg2)
ld [%o0 + 4], %o1
to
ldd [%o0], %o0
+ nor:
+ ld [%g3 + 4], %g3
+ ld [%g3], %g2
+ to
+ ldd [%g3], %g2
+
+ But, note that the transformation from:
+ ld [%g2 + 4], %g3
+ ld [%g2], %g2
+ to
+ ldd [%g2], %g2
+ is perfectly fine. Thus, the peephole2 patterns always pass us
+ the destination register of the first load, never the second one.
+
For stores we don't have a similar problem, so dependent_reg_rtx is
NULL_RTX. */
@@ -5987,9 +6442,7 @@ print_operand (file, x, code)
case 'b':
{
/* Print a sign-extended character. */
- int i = INTVAL (x) & 0xff;
- if (i & 0x80)
- i |= 0xffffff00;
+ int i = trunc_int_for_mode (INTVAL (x), QImode);
fprintf (file, "%d", i);
return;
}
@@ -6260,38 +6713,42 @@ sparc_initialize_trampoline (tramp, fnaddr, cxt)
*/
#ifdef TRANSFER_FROM_TRAMPOLINE
emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"),
- 0, VOIDmode, 1, tramp, Pmode);
+ LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
#endif
- emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 0)),
- expand_binop (SImode, ior_optab,
- expand_shift (RSHIFT_EXPR, SImode, fnaddr,
- size_int (10), 0, 1),
- GEN_INT (0x03000000),
- NULL_RTX, 1, OPTAB_DIRECT));
-
- emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 4)),
- expand_binop (SImode, ior_optab,
- expand_shift (RSHIFT_EXPR, SImode, cxt,
- size_int (10), 0, 1),
- GEN_INT (0x05000000),
- NULL_RTX, 1, OPTAB_DIRECT));
-
- emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 8)),
- expand_binop (SImode, ior_optab,
- expand_and (fnaddr, GEN_INT (0x3ff), NULL_RTX),
- GEN_INT (0x81c06000),
- NULL_RTX, 1, OPTAB_DIRECT));
-
- emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 12)),
- expand_binop (SImode, ior_optab,
- expand_and (cxt, GEN_INT (0x3ff), NULL_RTX),
- GEN_INT (0x8410a000),
- NULL_RTX, 1, OPTAB_DIRECT));
+ emit_move_insn
+ (gen_rtx_MEM (SImode, plus_constant (tramp, 0)),
+ expand_binop (SImode, ior_optab,
+ expand_shift (RSHIFT_EXPR, SImode, fnaddr,
+ size_int (10), 0, 1),
+ GEN_INT (trunc_int_for_mode (0x03000000, SImode)),
+ NULL_RTX, 1, OPTAB_DIRECT));
+
+ emit_move_insn
+ (gen_rtx_MEM (SImode, plus_constant (tramp, 4)),
+ expand_binop (SImode, ior_optab,
+ expand_shift (RSHIFT_EXPR, SImode, cxt,
+ size_int (10), 0, 1),
+ GEN_INT (trunc_int_for_mode (0x05000000, SImode)),
+ NULL_RTX, 1, OPTAB_DIRECT));
+
+ emit_move_insn
+ (gen_rtx_MEM (SImode, plus_constant (tramp, 8)),
+ expand_binop (SImode, ior_optab,
+ expand_and (SImode, fnaddr, GEN_INT (0x3ff), NULL_RTX),
+ GEN_INT (trunc_int_for_mode (0x81c06000, SImode)),
+ NULL_RTX, 1, OPTAB_DIRECT));
+
+ emit_move_insn
+ (gen_rtx_MEM (SImode, plus_constant (tramp, 12)),
+ expand_binop (SImode, ior_optab,
+ expand_and (SImode, cxt, GEN_INT (0x3ff), NULL_RTX),
+ GEN_INT (trunc_int_for_mode (0x8410a000, SImode)),
+ NULL_RTX, 1, OPTAB_DIRECT));
- emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode, tramp))));
/* On UltraSPARC a flush flushes an entire cache line. The trampoline is
aligned on a 16 byte boundary so one flush clears it all. */
+ emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode, tramp))));
if (sparc_cpu != PROCESSOR_ULTRASPARC)
emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode,
plus_constant (tramp, 8)))));
@@ -6307,7 +6764,7 @@ sparc64_initialize_trampoline (tramp, fnaddr, cxt)
{
#ifdef TRANSFER_FROM_TRAMPOLINE
emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"),
- 0, VOIDmode, 1, tramp, Pmode);
+ LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
#endif
/*
@@ -6319,13 +6776,13 @@ sparc64_initialize_trampoline (tramp, fnaddr, cxt)
*/
emit_move_insn (gen_rtx_MEM (SImode, tramp),
- GEN_INT (0x83414000));
+ GEN_INT (trunc_int_for_mode (0x83414000, SImode)));
emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 4)),
- GEN_INT (0xca586018));
+ GEN_INT (trunc_int_for_mode (0xca586018, SImode)));
emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 8)),
- GEN_INT (0x81c14000));
+ GEN_INT (trunc_int_for_mode (0x81c14000, SImode)));
emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 12)),
- GEN_INT (0xca586010));
+ GEN_INT (trunc_int_for_mode (0xca586010, SImode)));
emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, 16)), cxt);
emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, 24)), fnaddr);
emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode, tramp))));
@@ -6421,12 +6878,12 @@ struct sparc_frame_info zero_frame_info;
/* Tell prologue and epilogue if register REGNO should be saved / restored. */
#define RETURN_ADDR_REGNUM 15
-#define FRAME_POINTER_MASK (1 << (FRAME_POINTER_REGNUM))
+#define HARD_FRAME_POINTER_MASK (1 << (HARD_FRAME_POINTER_REGNUM))
#define RETURN_ADDR_MASK (1 << (RETURN_ADDR_REGNUM))
#define MUST_SAVE_REGISTER(regno) \
- ((regs_ever_live[regno] && !call_used_regs[regno]) \
- || (regno == FRAME_POINTER_REGNUM && frame_pointer_needed) \
+ ((regs_ever_live[regno] && !call_used_regs[regno]) \
+ || (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed) \
|| (regno == RETURN_ADDR_REGNUM && regs_ever_live[RETURN_ADDR_REGNUM]))
/* Return the bytes needed to compute the frame pointer from the current
@@ -6699,7 +7156,7 @@ sparc_flat_function_prologue (file, size)
if (size > 0)
{
unsigned int reg_offset = current_frame_info.reg_offset;
- const char *const fp_str = reg_names[FRAME_POINTER_REGNUM];
+ const char *const fp_str = reg_names[HARD_FRAME_POINTER_REGNUM];
static const char *const t1_str = "%g1";
/* Things get a little tricky if local variables take up more than ~4096
@@ -6720,7 +7177,7 @@ sparc_flat_function_prologue (file, size)
{
fprintf (file, "\tadd\t%s, %d, %s\n",
sp_str, (int) -size, sp_str);
- if (gmask & FRAME_POINTER_MASK)
+ if (gmask & HARD_FRAME_POINTER_MASK)
{
fprintf (file, "\tst\t%s, [%s+%d]\n",
fp_str, sp_str, reg_offset);
@@ -6735,7 +7192,7 @@ sparc_flat_function_prologue (file, size)
fprintf (file, HOST_WIDE_INT_PRINT_DEC, size);
fprintf (file, ", %s\n\tsub\t%s, %s, %s\n",
t1_str, sp_str, t1_str, sp_str);
- if (gmask & FRAME_POINTER_MASK)
+ if (gmask & HARD_FRAME_POINTER_MASK)
{
fprintf (file, "\tst\t%s, [%s+%d]\n",
fp_str, sp_str, reg_offset);
@@ -6747,11 +7204,11 @@ sparc_flat_function_prologue (file, size)
if (dwarf2out_do_frame ())
{
char *l = dwarf2out_cfi_label ();
- if (gmask & FRAME_POINTER_MASK)
+ if (gmask & HARD_FRAME_POINTER_MASK)
{
- dwarf2out_reg_save (l, FRAME_POINTER_REGNUM,
+ dwarf2out_reg_save (l, HARD_FRAME_POINTER_REGNUM,
reg_offset - 4 - size);
- dwarf2out_def_cfa (l, FRAME_POINTER_REGNUM, 0);
+ dwarf2out_def_cfa (l, HARD_FRAME_POINTER_REGNUM, 0);
}
else
dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, size);
@@ -6765,7 +7222,7 @@ sparc_flat_function_prologue (file, size)
reg_offset += 4;
}
sparc_flat_save_restore (file, sp_str, reg_offset,
- gmask & ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK),
+ gmask & ~(HARD_FRAME_POINTER_MASK | RETURN_ADDR_MASK),
current_frame_info.fmask,
"st", "std", -size);
}
@@ -6782,7 +7239,7 @@ sparc_flat_function_prologue (file, size)
{
fprintf (file, "\tadd\t%s, %d, %s\n",
sp_str, (int) -size1, sp_str);
- if (gmask & FRAME_POINTER_MASK)
+ if (gmask & HARD_FRAME_POINTER_MASK)
{
fprintf (file, "\tst\t%s, [%s+%d]\n\tsub\t%s, %d, %s\t%s# set up frame pointer\n",
fp_str, sp_str, (int) offset, sp_str, (int) -size1,
@@ -6796,7 +7253,7 @@ sparc_flat_function_prologue (file, size)
fprintf (file, HOST_WIDE_INT_PRINT_DEC, size1);
fprintf (file, ", %s\n\tsub\t%s, %s, %s\n",
t1_str, sp_str, t1_str, sp_str);
- if (gmask & FRAME_POINTER_MASK)
+ if (gmask & HARD_FRAME_POINTER_MASK)
{
fprintf (file, "\tst\t%s, [%s+%d]\n\tadd\t%s, %s, %s\t%s# set up frame pointer\n",
fp_str, sp_str, (int) offset, sp_str, t1_str,
@@ -6807,11 +7264,11 @@ sparc_flat_function_prologue (file, size)
if (dwarf2out_do_frame ())
{
char *l = dwarf2out_cfi_label ();
- if (gmask & FRAME_POINTER_MASK)
+ if (gmask & HARD_FRAME_POINTER_MASK)
{
- dwarf2out_reg_save (l, FRAME_POINTER_REGNUM,
+ dwarf2out_reg_save (l, HARD_FRAME_POINTER_REGNUM,
offset - 4 - size1);
- dwarf2out_def_cfa (l, FRAME_POINTER_REGNUM, 0);
+ dwarf2out_def_cfa (l, HARD_FRAME_POINTER_REGNUM, 0);
}
else
dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, size1);
@@ -6827,7 +7284,7 @@ sparc_flat_function_prologue (file, size)
offset += 4;
}
sparc_flat_save_restore (file, sp_str, offset,
- gmask & ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK),
+ gmask & ~(HARD_FRAME_POINTER_MASK | RETURN_ADDR_MASK),
current_frame_info.fmask,
"st", "std", -size1);
fprintf (file, "\tset\t");
@@ -6835,7 +7292,7 @@ sparc_flat_function_prologue (file, size)
fprintf (file, ", %s\n\tsub\t%s, %s, %s\n",
t1_str, sp_str, t1_str, sp_str);
if (dwarf2out_do_frame ())
- if (! (gmask & FRAME_POINTER_MASK))
+ if (! (gmask & HARD_FRAME_POINTER_MASK))
dwarf2out_def_cfa ("", STACK_POINTER_REGNUM, size);
}
}
@@ -6884,7 +7341,7 @@ sparc_flat_function_epilogue (file, size)
unsigned HOST_WIDE_INT reg_offset = current_frame_info.reg_offset;
unsigned HOST_WIDE_INT size1;
const char *const sp_str = reg_names[STACK_POINTER_REGNUM];
- const char *const fp_str = reg_names[FRAME_POINTER_REGNUM];
+ const char *const fp_str = reg_names[HARD_FRAME_POINTER_REGNUM];
static const char *const t1_str = "%g1";
/* In the reload sequence, we don't need to fill the load delay
@@ -6930,7 +7387,7 @@ sparc_flat_function_epilogue (file, size)
/* We must restore the frame pointer and return address reg first
because they are treated specially by the prologue output code. */
- if (current_frame_info.gmask & FRAME_POINTER_MASK)
+ if (current_frame_info.gmask & HARD_FRAME_POINTER_MASK)
{
fprintf (file, "\tld\t[%s+%d], %s\n",
sp_str, (int) reg_offset, fp_str);
@@ -6945,7 +7402,7 @@ sparc_flat_function_epilogue (file, size)
/* Restore any remaining saved registers. */
sparc_flat_save_restore (file, sp_str, reg_offset,
- current_frame_info.gmask & ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK),
+ current_frame_info.gmask & ~(HARD_FRAME_POINTER_MASK | RETURN_ADDR_MASK),
current_frame_info.fmask,
"ld", "ldd", 0);
@@ -8397,60 +8854,24 @@ sparc_v8plus_shift (operands, insn, opcode)
else
return strcat (asm_code, "\t%3, %2, %3\n\tsrlx\t%3, 32, %H0\n\tmov\t%3, %L0");
}
-
-
-/* Return 1 if DEST and SRC reference only global and in registers. */
-
-int
-sparc_return_peephole_ok (dest, src)
- rtx dest, src;
-{
- if (! TARGET_V9)
- return 0;
- if (current_function_uses_only_leaf_regs)
- return 0;
- if (GET_CODE (src) != CONST_INT
- && (GET_CODE (src) != REG || ! IN_OR_GLOBAL_P (src)))
- return 0;
- return IN_OR_GLOBAL_P (dest);
-}
-/* Output assembler code to FILE to increment profiler label # LABELNO
- for profiling a function entry.
-
- 32 bit sparc uses %g2 as the STATIC_CHAIN_REGNUM which gets clobbered
- during profiling so we need to save/restore it around the call to mcount.
- We're guaranteed that a save has just been done, and we use the space
- allocated for intreg/fpreg value passing. */
+/* Output rtl to increment the profiler label LABELNO
+ for profiling a function entry. */
void
-sparc_function_profiler (file, labelno)
- FILE *file;
+sparc_profile_hook (labelno)
int labelno;
{
char buf[32];
- ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
-
- if (! TARGET_ARCH64)
- fputs ("\tst\t%g2, [%fp-4]\n", file);
-
- fputs ("\tsethi\t%hi(", file);
- assemble_name (file, buf);
- fputs ("), %o0\n", file);
+ rtx lab, fun;
- fputs ("\tcall\t", file);
- assemble_name (file, MCOUNT_FUNCTION);
- putc ('\n', file);
-
- fputs ("\t or\t%o0, %lo(", file);
- assemble_name (file, buf);
- fputs ("), %o0\n", file);
+ ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
+ lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
+ fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_FUNCTION);
- if (! TARGET_ARCH64)
- fputs ("\tld\t[%fp-4], %g2\n", file);
+ emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lab, Pmode);
}
-
-
+
/* Mark ARG, which is really a struct ultrasparc_pipline_state *, for
GC. */
@@ -8474,7 +8895,6 @@ sparc_add_gc_roots ()
{
ggc_add_rtx_root (&sparc_compare_op0, 1);
ggc_add_rtx_root (&sparc_compare_op1, 1);
- ggc_add_rtx_root (&leaf_label, 1);
ggc_add_rtx_root (&global_offset_table, 1);
ggc_add_rtx_root (&get_pc_symbol, 1);
ggc_add_rtx_root (&sparc_addr_diff_list, 1);
@@ -8511,3 +8931,65 @@ sparc_elf_asm_named_section (name, flags)
fputc ('\n', asm_out_file);
}
#endif /* OBJECT_FORMAT_ELF */
+
+int
+sparc_extra_constraint_check (op, c, strict)
+ rtx op;
+ int c;
+ int strict;
+{
+ int reload_ok_mem;
+
+ if (TARGET_ARCH64
+ && (c == 'T' || c == 'U'))
+ return 0;
+
+ switch (c)
+ {
+ case 'Q':
+ return fp_sethi_p (op);
+
+ case 'R':
+ return fp_mov_p (op);
+
+ case 'S':
+ return fp_high_losum_p (op);
+
+ case 'U':
+ if (! strict
+ || (GET_CODE (op) == REG
+ && (REGNO (op) < FIRST_PSEUDO_REGISTER
+ || reg_renumber[REGNO (op)] >= 0)))
+ return register_ok_for_ldd (op);
+
+ return 0;
+
+ case 'W':
+ case 'T':
+ break;
+
+ default:
+ return 0;
+ }
+
+ /* Our memory extra constraints have to emulate the
+ behavior of 'm' and 'o' in order for reload to work
+ correctly. */
+ if (GET_CODE (op) == MEM)
+ {
+ reload_ok_mem = 0;
+ if ((TARGET_ARCH64 || mem_min_alignment (op, 8))
+ && (! strict
+ || strict_memory_address_p (Pmode, XEXP (op, 0))))
+ reload_ok_mem = 1;
+ }
+ else
+ {
+ reload_ok_mem = (reload_in_progress
+ && GET_CODE (op) == REG
+ && REGNO (op) >= FIRST_PSEUDO_REGISTER
+ && reg_renumber [REGNO (op)] < 0);
+ }
+
+ return reload_ok_mem;
+}
diff --git a/contrib/gcc/config/sparc/sparc.h b/contrib/gcc/config/sparc/sparc.h
index 608b393..3f21578 100644
--- a/contrib/gcc/config/sparc/sparc.h
+++ b/contrib/gcc/config/sparc/sparc.h
@@ -358,6 +358,11 @@ Unrecognized value in TARGET_CPU_DEFAULT.
SUBTARGET_EXTRA_SPECS
#define SUBTARGET_EXTRA_SPECS
+
+/* Because libgcc can generate references back to libc (via .umul etc.) we have
+ to list libc again after the second libgcc. */
+#define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G %L"
+
#ifdef SPARC_BI_ARCH
#define NO_BUILTIN_PTRDIFF_TYPE
@@ -369,34 +374,11 @@ Unrecognized value in TARGET_CPU_DEFAULT.
/* ??? This should be 32 bits for v9 but what can we do? */
#define WCHAR_TYPE "short unsigned int"
#define WCHAR_TYPE_SIZE 16
-#define MAX_WCHAR_TYPE_SIZE 16
/* Show we can debug even without a frame pointer. */
#define CAN_DEBUG_WITHOUT_FP
-/* To make profiling work with -f{pic,PIC}, we need to emit the profiling
- code into the rtl. Also, if we are profiling, we cannot eliminate
- the frame pointer (because the return address will get smashed). */
-
-#define OVERRIDE_OPTIONS \
- do { \
- if (profile_flag || profile_arc_flag) \
- { \
- if (flag_pic) \
- { \
- const char *const pic_string = (flag_pic == 1) ? "-fpic" : "-fPIC";\
- warning ("%s and profiling conflict: disabling %s", \
- pic_string, pic_string); \
- flag_pic = 0; \
- } \
- flag_omit_frame_pointer = 0; \
- } \
- sparc_override_options (); \
- SUBTARGET_OVERRIDE_OPTIONS; \
- } while (0)
-
-/* This is meant to be redefined in the host dependent files. */
-#define SUBTARGET_OVERRIDE_OPTIONS
+#define OVERRIDE_OPTIONS sparc_override_options ()
/* Generate DBX debugging information. */
@@ -410,11 +392,6 @@ extern int target_flags;
#define MASK_FPU 1
#define TARGET_FPU (target_flags & MASK_FPU)
-/* Nonzero if we should use function_epilogue(). Otherwise, we
- use fast return insns, but lose some generality. */
-#define MASK_EPILOGUE 2
-#define TARGET_EPILOGUE (target_flags & MASK_EPILOGUE)
-
/* Nonzero if we should assume that double pointers might be unaligned.
This can happen when linking gcc compiled code with other compilers,
because the ABI only guarantees 4 byte alignment. */
@@ -558,10 +535,6 @@ extern int target_flags;
{"soft-float", -MASK_FPU, \
N_("Do not use hardware fp") }, \
{"soft-float", MASK_FPU_SET, NULL }, \
- {"epilogue", MASK_EPILOGUE, \
- N_("Use function_epilogue()") }, \
- {"no-epilogue", -MASK_EPILOGUE, \
- N_("Do not use function_epilogue()") }, \
{"unaligned-doubles", MASK_UNALIGNED_DOUBLES, \
N_("Assume possible double misalignment") }, \
{"no-unaligned-doubles", -MASK_UNALIGNED_DOUBLES, \
@@ -630,7 +603,7 @@ extern int target_flags;
/* MASK_APP_REGS must always be the default because that's what
FIXED_REGISTERS is set to and -ffixed- is processed before
CONDITIONAL_REGISTER_USAGE is called (where we process -mno-app-regs). */
-#define TARGET_DEFAULT (MASK_APP_REGS + MASK_EPILOGUE + MASK_FPU)
+#define TARGET_DEFAULT (MASK_APP_REGS + MASK_FPU)
/* This is meant to be redefined in target specific files. */
#define SUBTARGET_SWITCHES
@@ -722,7 +695,11 @@ extern struct sparc_cpu_select sparc_select[];
/* Width of a word, in units (bytes). */
#define UNITS_PER_WORD (TARGET_ARCH64 ? 8 : 4)
+#ifdef IN_LIBGCC2
+#define MIN_UNITS_PER_WORD UNITS_PER_WORD
+#else
#define MIN_UNITS_PER_WORD 4
+#endif
/* Now define the sizes of the C data types. */
@@ -894,9 +871,10 @@ if (TARGET_ARCH64 \
accessible. We still account for them to simplify register computations
(eg: in CLASS_MAX_NREGS). There are also 4 fp condition code registers, so
32+32+32+4 == 100.
- Register 100 is used as the integer condition code register. */
+ Register 100 is used as the integer condition code register.
+ Register 101 is used as the soft frame pointer register. */
-#define FIRST_PSEUDO_REGISTER 101
+#define FIRST_PSEUDO_REGISTER 102
#define SPARC_FIRST_FP_REG 32
/* Additional V9 fp regs. */
@@ -962,7 +940,7 @@ if (TARGET_ARCH64 \
0, 0, 0, 0, 0, 0, 0, 0, \
0, 0, 0, 0, 0, 0, 0, 0, \
\
- 0, 0, 0, 0, 0}
+ 0, 0, 0, 0, 0, 1}
/* 1 for registers not available across function calls.
These must include the FIXED_REGISTERS and also any
@@ -987,7 +965,7 @@ if (TARGET_ARCH64 \
1, 1, 1, 1, 1, 1, 1, 1, \
1, 1, 1, 1, 1, 1, 1, 1, \
\
- 1, 1, 1, 1, 1}
+ 1, 1, 1, 1, 1, 1}
/* If !TARGET_FPU, then make the fp registers and fp cc regs fixed so that
they won't be allocated. */
@@ -995,7 +973,7 @@ if (TARGET_ARCH64 \
#define CONDITIONAL_REGISTER_USAGE \
do \
{ \
- if (flag_pic) \
+ if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM) \
{ \
fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
@@ -1039,12 +1017,16 @@ do \
fixed_regs[4] = 0; \
if (TARGET_FLAT) \
{ \
+ int regno; \
/* Let the compiler believe the frame pointer is still \
%fp, but output it as %i7. */ \
fixed_regs[31] = 1; \
- reg_names[FRAME_POINTER_REGNUM] = "%i7"; \
+ reg_names[HARD_FRAME_POINTER_REGNUM] = "%i7"; \
/* Disable leaf functions */ \
memset (sparc_leaf_regs, 0, FIRST_PSEUDO_REGISTER); \
+ /* Make LEAF_REG_REMAP a noop. */ \
+ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) \
+ leaf_reg_remap [regno] = regno; \
} \
} \
while (0)
@@ -1062,9 +1044,9 @@ while (0)
#define HARD_REGNO_NREGS(REGNO, MODE) \
(TARGET_ARCH64 \
- ? ((REGNO) < 32 \
- ? (GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD \
- : (GET_MODE_SIZE (MODE) + 3) / 4) \
+ ? ((REGNO) < 32 || (REGNO) == FRAME_POINTER_REGNUM \
+ ? (GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD \
+ : (GET_MODE_SIZE (MODE) + 3) / 4) \
: ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
/* Due to the ARCH64 descrepancy above we must override this next
@@ -1107,27 +1089,32 @@ extern int sparc_mode_class[];
/* Register to use for pushing function arguments. */
#define STACK_POINTER_REGNUM 14
+/* The stack bias (amount by which the hardware register is offset by). */
+#define SPARC_STACK_BIAS ((TARGET_ARCH64 && TARGET_STACK_BIAS) ? 2047 : 0)
+
/* Actual top-of-stack address is 92/176 greater than the contents of the
stack pointer register for !v9/v9. That is:
- !v9: 64 bytes for the in and local registers, 4 bytes for structure return
address, and 6*4 bytes for the 6 register parameters.
- v9: 128 bytes for the in and local registers + 6*8 bytes for the integer
parameter regs. */
-#define STACK_POINTER_OFFSET FIRST_PARM_OFFSET(0)
-
-/* The stack bias (amount by which the hardware register is offset by). */
-#define SPARC_STACK_BIAS ((TARGET_ARCH64 && TARGET_STACK_BIAS) ? 2047 : 0)
-
-/* Is stack biased? */
-#define STACK_BIAS SPARC_STACK_BIAS
+#define STACK_POINTER_OFFSET (FIRST_PARM_OFFSET(0) + SPARC_STACK_BIAS)
/* Base register for access to local variables of the function. */
-#define FRAME_POINTER_REGNUM 30
-
-#if 0
-/* Register that is used for the return address for the flat model. */
-#define RETURN_ADDR_REGNUM 15
-#endif
+#define HARD_FRAME_POINTER_REGNUM 30
+
+/* The soft frame pointer does not have the stack bias applied. */
+#define FRAME_POINTER_REGNUM 101
+
+/* Given the stack bias, the stack pointer isn't actually aligned. */
+#define INIT_EXPANDERS \
+ do { \
+ if (cfun && cfun->emit->regno_pointer_align && SPARC_STACK_BIAS) \
+ { \
+ REGNO_POINTER_ALIGN (STACK_POINTER_REGNUM) = BITS_PER_UNIT; \
+ REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM) = BITS_PER_UNIT; \
+ } \
+ } while (0)
/* Value should be nonzero if functions must have frame pointers.
Zero means the frame pointer need not be set up (and parms
@@ -1138,21 +1125,13 @@ extern int sparc_mode_class[];
Being a non-leaf function does not mean a frame pointer is needed in the
flat window model. However, the debugger won't be able to backtrace through
us with out it. */
-#define FRAME_POINTER_REQUIRED \
- (TARGET_FLAT ? (current_function_calls_alloca || current_function_varargs \
- || !leaf_function_p ()) \
+#define FRAME_POINTER_REQUIRED \
+ (TARGET_FLAT \
+ ? (current_function_calls_alloca \
+ || current_function_varargs \
+ || !leaf_function_p ()) \
: ! (leaf_function_p () && only_leaf_regs_used ()))
-/* C statement to store the difference between the frame pointer
- and the stack pointer values immediately after the function prologue.
-
- Note, we always pretend that this is a leaf function because if
- it's not, there's no point in trying to eliminate the
- frame pointer. If it is a leaf function, we guessed right! */
-#define INITIAL_FRAME_POINTER_OFFSET(VAR) \
- ((VAR) = (TARGET_FLAT ? sparc_flat_compute_frame_size (get_frame_size ()) \
- : compute_frame_size (get_frame_size (), 1)))
-
/* Base register for access to arguments of the function. */
#define ARG_POINTER_REGNUM FRAME_POINTER_REGNUM
@@ -1163,7 +1142,7 @@ extern int sparc_mode_class[];
/* Register which holds offset table for position-independent
data references. */
-#define PIC_OFFSET_TABLE_REGNUM 23
+#define PIC_OFFSET_TABLE_REGNUM (flag_pic ? 23 : INVALID_REGNUM)
/* Pick a default value we can notice from override_options:
!v9: Default is on.
@@ -1275,10 +1254,16 @@ enum reg_class { NO_REGS, FPCC_REGS, I64_REGS, GENERAL_REGS, FP_REGS,
This is an initializer for a vector of HARD_REG_SET
of length N_REG_CLASSES. */
-#define REG_CLASS_CONTENTS \
- {{0, 0, 0, 0}, {0, 0, 0, 0xf}, {0xffff, 0, 0, 0}, \
- {-1, 0, 0, 0}, {0, -1, 0, 0}, {0, -1, -1, 0}, \
- {-1, -1, 0, 0}, {-1, -1, -1, 0}, {-1, -1, -1, 0x1f}}
+#define REG_CLASS_CONTENTS \
+ {{0, 0, 0, 0}, /* NO_REGS */ \
+ {0, 0, 0, 0xf}, /* FPCC_REGS */ \
+ {0xffff, 0, 0, 0}, /* I64_REGS */ \
+ {-1, 0, 0, 0x20}, /* GENERAL_REGS */ \
+ {0, -1, 0, 0}, /* FP_REGS */ \
+ {0, -1, -1, 0}, /* EXTRA_FP_REGS */ \
+ {-1, -1, 0, 0x20}, /* GENERAL_OR_FP_REGS */ \
+ {-1, -1, -1, 0x20}, /* GENERAL_OR_EXTRA_FP_REGS */ \
+ {-1, -1, -1, 0x3f}} /* ALL_REGS */
/* The same information, inverted:
Return the class number of the smallest class containing
@@ -1310,7 +1295,7 @@ extern enum reg_class sparc_regno_reg_class[FIRST_PSEUDO_REGISTER];
88, 89, 90, 91, 92, 93, 94, 95, /* %f56-%f63 */ \
32, 33, /* %f0,%f1 */ \
96, 97, 98, 99, 100, /* %fcc0-3, %icc */ \
- 1, 4, 5, 6, 7, 0, 14, 30}
+ 1, 4, 5, 6, 7, 0, 14, 30, 101}
/* This is the order in which to allocate registers for
leaf functions. If all registers can fit in the "gi" registers,
@@ -1331,14 +1316,14 @@ extern enum reg_class sparc_regno_reg_class[FIRST_PSEUDO_REGISTER];
88, 89, 90, 91, 92, 93, 94, 95, \
32, 33, \
96, 97, 98, 99, 100, \
- 0, 14, 30, 31}
+ 0, 14, 30, 31, 101}
#define ORDER_REGS_FOR_LOCAL_ALLOC order_regs_for_local_alloc ()
extern char sparc_leaf_regs[];
#define LEAF_REGISTERS sparc_leaf_regs
-extern const char leaf_reg_remap[];
+extern char leaf_reg_remap[];
#define LEAF_REG_REMAP(REGNO) (leaf_reg_remap[REGNO])
/* The class value for index registers, and the one for base regs. */
@@ -1379,7 +1364,8 @@ extern const char leaf_reg_remap[];
`J' is used for the range which is just zero (since that is R0).
`K' is used for constants which can be loaded with a single sethi insn.
`L' is used for the range of constants supported by the movcc insns.
- `M' is used for the range of constants supported by the movrcc insns. */
+ `M' is used for the range of constants supported by the movrcc insns.
+ `N' is like K, but for constants wider than 32 bits. */
#define SPARC_SIMM10_P(X) ((unsigned HOST_WIDE_INT) (X) + 0x200 < 0x400)
#define SPARC_SIMM11_P(X) ((unsigned HOST_WIDE_INT) (X) + 0x400 < 0x800)
@@ -1388,17 +1374,21 @@ extern const char leaf_reg_remap[];
SMALL_INT is used throughout the port so we continue to use it. */
#define SMALL_INT(X) (SPARC_SIMM13_P (INTVAL (X)))
/* 13 bit immediate, considering only the low 32 bits */
-#define SMALL_INT32(X) (SPARC_SIMM13_P ((int)INTVAL (X) & 0xffffffff))
+#define SMALL_INT32(X) (SPARC_SIMM13_P (trunc_int_for_mode \
+ (INTVAL (X), SImode)))
#define SPARC_SETHI_P(X) \
-(((unsigned HOST_WIDE_INT) (X) & \
- (TARGET_ARCH64 ? ~(unsigned HOST_WIDE_INT) 0xfffffc00 : 0x3ff)) == 0)
+ (((unsigned HOST_WIDE_INT) (X) \
+ & ((unsigned HOST_WIDE_INT) 0x3ff - GET_MODE_MASK (SImode) - 1)) == 0)
+#define SPARC_SETHI32_P(X) \
+ (SPARC_SETHI_P ((unsigned HOST_WIDE_INT) (X) & GET_MODE_MASK (SImode)))
#define CONST_OK_FOR_LETTER_P(VALUE, C) \
((C) == 'I' ? SPARC_SIMM13_P (VALUE) \
: (C) == 'J' ? (VALUE) == 0 \
- : (C) == 'K' ? SPARC_SETHI_P (VALUE) \
+ : (C) == 'K' ? SPARC_SETHI32_P (VALUE) \
: (C) == 'L' ? SPARC_SIMM11_P (VALUE) \
: (C) == 'M' ? SPARC_SIMM10_P (VALUE) \
+ : (C) == 'N' ? SPARC_SETHI_P (VALUE) \
: 0)
/* Similar, but for floating constants, and defining letters G and H.
@@ -1440,7 +1430,10 @@ extern const char leaf_reg_remap[];
We need a temporary when loading/storing a HImode/QImode value
between memory and the FPU registers. This can happen when combine puts
- a paradoxical subreg in a float/fix conversion insn. */
+ a paradoxical subreg in a float/fix conversion insn.
+
+ We need a temporary when loading/storing a DFmode value between
+ unaligned memory and the upper FPU registers. */
#define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, IN) \
((FP_REG_CLASS_P (CLASS) \
@@ -1449,28 +1442,36 @@ extern const char leaf_reg_remap[];
|| ((GET_CODE (IN) == REG || GET_CODE (IN) == SUBREG) \
&& true_regnum (IN) == -1))) \
? GENERAL_REGS \
- : (((TARGET_CM_MEDANY \
- && symbolic_operand ((IN), (MODE))) \
- || (TARGET_CM_EMBMEDANY \
- && text_segment_operand ((IN), (MODE)))) \
- && !flag_pic) \
- ? GENERAL_REGS \
- : NO_REGS)
+ : ((CLASS) == EXTRA_FP_REGS && (MODE) == DFmode \
+ && GET_CODE (IN) == MEM && TARGET_ARCH32 \
+ && ! mem_min_alignment ((IN), 8)) \
+ ? FP_REGS \
+ : (((TARGET_CM_MEDANY \
+ && symbolic_operand ((IN), (MODE))) \
+ || (TARGET_CM_EMBMEDANY \
+ && text_segment_operand ((IN), (MODE)))) \
+ && !flag_pic) \
+ ? GENERAL_REGS \
+ : NO_REGS)
#define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, IN) \
- ((FP_REG_CLASS_P (CLASS) \
+ ((FP_REG_CLASS_P (CLASS) \
&& ((MODE) == HImode || (MODE) == QImode) \
&& (GET_CODE (IN) == MEM \
|| ((GET_CODE (IN) == REG || GET_CODE (IN) == SUBREG) \
&& true_regnum (IN) == -1))) \
- ? GENERAL_REGS \
- : (((TARGET_CM_MEDANY \
- && symbolic_operand ((IN), (MODE))) \
- || (TARGET_CM_EMBMEDANY \
- && text_segment_operand ((IN), (MODE)))) \
- && !flag_pic) \
- ? GENERAL_REGS \
- : NO_REGS)
+ ? GENERAL_REGS \
+ : ((CLASS) == EXTRA_FP_REGS && (MODE) == DFmode \
+ && GET_CODE (IN) == MEM && TARGET_ARCH32 \
+ && ! mem_min_alignment ((IN), 8)) \
+ ? FP_REGS \
+ : (((TARGET_CM_MEDANY \
+ && symbolic_operand ((IN), (MODE))) \
+ || (TARGET_CM_EMBMEDANY \
+ && text_segment_operand ((IN), (MODE)))) \
+ && !flag_pic) \
+ ? GENERAL_REGS \
+ : NO_REGS)
/* On SPARC it is not possible to directly move data between
GENERAL_REGS and FP_REGS. */
@@ -1535,7 +1536,7 @@ extern const char leaf_reg_remap[];
of the first local allocated. */
/* This allows space for one TFmode floating point value. */
#define STARTING_FRAME_OFFSET \
- (TARGET_ARCH64 ? (SPARC_STACK_BIAS - 16) \
+ (TARGET_ARCH64 ? -16 \
: (-SPARC_STACK_ALIGN (LONG_DOUBLE_TYPE_SIZE / BITS_PER_UNIT)))
/* If we generate an insn to push BYTES bytes,
@@ -1548,14 +1549,12 @@ extern const char leaf_reg_remap[];
even if this function isn't going to use it.
v9: This is 128 for the ins and locals. */
#define FIRST_PARM_OFFSET(FNDECL) \
- (TARGET_ARCH64 ? (SPARC_STACK_BIAS + 16 * UNITS_PER_WORD) \
- : (STRUCT_VALUE_OFFSET + UNITS_PER_WORD))
+ (TARGET_ARCH64 ? 16 * UNITS_PER_WORD : STRUCT_VALUE_OFFSET + UNITS_PER_WORD)
/* Offset from the argument pointer register value to the CFA.
This is different from FIRST_PARM_OFFSET because the register window
comes between the CFA and the arguments. */
-
-#define ARG_POINTER_CFA_OFFSET(FNDECL) SPARC_STACK_BIAS
+#define ARG_POINTER_CFA_OFFSET(FNDECL) 0
/* When a parameter is passed in a register, stack space is still
allocated for it.
@@ -1568,6 +1567,38 @@ extern const char leaf_reg_remap[];
all 6 slots even for v9. */
#define REG_PARM_STACK_SPACE(DECL) (6 * UNITS_PER_WORD)
+/* Definitions for register elimination. */
+/* ??? In TARGET_FLAT mode we needn't have a hard frame pointer. */
+
+#define ELIMINABLE_REGS \
+ {{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
+ { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM} }
+
+/* The way this is structured, we can't eliminate SFP in favor of SP
+ if the frame pointer is required: we want to use the SFP->HFP elimination
+ in that case. But the test in update_eliminables doesn't know we are
+ assuming below that we only do the former elimination. */
+#define CAN_ELIMINATE(FROM, TO) \
+ ((TO) == HARD_FRAME_POINTER_REGNUM || !FRAME_POINTER_REQUIRED)
+
+#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
+ do { \
+ (OFFSET) = 0; \
+ if ((TO) == STACK_POINTER_REGNUM) \
+ { \
+ /* Note, we always pretend that this is a leaf function \
+ because if it's not, there's no point in trying to \
+ eliminate the frame pointer. If it is a leaf \
+ function, we guessed right! */ \
+ if (TARGET_FLAT) \
+ (OFFSET) = \
+ sparc_flat_compute_frame_size (get_frame_size ()); \
+ else \
+ (OFFSET) = compute_frame_size (get_frame_size (), 1); \
+ } \
+ (OFFSET) += SPARC_STACK_BIAS; \
+ } while (0)
+
/* Keep the stack pointer constant throughout the function.
This is both an optimization and a necessity: longjmp
doesn't behave itself when the stack pointer moves within
@@ -1828,14 +1859,13 @@ do { \
#endif
-/* Output assembler code to FILE to increment profiler label # LABELNO
- for profiling a function entry. */
+/* Emit rtl for profiling. */
+#define PROFILE_HOOK(LABEL) sparc_profile_hook (LABEL)
-#define FUNCTION_PROFILER(FILE, LABELNO) \
- sparc_function_profiler(FILE, LABELNO)
+/* All the work done in PROFILE_HOOK, but still required. */
+#define FUNCTION_PROFILER(FILE, LABELNO) do { } while (0)
/* Set the name of the mcount function for the system. */
-
#define MCOUNT_FUNCTION "*mcount"
/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
@@ -1899,8 +1929,25 @@ do { \
#define STRICT_ARGUMENT_NAMING TARGET_V9
/* We do not allow sibling calls if -mflat, nor
- we do not allow indirect calls to be optimized into sibling calls. */
-#define FUNCTION_OK_FOR_SIBCALL(DECL) (DECL && ! TARGET_FLAT)
+ we do not allow indirect calls to be optimized into sibling calls.
+
+ Also, on sparc 32-bit we cannot emit a sibling call when the
+ current function returns a structure. This is because the "unimp
+ after call" convention would cause the callee to return to the
+ wrong place. The generic code already disallows cases where the
+ function being called returns a structure.
+
+ It may seem strange how this last case could occur. Usually there
+ is code after the call which jumps to epilogue code which dumps the
+ return value into the struct return area. That ought to invalidate
+ the sibling call right? Well, in the c++ case we can end up passing
+ the pointer to the struct return area to a constructor (which returns
+ void) and then nothing else happens. Such a sibling call would look
+ valid without the added check here. */
+#define FUNCTION_OK_FOR_SIBCALL(DECL) \
+ (DECL \
+ && ! TARGET_FLAT \
+ && (TARGET_ARCH64 || ! current_function_returns_struct))
/* Generate RTL to flush the register windows so as to make arbitrary frames
available. */
@@ -1933,7 +1980,8 @@ do { \
? gen_rtx_REG (Pmode, 31) \
: gen_rtx_MEM (Pmode, \
memory_address (Pmode, plus_constant (frame, \
- 15 * UNITS_PER_WORD))))
+ 15 * UNITS_PER_WORD \
+ + SPARC_STACK_BIAS))))
/* Before the prologue, the return address is %o7 + 8. OK, sometimes it's
+12, but always using +8 is close enough for frame unwind purposes.
@@ -1960,14 +2008,27 @@ do { \
If assembler and linker properly support .uaword %r_disp32(foo),
then use PC relative 32-bit relocations instead of absolute relocs
for shared libraries. On sparc64, use pc relative 32-bit relocs even
- for binaries, to save memory. */
+ for binaries, to save memory.
+
+ binutils 2.12 would emit a R_SPARC_DISP32 dynamic relocation if the
+ symbol %r_disp32() is against was not local, but .hidden. In that
+ case, we have to use DW_EH_PE_absptr for pic personality. */
#ifdef HAVE_AS_SPARC_UA_PCREL
+#ifdef HAVE_AS_SPARC_UA_PCREL_HIDDEN
#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
(flag_pic \
? (GLOBAL ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4\
: ((TARGET_ARCH64 && ! GLOBAL) \
? (DW_EH_PE_pcrel | DW_EH_PE_sdata4) \
: DW_EH_PE_absptr))
+#else
+#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
+ (flag_pic \
+ ? (GLOBAL ? DW_EH_PE_absptr : (DW_EH_PE_pcrel | DW_EH_PE_sdata4)) \
+ : ((TARGET_ARCH64 && ! GLOBAL) \
+ ? (DW_EH_PE_pcrel | DW_EH_PE_sdata4) \
+ : DW_EH_PE_absptr))
+#endif
/* Emit a PC-relative relocation. */
#define ASM_OUTPUT_DWARF_PCREL(FILE, SIZE, LABEL) \
@@ -1996,9 +2057,12 @@ do { \
has been allocated, which happens in local-alloc.c. */
#define REGNO_OK_FOR_INDEX_P(REGNO) \
-((REGNO) < 32 || (unsigned) reg_renumber[REGNO] < (unsigned)32)
-#define REGNO_OK_FOR_BASE_P(REGNO) \
-((REGNO) < 32 || (unsigned) reg_renumber[REGNO] < (unsigned)32)
+((REGNO) < 32 || (unsigned) reg_renumber[REGNO] < (unsigned)32 \
+ || (REGNO) == FRAME_POINTER_REGNUM \
+ || reg_renumber[REGNO] == FRAME_POINTER_REGNUM)
+
+#define REGNO_OK_FOR_BASE_P(REGNO) REGNO_OK_FOR_INDEX_P (REGNO)
+
#define REGNO_OK_FOR_FP_P(REGNO) \
(((unsigned) (REGNO) - 32 < (TARGET_V9 ? (unsigned)64 : (unsigned)32)) \
|| ((unsigned) reg_renumber[REGNO] - 32 < (TARGET_V9 ? (unsigned)64 : (unsigned)32)))
@@ -2079,34 +2143,32 @@ do { \
be at least 8 bytes.
`U' handles all pseudo registers or a hard even numbered
- integer register, needed for ldd/std instructions. */
+ integer register, needed for ldd/std instructions.
-#define EXTRA_CONSTRAINT_BASE(OP, C) \
- ((C) == 'Q' ? fp_sethi_p(OP) \
- : (C) == 'R' ? fp_mov_p(OP) \
- : (C) == 'S' ? fp_high_losum_p(OP) \
- : 0)
+ 'W' handles the memory operand when moving operands in/out
+ of 'e' constraint floating point registers. */
#ifndef REG_OK_STRICT
/* Nonzero if X is a hard reg that can be used as an index
or if it is a pseudo reg. */
#define REG_OK_FOR_INDEX_P(X) \
- (((unsigned) REGNO (X)) - 32 >= (FIRST_PSEUDO_REGISTER - 32))
+ (REGNO (X) < 32 \
+ || REGNO (X) == FRAME_POINTER_REGNUM \
+ || REGNO (X) >= FIRST_PSEUDO_REGISTER)
+
/* Nonzero if X is a hard reg that can be used as a base reg
or if it is a pseudo reg. */
-#define REG_OK_FOR_BASE_P(X) \
- (((unsigned) REGNO (X)) - 32 >= (FIRST_PSEUDO_REGISTER - 32))
+#define REG_OK_FOR_BASE_P(X) REG_OK_FOR_INDEX_P (X)
+
+/* 'T', 'U' are for aligned memory loads which aren't needed for arch64.
+ 'W' is like 'T' but is assumed true on arch64.
-/* 'T', 'U' are for aligned memory loads which aren't needed for arch64. */
+ Remember to accept pseudo-registers for memory constraints if reload is
+ in progress. */
-#define EXTRA_CONSTRAINT(OP, C) \
- (EXTRA_CONSTRAINT_BASE(OP, C) \
- || ((! TARGET_ARCH64 && (C) == 'T') \
- ? (mem_min_alignment (OP, 8)) \
- : ((! TARGET_ARCH64 && (C) == 'U') \
- ? (register_ok_for_ldd (OP)) \
- : 0)))
+#define EXTRA_CONSTRAINT(OP, C) \
+ sparc_extra_constraint_check(OP, C, 0)
#else
@@ -2115,16 +2177,8 @@ do { \
/* Nonzero if X is a hard reg that can be used as a base reg. */
#define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
-#define EXTRA_CONSTRAINT(OP, C) \
- (EXTRA_CONSTRAINT_BASE(OP, C) \
- || ((! TARGET_ARCH64 && (C) == 'T') \
- ? mem_min_alignment (OP, 8) && strict_memory_address_p (Pmode, XEXP (OP, 0)) \
- : ((! TARGET_ARCH64 && (C) == 'U') \
- ? (GET_CODE (OP) == REG \
- && (REGNO (OP) < FIRST_PSEUDO_REGISTER \
- || reg_renumber[REGNO (OP)] >= 0) \
- && register_ok_for_ldd (OP)) \
- : 0)))
+#define EXTRA_CONSTRAINT(OP, C) \
+ sparc_extra_constraint_check(OP, C, 1)
#endif
@@ -2326,12 +2380,13 @@ do { \
/* Decompose SImode constants into hi+lo_sum. We do have to \
rerecognize what we produce, so be careful. */ \
if (CONSTANT_P (X) \
- && (MODE != TFmode || TARGET_V9) \
+ && (MODE != TFmode || TARGET_ARCH64) \
&& GET_MODE (X) == SImode \
&& GET_CODE (X) != LO_SUM && GET_CODE (X) != HIGH \
&& ! (flag_pic \
&& (symbolic_operand (X, Pmode) \
- || pic_address_needs_scratch (X)))) \
+ || pic_address_needs_scratch (X))) \
+ && sparc_cmodel <= CM_MEDLOW) \
{ \
X = gen_rtx_LO_SUM (GET_MODE (X), \
gen_rtx_HIGH (GET_MODE (X), X), X); \
@@ -2596,6 +2651,23 @@ do { \
|| (CLASS1) == FPCC_REGS || (CLASS2) == FPCC_REGS) \
? (sparc_cpu == PROCESSOR_ULTRASPARC ? 12 : 6) : 2)
+/* Provide the cost of a branch. For pre-v9 processors we use
+ a value of 3 to take into account the potential annulling of
+ the delay slot (which ends up being a bubble in the pipeline slot)
+ plus a cycle to take into consideration the instruction cache
+ effects.
+
+ On v9 and later, which have branch prediction facilities, we set
+ it to the depth of the pipeline as that is the cost of a
+ mispredicted branch.
+
+ ??? Set to 9 when PROCESSOR_ULTRASPARC3 is added */
+
+#define BRANCH_COST \
+ ((sparc_cpu == PROCESSOR_V9 \
+ || sparc_cpu == PROCESSOR_ULTRASPARC) \
+ ? 7 : 3)
+
/* Provide the costs of a rtl expression. This is in the body of a
switch on CODE. The purpose for the cost of MULT is to encourage
`synth_mult' to find a synthetic multiply when reasonable.
@@ -2623,13 +2695,12 @@ do { \
case FIX: \
return 19;
-/* Conditional branches with empty delay slots have a length of two. */
-#define ADJUST_INSN_LENGTH(INSN, LENGTH) \
-do { \
- if (GET_CODE (INSN) == CALL_INSN \
- || (GET_CODE (INSN) == JUMP_INSN && ! simplejump_p (insn))) \
- LENGTH += 1; \
-} while (0)
+#define PREFETCH_BLOCK \
+ ((sparc_cpu == PROCESSOR_ULTRASPARC) ? 64 : 32)
+
+/* ??? UltraSPARC-III note: Can set this to 8 for ultra3. */
+#define SIMULTANEOUS_PREFETCHES \
+ ((sparc_cpu == PROCESSOR_ULTRASPARC) ? 2 : 3)
/* Control the assembler format that we output. */
@@ -2675,7 +2746,7 @@ do { \
"%f40", "%f41", "%f42", "%f43", "%f44", "%f45", "%f46", "%f47", \
"%f48", "%f49", "%f50", "%f51", "%f52", "%f53", "%f54", "%f55", \
"%f56", "%f57", "%f58", "%f59", "%f60", "%f61", "%f62", "%f63", \
- "%fcc0", "%fcc1", "%fcc2", "%fcc3", "%icc"}
+ "%fcc0", "%fcc1", "%fcc2", "%fcc3", "%icc", "%sfp" }
/* Define additional names for use in asm clobbers and asm declarations. */
@@ -2944,8 +3015,10 @@ do { \
#define PREDICATE_CODES \
{"reg_or_0_operand", {SUBREG, REG, CONST_INT, CONST_DOUBLE}}, \
{"fp_zero_operand", {CONST_DOUBLE}}, \
+{"fp_register_operand", {SUBREG, REG}}, \
{"intreg_operand", {SUBREG, REG}}, \
{"fcc_reg_operand", {REG}}, \
+{"fcc0_reg_operand", {REG}}, \
{"icc_or_fcc_reg_operand", {REG}}, \
{"restore_operand", {REG}}, \
{"call_operand", {MEM}}, \
@@ -2963,6 +3036,7 @@ do { \
{"eq_or_neq", {EQ, NE}}, \
{"normal_comp_operator", {GE, GT, LE, LT, GTU, LEU}}, \
{"noov_compare_op", {NE, EQ, GE, GT, LE, LT, GEU, GTU, LEU, LTU}}, \
+{"noov_compare64_op", {NE, EQ, GE, GT, LE, LT, GEU, GTU, LEU, LTU}}, \
{"v9_regcmp_op", {EQ, NE, GE, LT, LE, GT}}, \
{"extend_op", {SIGN_EXTEND, ZERO_EXTEND}}, \
{"cc_arithop", {AND, IOR, XOR}}, \
diff --git a/contrib/gcc/config/sparc/sparc.md b/contrib/gcc/config/sparc/sparc.md
index c0b8f60..ebb6768 100644
--- a/contrib/gcc/config/sparc/sparc.md
+++ b/contrib/gcc/config/sparc/sparc.md
@@ -1,4 +1,4 @@
-;- Machine description for SPARC chip for GNU C compiler
+;; Machine description for SPARC chip for GNU C compiler
;; Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
;; 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
;; Contributed by Michael Tiemann (tiemann@cygnus.com)
@@ -87,8 +87,78 @@
"ialu,compare,shift,load,sload,store,uncond_branch,branch,call,sibcall,call_no_delay_slot,return,imul,idiv,fpload,fpstore,fp,fpmove,fpcmove,fpcmp,fpmul,fpdivs,fpdivd,fpsqrts,fpsqrtd,cmove,multi,misc"
(const_string "ialu"))
+;; true if branch/call has empty delay slot and will emit a nop in it
+(define_attr "empty_delay_slot" "false,true"
+ (symbol_ref "empty_delay_slot (insn)"))
+
+(define_attr "branch_type" "none,icc,fcc,reg" (const_string "none"))
+
+(define_attr "pic" "false,true"
+ (symbol_ref "flag_pic != 0"))
+
;; Length (in # of insns).
-(define_attr "length" "" (const_int 1))
+(define_attr "length" ""
+ (cond [(eq_attr "type" "uncond_branch,call,sibcall")
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 2)
+ (const_int 1))
+ (eq_attr "branch_type" "icc")
+ (if_then_else (match_operand 0 "noov_compare64_op" "")
+ (if_then_else (lt (pc) (match_dup 1))
+ (if_then_else (lt (minus (match_dup 1) (pc)) (const_int 260000))
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 2)
+ (const_int 1))
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 4)
+ (const_int 3)))
+ (if_then_else (lt (minus (pc) (match_dup 1)) (const_int 260000))
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 2)
+ (const_int 1))
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 4)
+ (const_int 3))))
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 2)
+ (const_int 1)))
+ (eq_attr "branch_type" "fcc")
+ (if_then_else (match_operand 0 "fcc0_reg_operand" "")
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 2)
+ (const_int 1))
+ (if_then_else (lt (pc) (match_dup 2))
+ (if_then_else (lt (minus (match_dup 2) (pc)) (const_int 260000))
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 2)
+ (const_int 1))
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 4)
+ (const_int 3)))
+ (if_then_else (lt (minus (pc) (match_dup 2)) (const_int 260000))
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 2)
+ (const_int 1))
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 4)
+ (const_int 3)))))
+ (eq_attr "branch_type" "reg")
+ (if_then_else (lt (pc) (match_dup 2))
+ (if_then_else (lt (minus (match_dup 2) (pc)) (const_int 32000))
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 2)
+ (const_int 1))
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 4)
+ (const_int 3)))
+ (if_then_else (lt (minus (pc) (match_dup 2)) (const_int 32000))
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 2)
+ (const_int 1))
+ (if_then_else (eq_attr "empty_delay_slot" "true")
+ (const_int 4)
+ (const_int 3))))
+ ] (const_int 1)))
;; FP precision.
(define_attr "fptype" "single,double" (const_string "single"))
@@ -1893,11 +1963,12 @@
""
"*
{
- return output_cbranch (operands[0], 1, 0,
+ return output_cbranch (operands[0], operands[1], 1, 0,
final_sequence && INSN_ANNULLED_BRANCH_P (insn),
! final_sequence, insn);
}"
- [(set_attr "type" "branch")])
+ [(set_attr "type" "branch")
+ (set_attr "branch_type" "icc")])
;; XXX fpcmp nop braindamage
(define_insn "*inverted_branch"
@@ -1909,11 +1980,12 @@
""
"*
{
- return output_cbranch (operands[0], 1, 1,
+ return output_cbranch (operands[0], operands[1], 1, 1,
final_sequence && INSN_ANNULLED_BRANCH_P (insn),
! final_sequence, insn);
}"
- [(set_attr "type" "branch")])
+ [(set_attr "type" "branch")
+ (set_attr "branch_type" "icc")])
;; XXX fpcmp nop braindamage
(define_insn "*normal_fp_branch"
@@ -1926,11 +1998,12 @@
""
"*
{
- return output_cbranch (operands[1], 2, 0,
+ return output_cbranch (operands[1], operands[2], 2, 0,
final_sequence && INSN_ANNULLED_BRANCH_P (insn),
! final_sequence, insn);
}"
- [(set_attr "type" "branch")])
+ [(set_attr "type" "branch")
+ (set_attr "branch_type" "fcc")])
;; XXX fpcmp nop braindamage
(define_insn "*inverted_fp_branch"
@@ -1943,11 +2016,12 @@
""
"*
{
- return output_cbranch (operands[1], 2, 1,
+ return output_cbranch (operands[1], operands[2], 2, 1,
final_sequence && INSN_ANNULLED_BRANCH_P (insn),
! final_sequence, insn);
}"
- [(set_attr "type" "branch")])
+ [(set_attr "type" "branch")
+ (set_attr "branch_type" "fcc")])
;; XXX fpcmp nop braindamage
(define_insn "*normal_fpe_branch"
@@ -1960,11 +2034,12 @@
""
"*
{
- return output_cbranch (operands[1], 2, 0,
+ return output_cbranch (operands[1], operands[2], 2, 0,
final_sequence && INSN_ANNULLED_BRANCH_P (insn),
! final_sequence, insn);
}"
- [(set_attr "type" "branch")])
+ [(set_attr "type" "branch")
+ (set_attr "branch_type" "fcc")])
;; XXX fpcmp nop braindamage
(define_insn "*inverted_fpe_branch"
@@ -1977,11 +2052,12 @@
""
"*
{
- return output_cbranch (operands[1], 2, 1,
+ return output_cbranch (operands[1], operands[2], 2, 1,
final_sequence && INSN_ANNULLED_BRANCH_P (insn),
! final_sequence, insn);
}"
- [(set_attr "type" "branch")])
+ [(set_attr "type" "branch")
+ (set_attr "branch_type" "fcc")])
;; Sparc V9-specific jump insns. None of these are guaranteed to be
;; in the architecture.
@@ -1999,11 +2075,12 @@
"TARGET_ARCH64"
"*
{
- return output_v9branch (operands[0], 1, 2, 0,
+ return output_v9branch (operands[0], operands[2], 1, 2, 0,
final_sequence && INSN_ANNULLED_BRANCH_P (insn),
! final_sequence, insn);
}"
- [(set_attr "type" "branch")])
+ [(set_attr "type" "branch")
+ (set_attr "branch_type" "reg")])
;; XXX
(define_insn "*inverted_int_branch_sp64"
@@ -2016,11 +2093,12 @@
"TARGET_ARCH64"
"*
{
- return output_v9branch (operands[0], 1, 2, 1,
+ return output_v9branch (operands[0], operands[2], 1, 2, 1,
final_sequence && INSN_ANNULLED_BRANCH_P (insn),
! final_sequence, insn);
}"
- [(set_attr "type" "branch")])
+ [(set_attr "type" "branch")
+ (set_attr "branch_type" "reg")])
;; Load program counter insns.
@@ -2053,14 +2131,8 @@
a double if needed. */
if (GET_CODE (operands[1]) == CONST_DOUBLE)
{
- operands[1] = GEN_INT (CONST_DOUBLE_LOW (operands[1]) & 0xff);
- }
- else if (GET_CODE (operands[1]) == CONST_INT)
- {
- /* And further, we know for all QI cases that only the
- low byte is significant, which we can always process
- in a single insn. So mask it now. */
- operands[1] = GEN_INT (INTVAL (operands[1]) & 0xff);
+ operands[1] = GEN_INT (trunc_int_for_mode
+ (CONST_DOUBLE_LOW (operands[1]), QImode));
}
/* Handle sets of MEM first. */
@@ -2459,13 +2531,14 @@
(define_insn "*movdi_insn_sp32_v9"
[(set (match_operand:DI 0 "nonimmediate_operand"
- "=m,T,U,o,r,r,r,?T,?f,?f,?o,?f")
+ "=T,o,T,U,o,r,r,r,?T,?f,?f,?o,?f")
(match_operand:DI 1 "input_operand"
- " J,U,T,r,o,i,r, f, T, o, f, f"))]
+ " J,J,U,T,r,o,i,r, f, T, o, f, f"))]
"! TARGET_ARCH64 && TARGET_V9
&& (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
"@
stx\\t%%g0, %0
+ #
std\\t%1, %0
ldd\\t%1, %0
#
@@ -2477,18 +2550,19 @@
#
#
#"
- [(set_attr "type" "store,store,load,*,*,*,*,fpstore,fpload,*,*,*")
- (set_attr "length" "*,*,*,2,2,2,2,*,*,2,2,2")])
+ [(set_attr "type" "store,store,store,load,*,*,*,*,fpstore,fpload,*,*,*")
+ (set_attr "length" "*,2,*,*,2,2,2,2,*,*,2,2,2")])
(define_insn "*movdi_insn_sp32"
[(set (match_operand:DI 0 "nonimmediate_operand"
- "=T,U,o,r,r,r,?T,?f,?f,?o,?f")
+ "=o,T,U,o,r,r,r,?T,?f,?f,?o,?f")
(match_operand:DI 1 "input_operand"
- " U,T,r,o,i,r, f, T, o, f, f"))]
+ " J,U,T,r,o,i,r, f, T, o, f, f"))]
"! TARGET_ARCH64
&& (register_operand (operands[0], DImode)
|| register_operand (operands[1], DImode))"
"@
+ #
std\\t%1, %0
ldd\\t%1, %0
#
@@ -2500,8 +2574,8 @@
#
#
#"
- [(set_attr "type" "store,load,*,*,*,*,fpstore,fpload,*,*,*")
- (set_attr "length" "*,*,2,2,2,2,*,*,2,2,2")])
+ [(set_attr "type" "store,store,load,*,*,*,*,fpstore,fpload,*,*,*")
+ (set_attr "length" "2,*,*,2,2,2,2,*,*,2,2,2")])
;; The following are generated by sparc_emit_set_const64
(define_insn "*movdi_sp64_dbl"
@@ -2520,8 +2594,8 @@
"sethi\\t%%hi(%a1), %0")
(define_insn "*movdi_insn_sp64_novis"
- [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,r,m,?e,?e,?m")
- (match_operand:DI 1 "input_operand" "rI,K,J,m,rJ,e,m,e"))]
+ [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,r,m,?e,?e,?W")
+ (match_operand:DI 1 "input_operand" "rI,N,J,m,rJ,e,W,e"))]
"TARGET_ARCH64 && ! TARGET_VIS
&& (register_operand (operands[0], DImode)
|| reg_or_0_operand (operands[1], DImode))"
@@ -2538,8 +2612,8 @@
(set_attr "fptype" "*,*,*,*,*,double,*,*")])
(define_insn "*movdi_insn_sp64_vis"
- [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,r,m,?e,?e,?m,b")
- (match_operand:DI 1 "input_operand" "rI,K,J,m,rJ,e,m,e,J"))]
+ [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,r,m,?e,?e,?W,b")
+ (match_operand:DI 1 "input_operand" "rI,N,J,m,rJ,e,W,e,J"))]
"TARGET_ARCH64 && TARGET_VIS &&
(register_operand (operands[0], DImode)
|| reg_or_0_operand (operands[1], DImode))"
@@ -2734,8 +2808,7 @@
&& ! flag_pic"
"
{
- sparc_emit_set_symbolic_const64 (operands[0], operands[1],
- gen_rtx_REG (DImode, REGNO (operands[2])));
+ sparc_emit_set_symbolic_const64 (operands[0], operands[1], operands[2]);
DONE;
}")
@@ -2748,8 +2821,7 @@
&& ! flag_pic"
"
{
- sparc_emit_set_symbolic_const64 (operands[0], operands[1],
- gen_rtx_REG (DImode, REGNO (operands[2])));
+ sparc_emit_set_symbolic_const64 (operands[0], operands[1], operands[2]);
DONE;
}")
@@ -2771,8 +2843,8 @@
#else
unsigned int low, high;
- low = INTVAL (operands[1]) & 0xffffffff;
- high = (INTVAL (operands[1]) >> 32) & 0xffffffff;
+ low = trunc_int_for_mode (INTVAL (operands[1]), SImode);
+ high = trunc_int_for_mode (INTVAL (operands[1]) >> 32, SImode);
emit_insn (gen_movsi (gen_highpart (SImode, operands[0]), GEN_INT (high)));
/* Slick... but this trick loses if this subreg constant part
@@ -2799,7 +2871,7 @@
/* Slick... but this trick loses if this subreg constant part
can be done in one insn. */
if (CONST_DOUBLE_LOW (operands[1]) == CONST_DOUBLE_HIGH (operands[1])
- && !(SPARC_SETHI_P (CONST_DOUBLE_HIGH (operands[1]))
+ && !(SPARC_SETHI32_P (CONST_DOUBLE_HIGH (operands[1]))
|| SPARC_SIMM13_P (CONST_DOUBLE_HIGH (operands[1]))))
{
emit_insn (gen_movsi (gen_lowpart (SImode, operands[0]),
@@ -2890,6 +2962,21 @@
DONE;
}")
+(define_split
+ [(set (match_operand:DI 0 "memory_operand" "")
+ (const_int 0))]
+ "reload_completed
+ && (! TARGET_V9
+ || (! TARGET_ARCH64
+ && ! mem_min_alignment (operands[0], 8)))
+ && offsettable_memref_p (operands[0])"
+ [(clobber (const_int 0))]
+ "
+{
+ emit_insn (gen_movsi (adjust_address (operands[0], SImode, 0), const0_rtx));
+ emit_insn (gen_movsi (adjust_address (operands[0], SImode, 4), const0_rtx));
+ DONE;
+}")
;; Floating point move insns
@@ -3202,8 +3289,8 @@
;; Be careful, fmovd does not exist when !v9.
(define_insn "*movdf_insn_sp32"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=e,T,U,T,o,e,*r,o,e,o")
- (match_operand:DF 1 "input_operand" "T#F,e,T,U,G,e,*rFo,*r,o#F,e"))]
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=e,W,U,T,o,e,*r,o,e,o")
+ (match_operand:DF 1 "input_operand" "W#F,e,T,U,G,e,*rFo,*r,o#F,e"))]
"TARGET_FPU
&& ! TARGET_V9
&& (register_operand (operands[0], DFmode)
@@ -3262,8 +3349,8 @@
;; We have available v9 double floats but not 64-bit
;; integer registers and no VIS.
(define_insn "*movdf_insn_v9only_novis"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=e,e,T,T,U,T,e,*r,o")
- (match_operand:DF 1 "input_operand" "e,T#F,G,e,T,U,o#F,*roF,*rGe"))]
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=e,e,T,W,U,T,f,*r,o")
+ (match_operand:DF 1 "input_operand" "e,W#F,G,e,T,U,o#F,*roF,*rGf"))]
"TARGET_FPU
&& TARGET_V9
&& ! TARGET_VIS
@@ -3288,8 +3375,8 @@
;; We have available v9 double floats but not 64-bit
;; integer registers but we have VIS.
(define_insn "*movdf_insn_v9only_vis"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=e,e,e,T,T,U,T,e,*r,o")
- (match_operand:DF 1 "input_operand" "G,e,T#F,G,e,T,U,o#F,*roGF,*rGe"))]
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=e,e,e,T,W,U,T,f,*r,o")
+ (match_operand:DF 1 "input_operand" "G,e,W#F,G,e,T,U,o#F,*roGF,*rGf"))]
"TARGET_FPU
&& TARGET_VIS
&& ! TARGET_ARCH64
@@ -3314,8 +3401,8 @@
;; We have available both v9 double floats and 64-bit
;; integer registers. No VIS though.
(define_insn "*movdf_insn_sp64_novis"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=e,e,m,*r,*r,m,*r")
- (match_operand:DF 1 "input_operand" "e,m#F,e,*rG,m,*rG,F"))]
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=e,e,W,*r,*r,m,*r")
+ (match_operand:DF 1 "input_operand" "e,W#F,e,*rG,m,*rG,F"))]
"TARGET_FPU
&& ! TARGET_VIS
&& TARGET_ARCH64
@@ -3337,8 +3424,8 @@
;; We have available both v9 double floats and 64-bit
;; integer registers. And we have VIS.
(define_insn "*movdf_insn_sp64_vis"
- [(set (match_operand:DF 0 "nonimmediate_operand" "=e,e,e,m,*r,*r,m,*r")
- (match_operand:DF 1 "input_operand" "G,e,m#F,e,*rG,m,*rG,F"))]
+ [(set (match_operand:DF 0 "nonimmediate_operand" "=e,e,e,W,*r,*r,m,*r")
+ (match_operand:DF 1 "input_operand" "G,e,W#F,e,*rG,m,*rG,F"))]
"TARGET_FPU
&& TARGET_VIS
&& TARGET_ARCH64
@@ -3411,7 +3498,7 @@
/* Slick... but this trick loses if this subreg constant part
can be done in one insn. */
if (l[1] == l[0]
- && !(SPARC_SETHI_P (l[0])
+ && !(SPARC_SETHI32_P (l[0])
|| SPARC_SIMM13_P (l[0])))
{
emit_insn (gen_movsi (gen_lowpart (SImode, operands[0]),
@@ -3753,7 +3840,8 @@
"reload_completed
&& (! TARGET_ARCH64
|| (TARGET_FPU
- && ! TARGET_HARD_QUAD))"
+ && ! TARGET_HARD_QUAD)
+ || ! fp_register_operand (operands[0], TFmode))"
[(clobber (const_int 0))]
"
{
@@ -3815,7 +3903,10 @@
[(set (match_operand:TF 0 "register_operand" "")
(match_operand:TF 1 "memory_operand" ""))]
"(reload_completed
- && offsettable_memref_p (operands[1]))"
+ && offsettable_memref_p (operands[1])
+ && (! TARGET_ARCH64
+ || ! TARGET_HARD_QUAD
+ || ! fp_register_operand (operands[0], TFmode)))"
[(clobber (const_int 0))]
"
{
@@ -3848,7 +3939,10 @@
[(set (match_operand:TF 0 "memory_operand" "")
(match_operand:TF 1 "register_operand" ""))]
"(reload_completed
- && offsettable_memref_p (operands[0]))"
+ && offsettable_memref_p (operands[0])
+ && (! TARGET_ARCH64
+ || ! TARGET_HARD_QUAD
+ || ! fp_register_operand (operands[1], TFmode)))"
[(clobber (const_int 0))]
"
{
@@ -4929,31 +5023,11 @@
(set_attr "fptype" "double")])
(define_expand "extendsftf2"
- [(set (match_operand:TF 0 "register_operand" "=e")
+ [(set (match_operand:TF 0 "nonimmediate_operand" "")
(float_extend:TF
- (match_operand:SF 1 "register_operand" "f")))]
+ (match_operand:SF 1 "register_operand" "")))]
"TARGET_FPU && (TARGET_HARD_QUAD || TARGET_ARCH64)"
- "
-{
- if (! TARGET_HARD_QUAD)
- {
- rtx slot0;
-
- if (GET_CODE (operands[0]) != MEM)
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- else
- slot0 = operands[0];
-
- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_stoq\"), 0,
- VOIDmode, 2,
- XEXP (slot0, 0), Pmode,
- operands[1], SFmode);
-
- if (GET_CODE (operands[0]) != MEM)
- emit_insn (gen_rtx_SET (VOIDmode, operands[0], slot0));
- DONE;
- }
-}")
+ "emit_tfmode_cvt (FLOAT_EXTEND, operands); DONE;")
(define_insn "*extendsftf2_hq"
[(set (match_operand:TF 0 "register_operand" "=e")
@@ -4964,31 +5038,11 @@
[(set_attr "type" "fp")])
(define_expand "extenddftf2"
- [(set (match_operand:TF 0 "register_operand" "=e")
+ [(set (match_operand:TF 0 "nonimmediate_operand" "")
(float_extend:TF
- (match_operand:DF 1 "register_operand" "e")))]
+ (match_operand:DF 1 "register_operand" "")))]
"TARGET_FPU && (TARGET_HARD_QUAD || TARGET_ARCH64)"
- "
-{
- if (! TARGET_HARD_QUAD)
- {
- rtx slot0;
-
- if (GET_CODE (operands[0]) != MEM)
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- else
- slot0 = operands[0];
-
- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_dtoq\"), 0,
- VOIDmode, 2,
- XEXP (slot0, 0), Pmode,
- operands[1], DFmode);
-
- if (GET_CODE (operands[0]) != MEM)
- emit_insn (gen_rtx_SET (VOIDmode, operands[0], slot0));
- DONE;
- }
-}")
+ "emit_tfmode_cvt (FLOAT_EXTEND, operands); DONE;")
(define_insn "*extenddftf2_hq"
[(set (match_operand:TF 0 "register_operand" "=e")
@@ -5008,30 +5062,11 @@
(set_attr "fptype" "double")])
(define_expand "trunctfsf2"
- [(set (match_operand:SF 0 "register_operand" "=f")
+ [(set (match_operand:SF 0 "register_operand" "")
(float_truncate:SF
- (match_operand:TF 1 "register_operand" "e")))]
+ (match_operand:TF 1 "general_operand" "")))]
"TARGET_FPU && (TARGET_HARD_QUAD || TARGET_ARCH64)"
- "
-{
- if (! TARGET_HARD_QUAD)
- {
- rtx slot0;
-
- if (GET_CODE (operands[1]) != MEM)
- {
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot0, operands[1]));
- }
- else
- slot0 = operands[1];
-
- emit_library_call_value (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_qtos\"),
- operands[0], 0, SFmode, 1,
- XEXP (slot0, 0), Pmode);
- DONE;
- }
-}")
+ "emit_tfmode_cvt (FLOAT_TRUNCATE, operands); DONE;")
(define_insn "*trunctfsf2_hq"
[(set (match_operand:SF 0 "register_operand" "=f")
@@ -5042,30 +5077,11 @@
[(set_attr "type" "fp")])
(define_expand "trunctfdf2"
- [(set (match_operand:DF 0 "register_operand" "=f")
+ [(set (match_operand:DF 0 "register_operand" "")
(float_truncate:DF
- (match_operand:TF 1 "register_operand" "e")))]
+ (match_operand:TF 1 "general_operand" "")))]
"TARGET_FPU && (TARGET_HARD_QUAD || TARGET_ARCH64)"
- "
-{
- if (! TARGET_HARD_QUAD)
- {
- rtx slot0;
-
- if (GET_CODE (operands[1]) != MEM)
- {
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot0, operands[1]));
- }
- else
- slot0 = operands[1];
-
- emit_library_call_value (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_qtod\"),
- operands[0], 0, DFmode, 1,
- XEXP (slot0, 0), Pmode);
- DONE;
- }
-}")
+ "emit_tfmode_cvt (FLOAT_TRUNCATE, operands); DONE;")
(define_insn "*trunctfdf2_hq"
[(set (match_operand:DF 0 "register_operand" "=e")
@@ -5094,30 +5110,10 @@
(set_attr "fptype" "double")])
(define_expand "floatsitf2"
- [(set (match_operand:TF 0 "register_operand" "=e")
- (float:TF (match_operand:SI 1 "register_operand" "f")))]
+ [(set (match_operand:TF 0 "nonimmediate_operand" "")
+ (float:TF (match_operand:SI 1 "register_operand" "")))]
"TARGET_FPU && (TARGET_HARD_QUAD || TARGET_ARCH64)"
- "
-{
- if (! TARGET_HARD_QUAD)
- {
- rtx slot0;
-
- if (GET_CODE (operands[1]) != MEM)
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- else
- slot0 = operands[1];
-
- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_itoq\"), 0,
- VOIDmode, 2,
- XEXP (slot0, 0), Pmode,
- operands[1], SImode);
-
- if (GET_CODE (operands[0]) != MEM)
- emit_insn (gen_rtx_SET (VOIDmode, operands[0], slot0));
- DONE;
- }
-}")
+ "emit_tfmode_cvt (FLOAT, operands); DONE;")
(define_insn "*floatsitf2_hq"
[(set (match_operand:TF 0 "register_operand" "=e")
@@ -5127,27 +5123,10 @@
[(set_attr "type" "fp")])
(define_expand "floatunssitf2"
- [(set (match_operand:TF 0 "register_operand" "=e")
- (unsigned_float:TF (match_operand:SI 1 "register_operand" "e")))]
+ [(set (match_operand:TF 0 "nonimmediate_operand" "")
+ (unsigned_float:TF (match_operand:SI 1 "register_operand" "")))]
"TARGET_FPU && TARGET_ARCH64 && ! TARGET_HARD_QUAD"
- "
-{
- rtx slot0;
-
- if (GET_CODE (operands[1]) != MEM)
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- else
- slot0 = operands[1];
-
- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_uitoq\"), 0,
- VOIDmode, 2,
- XEXP (slot0, 0), Pmode,
- operands[1], SImode);
-
- if (GET_CODE (operands[0]) != MEM)
- emit_insn (gen_rtx_SET (VOIDmode, operands[0], slot0));
- DONE;
-}")
+ "emit_tfmode_cvt (UNSIGNED_FLOAT, operands); DONE;")
;; Now the same for 64 bit sources.
@@ -5159,6 +5138,12 @@
[(set_attr "type" "fp")
(set_attr "fptype" "double")])
+(define_expand "floatunsdisf2"
+ [(use (match_operand:SF 0 "register_operand" ""))
+ (use (match_operand:DI 1 "register_operand" ""))]
+ "TARGET_ARCH64 && TARGET_FPU"
+ "sparc_emit_floatunsdi (operands); DONE;")
+
(define_insn "floatdidf2"
[(set (match_operand:DF 0 "register_operand" "=e")
(float:DF (match_operand:DI 1 "register_operand" "e")))]
@@ -5167,31 +5152,17 @@
[(set_attr "type" "fp")
(set_attr "fptype" "double")])
+(define_expand "floatunsdidf2"
+ [(use (match_operand:DF 0 "register_operand" ""))
+ (use (match_operand:DI 1 "register_operand" ""))]
+ "TARGET_ARCH64 && TARGET_FPU"
+ "sparc_emit_floatunsdi (operands); DONE;")
+
(define_expand "floatditf2"
- [(set (match_operand:TF 0 "register_operand" "=e")
- (float:TF (match_operand:DI 1 "register_operand" "e")))]
+ [(set (match_operand:TF 0 "nonimmediate_operand" "")
+ (float:TF (match_operand:DI 1 "register_operand" "")))]
"TARGET_FPU && TARGET_V9 && (TARGET_HARD_QUAD || TARGET_ARCH64)"
- "
-{
- if (! TARGET_HARD_QUAD)
- {
- rtx slot0;
-
- if (GET_CODE (operands[1]) != MEM)
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- else
- slot0 = operands[1];
-
- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_xtoq\"), 0,
- VOIDmode, 2,
- XEXP (slot0, 0), Pmode,
- operands[1], DImode);
-
- if (GET_CODE (operands[0]) != MEM)
- emit_insn (gen_rtx_SET (VOIDmode, operands[0], slot0));
- DONE;
- }
-}")
+ "emit_tfmode_cvt (FLOAT, operands); DONE;")
(define_insn "*floatditf2_hq"
[(set (match_operand:TF 0 "register_operand" "=e")
@@ -5201,27 +5172,10 @@
[(set_attr "type" "fp")])
(define_expand "floatunsditf2"
- [(set (match_operand:TF 0 "register_operand" "=e")
- (unsigned_float:TF (match_operand:DI 1 "register_operand" "e")))]
+ [(set (match_operand:TF 0 "nonimmediate_operand" "")
+ (unsigned_float:TF (match_operand:DI 1 "register_operand" "")))]
"TARGET_FPU && TARGET_ARCH64 && ! TARGET_HARD_QUAD"
- "
-{
- rtx slot0;
-
- if (GET_CODE (operands[1]) != MEM)
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- else
- slot0 = operands[1];
-
- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_uxtoq\"), 0,
- VOIDmode, 2,
- XEXP (slot0, 0), Pmode,
- operands[1], DImode);
-
- if (GET_CODE (operands[0]) != MEM)
- emit_insn (gen_rtx_SET (VOIDmode, operands[0], slot0));
- DONE;
-}")
+ "emit_tfmode_cvt (UNSIGNED_FLOAT, operands); DONE;")
;; Convert a float to an actual integer.
;; Truncation is performed as part of the conversion.
@@ -5243,58 +5197,23 @@
(set_attr "fptype" "double")])
(define_expand "fix_trunctfsi2"
- [(set (match_operand:SI 0 "register_operand" "=f")
- (fix:SI (fix:TF (match_operand:TF 1 "register_operand" "e"))))]
+ [(set (match_operand:SI 0 "register_operand" "")
+ (fix:SI (match_operand:TF 1 "general_operand" "")))]
"TARGET_FPU && (TARGET_HARD_QUAD || TARGET_ARCH64)"
- "
-{
- if (! TARGET_HARD_QUAD)
- {
- rtx slot0;
-
- if (GET_CODE (operands[1]) != MEM)
- {
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot0, operands[1]));
- }
- else
- slot0 = operands[1];
-
- emit_library_call_value (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_qtoi\"),
- operands[0], 0, SImode, 1,
- XEXP (slot0, 0), Pmode);
- DONE;
- }
-}")
+ "emit_tfmode_cvt (FIX, operands); DONE;")
(define_insn "*fix_trunctfsi2_hq"
[(set (match_operand:SI 0 "register_operand" "=f")
- (fix:SI (fix:TF (match_operand:TF 1 "register_operand" "e"))))]
+ (fix:SI (match_operand:TF 1 "register_operand" "e")))]
"TARGET_FPU && TARGET_HARD_QUAD"
"fqtoi\\t%1, %0"
[(set_attr "type" "fp")])
(define_expand "fixuns_trunctfsi2"
- [(set (match_operand:SI 0 "register_operand" "=f")
- (unsigned_fix:SI (fix:TF (match_operand:TF 1 "register_operand" "e"))))]
+ [(set (match_operand:SI 0 "register_operand" "")
+ (unsigned_fix:SI (match_operand:TF 1 "general_operand" "")))]
"TARGET_FPU && TARGET_ARCH64 && ! TARGET_HARD_QUAD"
- "
-{
- rtx slot0;
-
- if (GET_CODE (operands[1]) != MEM)
- {
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot0, operands[1]));
- }
- else
- slot0 = operands[1];
-
- emit_library_call_value (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_qtoui\"),
- operands[0], 0, SImode, 1,
- XEXP (slot0, 0), Pmode);
- DONE;
-}")
+ "emit_tfmode_cvt (UNSIGNED_FIX, operands); DONE;")
;; Now the same, for V9 targets
@@ -5315,59 +5234,23 @@
(set_attr "fptype" "double")])
(define_expand "fix_trunctfdi2"
- [(set (match_operand:DI 0 "register_operand" "=e")
- (fix:DI (fix:TF (match_operand:TF 1 "register_operand" "e"))))]
+ [(set (match_operand:DI 0 "register_operand" "")
+ (fix:DI (match_operand:TF 1 "general_operand" "")))]
"TARGET_V9 && TARGET_FPU && (TARGET_HARD_QUAD || TARGET_ARCH64)"
- "
-{
- if (! TARGET_HARD_QUAD)
- {
- rtx slot0;
-
- if (GET_CODE (operands[1]) != MEM)
- {
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot0, operands[1]));
- }
- else
- slot0 = operands[1];
-
- emit_library_call_value (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_qtox\"),
- operands[0], 0, DImode, 1,
- XEXP (slot0, 0), Pmode);
- DONE;
- }
-}")
+ "emit_tfmode_cvt (FIX, operands); DONE;")
(define_insn "*fix_trunctfdi2_hq"
[(set (match_operand:DI 0 "register_operand" "=e")
- (fix:DI (fix:TF (match_operand:TF 1 "register_operand" "e"))))]
+ (fix:DI (match_operand:TF 1 "register_operand" "e")))]
"TARGET_V9 && TARGET_FPU && TARGET_HARD_QUAD"
"fqtox\\t%1, %0"
[(set_attr "type" "fp")])
(define_expand "fixuns_trunctfdi2"
- [(set (match_operand:DI 0 "register_operand" "=f")
- (unsigned_fix:DI (fix:TF (match_operand:TF 1 "register_operand" "e"))))]
+ [(set (match_operand:DI 0 "register_operand" "")
+ (unsigned_fix:DI (match_operand:TF 1 "general_operand" "")))]
"TARGET_FPU && TARGET_ARCH64 && ! TARGET_HARD_QUAD"
- "
-{
- rtx slot0;
-
- if (GET_CODE (operands[1]) != MEM)
- {
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot0, operands[1]));
- }
- else
- slot0 = operands[1];
-
- emit_library_call_value (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_qtoux\"),
- operands[0], 0, DImode, 1,
- XEXP (slot0, 0), Pmode);
- DONE;
-}")
-
+ "emit_tfmode_cvt (UNSIGNED_FIX, operands); DONE;")
;;- arithmetic instructions
@@ -5920,6 +5803,13 @@
else
return \"sllx\\t%H1, 32, %3\\n\\tor\\t%L1, %3, %3\\n\\tmulx\\t%3, %2, %3\\n\\tsrlx\\t%3, 32, %H0\\n\\tmov\\t%3, %L0\";
}
+ else if (rtx_equal_p (operands[1], operands[2]))
+ {
+ if (which_alternative == 1)
+ return \"or\\t%L1, %H1, %H1\\n\\tmulx\\t%H1, %H1, %L0\;srlx\\t%L0, 32, %H0\";
+ else
+ return \"sllx\\t%H1, 32, %3\\n\\tor\\t%L1, %3, %3\\n\\tmulx\\t%3, %3, %3\\n\\tsrlx\\t%3, 32, %H0\\n\\tmov\\t%3, %L0\";
+ }
if (sparc_check_64 (operands[2], insn) <= 0)
output_asm_insn (\"srl\\t%L2, 0, %L2\", operands);
if (which_alternative == 1)
@@ -6377,7 +6267,7 @@
[(set_attr "type" "multi")
(set (attr "length")
(if_then_else (eq_attr "isa" "v9")
- (const_int 4) (const_int 7)))])
+ (const_int 4) (const_int 6)))])
(define_insn "divsi3_sp64"
[(set (match_operand:SI 0 "register_operand" "=r")
@@ -6576,7 +6466,7 @@
(set (match_dup 0) (and:SI (not:SI (match_dup 3)) (match_dup 1)))]
"
{
- operands[4] = GEN_INT (~INTVAL (operands[2]) & 0xffffffff);
+ operands[4] = GEN_INT (~INTVAL (operands[2]));
}")
;; Split DImode logical operations requiring two instructions.
@@ -6719,7 +6609,7 @@
(set (match_dup 0) (ior:SI (not:SI (match_dup 3)) (match_dup 1)))]
"
{
- operands[4] = GEN_INT (~INTVAL (operands[2]) & 0xffffffff);
+ operands[4] = GEN_INT (~INTVAL (operands[2]));
}")
(define_insn "*or_not_di_sp32"
@@ -6835,7 +6725,7 @@
(set (match_dup 0) (not:SI (xor:SI (match_dup 3) (match_dup 1))))]
"
{
- operands[4] = GEN_INT (~INTVAL (operands[2]) & 0xffffffff);
+ operands[4] = GEN_INT (~INTVAL (operands[2]));
}")
(define_split
@@ -6850,7 +6740,7 @@
(set (match_dup 0) (xor:SI (match_dup 3) (match_dup 1)))]
"
{
- operands[4] = GEN_INT (~INTVAL (operands[2]) & 0xffffffff);
+ operands[4] = GEN_INT (~INTVAL (operands[2]));
}")
;; xnor patterns. Note that (a ^ ~b) == (~a ^ b) == ~(a ^ b).
@@ -7267,42 +7157,7 @@
(plus:TF (match_operand:TF 1 "general_operand" "")
(match_operand:TF 2 "general_operand" "")))]
"TARGET_FPU && (TARGET_HARD_QUAD || TARGET_ARCH64)"
- "
-{
- if (! TARGET_HARD_QUAD)
- {
- rtx slot0, slot1, slot2;
-
- if (GET_CODE (operands[0]) != MEM)
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- else
- slot0 = operands[0];
- if (GET_CODE (operands[1]) != MEM)
- {
- slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot1, operands[1]));
- }
- else
- slot1 = operands[1];
- if (GET_CODE (operands[2]) != MEM)
- {
- slot2 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot2, operands[2]));
- }
- else
- slot2 = operands[2];
-
- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_add\"), 0,
- VOIDmode, 3,
- XEXP (slot0, 0), Pmode,
- XEXP (slot1, 0), Pmode,
- XEXP (slot2, 0), Pmode);
-
- if (GET_CODE (operands[0]) != MEM)
- emit_insn (gen_rtx_SET (VOIDmode, operands[0], slot0));
- DONE;
- }
-}")
+ "emit_tfmode_binop (PLUS, operands); DONE;")
(define_insn "*addtf3_hq"
[(set (match_operand:TF 0 "register_operand" "=e")
@@ -7334,42 +7189,7 @@
(minus:TF (match_operand:TF 1 "general_operand" "")
(match_operand:TF 2 "general_operand" "")))]
"TARGET_FPU && (TARGET_HARD_QUAD || TARGET_ARCH64)"
- "
-{
- if (! TARGET_HARD_QUAD)
- {
- rtx slot0, slot1, slot2;
-
- if (GET_CODE (operands[0]) != MEM)
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- else
- slot0 = operands[0];
- if (GET_CODE (operands[1]) != MEM)
- {
- slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot1, operands[1]));
- }
- else
- slot1 = operands[1];
- if (GET_CODE (operands[2]) != MEM)
- {
- slot2 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot2, operands[2]));
- }
- else
- slot2 = operands[2];
-
- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_sub\"), 0,
- VOIDmode, 3,
- XEXP (slot0, 0), Pmode,
- XEXP (slot1, 0), Pmode,
- XEXP (slot2, 0), Pmode);
-
- if (GET_CODE (operands[0]) != MEM)
- emit_insn (gen_rtx_SET (VOIDmode, operands[0], slot0));
- DONE;
- }
-}")
+ "emit_tfmode_binop (MINUS, operands); DONE;")
(define_insn "*subtf3_hq"
[(set (match_operand:TF 0 "register_operand" "=e")
@@ -7401,42 +7221,7 @@
(mult:TF (match_operand:TF 1 "general_operand" "")
(match_operand:TF 2 "general_operand" "")))]
"TARGET_FPU && (TARGET_HARD_QUAD || TARGET_ARCH64)"
- "
-{
- if (! TARGET_HARD_QUAD)
- {
- rtx slot0, slot1, slot2;
-
- if (GET_CODE (operands[0]) != MEM)
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- else
- slot0 = operands[0];
- if (GET_CODE (operands[1]) != MEM)
- {
- slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot1, operands[1]));
- }
- else
- slot1 = operands[1];
- if (GET_CODE (operands[2]) != MEM)
- {
- slot2 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot2, operands[2]));
- }
- else
- slot2 = operands[2];
-
- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_mul\"), 0,
- VOIDmode, 3,
- XEXP (slot0, 0), Pmode,
- XEXP (slot1, 0), Pmode,
- XEXP (slot2, 0), Pmode);
-
- if (GET_CODE (operands[0]) != MEM)
- emit_insn (gen_rtx_SET (VOIDmode, operands[0], slot0));
- DONE;
- }
-}")
+ "emit_tfmode_binop (MULT, operands); DONE;")
(define_insn "*multf3_hq"
[(set (match_operand:TF 0 "register_operand" "=e")
@@ -7485,42 +7270,7 @@
(div:TF (match_operand:TF 1 "general_operand" "")
(match_operand:TF 2 "general_operand" "")))]
"TARGET_FPU && (TARGET_HARD_QUAD || TARGET_ARCH64)"
- "
-{
- if (! TARGET_HARD_QUAD)
- {
- rtx slot0, slot1, slot2;
-
- if (GET_CODE (operands[0]) != MEM)
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- else
- slot0 = operands[0];
- if (GET_CODE (operands[1]) != MEM)
- {
- slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot1, operands[1]));
- }
- else
- slot1 = operands[1];
- if (GET_CODE (operands[2]) != MEM)
- {
- slot2 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot2, operands[2]));
- }
- else
- slot2 = operands[2];
-
- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_div\"), 0,
- VOIDmode, 3,
- XEXP (slot0, 0), Pmode,
- XEXP (slot1, 0), Pmode,
- XEXP (slot2, 0), Pmode);
-
- if (GET_CODE (operands[0]) != MEM)
- emit_insn (gen_rtx_SET (VOIDmode, operands[0], slot0));
- DONE;
- }
-}")
+ "emit_tfmode_binop (DIV, operands); DONE;")
;; don't have timing for quad-prec. divide.
(define_insn "*divtf3_hq"
@@ -7769,37 +7519,10 @@
[(set_attr "type" "fpmove")])
(define_expand "sqrttf2"
- [(set (match_operand:TF 0 "register_operand" "=e")
- (sqrt:TF (match_operand:TF 1 "register_operand" "e")))]
+ [(set (match_operand:TF 0 "nonimmediate_operand" "")
+ (sqrt:TF (match_operand:TF 1 "general_operand" "")))]
"TARGET_FPU && (TARGET_HARD_QUAD || TARGET_ARCH64)"
- "
-{
- if (! TARGET_HARD_QUAD)
- {
- rtx slot0, slot1;
-
- if (GET_CODE (operands[0]) != MEM)
- slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- else
- slot0 = operands[0];
- if (GET_CODE (operands[1]) != MEM)
- {
- slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot1, operands[1]));
- }
- else
- slot1 = operands[1];
-
- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, \"_Qp_sqrt\"), 0,
- VOIDmode, 2,
- XEXP (slot0, 0), Pmode,
- XEXP (slot1, 0), Pmode);
-
- if (GET_CODE (operands[0]) != MEM)
- emit_insn (gen_rtx_SET (VOIDmode, operands[0], slot0));
- DONE;
- }
-}")
+ "emit_tfmode_unop (SQRT, operands); DONE;")
(define_insn "*sqrttf2_hq"
[(set (match_operand:TF 0 "register_operand" "=e")
@@ -8403,7 +8126,7 @@
"! TARGET_ARCH64 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0"
"call\\t%a0, %1\\n\\tnop\\n\\tunimp\\t%2"
[(set_attr "type" "call_no_delay_slot")
- (set_attr "length" "2")])
+ (set_attr "length" "3")])
;; This is a call that wants a structure value.
;; There is no such critter for v9 (??? we may need one anyway).
@@ -8416,7 +8139,7 @@
"! TARGET_ARCH64 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0"
"call\\t%a0, %1\\n\\tnop\\n\\tunimp\\t%2"
[(set_attr "type" "call_no_delay_slot")
- (set_attr "length" "2")])
+ (set_attr "length" "3")])
;; This is a call that may want a structure value. This is used for
;; untyped_calls.
@@ -8429,7 +8152,7 @@
"! TARGET_ARCH64 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0"
"call\\t%a0, %1\\n\\tnop\\n\\tnop"
[(set_attr "type" "call_no_delay_slot")
- (set_attr "length" "2")])
+ (set_attr "length" "3")])
;; This is a call that wants a structure value.
(define_insn "*call_symbolic_untyped_struct_value_sp32"
@@ -8441,7 +8164,7 @@
"! TARGET_ARCH64 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0"
"call\\t%a0, %1\\n\\tnop\\n\\tnop"
[(set_attr "type" "call_no_delay_slot")
- (set_attr "length" "2")])
+ (set_attr "length" "3")])
(define_expand "call_value"
;; Note that this expression is not used for generating RTL.
@@ -8665,21 +8388,6 @@
[(set_attr "type" "multi")
(set_attr "length" "3")])
-(define_insn "return"
- [(return)
- (use (reg:SI 31))]
- "! TARGET_EPILOGUE"
- "* return output_return (operands);"
- [(set_attr "type" "return")])
-
-(define_peephole
- [(set (match_operand:SI 0 "register_operand" "=r")
- (match_operand:SI 1 "arith_operand" "rI"))
- (parallel [(return)
- (use (reg:SI 31))])]
- "sparc_return_peephole_ok (operands[0], operands[1])"
- "return\\t%%i7+8\\n\\tmov\\t%Y1, %Y0")
-
(define_insn "nop"
[(const_int 0)]
""
@@ -8737,7 +8445,7 @@
/* Restore %fp from stack pointer value for containing function.
The restore insn that follows will move this to %sp,
and reload the appropriate value into %fp. */
- emit_move_insn (frame_pointer_rtx, stack);
+ emit_move_insn (hard_frame_pointer_rtx, stack);
/* USE of frame_pointer_rtx added for consistency; not clear if
really needed. */
@@ -8813,22 +8521,41 @@
DONE;
}")
-;; ??? Should set length to zero when !current_function_calls_alloca,
-;; ??? but there is no easy way to get at that definition. It would
-;; ??? require including function.h into sparc-protos.h and that is
-;; ??? likely not a good idea. -DaveM
(define_insn "do_builtin_setjmp_setup"
[(unspec_volatile [(const_int 0)] 5)]
""
"*
{
- if (!current_function_calls_alloca)
- return \"\";
- if (TARGET_V9)
- return \"flushw\";
- return \"ta\\t3\";
+ if (! current_function_calls_alloca || ! TARGET_V9 || TARGET_FLAT)
+ return \"#\";
+ fputs (\"\tflushw\n\", asm_out_file);
+ if (flag_pic)
+ fprintf (asm_out_file, \"\tst%c\t%%l7, [%%sp+%d]\n\",
+ TARGET_ARCH64 ? 'x' : 'w',
+ SPARC_STACK_BIAS + 7 * UNITS_PER_WORD);
+ fprintf (asm_out_file, \"\tst%c\t%%fp, [%%sp+%d]\n\",
+ TARGET_ARCH64 ? 'x' : 'w',
+ SPARC_STACK_BIAS + 14 * UNITS_PER_WORD);
+ fprintf (asm_out_file, \"\tst%c\t%%i7, [%%sp+%d]\n\",
+ TARGET_ARCH64 ? 'x' : 'w',
+ SPARC_STACK_BIAS + 15 * UNITS_PER_WORD);
+ return \"\";
}"
- [(set_attr "type" "misc")])
+ [(set_attr "type" "misc")
+ (set (attr "length") (if_then_else (eq_attr "pic" "true")
+ (const_int 4)
+ (const_int 3)))])
+
+(define_split
+ [(unspec_volatile [(const_int 0)] 5)]
+ "! current_function_calls_alloca || ! TARGET_V9 || TARGET_FLAT"
+ [(const_int 0)]
+ "
+{
+ if (current_function_calls_alloca)
+ emit_insn (gen_flush_register_windows ());
+ DONE;
+}")
;; Pattern for use after a setjmp to store FP and the return register
;; into the stack area.
@@ -8998,7 +8725,7 @@
(set (match_operand:SI 2 "register_operand" "")
(match_operand:SI 3 "memory_operand" ""))]
"registers_ok_for_ldd_peep (operands[2], operands[0])
- && mems_ok_for_ldd_peep (operands[3], operands[1], operands[2])"
+ && mems_ok_for_ldd_peep (operands[3], operands[1], operands[0])"
[(set (match_dup 2)
(match_dup 3))]
"operands[3] = change_address (operands[3], DImode, NULL);
@@ -9023,7 +8750,7 @@
(set (match_operand:SF 2 "register_operand" "")
(match_operand:SF 3 "memory_operand" ""))]
"registers_ok_for_ldd_peep (operands[2], operands[0])
- && mems_ok_for_ldd_peep (operands[3], operands[1], operands[2])"
+ && mems_ok_for_ldd_peep (operands[3], operands[1], operands[0])"
[(set (match_dup 2)
(match_dup 3))]
"operands[3] = change_address (operands[3], DFmode, NULL);
@@ -9073,17 +8800,17 @@
&& ! SPARC_FP_REG_P (REGNO (operands[1]))"
[(parallel [(set (match_dup 0) (match_dup 1))
(set (reg:CCX 100)
- (compare:CC (match_dup 1) (const_int 0)))])]
+ (compare:CCX (match_dup 1) (const_int 0)))])]
"")
-;; Return peepholes. First the "normal" ones.
-;; These are necessary to catch insns ending up in the epilogue delay list.
+;; Return peepholes. These are generated by sparc_nonflat_function_epilogue
+;; who then immediately calls final_scan_insn.
(define_insn "*return_qi"
[(set (match_operand:QI 0 "restore_operand" "")
(match_operand:QI 1 "arith_operand" "rI"))
(return)]
- "! TARGET_EPILOGUE"
+ "sparc_emitting_epilogue"
"*
{
if (! TARGET_ARCH64 && current_function_returns_struct)
@@ -9101,7 +8828,7 @@
[(set (match_operand:HI 0 "restore_operand" "")
(match_operand:HI 1 "arith_operand" "rI"))
(return)]
- "! TARGET_EPILOGUE"
+ "sparc_emitting_epilogue"
"*
{
if (! TARGET_ARCH64 && current_function_returns_struct)
@@ -9119,7 +8846,7 @@
[(set (match_operand:SI 0 "restore_operand" "")
(match_operand:SI 1 "arith_operand" "rI"))
(return)]
- "! TARGET_EPILOGUE"
+ "sparc_emitting_epilogue"
"*
{
if (! TARGET_ARCH64 && current_function_returns_struct)
@@ -9133,15 +8860,11 @@
[(set_attr "type" "multi")
(set_attr "length" "2")])
-;; The following pattern is only generated by delayed-branch scheduling,
-;; when the insn winds up in the epilogue. This can happen not only when
-;; ! TARGET_FPU because we move complex types around by parts using
-;; SF mode SUBREGs.
(define_insn "*return_sf_no_fpu"
[(set (match_operand:SF 0 "restore_operand" "=r")
(match_operand:SF 1 "register_operand" "r"))
(return)]
- "! TARGET_EPILOGUE"
+ "sparc_emitting_epilogue"
"*
{
if (! TARGET_ARCH64 && current_function_returns_struct)
@@ -9158,7 +8881,7 @@
[(set (match_operand:DF 0 "restore_operand" "=r")
(match_operand:DF 1 "register_operand" "r"))
(return)]
- "! TARGET_EPILOGUE && TARGET_ARCH64"
+ "sparc_emitting_epilogue && TARGET_ARCH64"
"*
{
if (IN_OR_GLOBAL_P (operands[1]))
@@ -9174,7 +8897,7 @@
(plus:SI (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "arith_operand" "rI")))
(return)]
- "! TARGET_EPILOGUE"
+ "sparc_emitting_epilogue"
"*
{
if (! TARGET_ARCH64 && current_function_returns_struct)
@@ -9195,7 +8918,7 @@
(lo_sum:SI (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "immediate_operand" "in")))
(return)]
- "! TARGET_EPILOGUE && ! TARGET_CM_MEDMID"
+ "sparc_emitting_epilogue && ! TARGET_CM_MEDMID"
"*
{
if (! TARGET_ARCH64 && current_function_returns_struct)
@@ -9213,7 +8936,7 @@
[(set (match_operand:DI 0 "restore_operand" "")
(match_operand:DI 1 "arith_double_operand" "rHI"))
(return)]
- "TARGET_ARCH64 && ! TARGET_EPILOGUE"
+ "sparc_emitting_epilogue && TARGET_ARCH64"
"ret\;restore %%g0, %1, %Y0"
[(set_attr "type" "multi")
(set_attr "length" "2")])
@@ -9223,7 +8946,7 @@
(plus:DI (match_operand:DI 1 "arith_operand" "%r")
(match_operand:DI 2 "arith_double_operand" "rHI")))
(return)]
- "TARGET_ARCH64 && ! TARGET_EPILOGUE"
+ "sparc_emitting_epilogue && TARGET_ARCH64"
"ret\;restore %r1, %2, %Y0"
[(set_attr "type" "multi")
(set_attr "length" "2")])
@@ -9233,23 +8956,24 @@
(lo_sum:DI (match_operand:DI 1 "arith_operand" "%r")
(match_operand:DI 2 "immediate_operand" "in")))
(return)]
- "TARGET_ARCH64 && ! TARGET_EPILOGUE && ! TARGET_CM_MEDMID"
+ "sparc_emitting_epilogue && TARGET_ARCH64 && ! TARGET_CM_MEDMID"
"ret\;restore %r1, %%lo(%a2), %Y0"
[(set_attr "type" "multi")
(set_attr "length" "2")])
-;; The following pattern is only generated by delayed-branch scheduling,
-;; when the insn winds up in the epilogue.
(define_insn "*return_sf"
[(set (reg:SF 32)
(match_operand:SF 0 "register_operand" "f"))
(return)]
- "! TARGET_EPILOGUE"
+ "sparc_emitting_epilogue"
"ret\;fmovs\\t%0, %%f0"
[(set_attr "type" "multi")
(set_attr "length" "2")])
;; Now peepholes to do a call followed by a jump.
+;; Do not match this on V9 and later processors, which have a call-return
+;; stack as this corrupts it and causes the code to run slower not faster.
+;; There are not TARGET_ARCH64 patterns because that implies TARGET_V9.
(define_peephole
[(parallel [(set (match_operand 0 "" "")
@@ -9257,7 +8981,8 @@
(match_operand 2 "" "")))
(clobber (reg:SI 15))])
(set (pc) (label_ref (match_operand 3 "" "")))]
- "short_branch (INSN_UID (insn), INSN_UID (operands[3]))
+ "! TARGET_V9
+ && short_branch (INSN_UID (insn), INSN_UID (operands[3]))
&& (USING_SJLJ_EXCEPTIONS || ! can_throw_internal (ins1))"
"call\\t%a1, %2\\n\\tadd\\t%%o7, (%l3-.-4), %%o7")
@@ -9266,49 +8991,70 @@
(match_operand 1 "" ""))
(clobber (reg:SI 15))])
(set (pc) (label_ref (match_operand 2 "" "")))]
- "short_branch (INSN_UID (insn), INSN_UID (operands[2]))
- && (USING_SJLJ_EXCEPTIONS || ! can_throw_internal (ins1))"
- "call\\t%a0, %1\\n\\tadd\\t%%o7, (%l2-.-4), %%o7")
-
-(define_peephole
- [(parallel [(set (match_operand 0 "" "")
- (call (mem:SI (match_operand:DI 1 "call_operand_address" "ps"))
- (match_operand 2 "" "")))
- (clobber (reg:DI 15))])
- (set (pc) (label_ref (match_operand 3 "" "")))]
- "TARGET_ARCH64
- && short_branch (INSN_UID (insn), INSN_UID (operands[3]))
- && (USING_SJLJ_EXCEPTIONS || ! can_throw_internal (ins1))"
- "call\\t%a1, %2\\n\\tadd\\t%%o7, (%l3-.-4), %%o7")
-
-(define_peephole
- [(parallel [(call (mem:SI (match_operand:DI 0 "call_operand_address" "ps"))
- (match_operand 1 "" ""))
- (clobber (reg:DI 15))])
- (set (pc) (label_ref (match_operand 2 "" "")))]
- "TARGET_ARCH64
+ "! TARGET_V9
&& short_branch (INSN_UID (insn), INSN_UID (operands[2]))
&& (USING_SJLJ_EXCEPTIONS || ! can_throw_internal (ins1))"
"call\\t%a0, %1\\n\\tadd\\t%%o7, (%l2-.-4), %%o7")
-(define_insn "prefetch"
+;; ??? UltraSPARC-III note: A memory operation loading into the floating point register
+;; ??? file, if it hits the prefetch cache, has a chance to dual-issue with other memory
+;; ??? operations. With DFA we might be able to model this, but it requires a lot of
+;; ??? state.
+(define_expand "prefetch"
+ [(match_operand 0 "address_operand" "")
+ (match_operand 1 "const_int_operand" "")
+ (match_operand 2 "const_int_operand" "")]
+ "TARGET_V9"
+ "
+{
+ if (TARGET_ARCH64)
+ emit_insn (gen_prefetch_64 (operands[0], operands[1], operands[2]));
+ else
+ emit_insn (gen_prefetch_32 (operands[0], operands[1], operands[2]));
+ DONE;
+}")
+
+(define_insn "prefetch_64"
[(prefetch (match_operand:DI 0 "address_operand" "p")
(match_operand:DI 1 "const_int_operand" "n")
(match_operand:DI 2 "const_int_operand" "n"))]
- "TARGET_V9"
+ ""
+{
+ static const char * const prefetch_instr[2][2] = {
+ {
+ "prefetch\\t[%a0], 1", /* no locality: prefetch for one read */
+ "prefetch\\t[%a0], 0", /* medium to high locality: prefetch for several reads */
+ },
+ {
+ "prefetch\\t[%a0], 3", /* no locality: prefetch for one write */
+ "prefetch\\t[%a0], 2", /* medium to high locality: prefetch for several writes */
+ }
+ };
+ int read_or_write = INTVAL (operands[1]);
+ int locality = INTVAL (operands[2]);
+
+ if (read_or_write != 0 && read_or_write != 1)
+ abort ();
+ if (locality < 0 || locality > 3)
+ abort ();
+ return prefetch_instr [read_or_write][locality == 0 ? 0 : 1];
+}
+ [(set_attr "type" "load")])
+
+(define_insn "prefetch_32"
+ [(prefetch (match_operand:SI 0 "address_operand" "p")
+ (match_operand:SI 1 "const_int_operand" "n")
+ (match_operand:SI 2 "const_int_operand" "n"))]
+ ""
{
- static const char * const prefetch_instr[2][4] = {
+ static const char * const prefetch_instr[2][2] = {
{
"prefetch\\t[%a0], 1", /* no locality: prefetch for one read */
- "prefetch\\t[%a0], 0", /* medium locality: prefetch for several reads */
- "prefetch\\t[%a0], 0", /* medium locality: prefetch for several reads */
- "prefetch\\t[%a0], 4", /* high locality: prefetch page */
+ "prefetch\\t[%a0], 0", /* medium to high locality: prefetch for several reads */
},
{
"prefetch\\t[%a0], 3", /* no locality: prefetch for one write */
- "prefetch\\t[%a0], 2", /* medium locality: prefetch for several writes */
- "prefetch\\t[%a0], 2", /* medium locality: prefetch for several writes */
- "prefetch\\t[%a0], 4", /* high locality: prefetch page */
+ "prefetch\\t[%a0], 2", /* medium to high locality: prefetch for several writes */
}
};
int read_or_write = INTVAL (operands[1]);
@@ -9318,7 +9064,7 @@
abort ();
if (locality < 0 || locality > 3)
abort ();
- return prefetch_instr [read_or_write][locality];
+ return prefetch_instr [read_or_write][locality == 0 ? 0 : 1];
}
[(set_attr "type" "load")])
diff --git a/contrib/gcc/config/sparc/splet.h b/contrib/gcc/config/sparc/splet.h
index d2ef4fb..0d3f054 100644
--- a/contrib/gcc/config/sparc/splet.h
+++ b/contrib/gcc/config/sparc/splet.h
@@ -20,7 +20,7 @@ the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#undef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_APP_REGS + MASK_EPILOGUE)
+#define TARGET_DEFAULT MASK_APP_REGS
#define CPP_PREDEFINES "-Dsparc -Acpu=sparc -Amachine=sparc"
diff --git a/contrib/gcc/config/sparc/t-crtfm b/contrib/gcc/config/sparc/t-crtfm
new file mode 100644
index 0000000..744537d
--- /dev/null
+++ b/contrib/gcc/config/sparc/t-crtfm
@@ -0,0 +1,4 @@
+EXTRA_PARTS += crtfastmath.o
+
+crtfastmath.o: $(srcdir)/config/sparc/crtfastmath.c $(GCC_PASSES)
+ $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -c -o crtfastmath.o $(srcdir)/config/sparc/crtfastmath.c
diff --git a/contrib/gcc/config/sparc/t-elf b/contrib/gcc/config/sparc/t-elf
index ead6e25..027940b 100644
--- a/contrib/gcc/config/sparc/t-elf
+++ b/contrib/gcc/config/sparc/t-elf
@@ -1,3 +1,6 @@
+LIB1ASMSRC = sparc/lb1spc.asm
+LIB1ASMFUNCS = _mulsi3 _divsi3 _modsi3
+
# We want fine grained libraries, so use the new code to build the
# floating point emulation libraries.
FPBIT = fp-bit.c
@@ -12,12 +15,9 @@ fp-bit.c: $(srcdir)/config/fp-bit.c
# MULTILIB_OPTIONS should have msparclite too, but we'd have to make
# gas build...
-#MULTILIB_OPTIONS = msoft-float mcpu=v8
-MULTILIB_OPTIONS = msoft-float
-#MULTILIB_DIRNAMES = soft v8
-MULTILIB_DIRNAMES = soft
-#MULTILIB_MATCHES = msoft-float=mno-fpu mcpu?v8=mv8
-MULTILIB_MATCHES = msoft-float=mno-fpu
+MULTILIB_OPTIONS = msoft-float mcpu=v8
+MULTILIB_DIRNAMES = soft v8
+MULTILIB_MATCHES = msoft-float=mno-fpu mcpu?v8=mv8
LIBGCC = stmp-multilib
INSTALL_LIBGCC = install-multilib
diff --git a/contrib/gcc/config/sparc/t-linux64 b/contrib/gcc/config/sparc/t-linux64
index 4f552e0..c93ff25 100644
--- a/contrib/gcc/config/sparc/t-linux64
+++ b/contrib/gcc/config/sparc/t-linux64
@@ -8,3 +8,11 @@ LIBGCC = stmp-multilib
INSTALL_LIBGCC = install-multilib
EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
+
+SHLIB_SLIBDIR_SUFFIXES = 64:64 32:
+
+# Override t-slibgcc-elf-ver to export some libgcc symbols with
+# the symbol versions that glibc used.
+# Avoid the t-linux version file.
+SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \
+ $(srcdir)/config/sparc/libgcc-sparc-glibc.ver
diff --git a/contrib/gcc/config/sparc/t-netbsd64 b/contrib/gcc/config/sparc/t-netbsd64
new file mode 100644
index 0000000..1292b86
--- /dev/null
+++ b/contrib/gcc/config/sparc/t-netbsd64
@@ -0,0 +1,6 @@
+MULTILIB_OPTIONS = m32/m64
+MULTILIB_DIRNAMES = 32 64
+MULTILIB_MATCHES =
+
+LIBGCC = stmp-multilib
+INSTALL_LIBGCC = install-multilib
diff --git a/contrib/gcc/config/sparc/t-sol2-64 b/contrib/gcc/config/sparc/t-sol2-64
index 8d42c44..ef7dee7 100644
--- a/contrib/gcc/config/sparc/t-sol2-64
+++ b/contrib/gcc/config/sparc/t-sol2-64
@@ -6,3 +6,5 @@ LIBGCC = stmp-multilib
INSTALL_LIBGCC = install-multilib
EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o gmon.o crt1.o crti.o crtn.o gcrt1.o
+
+SHLIB_SLIBDIR_SUFFIXES = sparcv9:/sparcv9 sparcv7:
diff --git a/contrib/gcc/config/sparc/vxsim.h b/contrib/gcc/config/sparc/vxsim.h
index 94cfb92..c821e82 100644
--- a/contrib/gcc/config/sparc/vxsim.h
+++ b/contrib/gcc/config/sparc/vxsim.h
@@ -71,6 +71,9 @@ do { \
#undef COMMON_ASM_OP
#define COMMON_ASM_OP "\t.common\t"
+#undef LOCAL_LABEL_PREFIX
+#define LOCAL_LABEL_PREFIX "."
+
/* This is how to output a definition of an internal numbered label where
PREFIX is the class of label and NUM is the number within the class. */
diff --git a/contrib/gcc/config/sparc/vxsparc64.h b/contrib/gcc/config/sparc/vxsparc64.h
index ecfe25b..358f2c0 100644
--- a/contrib/gcc/config/sparc/vxsparc64.h
+++ b/contrib/gcc/config/sparc/vxsparc64.h
@@ -71,7 +71,7 @@ Boston, MA 02111-1307, USA. */
#define CPP_SPEC "%(cpp_cpu) %(cpp_arch) -DCPU=ULTRASPARC -D__CPU__=CPU"
#undef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_APP_REGS | MASK_EPILOGUE | MASK_FPU \
+#define TARGET_DEFAULT (MASK_APP_REGS | MASK_FPU \
| MASK_LONG_DOUBLE_128 | MASK_64BIT)
#undef SPARC_DEFAULT_CMODEL
diff --git a/contrib/gcc/config/t-slibgcc-elf-ver b/contrib/gcc/config/t-slibgcc-elf-ver
index 2912e0a..c02ff9d 100644
--- a/contrib/gcc/config/t-slibgcc-elf-ver
+++ b/contrib/gcc/config/t-slibgcc-elf-ver
@@ -2,21 +2,28 @@
# with the GNU linker.
SHLIB_EXT = .so
-SHLIB_NAME = @shlib_base_name@.so
-SHLIB_SONAME = @shlib_base_name@.so.1
+SHLIB_SOLINK = @shlib_base_name@.so
+SHLIB_SONAME = @shlib_so_name@.so.1
+SHLIB_NAME = @shlib_dir@@shlib_so_name@.so.1
SHLIB_MAP = @shlib_map_file@
SHLIB_OBJS = @shlib_objs@
+SHLIB_SLIBDIR_QUAL = @shlib_slibdir_qual@
+SHLIB_LC = -lc
SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
-Wl,--soname=$(SHLIB_SONAME) \
-Wl,--version-script=$(SHLIB_MAP) \
- -o $(SHLIB_NAME) @multilib_flags@ $(SHLIB_OBJS) -lc && \
- rm -f $(SHLIB_SONAME) && \
- $(LN_S) $(SHLIB_NAME) $(SHLIB_SONAME)
+ -o $(SHLIB_NAME) @multilib_flags@ $(SHLIB_OBJS) $(SHLIB_LC) && \
+ rm -f $(SHLIB_SOLINK) && \
+ $(LN_S) $(SHLIB_NAME) $(SHLIB_SOLINK)
# $(slibdir) double quoted to protect it from expansion while building
# libgcc.mk. We want this delayed until actual install time.
-SHLIB_INSTALL = $(INSTALL_DATA) $(SHLIB_NAME) $$(slibdir)/$(SHLIB_SONAME); \
- rm -f $$(slibdir)/$(SHLIB_NAME); \
- $(LN_S) $(SHLIB_SONAME) $$(slibdir)/$(SHLIB_NAME)
+SHLIB_INSTALL = \
+ $$(SHELL) $$(srcdir)/mkinstalldirs $$(slibdir)$(SHLIB_SLIBDIR_QUAL); \
+ $(INSTALL_DATA) $(SHLIB_NAME) \
+ $$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SONAME); \
+ rm -f $$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK); \
+ $(LN_S) $(SHLIB_SONAME) \
+ $$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
SHLIB_MKMAP = $(srcdir)/mkmap-symver.awk
SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
diff --git a/contrib/gcc/config/t-slibgcc-nolc-override b/contrib/gcc/config/t-slibgcc-nolc-override
new file mode 100644
index 0000000..959d2cc
--- /dev/null
+++ b/contrib/gcc/config/t-slibgcc-nolc-override
@@ -0,0 +1 @@
+SHLIB_LC =
diff --git a/contrib/gcc/config/t-slibgcc-sld b/contrib/gcc/config/t-slibgcc-sld
index 35f1bc1..c11a572 100644
--- a/contrib/gcc/config/t-slibgcc-sld
+++ b/contrib/gcc/config/t-slibgcc-sld
@@ -1,21 +1,27 @@
# Build a shared libgcc library with the Solaris linker.
SHLIB_EXT = .so
-SHLIB_NAME = @shlib_base_name@.so
-SHLIB_SONAME = @shlib_base_name@.so.1
+SHLIB_SOLINK = @shlib_base_name@.so
+SHLIB_SONAME = @shlib_so_name@.so.1
+SHLIB_NAME = @shlib_dir@@shlib_so_name@.so.1
SHLIB_MAP = @shlib_map_file@
SHLIB_OBJS = @shlib_objs@
+SHLIB_SLIBDIR_QUAL = @shlib_slibdir_qual@
SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
-Wl,-h,$(SHLIB_SONAME) -Wl,-z,text -Wl,-z,defs \
-Wl,-M,$(SHLIB_MAP) -o $(SHLIB_NAME) \
@multilib_flags@ $(SHLIB_OBJS) -lc && \
- rm -f $(SHLIB_SONAME) && \
- $(LN_S) $(SHLIB_NAME) $(SHLIB_SONAME)
+ rm -f $(SHLIB_SOLINK) && \
+ $(LN_S) $(SHLIB_NAME) $(SHLIB_SOLINK)
# $(slibdir) double quoted to protect it from expansion while building
# libgcc.mk. We want this delayed until actual install time.
-SHLIB_INSTALL = $(INSTALL_DATA) $(SHLIB_NAME) $$(slibdir)/$(SHLIB_SONAME); \
- rm -f $$(slibdir)/$(SHLIB_NAME); \
- $(LN_S) $(SHLIB_SONAME) $$(slibdir)/$(SHLIB_NAME)
+SHLIB_INSTALL = \
+ $$(SHELL) $$(srcdir)/mkinstalldirs $$(slibdir)$(SHLIB_SLIBDIR_QUAL); \
+ $(INSTALL_DATA) $(SHLIB_NAME) \
+ $$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SONAME); \
+ rm -f $$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK); \
+ $(LN_S) $(SHLIB_SONAME) \
+ $$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
SHLIB_MKMAP = $(srcdir)/mkmap-symver.awk
SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
diff --git a/contrib/gcc/configure.in b/contrib/gcc/configure.in
index 0c7e333..8893ed6 100644
--- a/contrib/gcc/configure.in
+++ b/contrib/gcc/configure.in
@@ -214,8 +214,7 @@ no) ;;
;;
esac
],
-# Enable some checks by default for development versions of GCC
-[ac_checking=1; ac_tree_checking=1; ac_gc_checking=1;])
+[])
if test x$ac_checking != x ; then
AC_DEFINE(ENABLE_CHECKING, 1,
[Define if you want more run-time sanity checks. This one gets a grab
@@ -350,6 +349,9 @@ fi
AC_SUBST(NO_MINUS_C_MINUS_O)
AC_SUBST(OUTPUT_OPTION)
+# See if GNAT has been installed
+gcc_AC_PROG_GNAT
+
AC_CACHE_CHECK(whether ${CC-cc} accepts -Wno-long-long,
ac_cv_prog_cc_no_long_long,
[save_CFLAGS="$CFLAGS"
@@ -357,8 +359,26 @@ CFLAGS="-Wno-long-long"
AC_TRY_COMPILE(,,ac_cv_prog_cc_no_long_long=yes,
ac_cv_prog_cc_no_long_long=no)
CFLAGS="$save_CFLAGS"])
+
+if test x$have_gnat != xno ; then
+AC_CACHE_CHECK(whether ${ADAC} accepts -Wno-long-long,
+ac_cv_prog_adac_no_long_long,
+[cat >conftest.adb <<EOF
+procedure conftest is begin null; end conftest;
+EOF
+if $ADAC -Wno-long-long -c conftest.adb 1>&5 2>&5 ; then
+ ac_cv_prog_adac_no_long_long=yes
+else
+ ac_cv_prog_adac_no_long_long=no
+fi
+rm -f conftest*])
+else
+ ac_cv_prog_adac_no_long_long=yes
+fi
+
strict1_warn=
-if test $ac_cv_prog_cc_no_long_long = yes; then
+if test $ac_cv_prog_cc_no_long_long = yes && \
+ test $ac_cv_prog_adac_no_long_long = yes ; then
strict1_warn="-pedantic -Wno-long-long"
fi
AC_SUBST(strict1_warn)
@@ -478,9 +498,6 @@ gcc_AC_C_CHAR_BIT
gcc_AC_C_COMPILE_ENDIAN
gcc_AC_C_FLOAT_FORMAT
-# See if GNAT has been installed
-gcc_AC_PROG_GNAT
-
# See if we have the mktemp command.
AC_CHECK_PROG(have_mktemp_command, mktemp, yes, no)
@@ -494,7 +511,7 @@ else
# that we can use it.
gcc_AC_CHECK_PROG_VER(MAKEINFO, makeinfo, --version,
[GNU texinfo.* \([0-9][0-9.]*\)],
- [4.*])
+ [4.[1-9]*])
fi
if test $gcc_cv_prog_makeinfo_modern = no; then
@@ -864,7 +881,7 @@ else
saved_CFLAGS="${CFLAGS}"
CC="${CC_FOR_BUILD}" CFLAGS="${CFLAGS_FOR_BUILD}" \
${realsrcdir}/configure \
- --target=$target --host=$build --build=$build
+ --target=$target_alias --host=$build_alias --build=$build_alias
CFLAGS="${saved_CFLAGS}"
# We just finished tests for the build machine, so rename
@@ -1201,11 +1218,11 @@ changequote([,])dnl
changequote(,)dnl
gcc_cv_gas_major_version=`expr "$gcc_cv_gas_version" : "VERSION=\([0-9]*\)"`
gcc_cv_gas_minor_version=`expr "$gcc_cv_gas_version" : "VERSION=[0-9]*\.\([0-9]*\)"`
+ gcc_cv_gas_patch_version=`expr "$gcc_cv_gas_version" : "VERSION=[0-9]*\.[0-9]*\.\([0-9]*\)"`
changequote([,])dnl
fi
-if test "x$gcc_cv_as" = x -a x$host = x$target; then
- # Native build.
+if test "x$gcc_cv_as" = x; then
# Search the same directories that the installed compiler will
# search. Else we may find the wrong assembler and lose. If we
# do not find a suitable assembler binary, then try the user's
@@ -1230,14 +1247,21 @@ if test "x$gcc_cv_as" = x -a x$host = x$target; then
# If the loop below does not find an assembler, then use whatever
# one we can find in the users's path.
# user's path.
- gcc_cv_as=as$host_exeext
-
- test_dirs="$test_prefix/lib/gcc-lib/$target/$gcc_version \
- $test_prefix/lib/gcc-lib/$target \
- /usr/lib/gcc/$target/$gcc_version \
- /usr/lib/gcc/$target \
- $test_prefix/$target/bin/$target/$gcc_version \
- $test_prefix/$target/bin \
+ if test "x$program_prefix" != xNONE; then
+ gcc_cv_as=${program_prefix}as$host_exeext
+ else
+ gcc_cv_as=`echo as | sed ${program_transform_name}`$host_exeext
+ fi
+
+ test_dirs="$test_prefix/lib/gcc-lib/$target_alias/$gcc_version \
+ $test_prefix/lib/gcc-lib/$target_alias \
+ /usr/lib/gcc/$target_alias/$gcc_version \
+ /usr/lib/gcc/$target_alias \
+ $test_prefix/$target_alias/bin/$target_alias/$gcc_version \
+ $test_prefix/$target_alias/bin"
+
+ if test x$host = x$target; then
+ test_dirs="$test_dirs \
/usr/libexec \
/usr/ccs/gcc \
/usr/ccs/bin \
@@ -1248,9 +1272,10 @@ if test "x$gcc_cv_as" = x -a x$host = x$target; then
/sysv/usr/lib/cmplrs/cc \
/svr4/usr/lib/cmplrs/cc \
/usr/bin"
+ fi
for dir in $test_dirs; do
- if test -f $dir/as$host_exeext; then
+ if test -x $dir/as$host_exeext; then
gcc_cv_as=$dir/as$host_exeext
break;
fi
@@ -1293,8 +1318,7 @@ changequote(,)dnl
changequote([,])dnl
fi
-if test "x$gcc_cv_ld" = x -a x$host = x$target; then
- # Native build.
+if test "x$gcc_cv_ld" = x; then
# Search the same directories that the installed compiler will
# search. Else we may find the wrong linker and lose. If we
# do not find a suitable linker binary, then try the user's
@@ -1319,14 +1343,21 @@ if test "x$gcc_cv_ld" = x -a x$host = x$target; then
# If the loop below does not find an linker, then use whatever
# one we can find in the users's path.
# user's path.
- gcc_cv_ld=ld$host_exeext
-
- test_dirs="$test_prefix/lib/gcc-lib/$target/$gcc_version \
- $test_prefix/lib/gcc-lib/$target \
- /usr/lib/gcc/$target/$gcc_version \
- /usr/lib/gcc/$target \
- $test_prefix/$target/bin/$target/$gcc_version \
- $test_prefix/$target/bin \
+ if test "x$program_prefix" != xNONE; then
+ gcc_cv_ld=${program_prefix}ld$host_exeext
+ else
+ gcc_cv_ld=`echo ld | sed ${program_transform_name}`$host_exeext
+ fi
+
+ test_dirs="$test_prefix/lib/gcc-lib/$target_alias/$gcc_version \
+ $test_prefix/lib/gcc-lib/$target_alias \
+ /usr/lib/gcc/$target_alias/$gcc_version \
+ /usr/lib/gcc/$target_alias \
+ $test_prefix/$target_alias/bin/$target_alias/$gcc_version \
+ $test_prefix/$target_alias/bin"
+
+ if test x$host = x$target; then
+ test_dirs="$test_dirs \
/usr/libexec \
/usr/ccs/gcc \
/usr/ccs/bin \
@@ -1337,9 +1368,10 @@ if test "x$gcc_cv_ld" = x -a x$host = x$target; then
/sysv/usr/lib/cmplrs/cc \
/svr4/usr/lib/cmplrs/cc \
/usr/bin"
+ fi
for dir in $test_dirs; do
- if test -f $dir/ld$host_exeext; then
+ if test -x $dir/ld$host_exeext; then
gcc_cv_ld=$dir/ld$host_exeext
break;
fi
@@ -1355,9 +1387,10 @@ fi
AC_MSG_CHECKING(what nm to use)
if test -x nm$host_exeext; then
gcc_cv_nm=./nm$host_exeext
-elif test x$host = x$target; then
- # Native build.
- gcc_cv_nm=nm$host_exeext
+elif test "x$program_prefix" != xNONE; then
+ gcc_cv_nm=${program_prefix}nm$host_exeext
+else
+ gcc_cv_nm=`echo nm | sed ${program_transform_name}`$host_exeext
fi
AC_MSG_RESULT($gcc_cv_nm)
@@ -1365,9 +1398,10 @@ AC_MSG_RESULT($gcc_cv_nm)
AC_MSG_CHECKING(what objdump to use)
if test -x objdump$host_exeext; then
gcc_cv_objdump=./objdump$host_exeext
-elif test x$host = x$target; then
- # Native build.
- gcc_cv_objdump=objdump$host_exeext
+elif test "x$program_prefix" != xNONE; then
+ gcc_cv_objdump=${program_prefix}objdump$host_exeext
+else
+ gcc_cv_objdump=`echo objdump | sed ${program_transform_name}`$host_exeext
fi
AC_MSG_RESULT($gcc_cv_objdump)
@@ -1467,7 +1501,13 @@ AC_MSG_RESULT($gcc_cv_as_weak)
AC_MSG_CHECKING(assembler hidden support)
gcc_cv_as_hidden=no
if test x$gcc_cv_gas_major_version != x -a x$gcc_cv_gas_minor_version != x; then
- if test "$gcc_cv_gas_major_version" -eq 2 -a "$gcc_cv_gas_minor_version" -ge 10 -o "$gcc_cv_gas_major_version" -gt 2 && grep 'obj_format = elf' ../gas/Makefile > /dev/null; then
+ if test "$gcc_cv_gas_major_version" -eq 2 \
+ -a "$gcc_cv_gas_minor_version" -eq 12 \
+ -a "$gcc_cv_gas_patch_version" -ge 1 \
+ -o "$gcc_cv_gas_major_version" -eq 2 \
+ -a "$gcc_cv_gas_minor_version" -gt 12 \
+ -o "$gcc_cv_gas_major_version" -gt 2 \
+ && grep 'obj_format = elf' ../gas/Makefile > /dev/null; then
gcc_cv_as_hidden="yes"
fi
elif test x$gcc_cv_as != x; then
@@ -1478,12 +1518,28 @@ elif test x$gcc_cv_as != x; then
gcc_cv_as_hidden="yes"
fi
rm -f conftest.s conftest.o conftest.nm1 conftest.nm2
+
+ # GNU LD versions before 2.12.1 have buggy support for STV_HIDDEN.
+ # This is irritatingly difficult to feature test for. Look for
+ # the date string after the version number.
+ ld_ver=`$gcc_cv_ld --version 2>/dev/null | head -1`
+ if echo "$ld_ver" | grep GNU > /dev/null; then
+changequote(,)dnl
+ ld_date=`echo $ld_ver | sed -n 's,^.*\([2-9][0-9][0-9][0-9]\)[-]*\([01][0-9]\)[-]*\([0-3][0-9]\).*$,\1\2\3,p'`
+changequote([,])dnl
+ if test 0"$ld_date" -lt 20020404; then
+ gcc_cv_as_hidden="no"
+ fi
+ fi
fi
+
if test x"$gcc_cv_as_hidden" = xyes; then
AC_DEFINE(HAVE_GAS_HIDDEN, 1,
[Define if your assembler supports .hidden.])
fi
AC_MSG_RESULT($gcc_cv_as_hidden)
+libgcc_visibility=$gcc_cv_as_hidden
+AC_SUBST(libgcc_visibility)
AC_MSG_CHECKING(assembler leb128 support)
gcc_cv_as_leb128=no
@@ -1715,10 +1771,9 @@ EOF
if test x$gcc_cv_as != x -a x$gcc_cv_ld != x; then
gcc_cv_as_sparc_ua_pcrel=no
echo ".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo)" > conftest.s
- if $gcc_cv_as -K PIC -o conftest.o conftest.s > /dev/null 2>&1; then
- if $gcc_cv_ld -o conftest conftest.o -G > /dev/null 2>&1; then
- gcc_cv_as_sparc_ua_pcrel=yes
- fi
+ if $gcc_cv_as -K PIC -o conftest.o conftest.s > /dev/null 2>&1 \
+ && $gcc_cv_ld -o conftest conftest.o -G > /dev/null 2>&1; then
+ gcc_cv_as_sparc_ua_pcrel=yes
fi
rm -f conftest.s conftest.o conftest
fi
@@ -1728,42 +1783,36 @@ EOF
[Define if your assembler and linker support unaligned PC relative relocs.])
fi
- case "$tm_file" in
- *64*)
- AC_CACHE_CHECK([for 64 bit support in assembler ($gcc_cv_as)],
- gcc_cv_as_flags64, [
- if test -n "$gcc_cv_as"; then
- echo ".xword foo" > conftest.s
- gcc_cv_as_flags64=no
- for flag in "-xarch=v9" "-64 -Av9"; do
- if $gcc_cv_as $flag -o conftest.o conftest.s \
- > /dev/null 2>&1; then
- gcc_cv_as_flags64=$flag
- break
- fi
- done
- rm -f conftest.s conftest.o
- else
- if test "$gas" = yes; then
- gcc_cv_as_flags64="-64 -Av9"
+ AC_CACHE_CHECK([assembler and linker support unaligned pc related relocs against hidden symbols],
+ gcc_cv_as_sparc_ua_pcrel_hidden, [
+ if test "x$gcc_cv_as_sparc_ua_pcrel" = xyes; then
+ gcc_cv_as_sparc_ua_pcrel_hidden=unknown
+ if test x$gcc_cv_objdump != x; then
+ gcc_cv_as_sparc_ua_pcrel_hidden=no
+ echo ".data; .align 4; .byte 0x31; .uaword %r_disp32(foo)" > conftest.s
+ echo ".byte 0x32, 0x33, 0x34; .global foo; .hidden foo" >> conftest.s
+ echo "foo: .skip 4" >> conftest.s
+ if $gcc_cv_as -K PIC -o conftest.o conftest.s > /dev/null 2>&1 \
+ && $gcc_cv_ld -o conftest conftest.o -G > /dev/null 2>&1 \
+ && $gcc_cv_objdump -s -j .data conftest 2> /dev/null \
+ | grep ' 31000000 07323334' > /dev/null 2>&1; then
+ if $gcc_cv_objdump -R conftest 2> /dev/null \
+ | grep 'DISP32' > /dev/null 2>&1; then
+ :
else
- gcc_cv_as_flags64="-xarch=v9"
+ gcc_cv_as_sparc_ua_pcrel_hidden=yes
fi
fi
- ])
- if test "x$gcc_cv_as_flags64" = xno; then
-changequote(, )
- tmake_file=`echo " $tmake_file " | sed -e 's, sparc/t-sol2-64 , ,' -e 's,^ ,,' -e 's, $,,'`
- dep_tmake_file=`echo " $dep_tmake_file " | sed -e 's, [^ ]*/config/sparc/t-sol2-64 , ,' -e 's,^ ,,' -e 's, $,,'`
-changequote([, ])
+ fi
+ rm -f conftest.s conftest.o conftest
else
- AC_DEFINE_UNQUOTED(AS_SPARC64_FLAG, "$gcc_cv_as_flags64",
- [Define if the assembler supports 64bit sparc.])
+ gcc_cv_as_sparc_ua_pcrel_hidden="$gcc_cv_as_sparc_ua_pcrel"
fi
- ;;
- *) gcc_cv_as_flags64=${gcc_cv_as_flags64-no}
- ;;
- esac
+ ])
+ if test "x$gcc_cv_as_sparc_ua_pcrel_hidden" = xyes; then
+ AC_DEFINE(HAVE_AS_SPARC_UA_PCREL_HIDDEN, 1,
+ [Define if your assembler and linker support unaligned PC relative relocs against hidden symbols.])
+ fi
if test "x$gcc_cv_as_flags64" != xno; then
AC_CACHE_CHECK([for assembler offsetable %lo() support],
@@ -1967,11 +2016,94 @@ elif test x$gcc_cv_ld != x; then
gcc_cv_ld_eh_frame_hdr=yes
fi
fi
+AC_MSG_RESULT($gcc_cv_ld_eh_frame_hdr)
if test x"$gcc_cv_ld_eh_frame_hdr" = xyes; then
+ AC_MSG_CHECKING(whether linker eh_frame optimizations work properly)
+ gcc_cv_ld_eh_frame_hdr_works=no
+ if test x$gcc_cv_gld_major_version != x -a x$gcc_cv_gld_minor_version != x; then
+ if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 13 -o "$gcc_cv_gld_major_version" -gt 2 && grep 'EMUL = elf' ../ld/Makefile > /dev/null; then
+ gcc_cv_ld_eh_frame_hdr_works=yes
+ fi
+ elif test x$gcc_cv_ld != x; then
+ for gcc_WS in 4 8; do
+ cat > conftest.s <<EOF
+ .text
+.LFB1: .skip 64
+.LFE1:
+.LFB2: .skip 64
+.LFE2:
+.LFB3: .skip 64
+.LFE3:
+ .section .eh_frame,"aw",@progbits
+.Lframe1:
+ .4byte .LECIE1-.LSCIE1
+.LSCIE1:
+ .4byte 0x0
+ .byte 0x1
+ .ascii "zR\0"
+ .uleb128 0x1
+ .sleb128 -4
+ .byte 0x8
+ .uleb128 0x1
+ .byte 0x50
+ .byte 0xc
+ .uleb128 0x4
+ .uleb128 0x4
+ .byte 0x88
+ .uleb128 0x1
+ .balign ${gcc_WS}
+.LECIE1:
+.LSFDE1:
+ .4byte .LEFDE1-.LASFDE1
+.LASFDE1:
+ .4byte .LASFDE1-.Lframe1
+ .${gcc_WS}byte .LFB1
+ .${gcc_WS}byte .LFE1-.LFB1
+ .uleb128 0x0
+ .balign ${gcc_WS}
+.LEFDE1:
+.LSFDE2:
+ .4byte .LEFDE2-.LASFDE2
+.LASFDE2:
+ .4byte .LASFDE2-.Lframe1
+ .${gcc_WS}byte .LFB2
+ .${gcc_WS}byte .LFE2-.LFB2
+ .uleb128 0x0
+ .balign ${gcc_WS}
+.LEFDE2:
+.LSFDE3:
+ .4byte .LEFDE3-.LASFDE3
+.LASFDE3:
+ .4byte .LASFDE3-.Lframe1
+ .${gcc_WS}byte .LFB3
+ .${gcc_WS}byte .LFE3-.LFB3
+ .uleb128 0x0
+ .balign ${gcc_WS}
+.LEFDE3:
+ .4byte 0
+EOF
+ if ($gcc_cv_as -o conftest.o conftest.s; exit $?) 1>&AC_FD_CC 2>&1; then
+ if ($gcc_cv_ld --eh-frame-hdr -shared -o conftest.so conftest.o; exit $?) 1>&AC_FD_CC 2>&1; then
+changequote(,)dnl
+ if $gcc_cv_objdump -h conftest.so 2>&AC_FD_CC \
+ | grep 'eh_frame_hdr[ ]*0*[01][048cC][ ]' 1>&AC_FD_CC 2>&1; then
+ gcc_cv_ld_eh_frame_hdr_works=yes; break
+ else
+ $gcc_cv_objdump -h conftest.so 2>/dev/null | grep eh_frame_hdr 1>&AC_FD_CC 2>&1
+ fi
+changequote([,])dnl
+ fi
+ fi
+ rm -f conftest.*
+ done
+ fi
+ AC_MSG_RESULT($gcc_cv_ld_eh_frame_hdr_works)
+fi
+if test x"$gcc_cv_ld_eh_frame_hdr" = xyes \
+ && test x"$gcc_cv_ld_eh_frame_hdr_works" = xyes; then
AC_DEFINE(HAVE_LD_EH_FRAME_HDR, 1,
[Define if your linker supports --eh-frame-hdr option.])
fi
-AC_MSG_RESULT($gcc_cv_ld_eh_frame_hdr)
if test "$prefix" != "/usr" && test "$prefix" != "/usr/local" ; then
AC_DEFINE_UNQUOTED(PREFIX_INCLUDE_DIR, "$prefix/include")
diff --git a/contrib/gcc/cp-demangle.c b/contrib/gcc/cp-demangle.c
new file mode 100644
index 0000000..53eeaaf
--- /dev/null
+++ b/contrib/gcc/cp-demangle.c
@@ -0,0 +1,4138 @@
+/* Demangler for IA64 / g++ V3 ABI.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Written by Alex Samuel <samuel@codesourcery.com>.
+
+ This file is part of GNU CC.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ In addition to the permissions in the GNU General Public License, the
+ Free Software Foundation gives you unlimited permission to link the
+ compiled version of this file into combinations with other programs,
+ and to distribute those combinations without any restriction coming
+ from the use of this file. (The General Public License restrictions
+ do apply in other respects; for example, they cover modification of
+ the file, and distribution when not linked into a combined
+ executable.)
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/* This file implements demangling of C++ names mangled according to
+ the IA64 / g++ V3 ABI. Use the cp_demangle function to
+ demangle a mangled name, or compile with the preprocessor macro
+ STANDALONE_DEMANGLER defined to create a demangling filter
+ executable (functionally similar to c++filt, but includes this
+ demangler only). */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "ansidecl.h"
+#include "libiberty.h"
+#include "dyn-string.h"
+#include "demangle.h"
+
+/* If CP_DEMANGLE_DEBUG is defined, a trace of the grammar evaluation,
+ and other debugging output, will be generated. */
+#ifdef CP_DEMANGLE_DEBUG
+#define DEMANGLE_TRACE(PRODUCTION, DM) \
+ fprintf (stderr, " -> %-24s at position %3d\n", \
+ (PRODUCTION), current_position (DM));
+#else
+#define DEMANGLE_TRACE(PRODUCTION, DM)
+#endif
+
+/* Don't include <ctype.h>, to prevent additional unresolved symbols
+ from being dragged into the C++ runtime library. */
+#define IS_DIGIT(CHAR) ((CHAR) >= '0' && (CHAR) <= '9')
+#define IS_ALPHA(CHAR) \
+ (((CHAR) >= 'a' && (CHAR) <= 'z') \
+ || ((CHAR) >= 'A' && (CHAR) <= 'Z'))
+
+/* The prefix prepended by GCC to an identifier represnting the
+ anonymous namespace. */
+#define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_"
+
+/* Character(s) to use for namespace separation in demangled output */
+#define NAMESPACE_SEPARATOR (dm->style == DMGL_JAVA ? "." : "::")
+
+/* If flag_verbose is zero, some simplifications will be made to the
+ output to make it easier to read and supress details that are
+ generally not of interest to the average C++ programmer.
+ Otherwise, the demangled representation will attempt to convey as
+ much information as the mangled form. */
+static int flag_verbose;
+
+/* If flag_strict is non-zero, demangle strictly according to the
+ specification -- don't demangle special g++ manglings. */
+static int flag_strict;
+
+/* String_list_t is an extended form of dyn_string_t which provides a
+ link field and a caret position for additions to the string. A
+ string_list_t may safely be cast to and used as a dyn_string_t. */
+
+struct string_list_def
+{
+ /* The dyn_string; must be first. */
+ struct dyn_string string;
+
+ /* The position at which additional text is added to this string
+ (using the result_add* macros). This value is an offset from the
+ end of the string, not the beginning (and should be
+ non-positive). */
+ int caret_position;
+
+ /* The next string in the list. */
+ struct string_list_def *next;
+};
+
+typedef struct string_list_def *string_list_t;
+
+/* Data structure representing a potential substitution. */
+
+struct substitution_def
+{
+ /* The demangled text of the substitution. */
+ dyn_string_t text;
+
+ /* Whether this substitution represents a template item. */
+ int template_p : 1;
+};
+
+/* Data structure representing a template argument list. */
+
+struct template_arg_list_def
+{
+ /* The next (lower) template argument list in the stack of currently
+ active template arguments. */
+ struct template_arg_list_def *next;
+
+ /* The first element in the list of template arguments in
+ left-to-right order. */
+ string_list_t first_argument;
+
+ /* The last element in the arguments lists. */
+ string_list_t last_argument;
+};
+
+typedef struct template_arg_list_def *template_arg_list_t;
+
+/* Data structure to maintain the state of the current demangling. */
+
+struct demangling_def
+{
+ /* The full mangled name being mangled. */
+ const char *name;
+
+ /* Pointer into name at the current position. */
+ const char *next;
+
+ /* Stack for strings containing demangled result generated so far.
+ Text is emitted to the topmost (first) string. */
+ string_list_t result;
+
+ /* The number of presently available substitutions. */
+ int num_substitutions;
+
+ /* The allocated size of the substitutions array. */
+ int substitutions_allocated;
+
+ /* An array of available substitutions. The number of elements in
+ the array is given by num_substitions, and the allocated array
+ size in substitutions_size.
+
+ The most recent substition is at the end, so
+
+ - `S_' corresponds to substititutions[num_substitutions - 1]
+ - `S0_' corresponds to substititutions[num_substitutions - 2]
+
+ etc. */
+ struct substitution_def *substitutions;
+
+ /* The stack of template argument lists. */
+ template_arg_list_t template_arg_lists;
+
+ /* The most recently demangled source-name. */
+ dyn_string_t last_source_name;
+
+ /* Language style to use for demangled output. */
+ int style;
+
+ /* Set to non-zero iff this name is a constructor. The actual value
+ indicates what sort of constructor this is; see demangle.h. */
+ enum gnu_v3_ctor_kinds is_constructor;
+
+ /* Set to non-zero iff this name is a destructor. The actual value
+ indicates what sort of destructor this is; see demangle.h. */
+ enum gnu_v3_dtor_kinds is_destructor;
+
+};
+
+typedef struct demangling_def *demangling_t;
+
+/* This type is the standard return code from most functions. Values
+ other than STATUS_OK contain descriptive messages. */
+typedef const char *status_t;
+
+/* Special values that can be used as a status_t. */
+#define STATUS_OK NULL
+#define STATUS_ERROR "Error."
+#define STATUS_UNIMPLEMENTED "Unimplemented."
+#define STATUS_INTERNAL_ERROR "Internal error."
+
+/* This status code indicates a failure in malloc or realloc. */
+static const char *const status_allocation_failed = "Allocation failed.";
+#define STATUS_ALLOCATION_FAILED status_allocation_failed
+
+/* Non-zero if STATUS indicates that no error has occurred. */
+#define STATUS_NO_ERROR(STATUS) ((STATUS) == STATUS_OK)
+
+/* Evaluate EXPR, which must produce a status_t. If the status code
+ indicates an error, return from the current function with that
+ status code. */
+#define RETURN_IF_ERROR(EXPR) \
+ do \
+ { \
+ status_t s = EXPR; \
+ if (!STATUS_NO_ERROR (s)) \
+ return s; \
+ } \
+ while (0)
+
+static status_t int_to_dyn_string
+ PARAMS ((int, dyn_string_t));
+static string_list_t string_list_new
+ PARAMS ((int));
+static void string_list_delete
+ PARAMS ((string_list_t));
+static status_t result_add_separated_char
+ PARAMS ((demangling_t, int));
+static status_t result_push
+ PARAMS ((demangling_t));
+static string_list_t result_pop
+ PARAMS ((demangling_t));
+static int substitution_start
+ PARAMS ((demangling_t));
+static status_t substitution_add
+ PARAMS ((demangling_t, int, int));
+static dyn_string_t substitution_get
+ PARAMS ((demangling_t, int, int *));
+#ifdef CP_DEMANGLE_DEBUG
+static void substitutions_print
+ PARAMS ((demangling_t, FILE *));
+#endif
+static template_arg_list_t template_arg_list_new
+ PARAMS ((void));
+static void template_arg_list_delete
+ PARAMS ((template_arg_list_t));
+static void template_arg_list_add_arg
+ PARAMS ((template_arg_list_t, string_list_t));
+static string_list_t template_arg_list_get_arg
+ PARAMS ((template_arg_list_t, int));
+static void push_template_arg_list
+ PARAMS ((demangling_t, template_arg_list_t));
+static void pop_to_template_arg_list
+ PARAMS ((demangling_t, template_arg_list_t));
+#ifdef CP_DEMANGLE_DEBUG
+static void template_arg_list_print
+ PARAMS ((template_arg_list_t, FILE *));
+#endif
+static template_arg_list_t current_template_arg_list
+ PARAMS ((demangling_t));
+static demangling_t demangling_new
+ PARAMS ((const char *, int));
+static void demangling_delete
+ PARAMS ((demangling_t));
+
+/* The last character of DS. Warning: DS is evaluated twice. */
+#define dyn_string_last_char(DS) \
+ (dyn_string_buf (DS)[dyn_string_length (DS) - 1])
+
+/* Append a space character (` ') to DS if it does not already end
+ with one. Evaluates to 1 on success, or 0 on allocation failure. */
+#define dyn_string_append_space(DS) \
+ ((dyn_string_length (DS) > 0 \
+ && dyn_string_last_char (DS) != ' ') \
+ ? dyn_string_append_char ((DS), ' ') \
+ : 1)
+
+/* Returns the index of the current position in the mangled name. */
+#define current_position(DM) ((DM)->next - (DM)->name)
+
+/* Returns the character at the current position of the mangled name. */
+#define peek_char(DM) (*((DM)->next))
+
+/* Returns the character one past the current position of the mangled
+ name. */
+#define peek_char_next(DM) \
+ (peek_char (DM) == '\0' ? '\0' : (*((DM)->next + 1)))
+
+/* Returns the character at the current position, and advances the
+ current position to the next character. */
+#define next_char(DM) (*((DM)->next)++)
+
+/* Returns non-zero if the current position is the end of the mangled
+ name, i.e. one past the last character. */
+#define end_of_name_p(DM) (peek_char (DM) == '\0')
+
+/* Advances the current position by one character. */
+#define advance_char(DM) (++(DM)->next)
+
+/* Returns the string containing the current demangled result. */
+#define result_string(DM) (&(DM)->result->string)
+
+/* Returns the position at which new text is inserted into the
+ demangled result. */
+#define result_caret_pos(DM) \
+ (result_length (DM) + \
+ ((string_list_t) result_string (DM))->caret_position)
+
+/* Adds a dyn_string_t to the demangled result. */
+#define result_add_string(DM, STRING) \
+ (dyn_string_insert (&(DM)->result->string, \
+ result_caret_pos (DM), (STRING)) \
+ ? STATUS_OK : STATUS_ALLOCATION_FAILED)
+
+/* Adds NUL-terminated string CSTR to the demangled result. */
+#define result_add(DM, CSTR) \
+ (dyn_string_insert_cstr (&(DM)->result->string, \
+ result_caret_pos (DM), (CSTR)) \
+ ? STATUS_OK : STATUS_ALLOCATION_FAILED)
+
+/* Adds character CHAR to the demangled result. */
+#define result_add_char(DM, CHAR) \
+ (dyn_string_insert_char (&(DM)->result->string, \
+ result_caret_pos (DM), (CHAR)) \
+ ? STATUS_OK : STATUS_ALLOCATION_FAILED)
+
+/* Inserts a dyn_string_t to the demangled result at position POS. */
+#define result_insert_string(DM, POS, STRING) \
+ (dyn_string_insert (&(DM)->result->string, (POS), (STRING)) \
+ ? STATUS_OK : STATUS_ALLOCATION_FAILED)
+
+/* Inserts NUL-terminated string CSTR to the demangled result at
+ position POS. */
+#define result_insert(DM, POS, CSTR) \
+ (dyn_string_insert_cstr (&(DM)->result->string, (POS), (CSTR)) \
+ ? STATUS_OK : STATUS_ALLOCATION_FAILED)
+
+/* Inserts character CHAR to the demangled result at position POS. */
+#define result_insert_char(DM, POS, CHAR) \
+ (dyn_string_insert_char (&(DM)->result->string, (POS), (CHAR)) \
+ ? STATUS_OK : STATUS_ALLOCATION_FAILED)
+
+/* The length of the current demangled result. */
+#define result_length(DM) \
+ dyn_string_length (&(DM)->result->string)
+
+/* Appends a (less-than, greater-than) character to the result in DM
+ to (open, close) a template argument or parameter list. Appends a
+ space first if necessary to prevent spurious elision of angle
+ brackets with the previous character. */
+#define result_open_template_list(DM) result_add_separated_char(DM, '<')
+#define result_close_template_list(DM) result_add_separated_char(DM, '>')
+
+/* Appends a base 10 representation of VALUE to DS. STATUS_OK on
+ success. On failure, deletes DS and returns an error code. */
+
+static status_t
+int_to_dyn_string (value, ds)
+ int value;
+ dyn_string_t ds;
+{
+ int i;
+ int mask = 1;
+
+ /* Handle zero up front. */
+ if (value == 0)
+ {
+ if (!dyn_string_append_char (ds, '0'))
+ return STATUS_ALLOCATION_FAILED;
+ return STATUS_OK;
+ }
+
+ /* For negative numbers, emit a minus sign. */
+ if (value < 0)
+ {
+ if (!dyn_string_append_char (ds, '-'))
+ return STATUS_ALLOCATION_FAILED;
+ value = -value;
+ }
+
+ /* Find the power of 10 of the first digit. */
+ i = value;
+ while (i > 9)
+ {
+ mask *= 10;
+ i /= 10;
+ }
+
+ /* Write the digits. */
+ while (mask > 0)
+ {
+ int digit = value / mask;
+
+ if (!dyn_string_append_char (ds, '0' + digit))
+ return STATUS_ALLOCATION_FAILED;
+
+ value -= digit * mask;
+ mask /= 10;
+ }
+
+ return STATUS_OK;
+}
+
+/* Creates a new string list node. The contents of the string are
+ empty, but the initial buffer allocation is LENGTH. The string
+ list node should be deleted with string_list_delete. Returns NULL
+ if allocation fails. */
+
+static string_list_t
+string_list_new (length)
+ int length;
+{
+ string_list_t s = (string_list_t) malloc (sizeof (struct string_list_def));
+ s->caret_position = 0;
+ if (s == NULL)
+ return NULL;
+ if (!dyn_string_init ((dyn_string_t) s, length))
+ return NULL;
+ return s;
+}
+
+/* Deletes the entire string list starting at NODE. */
+
+static void
+string_list_delete (node)
+ string_list_t node;
+{
+ while (node != NULL)
+ {
+ string_list_t next = node->next;
+ dyn_string_delete ((dyn_string_t) node);
+ node = next;
+ }
+}
+
+/* Appends CHARACTER to the demangled result. If the current trailing
+ character of the result is CHARACTER, a space is inserted first. */
+
+static status_t
+result_add_separated_char (dm, character)
+ demangling_t dm;
+ int character;
+{
+ char *result = dyn_string_buf (result_string (dm));
+ int caret_pos = result_caret_pos (dm);
+
+ /* Add a space if the last character is already the character we
+ want to add. */
+ if (caret_pos > 0 && result[caret_pos - 1] == character)
+ RETURN_IF_ERROR (result_add_char (dm, ' '));
+ /* Add the character. */
+ RETURN_IF_ERROR (result_add_char (dm, character));
+
+ return STATUS_OK;
+}
+
+/* Allocates and pushes a new string onto the demangled results stack
+ for DM. Subsequent demangling with DM will emit to the new string.
+ Returns STATUS_OK on success, STATUS_ALLOCATION_FAILED on
+ allocation failure. */
+
+static status_t
+result_push (dm)
+ demangling_t dm;
+{
+ string_list_t new_string = string_list_new (0);
+ if (new_string == NULL)
+ /* Allocation failed. */
+ return STATUS_ALLOCATION_FAILED;
+
+ /* Link the new string to the front of the list of result strings. */
+ new_string->next = (string_list_t) dm->result;
+ dm->result = new_string;
+ return STATUS_OK;
+}
+
+/* Removes and returns the topmost element on the demangled results
+ stack for DM. The caller assumes ownership for the returned
+ string. */
+
+static string_list_t
+result_pop (dm)
+ demangling_t dm;
+{
+ string_list_t top = dm->result;
+ dm->result = top->next;
+ return top;
+}
+
+/* Returns the current value of the caret for the result string. The
+ value is an offet from the end of the result string. */
+
+static int
+result_get_caret (dm)
+ demangling_t dm;
+{
+ return ((string_list_t) result_string (dm))->caret_position;
+}
+
+/* Sets the value of the caret for the result string, counted as an
+ offet from the end of the result string. */
+
+static void
+result_set_caret (dm, position)
+ demangling_t dm;
+ int position;
+{
+ ((string_list_t) result_string (dm))->caret_position = position;
+}
+
+/* Shifts the position of the next addition to the result by
+ POSITION_OFFSET. A negative value shifts the caret to the left. */
+
+static void
+result_shift_caret (dm, position_offset)
+ demangling_t dm;
+ int position_offset;
+{
+ ((string_list_t) result_string (dm))->caret_position += position_offset;
+}
+
+/* Returns non-zero if the character that comes right before the place
+ where text will be added to the result is a space. In this case,
+ the caller should supress adding another space. */
+
+static int
+result_previous_char_is_space (dm)
+ demangling_t dm;
+{
+ char *result = dyn_string_buf (result_string (dm));
+ int pos = result_caret_pos (dm);
+ return pos > 0 && result[pos - 1] == ' ';
+}
+
+/* Returns the start position of a fragment of the demangled result
+ that will be a substitution candidate. Should be called at the
+ start of productions that can add substitutions. */
+
+static int
+substitution_start (dm)
+ demangling_t dm;
+{
+ return result_caret_pos (dm);
+}
+
+/* Adds the suffix of the current demangled result of DM starting at
+ START_POSITION as a potential substitution. If TEMPLATE_P is
+ non-zero, this potential substitution is a template-id. */
+
+static status_t
+substitution_add (dm, start_position, template_p)
+ demangling_t dm;
+ int start_position;
+ int template_p;
+{
+ dyn_string_t result = result_string (dm);
+ dyn_string_t substitution = dyn_string_new (0);
+ int i;
+
+ if (substitution == NULL)
+ return STATUS_ALLOCATION_FAILED;
+
+ /* Extract the substring of the current demangling result that
+ represents the subsitution candidate. */
+ if (!dyn_string_substring (substitution,
+ result, start_position, result_caret_pos (dm)))
+ {
+ dyn_string_delete (substitution);
+ return STATUS_ALLOCATION_FAILED;
+ }
+
+ /* If there's no room for the new entry, grow the array. */
+ if (dm->substitutions_allocated == dm->num_substitutions)
+ {
+ size_t new_array_size;
+ if (dm->substitutions_allocated > 0)
+ dm->substitutions_allocated *= 2;
+ else
+ dm->substitutions_allocated = 2;
+ new_array_size =
+ sizeof (struct substitution_def) * dm->substitutions_allocated;
+
+ dm->substitutions = (struct substitution_def *)
+ realloc (dm->substitutions, new_array_size);
+ if (dm->substitutions == NULL)
+ /* Realloc failed. */
+ {
+ dyn_string_delete (substitution);
+ return STATUS_ALLOCATION_FAILED;
+ }
+ }
+
+ /* Add the substitution to the array. */
+ i = dm->num_substitutions++;
+ dm->substitutions[i].text = substitution;
+ dm->substitutions[i].template_p = template_p;
+
+#ifdef CP_DEMANGLE_DEBUG
+ substitutions_print (dm, stderr);
+#endif
+
+ return STATUS_OK;
+}
+
+/* Returns the Nth-most-recent substitution. Sets *TEMPLATE_P to
+ non-zero if the substitution is a template-id, zero otherwise.
+ N is numbered from zero. DM retains ownership of the returned
+ string. If N is negative, or equal to or greater than the current
+ number of substitution candidates, returns NULL. */
+
+static dyn_string_t
+substitution_get (dm, n, template_p)
+ demangling_t dm;
+ int n;
+ int *template_p;
+{
+ struct substitution_def *sub;
+
+ /* Make sure N is in the valid range. */
+ if (n < 0 || n >= dm->num_substitutions)
+ return NULL;
+
+ sub = &(dm->substitutions[n]);
+ *template_p = sub->template_p;
+ return sub->text;
+}
+
+#ifdef CP_DEMANGLE_DEBUG
+/* Debugging routine to print the current substitutions to FP. */
+
+static void
+substitutions_print (dm, fp)
+ demangling_t dm;
+ FILE *fp;
+{
+ int seq_id;
+ int num = dm->num_substitutions;
+
+ fprintf (fp, "SUBSTITUTIONS:\n");
+ for (seq_id = -1; seq_id < num - 1; ++seq_id)
+ {
+ int template_p;
+ dyn_string_t text = substitution_get (dm, seq_id + 1, &template_p);
+
+ if (seq_id == -1)
+ fprintf (fp, " S_ ");
+ else
+ fprintf (fp, " S%d_", seq_id);
+ fprintf (fp, " %c: %s\n", template_p ? '*' : ' ', dyn_string_buf (text));
+ }
+}
+
+#endif /* CP_DEMANGLE_DEBUG */
+
+/* Creates a new template argument list. Returns NULL if allocation
+ fails. */
+
+static template_arg_list_t
+template_arg_list_new ()
+{
+ template_arg_list_t new_list =
+ (template_arg_list_t) malloc (sizeof (struct template_arg_list_def));
+ if (new_list == NULL)
+ return NULL;
+ /* Initialize the new list to have no arguments. */
+ new_list->first_argument = NULL;
+ new_list->last_argument = NULL;
+ /* Return the new list. */
+ return new_list;
+}
+
+/* Deletes a template argument list and the template arguments it
+ contains. */
+
+static void
+template_arg_list_delete (list)
+ template_arg_list_t list;
+{
+ /* If there are any arguments on LIST, delete them. */
+ if (list->first_argument != NULL)
+ string_list_delete (list->first_argument);
+ /* Delete LIST. */
+ free (list);
+}
+
+/* Adds ARG to the template argument list ARG_LIST. */
+
+static void
+template_arg_list_add_arg (arg_list, arg)
+ template_arg_list_t arg_list;
+ string_list_t arg;
+{
+ if (arg_list->first_argument == NULL)
+ /* If there were no arguments before, ARG is the first one. */
+ arg_list->first_argument = arg;
+ else
+ /* Make ARG the last argument on the list. */
+ arg_list->last_argument->next = arg;
+ /* Make ARG the last on the list. */
+ arg_list->last_argument = arg;
+ arg->next = NULL;
+}
+
+/* Returns the template arugment at position INDEX in template
+ argument list ARG_LIST. */
+
+static string_list_t
+template_arg_list_get_arg (arg_list, index)
+ template_arg_list_t arg_list;
+ int index;
+{
+ string_list_t arg = arg_list->first_argument;
+ /* Scan down the list of arguments to find the one at position
+ INDEX. */
+ while (index--)
+ {
+ arg = arg->next;
+ if (arg == NULL)
+ /* Ran out of arguments before INDEX hit zero. That's an
+ error. */
+ return NULL;
+ }
+ /* Return the argument at position INDEX. */
+ return arg;
+}
+
+/* Pushes ARG_LIST onto the top of the template argument list stack. */
+
+static void
+push_template_arg_list (dm, arg_list)
+ demangling_t dm;
+ template_arg_list_t arg_list;
+{
+ arg_list->next = dm->template_arg_lists;
+ dm->template_arg_lists = arg_list;
+#ifdef CP_DEMANGLE_DEBUG
+ fprintf (stderr, " ** pushing template arg list\n");
+ template_arg_list_print (arg_list, stderr);
+#endif
+}
+
+/* Pops and deletes elements on the template argument list stack until
+ arg_list is the topmost element. If arg_list is NULL, all elements
+ are popped and deleted. */
+
+static void
+pop_to_template_arg_list (dm, arg_list)
+ demangling_t dm;
+ template_arg_list_t arg_list;
+{
+ while (dm->template_arg_lists != arg_list)
+ {
+ template_arg_list_t top = dm->template_arg_lists;
+ /* Disconnect the topmost element from the list. */
+ dm->template_arg_lists = top->next;
+ /* Delete the popped element. */
+ template_arg_list_delete (top);
+#ifdef CP_DEMANGLE_DEBUG
+ fprintf (stderr, " ** removing template arg list\n");
+#endif
+ }
+}
+
+#ifdef CP_DEMANGLE_DEBUG
+
+/* Prints the contents of ARG_LIST to FP. */
+
+static void
+template_arg_list_print (arg_list, fp)
+ template_arg_list_t arg_list;
+ FILE *fp;
+{
+ string_list_t arg;
+ int index = -1;
+
+ fprintf (fp, "TEMPLATE ARGUMENT LIST:\n");
+ for (arg = arg_list->first_argument; arg != NULL; arg = arg->next)
+ {
+ if (index == -1)
+ fprintf (fp, " T_ : ");
+ else
+ fprintf (fp, " T%d_ : ", index);
+ ++index;
+ fprintf (fp, "%s\n", dyn_string_buf ((dyn_string_t) arg));
+ }
+}
+
+#endif /* CP_DEMANGLE_DEBUG */
+
+/* Returns the topmost element on the stack of template argument
+ lists. If there is no list of template arguments, returns NULL. */
+
+static template_arg_list_t
+current_template_arg_list (dm)
+ demangling_t dm;
+{
+ return dm->template_arg_lists;
+}
+
+/* Allocates a demangling_t object for demangling mangled NAME. A new
+ result must be pushed before the returned object can be used.
+ Returns NULL if allocation fails. */
+
+static demangling_t
+demangling_new (name, style)
+ const char *name;
+ int style;
+{
+ demangling_t dm;
+ dm = (demangling_t) malloc (sizeof (struct demangling_def));
+ if (dm == NULL)
+ return NULL;
+
+ dm->name = name;
+ dm->next = name;
+ dm->result = NULL;
+ dm->num_substitutions = 0;
+ dm->substitutions_allocated = 10;
+ dm->template_arg_lists = NULL;
+ dm->last_source_name = dyn_string_new (0);
+ if (dm->last_source_name == NULL)
+ return NULL;
+ dm->substitutions = (struct substitution_def *)
+ malloc (dm->substitutions_allocated * sizeof (struct substitution_def));
+ if (dm->substitutions == NULL)
+ {
+ dyn_string_delete (dm->last_source_name);
+ return NULL;
+ }
+ dm->style = style;
+ dm->is_constructor = 0;
+ dm->is_destructor = 0;
+
+ return dm;
+}
+
+/* Deallocates a demangling_t object and all memory associated with
+ it. */
+
+static void
+demangling_delete (dm)
+ demangling_t dm;
+{
+ int i;
+ template_arg_list_t arg_list = dm->template_arg_lists;
+
+ /* Delete the stack of template argument lists. */
+ while (arg_list != NULL)
+ {
+ template_arg_list_t next = arg_list->next;
+ template_arg_list_delete (arg_list);
+ arg_list = next;
+ }
+ /* Delete the list of substitutions. */
+ for (i = dm->num_substitutions; --i >= 0; )
+ dyn_string_delete (dm->substitutions[i].text);
+ free (dm->substitutions);
+ /* Delete the demangled result. */
+ string_list_delete (dm->result);
+ /* Delete the stored identifier name. */
+ dyn_string_delete (dm->last_source_name);
+ /* Delete the context object itself. */
+ free (dm);
+}
+
+/* These functions demangle an alternative of the corresponding
+ production in the mangling spec. The first argument of each is a
+ demangling context structure for the current demangling
+ operation. Most emit demangled text directly to the topmost result
+ string on the result string stack in the demangling context
+ structure. */
+
+static status_t demangle_char
+ PARAMS ((demangling_t, int));
+static status_t demangle_mangled_name
+ PARAMS ((demangling_t));
+static status_t demangle_encoding
+ PARAMS ((demangling_t));
+static status_t demangle_name
+ PARAMS ((demangling_t, int *));
+static status_t demangle_nested_name
+ PARAMS ((demangling_t, int *));
+static status_t demangle_prefix
+ PARAMS ((demangling_t, int *));
+static status_t demangle_unqualified_name
+ PARAMS ((demangling_t, int *));
+static status_t demangle_source_name
+ PARAMS ((demangling_t));
+static status_t demangle_number
+ PARAMS ((demangling_t, int *, int, int));
+static status_t demangle_number_literally
+ PARAMS ((demangling_t, dyn_string_t, int, int));
+static status_t demangle_identifier
+ PARAMS ((demangling_t, int, dyn_string_t));
+static status_t demangle_operator_name
+ PARAMS ((demangling_t, int, int *));
+static status_t demangle_nv_offset
+ PARAMS ((demangling_t));
+static status_t demangle_v_offset
+ PARAMS ((demangling_t));
+static status_t demangle_call_offset
+ PARAMS ((demangling_t));
+static status_t demangle_special_name
+ PARAMS ((demangling_t));
+static status_t demangle_ctor_dtor_name
+ PARAMS ((demangling_t));
+static status_t demangle_type_ptr
+ PARAMS ((demangling_t, int *, int));
+static status_t demangle_type
+ PARAMS ((demangling_t));
+static status_t demangle_CV_qualifiers
+ PARAMS ((demangling_t, dyn_string_t));
+static status_t demangle_builtin_type
+ PARAMS ((demangling_t));
+static status_t demangle_function_type
+ PARAMS ((demangling_t, int *));
+static status_t demangle_bare_function_type
+ PARAMS ((demangling_t, int *));
+static status_t demangle_class_enum_type
+ PARAMS ((demangling_t, int *));
+static status_t demangle_array_type
+ PARAMS ((demangling_t, int *));
+static status_t demangle_template_param
+ PARAMS ((demangling_t));
+static status_t demangle_template_args
+ PARAMS ((demangling_t));
+static status_t demangle_literal
+ PARAMS ((demangling_t));
+static status_t demangle_template_arg
+ PARAMS ((demangling_t));
+static status_t demangle_expression
+ PARAMS ((demangling_t));
+static status_t demangle_scope_expression
+ PARAMS ((demangling_t));
+static status_t demangle_expr_primary
+ PARAMS ((demangling_t));
+static status_t demangle_substitution
+ PARAMS ((demangling_t, int *));
+static status_t demangle_local_name
+ PARAMS ((demangling_t));
+static status_t demangle_discriminator
+ PARAMS ((demangling_t, int));
+static status_t cp_demangle
+ PARAMS ((const char *, dyn_string_t, int));
+static status_t cp_demangle_type
+ PARAMS ((const char*, dyn_string_t));
+
+/* When passed to demangle_bare_function_type, indicates that the
+ function's return type is not encoded before its parameter types. */
+#define BFT_NO_RETURN_TYPE NULL
+
+/* Check that the next character is C. If so, consume it. If not,
+ return an error. */
+
+static status_t
+demangle_char (dm, c)
+ demangling_t dm;
+ int c;
+{
+ static char *error_message = NULL;
+
+ if (peek_char (dm) == c)
+ {
+ advance_char (dm);
+ return STATUS_OK;
+ }
+ else
+ {
+ if (error_message == NULL)
+ error_message = strdup ("Expected ?");
+ error_message[9] = c;
+ return error_message;
+ }
+}
+
+/* Demangles and emits a <mangled-name>.
+
+ <mangled-name> ::= _Z <encoding> */
+
+static status_t
+demangle_mangled_name (dm)
+ demangling_t dm;
+{
+ DEMANGLE_TRACE ("mangled-name", dm);
+ RETURN_IF_ERROR (demangle_char (dm, '_'));
+ RETURN_IF_ERROR (demangle_char (dm, 'Z'));
+ RETURN_IF_ERROR (demangle_encoding (dm));
+ return STATUS_OK;
+}
+
+/* Demangles and emits an <encoding>.
+
+ <encoding> ::= <function name> <bare-function-type>
+ ::= <data name>
+ ::= <special-name> */
+
+static status_t
+demangle_encoding (dm)
+ demangling_t dm;
+{
+ int encode_return_type;
+ int start_position;
+ template_arg_list_t old_arg_list = current_template_arg_list (dm);
+ char peek = peek_char (dm);
+
+ DEMANGLE_TRACE ("encoding", dm);
+
+ /* Remember where the name starts. If it turns out to be a template
+ function, we'll have to insert the return type here. */
+ start_position = result_caret_pos (dm);
+
+ if (peek == 'G' || peek == 'T')
+ RETURN_IF_ERROR (demangle_special_name (dm));
+ else
+ {
+ /* Now demangle the name. */
+ RETURN_IF_ERROR (demangle_name (dm, &encode_return_type));
+
+ /* If there's anything left, the name was a function name, with
+ maybe its return type, and its parameter types, following. */
+ if (!end_of_name_p (dm)
+ && peek_char (dm) != 'E')
+ {
+ if (encode_return_type)
+ /* Template functions have their return type encoded. The
+ return type should be inserted at start_position. */
+ RETURN_IF_ERROR
+ (demangle_bare_function_type (dm, &start_position));
+ else
+ /* Non-template functions don't have their return type
+ encoded. */
+ RETURN_IF_ERROR
+ (demangle_bare_function_type (dm, BFT_NO_RETURN_TYPE));
+ }
+ }
+
+ /* Pop off template argument lists that were built during the
+ mangling of this name, to restore the old template context. */
+ pop_to_template_arg_list (dm, old_arg_list);
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <name>.
+
+ <name> ::= <unscoped-name>
+ ::= <unscoped-template-name> <template-args>
+ ::= <nested-name>
+ ::= <local-name>
+
+ <unscoped-name> ::= <unqualified-name>
+ ::= St <unqualified-name> # ::std::
+
+ <unscoped-template-name>
+ ::= <unscoped-name>
+ ::= <substitution> */
+
+static status_t
+demangle_name (dm, encode_return_type)
+ demangling_t dm;
+ int *encode_return_type;
+{
+ int start = substitution_start (dm);
+ char peek = peek_char (dm);
+ int is_std_substitution = 0;
+
+ /* Generally, the return type is encoded if the function is a
+ template-id, and suppressed otherwise. There are a few cases,
+ though, in which the return type is not encoded even for a
+ templated function. In these cases, this flag is set. */
+ int suppress_return_type = 0;
+
+ DEMANGLE_TRACE ("name", dm);
+
+ switch (peek)
+ {
+ case 'N':
+ /* This is a <nested-name>. */
+ RETURN_IF_ERROR (demangle_nested_name (dm, encode_return_type));
+ break;
+
+ case 'Z':
+ RETURN_IF_ERROR (demangle_local_name (dm));
+ *encode_return_type = 0;
+ break;
+
+ case 'S':
+ /* The `St' substitution allows a name nested in std:: to appear
+ without being enclosed in a nested name. */
+ if (peek_char_next (dm) == 't')
+ {
+ (void) next_char (dm);
+ (void) next_char (dm);
+ RETURN_IF_ERROR (result_add (dm, "std::"));
+ RETURN_IF_ERROR
+ (demangle_unqualified_name (dm, &suppress_return_type));
+ is_std_substitution = 1;
+ }
+ else
+ RETURN_IF_ERROR (demangle_substitution (dm, encode_return_type));
+ /* Check if a template argument list immediately follows.
+ If so, then we just demangled an <unqualified-template-name>. */
+ if (peek_char (dm) == 'I')
+ {
+ /* A template name of the form std::<unqualified-name> is a
+ substitution candidate. */
+ if (is_std_substitution)
+ RETURN_IF_ERROR (substitution_add (dm, start, 0));
+ /* Demangle the <template-args> here. */
+ RETURN_IF_ERROR (demangle_template_args (dm));
+ *encode_return_type = !suppress_return_type;
+ }
+ else
+ *encode_return_type = 0;
+
+ break;
+
+ default:
+ /* This is an <unscoped-name> or <unscoped-template-name>. */
+ RETURN_IF_ERROR (demangle_unqualified_name (dm, &suppress_return_type));
+
+ /* If the <unqualified-name> is followed by template args, this
+ is an <unscoped-template-name>. */
+ if (peek_char (dm) == 'I')
+ {
+ /* Add a substitution for the unqualified template name. */
+ RETURN_IF_ERROR (substitution_add (dm, start, 0));
+
+ RETURN_IF_ERROR (demangle_template_args (dm));
+ *encode_return_type = !suppress_return_type;
+ }
+ else
+ *encode_return_type = 0;
+
+ break;
+ }
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <nested-name>.
+
+ <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqulified-name> E */
+
+static status_t
+demangle_nested_name (dm, encode_return_type)
+ demangling_t dm;
+ int *encode_return_type;
+{
+ char peek;
+
+ DEMANGLE_TRACE ("nested-name", dm);
+
+ RETURN_IF_ERROR (demangle_char (dm, 'N'));
+
+ peek = peek_char (dm);
+ if (peek == 'r' || peek == 'V' || peek == 'K')
+ {
+ dyn_string_t cv_qualifiers;
+ status_t status;
+
+ /* Snarf up CV qualifiers. */
+ cv_qualifiers = dyn_string_new (24);
+ if (cv_qualifiers == NULL)
+ return STATUS_ALLOCATION_FAILED;
+ demangle_CV_qualifiers (dm, cv_qualifiers);
+
+ /* Emit them, preceded by a space. */
+ status = result_add_char (dm, ' ');
+ if (STATUS_NO_ERROR (status))
+ status = result_add_string (dm, cv_qualifiers);
+ /* The CV qualifiers that occur in a <nested-name> will be
+ qualifiers for member functions. These are placed at the end
+ of the function. Therefore, shift the caret to the left by
+ the length of the qualifiers, so other text is inserted
+ before them and they stay at the end. */
+ result_shift_caret (dm, -dyn_string_length (cv_qualifiers) - 1);
+ /* Clean up. */
+ dyn_string_delete (cv_qualifiers);
+ RETURN_IF_ERROR (status);
+ }
+
+ RETURN_IF_ERROR (demangle_prefix (dm, encode_return_type));
+ /* No need to demangle the final <unqualified-name>; demangle_prefix
+ will handle it. */
+ RETURN_IF_ERROR (demangle_char (dm, 'E'));
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <prefix>.
+
+ <prefix> ::= <prefix> <unqualified-name>
+ ::= <template-prefix> <template-args>
+ ::= # empty
+ ::= <substitution>
+
+ <template-prefix> ::= <prefix>
+ ::= <substitution> */
+
+static status_t
+demangle_prefix (dm, encode_return_type)
+ demangling_t dm;
+ int *encode_return_type;
+{
+ int start = substitution_start (dm);
+ int nested = 0;
+
+ /* ENCODE_RETURN_TYPE is updated as we decend the nesting chain.
+ After <template-args>, it is set to non-zero; after everything
+ else it is set to zero. */
+
+ /* Generally, the return type is encoded if the function is a
+ template-id, and suppressed otherwise. There are a few cases,
+ though, in which the return type is not encoded even for a
+ templated function. In these cases, this flag is set. */
+ int suppress_return_type = 0;
+
+ DEMANGLE_TRACE ("prefix", dm);
+
+ while (1)
+ {
+ char peek;
+
+ if (end_of_name_p (dm))
+ return "Unexpected end of name in <compound-name>.";
+
+ peek = peek_char (dm);
+
+ /* We'll initialize suppress_return_type to false, and set it to true
+ if we end up demangling a constructor name. However, make
+ sure we're not actually about to demangle template arguments
+ -- if so, this is the <template-args> following a
+ <template-prefix>, so we'll want the previous flag value
+ around. */
+ if (peek != 'I')
+ suppress_return_type = 0;
+
+ if (IS_DIGIT ((unsigned char) peek)
+ || (peek >= 'a' && peek <= 'z')
+ || peek == 'C' || peek == 'D'
+ || peek == 'S')
+ {
+ /* We have another level of scope qualification. */
+ if (nested)
+ RETURN_IF_ERROR (result_add (dm, NAMESPACE_SEPARATOR));
+ else
+ nested = 1;
+
+ if (peek == 'S')
+ /* The substitution determines whether this is a
+ template-id. */
+ RETURN_IF_ERROR (demangle_substitution (dm, encode_return_type));
+ else
+ {
+ /* It's just a name. */
+ RETURN_IF_ERROR
+ (demangle_unqualified_name (dm, &suppress_return_type));
+ *encode_return_type = 0;
+ }
+ }
+ else if (peek == 'Z')
+ RETURN_IF_ERROR (demangle_local_name (dm));
+ else if (peek == 'I')
+ {
+ RETURN_IF_ERROR (demangle_template_args (dm));
+
+ /* Now we want to indicate to the caller that we've
+ demangled template arguments, thus the prefix was a
+ <template-prefix>. That's so that the caller knows to
+ demangle the function's return type, if this turns out to
+ be a function name. But, if it's a member template
+ constructor or a templated conversion operator, report it
+ as untemplated. Those never get encoded return types. */
+ *encode_return_type = !suppress_return_type;
+ }
+ else if (peek == 'E')
+ /* All done. */
+ return STATUS_OK;
+ else
+ return "Unexpected character in <compound-name>.";
+
+ if (peek != 'S'
+ && peek_char (dm) != 'E')
+ /* Add a new substitution for the prefix thus far. */
+ RETURN_IF_ERROR (substitution_add (dm, start, *encode_return_type));
+ }
+}
+
+/* Demangles and emits an <unqualified-name>. If this
+ <unqualified-name> is for a special function type that should never
+ have its return type encoded (particularly, a constructor or
+ conversion operator), *SUPPRESS_RETURN_TYPE is set to 1; otherwise,
+ it is set to zero.
+
+ <unqualified-name> ::= <operator-name>
+ ::= <special-name>
+ ::= <source-name> */
+
+static status_t
+demangle_unqualified_name (dm, suppress_return_type)
+ demangling_t dm;
+ int *suppress_return_type;
+{
+ char peek = peek_char (dm);
+
+ DEMANGLE_TRACE ("unqualified-name", dm);
+
+ /* By default, don't force suppression of the return type (though
+ non-template functions still don't get a return type encoded). */
+ *suppress_return_type = 0;
+
+ if (IS_DIGIT ((unsigned char) peek))
+ RETURN_IF_ERROR (demangle_source_name (dm));
+ else if (peek >= 'a' && peek <= 'z')
+ {
+ int num_args;
+
+ /* Conversion operators never have a return type encoded. */
+ if (peek == 'c' && peek_char_next (dm) == 'v')
+ *suppress_return_type = 1;
+
+ RETURN_IF_ERROR (demangle_operator_name (dm, 0, &num_args));
+ }
+ else if (peek == 'C' || peek == 'D')
+ {
+ /* Constructors never have a return type encoded. */
+ if (peek == 'C')
+ *suppress_return_type = 1;
+
+ RETURN_IF_ERROR (demangle_ctor_dtor_name (dm));
+ }
+ else
+ return "Unexpected character in <unqualified-name>.";
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits <source-name>.
+
+ <source-name> ::= <length number> <identifier> */
+
+static status_t
+demangle_source_name (dm)
+ demangling_t dm;
+{
+ int length;
+
+ DEMANGLE_TRACE ("source-name", dm);
+
+ /* Decode the length of the identifier. */
+ RETURN_IF_ERROR (demangle_number (dm, &length, 10, 0));
+ if (length == 0)
+ return "Zero length in <source-name>.";
+
+ /* Now the identifier itself. It's placed into last_source_name,
+ where it can be used to build a constructor or destructor name. */
+ RETURN_IF_ERROR (demangle_identifier (dm, length,
+ dm->last_source_name));
+
+ /* Emit it. */
+ RETURN_IF_ERROR (result_add_string (dm, dm->last_source_name));
+
+ return STATUS_OK;
+}
+
+/* Demangles a number, either a <number> or a <positive-number> at the
+ current position, consuming all consecutive digit characters. Sets
+ *VALUE to the resulting numberand returns STATUS_OK. The number is
+ interpreted as BASE, which must be either 10 or 36. If IS_SIGNED
+ is non-zero, negative numbers -- prefixed with `n' -- are accepted.
+
+ <number> ::= [n] <positive-number>
+
+ <positive-number> ::= <decimal integer> */
+
+static status_t
+demangle_number (dm, value, base, is_signed)
+ demangling_t dm;
+ int *value;
+ int base;
+ int is_signed;
+{
+ dyn_string_t number = dyn_string_new (10);
+
+ DEMANGLE_TRACE ("number", dm);
+
+ if (number == NULL)
+ return STATUS_ALLOCATION_FAILED;
+
+ demangle_number_literally (dm, number, base, is_signed);
+ *value = strtol (dyn_string_buf (number), NULL, base);
+ dyn_string_delete (number);
+
+ return STATUS_OK;
+}
+
+/* Demangles a number at the current position. The digits (and minus
+ sign, if present) that make up the number are appended to STR.
+ Only base-BASE digits are accepted; BASE must be either 10 or 36.
+ If IS_SIGNED, negative numbers -- prefixed with `n' -- are
+ accepted. Does not consume a trailing underscore or other
+ terminating character. */
+
+static status_t
+demangle_number_literally (dm, str, base, is_signed)
+ demangling_t dm;
+ dyn_string_t str;
+ int base;
+ int is_signed;
+{
+ DEMANGLE_TRACE ("number*", dm);
+
+ if (base != 10 && base != 36)
+ return STATUS_INTERNAL_ERROR;
+
+ /* An `n' denotes a negative number. */
+ if (is_signed && peek_char (dm) == 'n')
+ {
+ /* Skip past the n. */
+ advance_char (dm);
+ /* The normal way to write a negative number is with a minus
+ sign. */
+ if (!dyn_string_append_char (str, '-'))
+ return STATUS_ALLOCATION_FAILED;
+ }
+
+ /* Loop until we hit a non-digit. */
+ while (1)
+ {
+ char peek = peek_char (dm);
+ if (IS_DIGIT ((unsigned char) peek)
+ || (base == 36 && peek >= 'A' && peek <= 'Z'))
+ {
+ /* Accumulate digits. */
+ if (!dyn_string_append_char (str, next_char (dm)))
+ return STATUS_ALLOCATION_FAILED;
+ }
+ else
+ /* Not a digit? All done. */
+ break;
+ }
+
+ return STATUS_OK;
+}
+
+/* Demangles an identifier at the current position of LENGTH
+ characters and places it in IDENTIFIER. */
+
+static status_t
+demangle_identifier (dm, length, identifier)
+ demangling_t dm;
+ int length;
+ dyn_string_t identifier;
+{
+ DEMANGLE_TRACE ("identifier", dm);
+
+ dyn_string_clear (identifier);
+ if (!dyn_string_resize (identifier, length))
+ return STATUS_ALLOCATION_FAILED;
+
+ while (length-- > 0)
+ {
+ if (end_of_name_p (dm))
+ return "Unexpected end of name in <identifier>.";
+ if (!dyn_string_append_char (identifier, next_char (dm)))
+ return STATUS_ALLOCATION_FAILED;
+ }
+
+ /* GCC encodes anonymous namespaces using a `_GLOBAL_[_.$]N.'
+ followed by the source file name and some random characters.
+ Unless we're in strict mode, decipher these names appropriately. */
+ if (!flag_strict)
+ {
+ char *name = dyn_string_buf (identifier);
+ int prefix_length = strlen (ANONYMOUS_NAMESPACE_PREFIX);
+
+ /* Compare the first, fixed part. */
+ if (strncmp (name, ANONYMOUS_NAMESPACE_PREFIX, prefix_length) == 0)
+ {
+ name += prefix_length;
+ /* The next character might be a period, an underscore, or
+ dollar sign, depending on the target architecture's
+ assembler's capabilities. After that comes an `N'. */
+ if ((*name == '.' || *name == '_' || *name == '$')
+ && *(name + 1) == 'N')
+ /* This looks like the anonymous namespace identifier.
+ Replace it with something comprehensible. */
+ dyn_string_copy_cstr (identifier, "(anonymous namespace)");
+ }
+ }
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits an <operator-name>. If SHORT_NAME is non-zero,
+ the short form is emitted; otherwise the full source form
+ (`operator +' etc.) is emitted. *NUM_ARGS is set to the number of
+ operands that the operator takes.
+
+ <operator-name>
+ ::= nw # new
+ ::= na # new[]
+ ::= dl # delete
+ ::= da # delete[]
+ ::= ps # + (unary)
+ ::= ng # - (unary)
+ ::= ad # & (unary)
+ ::= de # * (unary)
+ ::= co # ~
+ ::= pl # +
+ ::= mi # -
+ ::= ml # *
+ ::= dv # /
+ ::= rm # %
+ ::= an # &
+ ::= or # |
+ ::= eo # ^
+ ::= aS # =
+ ::= pL # +=
+ ::= mI # -=
+ ::= mL # *=
+ ::= dV # /=
+ ::= rM # %=
+ ::= aN # &=
+ ::= oR # |=
+ ::= eO # ^=
+ ::= ls # <<
+ ::= rs # >>
+ ::= lS # <<=
+ ::= rS # >>=
+ ::= eq # ==
+ ::= ne # !=
+ ::= lt # <
+ ::= gt # >
+ ::= le # <=
+ ::= ge # >=
+ ::= nt # !
+ ::= aa # &&
+ ::= oo # ||
+ ::= pp # ++
+ ::= mm # --
+ ::= cm # ,
+ ::= pm # ->*
+ ::= pt # ->
+ ::= cl # ()
+ ::= ix # []
+ ::= qu # ?
+ ::= sz # sizeof
+ ::= cv <type> # cast
+ ::= v [0-9] <source-name> # vendor extended operator */
+
+static status_t
+demangle_operator_name (dm, short_name, num_args)
+ demangling_t dm;
+ int short_name;
+ int *num_args;
+{
+ struct operator_code
+ {
+ /* The mangled code for this operator. */
+ const char *const code;
+ /* The source name of this operator. */
+ const char *const name;
+ /* The number of arguments this operator takes. */
+ const int num_args;
+ };
+
+ static const struct operator_code operators[] =
+ {
+ { "aN", "&=" , 2 },
+ { "aS", "=" , 2 },
+ { "aa", "&&" , 2 },
+ { "ad", "&" , 1 },
+ { "an", "&" , 2 },
+ { "cl", "()" , 0 },
+ { "cm", "," , 2 },
+ { "co", "~" , 1 },
+ { "dV", "/=" , 2 },
+ { "da", " delete[]", 1 },
+ { "de", "*" , 1 },
+ { "dl", " delete" , 1 },
+ { "dv", "/" , 2 },
+ { "eO", "^=" , 2 },
+ { "eo", "^" , 2 },
+ { "eq", "==" , 2 },
+ { "ge", ">=" , 2 },
+ { "gt", ">" , 2 },
+ { "ix", "[]" , 2 },
+ { "lS", "<<=" , 2 },
+ { "le", "<=" , 2 },
+ { "ls", "<<" , 2 },
+ { "lt", "<" , 2 },
+ { "mI", "-=" , 2 },
+ { "mL", "*=" , 2 },
+ { "mi", "-" , 2 },
+ { "ml", "*" , 2 },
+ { "mm", "--" , 1 },
+ { "na", " new[]" , 1 },
+ { "ne", "!=" , 2 },
+ { "ng", "-" , 1 },
+ { "nt", "!" , 1 },
+ { "nw", " new" , 1 },
+ { "oR", "|=" , 2 },
+ { "oo", "||" , 2 },
+ { "or", "|" , 2 },
+ { "pL", "+=" , 2 },
+ { "pl", "+" , 2 },
+ { "pm", "->*" , 2 },
+ { "pp", "++" , 1 },
+ { "ps", "+" , 1 },
+ { "pt", "->" , 2 },
+ { "qu", "?" , 3 },
+ { "rM", "%=" , 2 },
+ { "rS", ">>=" , 2 },
+ { "rm", "%" , 2 },
+ { "rs", ">>" , 2 },
+ { "sz", " sizeof" , 1 }
+ };
+
+ const int num_operators =
+ sizeof (operators) / sizeof (struct operator_code);
+
+ int c0 = next_char (dm);
+ int c1 = next_char (dm);
+ const struct operator_code* p1 = operators;
+ const struct operator_code* p2 = operators + num_operators;
+
+ DEMANGLE_TRACE ("operator-name", dm);
+
+ /* Is this a vendor-extended operator? */
+ if (c0 == 'v' && IS_DIGIT (c1))
+ {
+ RETURN_IF_ERROR (result_add (dm, "operator "));
+ RETURN_IF_ERROR (demangle_source_name (dm));
+ *num_args = 0;
+ return STATUS_OK;
+ }
+
+ /* Is this a conversion operator? */
+ if (c0 == 'c' && c1 == 'v')
+ {
+ RETURN_IF_ERROR (result_add (dm, "operator "));
+ /* Demangle the converted-to type. */
+ RETURN_IF_ERROR (demangle_type (dm));
+ *num_args = 0;
+ return STATUS_OK;
+ }
+
+ /* Perform a binary search for the operator code. */
+ while (1)
+ {
+ const struct operator_code* p = p1 + (p2 - p1) / 2;
+ char match0 = p->code[0];
+ char match1 = p->code[1];
+
+ if (c0 == match0 && c1 == match1)
+ /* Found it. */
+ {
+ if (!short_name)
+ RETURN_IF_ERROR (result_add (dm, "operator"));
+ RETURN_IF_ERROR (result_add (dm, p->name));
+ *num_args = p->num_args;
+
+ return STATUS_OK;
+ }
+
+ if (p == p1)
+ /* Couldn't find it. */
+ return "Unknown code in <operator-name>.";
+
+ /* Try again. */
+ if (c0 < match0 || (c0 == match0 && c1 < match1))
+ p2 = p;
+ else
+ p1 = p;
+ }
+}
+
+/* Demangles and omits an <nv-offset>.
+
+ <nv-offset> ::= <offset number> # non-virtual base override */
+
+static status_t
+demangle_nv_offset (dm)
+ demangling_t dm;
+{
+ dyn_string_t number;
+ status_t status = STATUS_OK;
+
+ DEMANGLE_TRACE ("h-offset", dm);
+
+ /* Demangle the offset. */
+ number = dyn_string_new (4);
+ if (number == NULL)
+ return STATUS_ALLOCATION_FAILED;
+ demangle_number_literally (dm, number, 10, 1);
+
+ /* Don't display the offset unless in verbose mode. */
+ if (flag_verbose)
+ {
+ status = result_add (dm, " [nv:");
+ if (STATUS_NO_ERROR (status))
+ status = result_add_string (dm, number);
+ if (STATUS_NO_ERROR (status))
+ status = result_add_char (dm, ']');
+ }
+
+ /* Clean up. */
+ dyn_string_delete (number);
+ RETURN_IF_ERROR (status);
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <v-offset>.
+
+ <v-offset> ::= <offset number> _ <virtual offset number>
+ # virtual base override, with vcall offset */
+
+static status_t
+demangle_v_offset (dm)
+ demangling_t dm;
+{
+ dyn_string_t number;
+ status_t status = STATUS_OK;
+
+ DEMANGLE_TRACE ("v-offset", dm);
+
+ /* Demangle the offset. */
+ number = dyn_string_new (4);
+ if (number == NULL)
+ return STATUS_ALLOCATION_FAILED;
+ demangle_number_literally (dm, number, 10, 1);
+
+ /* Don't display the offset unless in verbose mode. */
+ if (flag_verbose)
+ {
+ status = result_add (dm, " [v:");
+ if (STATUS_NO_ERROR (status))
+ status = result_add_string (dm, number);
+ if (STATUS_NO_ERROR (status))
+ result_add_char (dm, ',');
+ }
+ dyn_string_delete (number);
+ RETURN_IF_ERROR (status);
+
+ /* Demangle the separator. */
+ RETURN_IF_ERROR (demangle_char (dm, '_'));
+
+ /* Demangle the vcall offset. */
+ number = dyn_string_new (4);
+ if (number == NULL)
+ return STATUS_ALLOCATION_FAILED;
+ demangle_number_literally (dm, number, 10, 1);
+
+ /* Don't display the vcall offset unless in verbose mode. */
+ if (flag_verbose)
+ {
+ status = result_add_string (dm, number);
+ if (STATUS_NO_ERROR (status))
+ status = result_add_char (dm, ']');
+ }
+ dyn_string_delete (number);
+ RETURN_IF_ERROR (status);
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <call-offset>.
+
+ <call-offset> ::= h <nv-offset> _
+ ::= v <v-offset> _ */
+
+static status_t
+demangle_call_offset (dm)
+ demangling_t dm;
+{
+ DEMANGLE_TRACE ("call-offset", dm);
+
+ switch (peek_char (dm))
+ {
+ case 'h':
+ advance_char (dm);
+ /* Demangle the offset. */
+ RETURN_IF_ERROR (demangle_nv_offset (dm));
+ /* Demangle the separator. */
+ RETURN_IF_ERROR (demangle_char (dm, '_'));
+ break;
+
+ case 'v':
+ advance_char (dm);
+ /* Demangle the offset. */
+ RETURN_IF_ERROR (demangle_v_offset (dm));
+ /* Demangle the separator. */
+ RETURN_IF_ERROR (demangle_char (dm, '_'));
+ break;
+
+ default:
+ return "Unrecognized <call-offset>.";
+ }
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <special-name>.
+
+ <special-name> ::= GV <object name> # Guard variable
+ ::= TV <type> # virtual table
+ ::= TT <type> # VTT
+ ::= TI <type> # typeinfo structure
+ ::= TS <type> # typeinfo name
+
+ Other relevant productions include thunks:
+
+ <special-name> ::= T <call-offset> <base encoding>
+ # base is the nominal target function of thunk
+
+ <special-name> ::= Tc <call-offset> <call-offset> <base encoding>
+ # base is the nominal target function of thunk
+ # first call-offset is 'this' adjustment
+ # second call-offset is result adjustment
+
+ where
+
+ <call-offset> ::= h <nv-offset> _
+ ::= v <v-offset> _
+
+ Also demangles the special g++ manglings,
+
+ <special-name> ::= TC <type> <offset number> _ <base type>
+ # construction vtable
+ ::= TF <type> # typeinfo function (old ABI only)
+ ::= TJ <type> # java Class structure */
+
+static status_t
+demangle_special_name (dm)
+ demangling_t dm;
+{
+ dyn_string_t number;
+ int unused;
+ char peek = peek_char (dm);
+
+ DEMANGLE_TRACE ("special-name", dm);
+
+ if (peek == 'G')
+ {
+ /* Consume the G. */
+ advance_char (dm);
+ switch (peek_char (dm))
+ {
+ case 'V':
+ /* A guard variable name. */
+ advance_char (dm);
+ RETURN_IF_ERROR (result_add (dm, "guard variable for "));
+ RETURN_IF_ERROR (demangle_name (dm, &unused));
+ break;
+
+ case 'R':
+ /* A reference temporary. */
+ advance_char (dm);
+ RETURN_IF_ERROR (result_add (dm, "reference temporary for "));
+ RETURN_IF_ERROR (demangle_name (dm, &unused));
+ break;
+
+ default:
+ return "Unrecognized <special-name>.";
+ }
+ }
+ else if (peek == 'T')
+ {
+ status_t status = STATUS_OK;
+
+ /* Other C++ implementation miscellania. Consume the T. */
+ advance_char (dm);
+
+ switch (peek_char (dm))
+ {
+ case 'V':
+ /* Virtual table. */
+ advance_char (dm);
+ RETURN_IF_ERROR (result_add (dm, "vtable for "));
+ RETURN_IF_ERROR (demangle_type (dm));
+ break;
+
+ case 'T':
+ /* VTT structure. */
+ advance_char (dm);
+ RETURN_IF_ERROR (result_add (dm, "VTT for "));
+ RETURN_IF_ERROR (demangle_type (dm));
+ break;
+
+ case 'I':
+ /* Typeinfo structure. */
+ advance_char (dm);
+ RETURN_IF_ERROR (result_add (dm, "typeinfo for "));
+ RETURN_IF_ERROR (demangle_type (dm));
+ break;
+
+ case 'F':
+ /* Typeinfo function. Used only in old ABI with new mangling. */
+ advance_char (dm);
+ RETURN_IF_ERROR (result_add (dm, "typeinfo fn for "));
+ RETURN_IF_ERROR (demangle_type (dm));
+ break;
+
+ case 'S':
+ /* Character string containing type name, used in typeinfo. */
+ advance_char (dm);
+ RETURN_IF_ERROR (result_add (dm, "typeinfo name for "));
+ RETURN_IF_ERROR (demangle_type (dm));
+ break;
+
+ case 'J':
+ /* The java Class variable corresponding to a C++ class. */
+ advance_char (dm);
+ RETURN_IF_ERROR (result_add (dm, "java Class for "));
+ RETURN_IF_ERROR (demangle_type (dm));
+ break;
+
+ case 'h':
+ /* Non-virtual thunk. */
+ advance_char (dm);
+ RETURN_IF_ERROR (result_add (dm, "non-virtual thunk"));
+ RETURN_IF_ERROR (demangle_nv_offset (dm));
+ /* Demangle the separator. */
+ RETURN_IF_ERROR (demangle_char (dm, '_'));
+ /* Demangle and emit the target name and function type. */
+ RETURN_IF_ERROR (result_add (dm, " to "));
+ RETURN_IF_ERROR (demangle_encoding (dm));
+ break;
+
+ case 'v':
+ /* Virtual thunk. */
+ advance_char (dm);
+ RETURN_IF_ERROR (result_add (dm, "virtual thunk"));
+ RETURN_IF_ERROR (demangle_v_offset (dm));
+ /* Demangle the separator. */
+ RETURN_IF_ERROR (demangle_char (dm, '_'));
+ /* Demangle and emit the target function. */
+ RETURN_IF_ERROR (result_add (dm, " to "));
+ RETURN_IF_ERROR (demangle_encoding (dm));
+ break;
+
+ case 'c':
+ /* Covariant return thunk. */
+ advance_char (dm);
+ RETURN_IF_ERROR (result_add (dm, "covariant return thunk"));
+ RETURN_IF_ERROR (demangle_call_offset (dm));
+ RETURN_IF_ERROR (demangle_call_offset (dm));
+ /* Demangle and emit the target function. */
+ RETURN_IF_ERROR (result_add (dm, " to "));
+ RETURN_IF_ERROR (demangle_encoding (dm));
+ break;
+
+ case 'C':
+ /* TC is a special g++ mangling for a construction vtable. */
+ if (!flag_strict)
+ {
+ dyn_string_t derived_type;
+
+ advance_char (dm);
+ RETURN_IF_ERROR (result_add (dm, "construction vtable for "));
+
+ /* Demangle the derived type off to the side. */
+ RETURN_IF_ERROR (result_push (dm));
+ RETURN_IF_ERROR (demangle_type (dm));
+ derived_type = (dyn_string_t) result_pop (dm);
+
+ /* Demangle the offset. */
+ number = dyn_string_new (4);
+ if (number == NULL)
+ {
+ dyn_string_delete (derived_type);
+ return STATUS_ALLOCATION_FAILED;
+ }
+ demangle_number_literally (dm, number, 10, 1);
+ /* Demangle the underscore separator. */
+ status = demangle_char (dm, '_');
+
+ /* Demangle the base type. */
+ if (STATUS_NO_ERROR (status))
+ status = demangle_type (dm);
+
+ /* Emit the derived type. */
+ if (STATUS_NO_ERROR (status))
+ status = result_add (dm, "-in-");
+ if (STATUS_NO_ERROR (status))
+ status = result_add_string (dm, derived_type);
+ dyn_string_delete (derived_type);
+
+ /* Don't display the offset unless in verbose mode. */
+ if (flag_verbose)
+ {
+ status = result_add_char (dm, ' ');
+ if (STATUS_NO_ERROR (status))
+ result_add_string (dm, number);
+ }
+ dyn_string_delete (number);
+ RETURN_IF_ERROR (status);
+ break;
+ }
+ /* If flag_strict, fall through. */
+
+ default:
+ return "Unrecognized <special-name>.";
+ }
+ }
+ else
+ return STATUS_ERROR;
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <ctor-dtor-name>.
+
+ <ctor-dtor-name>
+ ::= C1 # complete object (in-charge) ctor
+ ::= C2 # base object (not-in-charge) ctor
+ ::= C3 # complete object (in-charge) allocating ctor
+ ::= D0 # deleting (in-charge) dtor
+ ::= D1 # complete object (in-charge) dtor
+ ::= D2 # base object (not-in-charge) dtor */
+
+static status_t
+demangle_ctor_dtor_name (dm)
+ demangling_t dm;
+{
+ static const char *const ctor_flavors[] =
+ {
+ "in-charge",
+ "not-in-charge",
+ "allocating"
+ };
+ static const char *const dtor_flavors[] =
+ {
+ "in-charge deleting",
+ "in-charge",
+ "not-in-charge"
+ };
+
+ int flavor;
+ char peek = peek_char (dm);
+
+ DEMANGLE_TRACE ("ctor-dtor-name", dm);
+
+ if (peek == 'C')
+ {
+ /* A constructor name. Consume the C. */
+ advance_char (dm);
+ flavor = next_char (dm);
+ if (flavor < '1' || flavor > '3')
+ return "Unrecognized constructor.";
+ RETURN_IF_ERROR (result_add_string (dm, dm->last_source_name));
+ switch (flavor)
+ {
+ case '1': dm->is_constructor = gnu_v3_complete_object_ctor;
+ break;
+ case '2': dm->is_constructor = gnu_v3_base_object_ctor;
+ break;
+ case '3': dm->is_constructor = gnu_v3_complete_object_allocating_ctor;
+ break;
+ }
+ /* Print the flavor of the constructor if in verbose mode. */
+ if (flag_verbose)
+ {
+ RETURN_IF_ERROR (result_add (dm, "["));
+ RETURN_IF_ERROR (result_add (dm, ctor_flavors[flavor - '1']));
+ RETURN_IF_ERROR (result_add_char (dm, ']'));
+ }
+ }
+ else if (peek == 'D')
+ {
+ /* A destructor name. Consume the D. */
+ advance_char (dm);
+ flavor = next_char (dm);
+ if (flavor < '0' || flavor > '2')
+ return "Unrecognized destructor.";
+ RETURN_IF_ERROR (result_add_char (dm, '~'));
+ RETURN_IF_ERROR (result_add_string (dm, dm->last_source_name));
+ switch (flavor)
+ {
+ case '0': dm->is_destructor = gnu_v3_deleting_dtor;
+ break;
+ case '1': dm->is_destructor = gnu_v3_complete_object_dtor;
+ break;
+ case '2': dm->is_destructor = gnu_v3_base_object_dtor;
+ break;
+ }
+ /* Print the flavor of the destructor if in verbose mode. */
+ if (flag_verbose)
+ {
+ RETURN_IF_ERROR (result_add (dm, " ["));
+ RETURN_IF_ERROR (result_add (dm, dtor_flavors[flavor - '0']));
+ RETURN_IF_ERROR (result_add_char (dm, ']'));
+ }
+ }
+ else
+ return STATUS_ERROR;
+
+ return STATUS_OK;
+}
+
+/* Handle pointer, reference, and pointer-to-member cases for
+ demangle_type. All consecutive `P's, `R's, and 'M's are joined to
+ build a pointer/reference type. We snarf all these, plus the
+ following <type>, all at once since we need to know whether we have
+ a pointer to data or pointer to function to construct the right
+ output syntax. C++'s pointer syntax is hairy.
+
+ This function adds substitution candidates for every nested
+ pointer/reference type it processes, including the outermost, final
+ type, assuming the substitution starts at SUBSTITUTION_START in the
+ demangling result. For example, if this function demangles
+ `PP3Foo', it will add a substitution for `Foo', `Foo*', and
+ `Foo**', in that order.
+
+ *INSERT_POS is a quantity used internally, when this function calls
+ itself recursively, to figure out where to insert pointer
+ punctuation on the way up. On entry to this function, INSERT_POS
+ should point to a temporary value, but that value need not be
+ initialized.
+
+ <type> ::= P <type>
+ ::= R <type>
+ ::= <pointer-to-member-type>
+
+ <pointer-to-member-type> ::= M </class/ type> </member/ type> */
+
+static status_t
+demangle_type_ptr (dm, insert_pos, substitution_start)
+ demangling_t dm;
+ int *insert_pos;
+ int substitution_start;
+{
+ status_t status;
+ int is_substitution_candidate = 1;
+
+ DEMANGLE_TRACE ("type*", dm);
+
+ /* Scan forward, collecting pointers and references into symbols,
+ until we hit something else. Then emit the type. */
+ switch (peek_char (dm))
+ {
+ case 'P':
+ /* A pointer. Snarf the `P'. */
+ advance_char (dm);
+ /* Demangle the underlying type. */
+ RETURN_IF_ERROR (demangle_type_ptr (dm, insert_pos,
+ substitution_start));
+ /* Insert an asterisk where we're told to; it doesn't
+ necessarily go at the end. If we're doing Java style output,
+ there is no pointer symbol. */
+ if (dm->style != DMGL_JAVA)
+ RETURN_IF_ERROR (result_insert_char (dm, *insert_pos, '*'));
+ /* The next (outermost) pointer or reference character should go
+ after this one. */
+ ++(*insert_pos);
+ break;
+
+ case 'R':
+ /* A reference. Snarf the `R'. */
+ advance_char (dm);
+ /* Demangle the underlying type. */
+ RETURN_IF_ERROR (demangle_type_ptr (dm, insert_pos,
+ substitution_start));
+ /* Insert an ampersand where we're told to; it doesn't
+ necessarily go at the end. */
+ RETURN_IF_ERROR (result_insert_char (dm, *insert_pos, '&'));
+ /* The next (outermost) pointer or reference character should go
+ after this one. */
+ ++(*insert_pos);
+ break;
+
+ case 'M':
+ {
+ /* A pointer-to-member. */
+ dyn_string_t class_type;
+
+ /* Eat the 'M'. */
+ advance_char (dm);
+
+ /* Capture the type of which this is a pointer-to-member. */
+ RETURN_IF_ERROR (result_push (dm));
+ RETURN_IF_ERROR (demangle_type (dm));
+ class_type = (dyn_string_t) result_pop (dm);
+
+ if (peek_char (dm) == 'F')
+ /* A pointer-to-member function. We want output along the
+ lines of `void (C::*) (int, int)'. Demangle the function
+ type, which would in this case give `void () (int, int)'
+ and set *insert_pos to the spot between the first
+ parentheses. */
+ status = demangle_type_ptr (dm, insert_pos, substitution_start);
+ else if (peek_char (dm) == 'A')
+ /* A pointer-to-member array variable. We want output that
+ looks like `int (Klass::*) [10]'. Demangle the array type
+ as `int () [10]', and set *insert_pos to the spot between
+ the parentheses. */
+ status = demangle_array_type (dm, insert_pos);
+ else
+ {
+ /* A pointer-to-member variable. Demangle the type of the
+ pointed-to member. */
+ status = demangle_type (dm);
+ /* Make it pretty. */
+ if (STATUS_NO_ERROR (status)
+ && !result_previous_char_is_space (dm))
+ status = result_add_char (dm, ' ');
+ /* The pointer-to-member notation (e.g. `C::*') follows the
+ member's type. */
+ *insert_pos = result_caret_pos (dm);
+ }
+
+ /* Build the pointer-to-member notation. */
+ if (STATUS_NO_ERROR (status))
+ status = result_insert (dm, *insert_pos, "::*");
+ if (STATUS_NO_ERROR (status))
+ status = result_insert_string (dm, *insert_pos, class_type);
+ /* There may be additional levels of (pointer or reference)
+ indirection in this type. If so, the `*' and `&' should be
+ added after the pointer-to-member notation (e.g. `C::*&' for
+ a reference to a pointer-to-member of class C). */
+ *insert_pos += dyn_string_length (class_type) + 3;
+
+ /* Clean up. */
+ dyn_string_delete (class_type);
+
+ RETURN_IF_ERROR (status);
+ }
+ break;
+
+ case 'F':
+ /* Ooh, tricky, a pointer-to-function. When we demangle the
+ function type, the return type should go at the very
+ beginning. */
+ *insert_pos = result_caret_pos (dm);
+ /* The parentheses indicate this is a function pointer or
+ reference type. */
+ RETURN_IF_ERROR (result_add (dm, "()"));
+ /* Now demangle the function type. The return type will be
+ inserted before the `()', and the argument list will go after
+ it. */
+ RETURN_IF_ERROR (demangle_function_type (dm, insert_pos));
+ /* We should now have something along the lines of
+ `void () (int, int)'. The pointer or reference characters
+ have to inside the first set of parentheses. *insert_pos has
+ already been updated to point past the end of the return
+ type. Move it one character over so it points inside the
+ `()'. */
+ ++(*insert_pos);
+ break;
+
+ case 'A':
+ /* An array pointer or reference. demangle_array_type will figure
+ out where the asterisks and ampersands go. */
+ RETURN_IF_ERROR (demangle_array_type (dm, insert_pos));
+ break;
+
+ default:
+ /* No more pointer or reference tokens; this is therefore a
+ pointer to data. Finish up by demangling the underlying
+ type. */
+ RETURN_IF_ERROR (demangle_type (dm));
+ /* The pointer or reference characters follow the underlying
+ type, as in `int*&'. */
+ *insert_pos = result_caret_pos (dm);
+ /* Because of the production <type> ::= <substitution>,
+ demangle_type will already have added the underlying type as
+ a substitution candidate. Don't do it again. */
+ is_substitution_candidate = 0;
+ break;
+ }
+
+ if (is_substitution_candidate)
+ RETURN_IF_ERROR (substitution_add (dm, substitution_start, 0));
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <type>.
+
+ <type> ::= <builtin-type>
+ ::= <function-type>
+ ::= <class-enum-type>
+ ::= <array-type>
+ ::= <pointer-to-member-type>
+ ::= <template-param>
+ ::= <template-template-param> <template-args>
+ ::= <CV-qualifiers> <type>
+ ::= P <type> # pointer-to
+ ::= R <type> # reference-to
+ ::= C <type> # complex pair (C 2000)
+ ::= G <type> # imaginary (C 2000)
+ ::= U <source-name> <type> # vendor extended type qualifier
+ ::= <substitution> */
+
+static status_t
+demangle_type (dm)
+ demangling_t dm;
+{
+ int start = substitution_start (dm);
+ char peek = peek_char (dm);
+ char peek_next;
+ int encode_return_type = 0;
+ template_arg_list_t old_arg_list = current_template_arg_list (dm);
+ int insert_pos;
+
+ /* A <type> can be a <substitution>; therefore, this <type> is a
+ substitution candidate unless a special condition holds (see
+ below). */
+ int is_substitution_candidate = 1;
+
+ DEMANGLE_TRACE ("type", dm);
+
+ /* A <class-enum-type> can start with a digit (a <source-name>), an
+ N (a <nested-name>), or a Z (a <local-name>). */
+ if (IS_DIGIT ((unsigned char) peek) || peek == 'N' || peek == 'Z')
+ RETURN_IF_ERROR (demangle_class_enum_type (dm, &encode_return_type));
+ /* Lower-case letters begin <builtin-type>s, except for `r', which
+ denotes restrict. */
+ else if (peek >= 'a' && peek <= 'z' && peek != 'r')
+ {
+ RETURN_IF_ERROR (demangle_builtin_type (dm));
+ /* Built-in types are not substitution candidates. */
+ is_substitution_candidate = 0;
+ }
+ else
+ switch (peek)
+ {
+ case 'r':
+ case 'V':
+ case 'K':
+ /* CV-qualifiers (including restrict). We have to demangle
+ them off to the side, since C++ syntax puts them in a funny
+ place for qualified pointer and reference types. */
+ {
+ status_t status;
+ dyn_string_t cv_qualifiers = dyn_string_new (24);
+ int old_caret_position = result_get_caret (dm);
+
+ if (cv_qualifiers == NULL)
+ return STATUS_ALLOCATION_FAILED;
+
+ /* Decode all adjacent CV qualifiers. */
+ demangle_CV_qualifiers (dm, cv_qualifiers);
+ /* Emit them, and shift the caret left so that the
+ underlying type will be emitted before the qualifiers. */
+ status = result_add_string (dm, cv_qualifiers);
+ result_shift_caret (dm, -dyn_string_length (cv_qualifiers));
+ /* Clean up. */
+ dyn_string_delete (cv_qualifiers);
+ RETURN_IF_ERROR (status);
+ /* Also prepend a blank, if needed. */
+ RETURN_IF_ERROR (result_add_char (dm, ' '));
+ result_shift_caret (dm, -1);
+
+ /* Demangle the underlying type. It will be emitted before
+ the CV qualifiers, since we moved the caret. */
+ RETURN_IF_ERROR (demangle_type (dm));
+
+ /* Put the caret back where it was previously. */
+ result_set_caret (dm, old_caret_position);
+ }
+ break;
+
+ case 'F':
+ return "Non-pointer or -reference function type.";
+
+ case 'A':
+ RETURN_IF_ERROR (demangle_array_type (dm, NULL));
+ break;
+
+ case 'T':
+ /* It's either a <template-param> or a
+ <template-template-param>. In either case, demangle the
+ `T' token first. */
+ RETURN_IF_ERROR (demangle_template_param (dm));
+
+ /* Check for a template argument list; if one is found, it's a
+ <template-template-param> ::= <template-param>
+ ::= <substitution> */
+ if (peek_char (dm) == 'I')
+ {
+ /* Add a substitution candidate. The template parameter
+ `T' token is a substitution candidate by itself,
+ without the template argument list. */
+ RETURN_IF_ERROR (substitution_add (dm, start, encode_return_type));
+
+ /* Now demangle the template argument list. */
+ RETURN_IF_ERROR (demangle_template_args (dm));
+ /* The entire type, including the template template
+ parameter and its argument list, will be added as a
+ substitution candidate below. */
+ }
+
+ break;
+
+ case 'S':
+ /* First check if this is a special substitution. If it is,
+ this is a <class-enum-type>. Special substitutions have a
+ letter following the `S'; other substitutions have a digit
+ or underscore. */
+ peek_next = peek_char_next (dm);
+ if (IS_DIGIT (peek_next) || peek_next == '_')
+ {
+ RETURN_IF_ERROR (demangle_substitution (dm, &encode_return_type));
+
+ /* The substituted name may have been a template name.
+ Check if template arguments follow, and if so, demangle
+ them. */
+ if (peek_char (dm) == 'I')
+ RETURN_IF_ERROR (demangle_template_args (dm));
+ else
+ /* A substitution token is not itself a substitution
+ candidate. (However, if the substituted template is
+ instantiated, the resulting type is.) */
+ is_substitution_candidate = 0;
+ }
+ else
+ {
+ /* Now some trickiness. We have a special substitution
+ here. Often, the special substitution provides the
+ name of a template that's subsequently instantiated,
+ for instance `SaIcE' => std::allocator<char>. In these
+ cases we need to add a substitution candidate for the
+ entire <class-enum-type> and thus don't want to clear
+ the is_substitution_candidate flag.
+
+ However, it's possible that what we have here is a
+ substitution token representing an entire type, such as
+ `Ss' => std::string. In this case, we mustn't add a
+ new substitution candidate for this substitution token.
+ To detect this case, remember where the start of the
+ substitution token is. */
+ const char *next = dm->next;
+ /* Now demangle the <class-enum-type>. */
+ RETURN_IF_ERROR
+ (demangle_class_enum_type (dm, &encode_return_type));
+ /* If all that was just demangled is the two-character
+ special substitution token, supress the addition of a
+ new candidate for it. */
+ if (dm->next == next + 2)
+ is_substitution_candidate = 0;
+ }
+
+ break;
+
+ case 'P':
+ case 'R':
+ case 'M':
+ RETURN_IF_ERROR (demangle_type_ptr (dm, &insert_pos, start));
+ /* demangle_type_ptr adds all applicable substitution
+ candidates. */
+ is_substitution_candidate = 0;
+ break;
+
+ case 'C':
+ /* A C99 complex type. */
+ RETURN_IF_ERROR (result_add (dm, "complex "));
+ advance_char (dm);
+ RETURN_IF_ERROR (demangle_type (dm));
+ break;
+
+ case 'G':
+ /* A C99 imaginary type. */
+ RETURN_IF_ERROR (result_add (dm, "imaginary "));
+ advance_char (dm);
+ RETURN_IF_ERROR (demangle_type (dm));
+ break;
+
+ case 'U':
+ /* Vendor-extended type qualifier. */
+ advance_char (dm);
+ RETURN_IF_ERROR (demangle_source_name (dm));
+ RETURN_IF_ERROR (result_add_char (dm, ' '));
+ RETURN_IF_ERROR (demangle_type (dm));
+ break;
+
+ default:
+ return "Unexpected character in <type>.";
+ }
+
+ if (is_substitution_candidate)
+ /* Add a new substitution for the type. If this type was a
+ <template-param>, pass its index since from the point of
+ substitutions; a <template-param> token is a substitution
+ candidate distinct from the type that is substituted for it. */
+ RETURN_IF_ERROR (substitution_add (dm, start, encode_return_type));
+
+ /* Pop off template argument lists added during mangling of this
+ type. */
+ pop_to_template_arg_list (dm, old_arg_list);
+
+ return STATUS_OK;
+}
+
+/* C++ source names of builtin types, indexed by the mangled code
+ letter's position in the alphabet ('a' -> 0, 'b' -> 1, etc). */
+static const char *const builtin_type_names[26] =
+{
+ "signed char", /* a */
+ "bool", /* b */
+ "char", /* c */
+ "double", /* d */
+ "long double", /* e */
+ "float", /* f */
+ "__float128", /* g */
+ "unsigned char", /* h */
+ "int", /* i */
+ "unsigned", /* j */
+ NULL, /* k */
+ "long", /* l */
+ "unsigned long", /* m */
+ "__int128", /* n */
+ "unsigned __int128", /* o */
+ NULL, /* p */
+ NULL, /* q */
+ NULL, /* r */
+ "short", /* s */
+ "unsigned short", /* t */
+ NULL, /* u */
+ "void", /* v */
+ "wchar_t", /* w */
+ "long long", /* x */
+ "unsigned long long", /* y */
+ "..." /* z */
+};
+
+/* Java source names of builtin types. Types that arn't valid in Java
+ are also included here - we don't fail if someone attempts to demangle a
+ C++ symbol in Java style. */
+static const char *const java_builtin_type_names[26] =
+{
+ "signed char", /* a */
+ "boolean", /* C++ "bool" */ /* b */
+ "byte", /* C++ "char" */ /* c */
+ "double", /* d */
+ "long double", /* e */
+ "float", /* f */
+ "__float128", /* g */
+ "unsigned char", /* h */
+ "int", /* i */
+ "unsigned", /* j */
+ NULL, /* k */
+ "long", /* l */
+ "unsigned long", /* m */
+ "__int128", /* n */
+ "unsigned __int128", /* o */
+ NULL, /* p */
+ NULL, /* q */
+ NULL, /* r */
+ "short", /* s */
+ "unsigned short", /* t */
+ NULL, /* u */
+ "void", /* v */
+ "char", /* C++ "wchar_t" */ /* w */
+ "long", /* C++ "long long" */ /* x */
+ "unsigned long long", /* y */
+ "..." /* z */
+};
+
+/* Demangles and emits a <builtin-type>.
+
+ <builtin-type> ::= v # void
+ ::= w # wchar_t
+ ::= b # bool
+ ::= c # char
+ ::= a # signed char
+ ::= h # unsigned char
+ ::= s # short
+ ::= t # unsigned short
+ ::= i # int
+ ::= j # unsigned int
+ ::= l # long
+ ::= m # unsigned long
+ ::= x # long long, __int64
+ ::= y # unsigned long long, __int64
+ ::= n # __int128
+ ::= o # unsigned __int128
+ ::= f # float
+ ::= d # double
+ ::= e # long double, __float80
+ ::= g # __float128
+ ::= z # ellipsis
+ ::= u <source-name> # vendor extended type */
+
+static status_t
+demangle_builtin_type (dm)
+ demangling_t dm;
+{
+
+ char code = peek_char (dm);
+
+ DEMANGLE_TRACE ("builtin-type", dm);
+
+ if (code == 'u')
+ {
+ advance_char (dm);
+ RETURN_IF_ERROR (demangle_source_name (dm));
+ return STATUS_OK;
+ }
+ else if (code >= 'a' && code <= 'z')
+ {
+ const char *type_name;
+ /* Java uses different names for some built-in types. */
+ if (dm->style == DMGL_JAVA)
+ type_name = java_builtin_type_names[code - 'a'];
+ else
+ type_name = builtin_type_names[code - 'a'];
+ if (type_name == NULL)
+ return "Unrecognized <builtin-type> code.";
+
+ RETURN_IF_ERROR (result_add (dm, type_name));
+ advance_char (dm);
+ return STATUS_OK;
+ }
+ else
+ return "Non-alphabetic <builtin-type> code.";
+}
+
+/* Demangles all consecutive CV-qualifiers (const, volatile, and
+ restrict) at the current position. The qualifiers are appended to
+ QUALIFIERS. Returns STATUS_OK. */
+
+static status_t
+demangle_CV_qualifiers (dm, qualifiers)
+ demangling_t dm;
+ dyn_string_t qualifiers;
+{
+ DEMANGLE_TRACE ("CV-qualifiers", dm);
+
+ while (1)
+ {
+ switch (peek_char (dm))
+ {
+ case 'r':
+ if (!dyn_string_append_space (qualifiers))
+ return STATUS_ALLOCATION_FAILED;
+ if (!dyn_string_append_cstr (qualifiers, "restrict"))
+ return STATUS_ALLOCATION_FAILED;
+ break;
+
+ case 'V':
+ if (!dyn_string_append_space (qualifiers))
+ return STATUS_ALLOCATION_FAILED;
+ if (!dyn_string_append_cstr (qualifiers, "volatile"))
+ return STATUS_ALLOCATION_FAILED;
+ break;
+
+ case 'K':
+ if (!dyn_string_append_space (qualifiers))
+ return STATUS_ALLOCATION_FAILED;
+ if (!dyn_string_append_cstr (qualifiers, "const"))
+ return STATUS_ALLOCATION_FAILED;
+ break;
+
+ default:
+ return STATUS_OK;
+ }
+
+ advance_char (dm);
+ }
+}
+
+/* Demangles and emits a <function-type>. *FUNCTION_NAME_POS is the
+ position in the result string of the start of the function
+ identifier, at which the function's return type will be inserted;
+ *FUNCTION_NAME_POS is updated to position past the end of the
+ function's return type.
+
+ <function-type> ::= F [Y] <bare-function-type> E */
+
+static status_t
+demangle_function_type (dm, function_name_pos)
+ demangling_t dm;
+ int *function_name_pos;
+{
+ DEMANGLE_TRACE ("function-type", dm);
+ RETURN_IF_ERROR (demangle_char (dm, 'F'));
+ if (peek_char (dm) == 'Y')
+ {
+ /* Indicate this function has C linkage if in verbose mode. */
+ if (flag_verbose)
+ RETURN_IF_ERROR (result_add (dm, " [extern \"C\"] "));
+ advance_char (dm);
+ }
+ RETURN_IF_ERROR (demangle_bare_function_type (dm, function_name_pos));
+ RETURN_IF_ERROR (demangle_char (dm, 'E'));
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <bare-function-type>. RETURN_TYPE_POS is the
+ position in the result string at which the function return type
+ should be inserted. If RETURN_TYPE_POS is BFT_NO_RETURN_TYPE, the
+ function's return type is assumed not to be encoded.
+
+ <bare-function-type> ::= <signature type>+ */
+
+static status_t
+demangle_bare_function_type (dm, return_type_pos)
+ demangling_t dm;
+ int *return_type_pos;
+{
+ /* Sequence is the index of the current function parameter, counting
+ from zero. The value -1 denotes the return type. */
+ int sequence =
+ (return_type_pos == BFT_NO_RETURN_TYPE ? 0 : -1);
+
+ DEMANGLE_TRACE ("bare-function-type", dm);
+
+ RETURN_IF_ERROR (result_add_char (dm, '('));
+ while (!end_of_name_p (dm) && peek_char (dm) != 'E')
+ {
+ if (sequence == -1)
+ /* We're decoding the function's return type. */
+ {
+ dyn_string_t return_type;
+ status_t status = STATUS_OK;
+
+ /* Decode the return type off to the side. */
+ RETURN_IF_ERROR (result_push (dm));
+ RETURN_IF_ERROR (demangle_type (dm));
+ return_type = (dyn_string_t) result_pop (dm);
+
+ /* Add a space to the end of the type. Insert the return
+ type where we've been asked to. */
+ if (!dyn_string_append_space (return_type))
+ status = STATUS_ALLOCATION_FAILED;
+ if (STATUS_NO_ERROR (status))
+ {
+ if (!dyn_string_insert (result_string (dm), *return_type_pos,
+ return_type))
+ status = STATUS_ALLOCATION_FAILED;
+ else
+ *return_type_pos += dyn_string_length (return_type);
+ }
+
+ dyn_string_delete (return_type);
+ RETURN_IF_ERROR (status);
+ }
+ else
+ {
+ /* Skip `void' parameter types. One should only occur as
+ the only type in a parameter list; in that case, we want
+ to print `foo ()' instead of `foo (void)'. */
+ if (peek_char (dm) == 'v')
+ /* Consume the v. */
+ advance_char (dm);
+ else
+ {
+ /* Separate parameter types by commas. */
+ if (sequence > 0)
+ RETURN_IF_ERROR (result_add (dm, ", "));
+ /* Demangle the type. */
+ RETURN_IF_ERROR (demangle_type (dm));
+ }
+ }
+
+ ++sequence;
+ }
+ RETURN_IF_ERROR (result_add_char (dm, ')'));
+
+ /* We should have demangled at least one parameter type (which would
+ be void, for a function that takes no parameters), plus the
+ return type, if we were supposed to demangle that. */
+ if (sequence == -1)
+ return "Missing function return type.";
+ else if (sequence == 0)
+ return "Missing function parameter.";
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <class-enum-type>. *ENCODE_RETURN_TYPE is set to
+ non-zero if the type is a template-id, zero otherwise.
+
+ <class-enum-type> ::= <name> */
+
+static status_t
+demangle_class_enum_type (dm, encode_return_type)
+ demangling_t dm;
+ int *encode_return_type;
+{
+ DEMANGLE_TRACE ("class-enum-type", dm);
+
+ RETURN_IF_ERROR (demangle_name (dm, encode_return_type));
+ return STATUS_OK;
+}
+
+/* Demangles and emits an <array-type>.
+
+ If PTR_INSERT_POS is not NULL, the array type is formatted as a
+ pointer or reference to an array, except that asterisk and
+ ampersand punctuation is omitted (since it's not know at this
+ point). *PTR_INSERT_POS is set to the position in the demangled
+ name at which this punctuation should be inserted. For example,
+ `A10_i' is demangled to `int () [10]' and *PTR_INSERT_POS points
+ between the parentheses.
+
+ If PTR_INSERT_POS is NULL, the array type is assumed not to be
+ pointer- or reference-qualified. Then, for example, `A10_i' is
+ demangled simply as `int[10]'.
+
+ <array-type> ::= A [<dimension number>] _ <element type>
+ ::= A <dimension expression> _ <element type> */
+
+static status_t
+demangle_array_type (dm, ptr_insert_pos)
+ demangling_t dm;
+ int *ptr_insert_pos;
+{
+ status_t status = STATUS_OK;
+ dyn_string_t array_size = NULL;
+ char peek;
+
+ DEMANGLE_TRACE ("array-type", dm);
+
+ RETURN_IF_ERROR (demangle_char (dm, 'A'));
+
+ /* Demangle the array size into array_size. */
+ peek = peek_char (dm);
+ if (peek == '_')
+ /* Array bound is omitted. This is a C99-style VLA. */
+ ;
+ else if (IS_DIGIT (peek_char (dm)))
+ {
+ /* It looks like a constant array bound. */
+ array_size = dyn_string_new (10);
+ if (array_size == NULL)
+ return STATUS_ALLOCATION_FAILED;
+ status = demangle_number_literally (dm, array_size, 10, 0);
+ }
+ else
+ {
+ /* Anything is must be an expression for a nont-constant array
+ bound. This happens if the array type occurs in a template
+ and the array bound references a template parameter. */
+ RETURN_IF_ERROR (result_push (dm));
+ RETURN_IF_ERROR (demangle_expression (dm));
+ array_size = (dyn_string_t) result_pop (dm);
+ }
+ /* array_size may have been allocated by now, so we can't use
+ RETURN_IF_ERROR until it's been deallocated. */
+
+ /* Demangle the base type of the array. */
+ if (STATUS_NO_ERROR (status))
+ status = demangle_char (dm, '_');
+ if (STATUS_NO_ERROR (status))
+ status = demangle_type (dm);
+
+ if (ptr_insert_pos != NULL)
+ {
+ /* This array is actually part of an pointer- or
+ reference-to-array type. Format appropriately, except we
+ don't know which and how much punctuation to use. */
+ if (STATUS_NO_ERROR (status))
+ status = result_add (dm, " () ");
+ /* Let the caller know where to insert the punctuation. */
+ *ptr_insert_pos = result_caret_pos (dm) - 2;
+ }
+
+ /* Emit the array dimension syntax. */
+ if (STATUS_NO_ERROR (status))
+ status = result_add_char (dm, '[');
+ if (STATUS_NO_ERROR (status) && array_size != NULL)
+ status = result_add_string (dm, array_size);
+ if (STATUS_NO_ERROR (status))
+ status = result_add_char (dm, ']');
+ if (array_size != NULL)
+ dyn_string_delete (array_size);
+
+ RETURN_IF_ERROR (status);
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <template-param>.
+
+ <template-param> ::= T_ # first template parameter
+ ::= T <parameter-2 number> _ */
+
+static status_t
+demangle_template_param (dm)
+ demangling_t dm;
+{
+ int parm_number;
+ template_arg_list_t current_arg_list = current_template_arg_list (dm);
+ string_list_t arg;
+
+ DEMANGLE_TRACE ("template-param", dm);
+
+ /* Make sure there is a template argmust list in which to look up
+ this parameter reference. */
+ if (current_arg_list == NULL)
+ return "Template parameter outside of template.";
+
+ RETURN_IF_ERROR (demangle_char (dm, 'T'));
+ if (peek_char (dm) == '_')
+ parm_number = 0;
+ else
+ {
+ RETURN_IF_ERROR (demangle_number (dm, &parm_number, 10, 0));
+ ++parm_number;
+ }
+ RETURN_IF_ERROR (demangle_char (dm, '_'));
+
+ arg = template_arg_list_get_arg (current_arg_list, parm_number);
+ if (arg == NULL)
+ /* parm_number exceeded the number of arguments in the current
+ template argument list. */
+ return "Template parameter number out of bounds.";
+ RETURN_IF_ERROR (result_add_string (dm, (dyn_string_t) arg));
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <template-args>.
+
+ <template-args> ::= I <template-arg>+ E */
+
+static status_t
+demangle_template_args (dm)
+ demangling_t dm;
+{
+ int first = 1;
+ dyn_string_t old_last_source_name;
+ template_arg_list_t arg_list = template_arg_list_new ();
+
+ if (arg_list == NULL)
+ return STATUS_ALLOCATION_FAILED;
+
+ /* Preserve the most recently demangled source name. */
+ old_last_source_name = dm->last_source_name;
+ dm->last_source_name = dyn_string_new (0);
+
+ DEMANGLE_TRACE ("template-args", dm);
+
+ if (dm->last_source_name == NULL)
+ return STATUS_ALLOCATION_FAILED;
+
+ RETURN_IF_ERROR (demangle_char (dm, 'I'));
+ RETURN_IF_ERROR (result_open_template_list (dm));
+ do
+ {
+ string_list_t arg;
+
+ if (first)
+ first = 0;
+ else
+ RETURN_IF_ERROR (result_add (dm, ", "));
+
+ /* Capture the template arg. */
+ RETURN_IF_ERROR (result_push (dm));
+ RETURN_IF_ERROR (demangle_template_arg (dm));
+ arg = result_pop (dm);
+
+ /* Emit it in the demangled name. */
+ RETURN_IF_ERROR (result_add_string (dm, (dyn_string_t) arg));
+
+ /* Save it for use in expanding <template-param>s. */
+ template_arg_list_add_arg (arg_list, arg);
+ }
+ while (peek_char (dm) != 'E');
+ /* Append the '>'. */
+ RETURN_IF_ERROR (result_close_template_list (dm));
+
+ /* Consume the 'E'. */
+ advance_char (dm);
+
+ /* Restore the most recent demangled source name. */
+ dyn_string_delete (dm->last_source_name);
+ dm->last_source_name = old_last_source_name;
+
+ /* Push the list onto the top of the stack of template argument
+ lists, so that arguments from it are used from now on when
+ expanding <template-param>s. */
+ push_template_arg_list (dm, arg_list);
+
+ return STATUS_OK;
+}
+
+/* This function, which does not correspond to a production in the
+ mangling spec, handles the `literal' production for both
+ <template-arg> and <expr-primary>. It does not expect or consume
+ the initial `L' or final `E'. The demangling is given by:
+
+ <literal> ::= <type> </value/ number>
+
+ and the emitted output is `(type)number'. */
+
+static status_t
+demangle_literal (dm)
+ demangling_t dm;
+{
+ char peek = peek_char (dm);
+ dyn_string_t value_string;
+ status_t status;
+
+ DEMANGLE_TRACE ("literal", dm);
+
+ if (!flag_verbose && peek >= 'a' && peek <= 'z')
+ {
+ /* If not in verbose mode and this is a builtin type, see if we
+ can produce simpler numerical output. In particular, for
+ integer types shorter than `long', just write the number
+ without type information; for bools, write `true' or `false'.
+ Other refinements could be made here too. */
+
+ /* This constant string is used to map from <builtin-type> codes
+ (26 letters of the alphabet) to codes that determine how the
+ value will be displayed. The codes are:
+ b: display as bool
+ i: display as int
+ l: display as long
+ A space means the value will be represented using cast
+ notation. */
+ static const char *const code_map = "ibi iii ll ii i ";
+
+ char code = code_map[peek - 'a'];
+ /* FIXME: Implement demangling of floats and doubles. */
+ if (code == 'u')
+ return STATUS_UNIMPLEMENTED;
+ if (code == 'b')
+ {
+ /* It's a boolean. */
+ char value;
+
+ /* Consume the b. */
+ advance_char (dm);
+ /* Look at the next character. It should be 0 or 1,
+ corresponding to false or true, respectively. */
+ value = peek_char (dm);
+ if (value == '0')
+ RETURN_IF_ERROR (result_add (dm, "false"));
+ else if (value == '1')
+ RETURN_IF_ERROR (result_add (dm, "true"));
+ else
+ return "Unrecognized bool constant.";
+ /* Consume the 0 or 1. */
+ advance_char (dm);
+ return STATUS_OK;
+ }
+ else if (code == 'i' || code == 'l')
+ {
+ /* It's an integer or long. */
+
+ /* Consume the type character. */
+ advance_char (dm);
+
+ /* Demangle the number and write it out. */
+ value_string = dyn_string_new (0);
+ status = demangle_number_literally (dm, value_string, 10, 1);
+ if (STATUS_NO_ERROR (status))
+ status = result_add_string (dm, value_string);
+ /* For long integers, append an l. */
+ if (code == 'l' && STATUS_NO_ERROR (status))
+ status = result_add_char (dm, code);
+ dyn_string_delete (value_string);
+
+ RETURN_IF_ERROR (status);
+ return STATUS_OK;
+ }
+ /* ...else code == ' ', so fall through to represent this
+ literal's type explicitly using cast syntax. */
+ }
+
+ RETURN_IF_ERROR (result_add_char (dm, '('));
+ RETURN_IF_ERROR (demangle_type (dm));
+ RETURN_IF_ERROR (result_add_char (dm, ')'));
+
+ value_string = dyn_string_new (0);
+ if (value_string == NULL)
+ return STATUS_ALLOCATION_FAILED;
+
+ status = demangle_number_literally (dm, value_string, 10, 1);
+ if (STATUS_NO_ERROR (status))
+ status = result_add_string (dm, value_string);
+ dyn_string_delete (value_string);
+ RETURN_IF_ERROR (status);
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <template-arg>.
+
+ <template-arg> ::= <type> # type
+ ::= L <type> <value number> E # literal
+ ::= LZ <encoding> E # external name
+ ::= X <expression> E # expression */
+
+static status_t
+demangle_template_arg (dm)
+ demangling_t dm;
+{
+ DEMANGLE_TRACE ("template-arg", dm);
+
+ switch (peek_char (dm))
+ {
+ case 'L':
+ advance_char (dm);
+
+ if (peek_char (dm) == 'Z')
+ {
+ /* External name. */
+ advance_char (dm);
+ /* FIXME: Standard is contradictory here. */
+ RETURN_IF_ERROR (demangle_encoding (dm));
+ }
+ else
+ RETURN_IF_ERROR (demangle_literal (dm));
+ RETURN_IF_ERROR (demangle_char (dm, 'E'));
+ break;
+
+ case 'X':
+ /* Expression. */
+ advance_char (dm);
+ RETURN_IF_ERROR (demangle_expression (dm));
+ RETURN_IF_ERROR (demangle_char (dm, 'E'));
+ break;
+
+ default:
+ RETURN_IF_ERROR (demangle_type (dm));
+ break;
+ }
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits an <expression>.
+
+ <expression> ::= <unary operator-name> <expression>
+ ::= <binary operator-name> <expression> <expression>
+ ::= <expr-primary>
+ ::= <scope-expression> */
+
+static status_t
+demangle_expression (dm)
+ demangling_t dm;
+{
+ char peek = peek_char (dm);
+
+ DEMANGLE_TRACE ("expression", dm);
+
+ if (peek == 'L' || peek == 'T')
+ RETURN_IF_ERROR (demangle_expr_primary (dm));
+ else if (peek == 's' && peek_char_next (dm) == 'r')
+ RETURN_IF_ERROR (demangle_scope_expression (dm));
+ else
+ /* An operator expression. */
+ {
+ int num_args;
+ status_t status = STATUS_OK;
+ dyn_string_t operator_name;
+
+ /* We have an operator name. Since we want to output binary
+ operations in infix notation, capture the operator name
+ first. */
+ RETURN_IF_ERROR (result_push (dm));
+ RETURN_IF_ERROR (demangle_operator_name (dm, 1, &num_args));
+ operator_name = (dyn_string_t) result_pop (dm);
+
+ /* If it's binary, do an operand first. */
+ if (num_args > 1)
+ {
+ status = result_add_char (dm, '(');
+ if (STATUS_NO_ERROR (status))
+ status = demangle_expression (dm);
+ if (STATUS_NO_ERROR (status))
+ status = result_add_char (dm, ')');
+ }
+
+ /* Emit the operator. */
+ if (STATUS_NO_ERROR (status))
+ status = result_add_string (dm, operator_name);
+ dyn_string_delete (operator_name);
+ RETURN_IF_ERROR (status);
+
+ /* Emit its second (if binary) or only (if unary) operand. */
+ RETURN_IF_ERROR (result_add_char (dm, '('));
+ RETURN_IF_ERROR (demangle_expression (dm));
+ RETURN_IF_ERROR (result_add_char (dm, ')'));
+
+ /* The ternary operator takes a third operand. */
+ if (num_args == 3)
+ {
+ RETURN_IF_ERROR (result_add (dm, ":("));
+ RETURN_IF_ERROR (demangle_expression (dm));
+ RETURN_IF_ERROR (result_add_char (dm, ')'));
+ }
+ }
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <scope-expression>.
+
+ <scope-expression> ::= sr <qualifying type> <source-name>
+ ::= sr <qualifying type> <encoding> */
+
+static status_t
+demangle_scope_expression (dm)
+ demangling_t dm;
+{
+ RETURN_IF_ERROR (demangle_char (dm, 's'));
+ RETURN_IF_ERROR (demangle_char (dm, 'r'));
+ RETURN_IF_ERROR (demangle_type (dm));
+ RETURN_IF_ERROR (result_add (dm, "::"));
+ RETURN_IF_ERROR (demangle_encoding (dm));
+ return STATUS_OK;
+}
+
+/* Demangles and emits an <expr-primary>.
+
+ <expr-primary> ::= <template-param>
+ ::= L <type> <value number> E # literal
+ ::= L <mangled-name> E # external name */
+
+static status_t
+demangle_expr_primary (dm)
+ demangling_t dm;
+{
+ char peek = peek_char (dm);
+
+ DEMANGLE_TRACE ("expr-primary", dm);
+
+ if (peek == 'T')
+ RETURN_IF_ERROR (demangle_template_param (dm));
+ else if (peek == 'L')
+ {
+ /* Consume the `L'. */
+ advance_char (dm);
+ peek = peek_char (dm);
+
+ if (peek == '_')
+ RETURN_IF_ERROR (demangle_mangled_name (dm));
+ else
+ RETURN_IF_ERROR (demangle_literal (dm));
+
+ RETURN_IF_ERROR (demangle_char (dm, 'E'));
+ }
+ else
+ return STATUS_ERROR;
+
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <substitution>. Sets *TEMPLATE_P to non-zero
+ if the substitution is the name of a template, zero otherwise.
+
+ <substitution> ::= S <seq-id> _
+ ::= S_
+
+ ::= St # ::std::
+ ::= Sa # ::std::allocator
+ ::= Sb # ::std::basic_string
+ ::= Ss # ::std::basic_string<char,
+ ::std::char_traits<char>,
+ ::std::allocator<char> >
+ ::= Si # ::std::basic_istream<char,
+ std::char_traits<char> >
+ ::= So # ::std::basic_ostream<char,
+ std::char_traits<char> >
+ ::= Sd # ::std::basic_iostream<char,
+ std::char_traits<char> >
+*/
+
+static status_t
+demangle_substitution (dm, template_p)
+ demangling_t dm;
+ int *template_p;
+{
+ int seq_id;
+ int peek;
+ dyn_string_t text;
+
+ DEMANGLE_TRACE ("substitution", dm);
+
+ RETURN_IF_ERROR (demangle_char (dm, 'S'));
+
+ /* Scan the substitution sequence index. A missing number denotes
+ the first index. */
+ peek = peek_char (dm);
+ if (peek == '_')
+ seq_id = -1;
+ /* If the following character is 0-9 or a capital letter, interpret
+ the sequence up to the next underscore as a base-36 substitution
+ index. */
+ else if (IS_DIGIT ((unsigned char) peek)
+ || (peek >= 'A' && peek <= 'Z'))
+ RETURN_IF_ERROR (demangle_number (dm, &seq_id, 36, 0));
+ else
+ {
+ const char *new_last_source_name = NULL;
+
+ switch (peek)
+ {
+ case 't':
+ RETURN_IF_ERROR (result_add (dm, "std"));
+ break;
+
+ case 'a':
+ RETURN_IF_ERROR (result_add (dm, "std::allocator"));
+ new_last_source_name = "allocator";
+ *template_p = 1;
+ break;
+
+ case 'b':
+ RETURN_IF_ERROR (result_add (dm, "std::basic_string"));
+ new_last_source_name = "basic_string";
+ *template_p = 1;
+ break;
+
+ case 's':
+ if (!flag_verbose)
+ {
+ RETURN_IF_ERROR (result_add (dm, "std::string"));
+ new_last_source_name = "string";
+ }
+ else
+ {
+ RETURN_IF_ERROR (result_add (dm, "std::basic_string<char, std::char_traits<char>, std::allocator<char> >"));
+ new_last_source_name = "basic_string";
+ }
+ *template_p = 0;
+ break;
+
+ case 'i':
+ if (!flag_verbose)
+ {
+ RETURN_IF_ERROR (result_add (dm, "std::istream"));
+ new_last_source_name = "istream";
+ }
+ else
+ {
+ RETURN_IF_ERROR (result_add (dm, "std::basic_istream<char, std::char_traints<char> >"));
+ new_last_source_name = "basic_istream";
+ }
+ *template_p = 0;
+ break;
+
+ case 'o':
+ if (!flag_verbose)
+ {
+ RETURN_IF_ERROR (result_add (dm, "std::ostream"));
+ new_last_source_name = "ostream";
+ }
+ else
+ {
+ RETURN_IF_ERROR (result_add (dm, "std::basic_ostream<char, std::char_traits<char> >"));
+ new_last_source_name = "basic_ostream";
+ }
+ *template_p = 0;
+ break;
+
+ case 'd':
+ if (!flag_verbose)
+ {
+ RETURN_IF_ERROR (result_add (dm, "std::iostream"));
+ new_last_source_name = "iostream";
+ }
+ else
+ {
+ RETURN_IF_ERROR (result_add (dm, "std::basic_iostream<char, std::char_traits<char> >"));
+ new_last_source_name = "basic_iostream";
+ }
+ *template_p = 0;
+ break;
+
+ default:
+ return "Unrecognized <substitution>.";
+ }
+
+ /* Consume the character we just processed. */
+ advance_char (dm);
+
+ if (new_last_source_name != NULL)
+ {
+ if (!dyn_string_copy_cstr (dm->last_source_name,
+ new_last_source_name))
+ return STATUS_ALLOCATION_FAILED;
+ }
+
+ return STATUS_OK;
+ }
+
+ /* Look up the substitution text. Since `S_' is the most recent
+ substitution, `S0_' is the second-most-recent, etc., shift the
+ numbering by one. */
+ text = substitution_get (dm, seq_id + 1, template_p);
+ if (text == NULL)
+ return "Substitution number out of range.";
+
+ /* Emit the substitution text. */
+ RETURN_IF_ERROR (result_add_string (dm, text));
+
+ RETURN_IF_ERROR (demangle_char (dm, '_'));
+ return STATUS_OK;
+}
+
+/* Demangles and emits a <local-name>.
+
+ <local-name> := Z <function encoding> E <entity name> [<discriminator>]
+ := Z <function encoding> E s [<discriminator>] */
+
+static status_t
+demangle_local_name (dm)
+ demangling_t dm;
+{
+ DEMANGLE_TRACE ("local-name", dm);
+
+ RETURN_IF_ERROR (demangle_char (dm, 'Z'));
+ RETURN_IF_ERROR (demangle_encoding (dm));
+ RETURN_IF_ERROR (demangle_char (dm, 'E'));
+ RETURN_IF_ERROR (result_add (dm, "::"));
+
+ if (peek_char (dm) == 's')
+ {
+ /* Local character string literal. */
+ RETURN_IF_ERROR (result_add (dm, "string literal"));
+ /* Consume the s. */
+ advance_char (dm);
+ RETURN_IF_ERROR (demangle_discriminator (dm, 0));
+ }
+ else
+ {
+ int unused;
+ /* Local name for some other entity. Demangle its name. */
+ RETURN_IF_ERROR (demangle_name (dm, &unused));
+ RETURN_IF_ERROR (demangle_discriminator (dm, 1));
+ }
+
+ return STATUS_OK;
+ }
+
+ /* Optimonally demangles and emits a <discriminator>. If there is no
+ <discriminator> at the current position in the mangled string, the
+ descriminator is assumed to be zero. Emit the discriminator number
+ in parentheses, unless SUPPRESS_FIRST is non-zero and the
+ discriminator is zero.
+
+ <discriminator> ::= _ <number> */
+
+static status_t
+demangle_discriminator (dm, suppress_first)
+ demangling_t dm;
+ int suppress_first;
+{
+ /* Output for <discriminator>s to the demangled name is completely
+ suppressed if not in verbose mode. */
+
+ if (peek_char (dm) == '_')
+ {
+ /* Consume the underscore. */
+ advance_char (dm);
+ if (flag_verbose)
+ RETURN_IF_ERROR (result_add (dm, " [#"));
+ /* Check if there's a number following the underscore. */
+ if (IS_DIGIT ((unsigned char) peek_char (dm)))
+ {
+ int discriminator;
+ /* Demangle the number. */
+ RETURN_IF_ERROR (demangle_number (dm, &discriminator, 10, 0));
+ if (flag_verbose)
+ /* Write the discriminator. The mangled number is two
+ less than the discriminator ordinal, counting from
+ zero. */
+ RETURN_IF_ERROR (int_to_dyn_string (discriminator + 1,
+ (dyn_string_t) dm->result));
+ }
+ else
+ return STATUS_ERROR;
+ if (flag_verbose)
+ RETURN_IF_ERROR (result_add_char (dm, ']'));
+ }
+ else if (!suppress_first)
+ {
+ if (flag_verbose)
+ RETURN_IF_ERROR (result_add (dm, " [#0]"));
+ }
+
+ return STATUS_OK;
+}
+
+/* Demangle NAME into RESULT, which must be an initialized
+ dyn_string_t. On success, returns STATUS_OK. On failure, returns
+ an error message, and the contents of RESULT are unchanged. */
+
+static status_t
+cp_demangle (name, result, style)
+ const char *name;
+ dyn_string_t result;
+ int style;
+{
+ status_t status;
+ int length = strlen (name);
+
+ if (length > 2 && name[0] == '_' && name[1] == 'Z')
+ {
+ demangling_t dm = demangling_new (name, style);
+ if (dm == NULL)
+ return STATUS_ALLOCATION_FAILED;
+
+ status = result_push (dm);
+ if (status != STATUS_OK)
+ {
+ demangling_delete (dm);
+ return status;
+ }
+
+ status = demangle_mangled_name (dm);
+ if (STATUS_NO_ERROR (status))
+ {
+ dyn_string_t demangled = (dyn_string_t) result_pop (dm);
+ if (!dyn_string_copy (result, demangled))
+ return STATUS_ALLOCATION_FAILED;
+ dyn_string_delete (demangled);
+ }
+
+ demangling_delete (dm);
+ }
+ else
+ {
+ /* It's evidently not a mangled C++ name. It could be the name
+ of something with C linkage, though, so just copy NAME into
+ RESULT. */
+ if (!dyn_string_copy_cstr (result, name))
+ return STATUS_ALLOCATION_FAILED;
+ status = STATUS_OK;
+ }
+
+ return status;
+}
+
+/* Demangle TYPE_NAME into RESULT, which must be an initialized
+ dyn_string_t. On success, returns STATUS_OK. On failiure, returns
+ an error message, and the contents of RESULT are unchanged. */
+
+static status_t
+cp_demangle_type (type_name, result)
+ const char* type_name;
+ dyn_string_t result;
+{
+ status_t status;
+ demangling_t dm = demangling_new (type_name, DMGL_GNU_V3);
+
+ if (dm == NULL)
+ return STATUS_ALLOCATION_FAILED;
+
+ /* Demangle the type name. The demangled name is stored in dm. */
+ status = result_push (dm);
+ if (status != STATUS_OK)
+ {
+ demangling_delete (dm);
+ return status;
+ }
+
+ status = demangle_type (dm);
+
+ if (STATUS_NO_ERROR (status))
+ {
+ /* The demangling succeeded. Pop the result out of dm and copy
+ it into RESULT. */
+ dyn_string_t demangled = (dyn_string_t) result_pop (dm);
+ if (!dyn_string_copy (result, demangled))
+ return STATUS_ALLOCATION_FAILED;
+ dyn_string_delete (demangled);
+ }
+
+ /* Clean up. */
+ demangling_delete (dm);
+
+ return status;
+}
+
+#if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
+extern char *__cxa_demangle PARAMS ((const char *, char *, size_t *, int *));
+
+/* ia64 ABI-mandated entry point in the C++ runtime library for performing
+ demangling. MANGLED_NAME is a NUL-terminated character string
+ containing the name to be demangled.
+
+ OUTPUT_BUFFER is a region of memory, allocated with malloc, of
+ *LENGTH bytes, into which the demangled name is stored. If
+ OUTPUT_BUFFER is not long enough, it is expanded using realloc.
+ OUTPUT_BUFFER may instead be NULL; in that case, the demangled name
+ is placed in a region of memory allocated with malloc.
+
+ If LENGTH is non-NULL, the length of the buffer conaining the
+ demangled name, is placed in *LENGTH.
+
+ The return value is a pointer to the start of the NUL-terminated
+ demangled name, or NULL if the demangling fails. The caller is
+ responsible for deallocating this memory using free.
+
+ *STATUS is set to one of the following values:
+ 0: The demangling operation succeeded.
+ -1: A memory allocation failiure occurred.
+ -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules.
+ -3: One of the arguments is invalid.
+
+ The demagling is performed using the C++ ABI mangling rules, with
+ GNU extensions. */
+
+char *
+__cxa_demangle (mangled_name, output_buffer, length, status)
+ const char *mangled_name;
+ char *output_buffer;
+ size_t *length;
+ int *status;
+{
+ struct dyn_string demangled_name;
+ status_t result;
+
+ if (status == NULL)
+ return NULL;
+
+ if (mangled_name == NULL) {
+ *status = -3;
+ return NULL;
+ }
+
+ /* Did the caller provide a buffer for the demangled name? */
+ if (output_buffer == NULL) {
+ /* No; dyn_string will malloc a buffer for us. */
+ if (!dyn_string_init (&demangled_name, 0))
+ {
+ *status = -1;
+ return NULL;
+ }
+ }
+ else {
+ /* Yes. Check that the length was provided. */
+ if (length == NULL) {
+ *status = -3;
+ return NULL;
+ }
+ /* Install the buffer into a dyn_string. */
+ demangled_name.allocated = *length;
+ demangled_name.length = 0;
+ demangled_name.s = output_buffer;
+ }
+
+ if (mangled_name[0] == '_' && mangled_name[1] == 'Z')
+ /* MANGLED_NAME apprears to be a function or variable name.
+ Demangle it accordingly. */
+ result = cp_demangle (mangled_name, &demangled_name, 0);
+ else
+ /* Try to demangled MANGLED_NAME as the name of a type. */
+ result = cp_demangle_type (mangled_name, &demangled_name);
+
+ if (result == STATUS_OK)
+ /* The demangling succeeded. */
+ {
+ /* If LENGTH isn't NULL, store the allocated buffer length
+ there; the buffer may have been realloced by dyn_string
+ functions. */
+ if (length != NULL)
+ *length = demangled_name.allocated;
+ /* The operation was a success. */
+ *status = 0;
+ return dyn_string_buf (&demangled_name);
+ }
+ else if (result == STATUS_ALLOCATION_FAILED)
+ /* A call to malloc or realloc failed during the demangling
+ operation. */
+ {
+ *status = -1;
+ return NULL;
+ }
+ else
+ /* The demangling failed for another reason, most probably because
+ MANGLED_NAME isn't a valid mangled name. */
+ {
+ /* If the buffer containing the demangled name wasn't provided
+ by the caller, free it. */
+ if (output_buffer == NULL)
+ free (dyn_string_buf (&demangled_name));
+ *status = -2;
+ return NULL;
+ }
+}
+
+#else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */
+
+/* Variant entry point for integration with the existing cplus-dem
+ demangler. Attempts to demangle MANGLED. If the demangling
+ succeeds, returns a buffer, allocated with malloc, containing the
+ demangled name. The caller must deallocate the buffer using free.
+ If the demangling failes, returns NULL. */
+
+char *
+cplus_demangle_v3 (mangled, options)
+ const char* mangled;
+ int options;
+{
+ dyn_string_t demangled;
+ status_t status;
+ int type = !!(options & DMGL_TYPES);
+
+ if (mangled[0] == '_' && mangled[1] == 'Z')
+ /* It is not a type. */
+ type = 0;
+ else
+ {
+ /* It is a type. Stop if we don't want to demangle types. */
+ if (!type)
+ return NULL;
+ }
+
+ flag_verbose = !!(options & DMGL_VERBOSE);
+
+ /* Create a dyn_string to hold the demangled name. */
+ demangled = dyn_string_new (0);
+ /* Attempt the demangling. */
+ if (!type)
+ /* Appears to be a function or variable name. */
+ status = cp_demangle (mangled, demangled, 0);
+ else
+ /* Try to demangle it as the name of a type. */
+ status = cp_demangle_type (mangled, demangled);
+
+ if (STATUS_NO_ERROR (status))
+ /* Demangling succeeded. */
+ {
+ /* Grab the demangled result from the dyn_string. It was
+ allocated with malloc, so we can return it directly. */
+ char *return_value = dyn_string_release (demangled);
+ /* Hand back the demangled name. */
+ return return_value;
+ }
+ else if (status == STATUS_ALLOCATION_FAILED)
+ {
+ fprintf (stderr, "Memory allocation failed.\n");
+ abort ();
+ }
+ else
+ /* Demangling failed. */
+ {
+ dyn_string_delete (demangled);
+ return NULL;
+ }
+}
+
+/* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling
+ conventions, but the output formatting is a little different.
+ This instructs the C++ demangler not to emit pointer characters ("*"), and
+ to use Java's namespace separator symbol ("." instead of "::"). It then
+ does an additional pass over the demangled output to replace instances
+ of JArray<TYPE> with TYPE[]. */
+
+char *
+java_demangle_v3 (mangled)
+ const char* mangled;
+{
+ dyn_string_t demangled;
+ char *next;
+ char *end;
+ int len;
+ status_t status;
+ int nesting = 0;
+ char *cplus_demangled;
+ char *return_value;
+
+ /* Create a dyn_string to hold the demangled name. */
+ demangled = dyn_string_new (0);
+
+ /* Attempt the demangling. */
+ status = cp_demangle ((char *) mangled, demangled, DMGL_JAVA);
+
+ if (STATUS_NO_ERROR (status))
+ /* Demangling succeeded. */
+ {
+ /* Grab the demangled result from the dyn_string. */
+ cplus_demangled = dyn_string_release (demangled);
+ }
+ else if (status == STATUS_ALLOCATION_FAILED)
+ {
+ fprintf (stderr, "Memory allocation failed.\n");
+ abort ();
+ }
+ else
+ /* Demangling failed. */
+ {
+ dyn_string_delete (demangled);
+ return NULL;
+ }
+
+ len = strlen (cplus_demangled);
+ next = cplus_demangled;
+ end = next + len;
+ demangled = NULL;
+
+ /* Replace occurances of JArray<TYPE> with TYPE[]. */
+ while (next < end)
+ {
+ char *open_str = strstr (next, "JArray<");
+ char *close_str = NULL;
+ if (nesting > 0)
+ close_str = strchr (next, '>');
+
+ if (open_str != NULL && (close_str == NULL || close_str > open_str))
+ {
+ ++nesting;
+
+ if (!demangled)
+ demangled = dyn_string_new(len);
+
+ /* Copy prepending symbols, if any. */
+ if (open_str > next)
+ {
+ open_str[0] = 0;
+ dyn_string_append_cstr (demangled, next);
+ }
+ next = open_str + 7;
+ }
+ else if (close_str != NULL)
+ {
+ --nesting;
+
+ /* Copy prepending type symbol, if any. Squash any spurious
+ whitespace. */
+ if (close_str > next && next[0] != ' ')
+ {
+ close_str[0] = 0;
+ dyn_string_append_cstr (demangled, next);
+ }
+ dyn_string_append_cstr (demangled, "[]");
+ next = close_str + 1;
+ }
+ else
+ {
+ /* There are no more arrays. Copy the rest of the symbol, or
+ simply return the original symbol if no changes were made. */
+ if (next == cplus_demangled)
+ return cplus_demangled;
+
+ dyn_string_append_cstr (demangled, next);
+ next = end;
+ }
+ }
+
+ free (cplus_demangled);
+
+ if (demangled)
+ return_value = dyn_string_release (demangled);
+ else
+ return_value = NULL;
+
+ return return_value;
+}
+
+#endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
+
+
+/* Demangle NAME in the G++ V3 ABI demangling style, and return either
+ zero, indicating that some error occurred, or a demangling_t
+ holding the results. */
+static demangling_t
+demangle_v3_with_details (name)
+ const char *name;
+{
+ demangling_t dm;
+ status_t status;
+
+ if (strncmp (name, "_Z", 2))
+ return 0;
+
+ dm = demangling_new (name, DMGL_GNU_V3);
+ if (dm == NULL)
+ {
+ fprintf (stderr, "Memory allocation failed.\n");
+ abort ();
+ }
+
+ status = result_push (dm);
+ if (! STATUS_NO_ERROR (status))
+ {
+ demangling_delete (dm);
+ fprintf (stderr, "%s\n", status);
+ abort ();
+ }
+
+ status = demangle_mangled_name (dm);
+ if (STATUS_NO_ERROR (status))
+ return dm;
+
+ demangling_delete (dm);
+ return 0;
+}
+
+
+#ifndef IN_GLIBCPP_V3
+/* Return non-zero iff NAME is the mangled form of a constructor name
+ in the G++ V3 ABI demangling style. Specifically, return:
+ - '1' if NAME is a complete object constructor,
+ - '2' if NAME is a base object constructor, or
+ - '3' if NAME is a complete object allocating constructor. */
+enum gnu_v3_ctor_kinds
+is_gnu_v3_mangled_ctor (name)
+ const char *name;
+{
+ demangling_t dm = demangle_v3_with_details (name);
+
+ if (dm)
+ {
+ enum gnu_v3_ctor_kinds result = dm->is_constructor;
+ demangling_delete (dm);
+ return result;
+ }
+ else
+ return 0;
+}
+
+
+/* Return non-zero iff NAME is the mangled form of a destructor name
+ in the G++ V3 ABI demangling style. Specifically, return:
+ - '0' if NAME is a deleting destructor,
+ - '1' if NAME is a complete object destructor, or
+ - '2' if NAME is a base object destructor. */
+enum gnu_v3_dtor_kinds
+is_gnu_v3_mangled_dtor (name)
+ const char *name;
+{
+ demangling_t dm = demangle_v3_with_details (name);
+
+ if (dm)
+ {
+ enum gnu_v3_dtor_kinds result = dm->is_destructor;
+ demangling_delete (dm);
+ return result;
+ }
+ else
+ return 0;
+}
+#endif /* IN_GLIBCPP_V3 */
+
+
+#ifdef STANDALONE_DEMANGLER
+
+#include "getopt.h"
+
+static void print_usage
+ PARAMS ((FILE* fp, int exit_value));
+
+/* Non-zero if CHAR is a character than can occur in a mangled name. */
+#define is_mangled_char(CHAR) \
+ (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \
+ || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$')
+
+/* The name of this program, as invoked. */
+const char* program_name;
+
+/* Prints usage summary to FP and then exits with EXIT_VALUE. */
+
+static void
+print_usage (fp, exit_value)
+ FILE* fp;
+ int exit_value;
+{
+ fprintf (fp, "Usage: %s [options] [names ...]\n", program_name);
+ fprintf (fp, "Options:\n");
+ fprintf (fp, " -h,--help Display this message.\n");
+ fprintf (fp, " -s,--strict Demangle standard names only.\n");
+ fprintf (fp, " -v,--verbose Produce verbose demanglings.\n");
+ fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n");
+
+ exit (exit_value);
+}
+
+/* Option specification for getopt_long. */
+static const struct option long_options[] =
+{
+ { "help", no_argument, NULL, 'h' },
+ { "strict", no_argument, NULL, 's' },
+ { "verbose", no_argument, NULL, 'v' },
+ { NULL, no_argument, NULL, 0 },
+};
+
+/* Main entry for a demangling filter executable. It will demangle
+ its command line arguments, if any. If none are provided, it will
+ filter stdin to stdout, replacing any recognized mangled C++ names
+ with their demangled equivalents. */
+
+int
+main (argc, argv)
+ int argc;
+ char *argv[];
+{
+ status_t status;
+ int i;
+ int opt_char;
+
+ /* Use the program name of this program, as invoked. */
+ program_name = argv[0];
+
+ /* Parse options. */
+ do
+ {
+ opt_char = getopt_long (argc, argv, "hsv", long_options, NULL);
+ switch (opt_char)
+ {
+ case '?': /* Unrecognized option. */
+ print_usage (stderr, 1);
+ break;
+
+ case 'h':
+ print_usage (stdout, 0);
+ break;
+
+ case 's':
+ flag_strict = 1;
+ break;
+
+ case 'v':
+ flag_verbose = 1;
+ break;
+ }
+ }
+ while (opt_char != -1);
+
+ if (optind == argc)
+ /* No command line arguments were provided. Filter stdin. */
+ {
+ dyn_string_t mangled = dyn_string_new (3);
+ dyn_string_t demangled = dyn_string_new (0);
+ status_t status;
+
+ /* Read all of input. */
+ while (!feof (stdin))
+ {
+ char c = getchar ();
+
+ /* The first character of a mangled name is an underscore. */
+ if (feof (stdin))
+ break;
+ if (c != '_')
+ {
+ /* It's not a mangled name. Print the character and go
+ on. */
+ putchar (c);
+ continue;
+ }
+ c = getchar ();
+
+ /* The second character of a mangled name is a capital `Z'. */
+ if (feof (stdin))
+ break;
+ if (c != 'Z')
+ {
+ /* It's not a mangled name. Print the previous
+ underscore, the `Z', and go on. */
+ putchar ('_');
+ putchar (c);
+ continue;
+ }
+
+ /* Start keeping track of the candidate mangled name. */
+ dyn_string_append_char (mangled, '_');
+ dyn_string_append_char (mangled, 'Z');
+
+ /* Pile characters into mangled until we hit one that can't
+ occur in a mangled name. */
+ c = getchar ();
+ while (!feof (stdin) && is_mangled_char (c))
+ {
+ dyn_string_append_char (mangled, c);
+ if (feof (stdin))
+ break;
+ c = getchar ();
+ }
+
+ /* Attempt to demangle the name. */
+ status = cp_demangle (dyn_string_buf (mangled), demangled, 0);
+
+ /* If the demangling succeeded, great! Print out the
+ demangled version. */
+ if (STATUS_NO_ERROR (status))
+ fputs (dyn_string_buf (demangled), stdout);
+ /* Abort on allocation failures. */
+ else if (status == STATUS_ALLOCATION_FAILED)
+ {
+ fprintf (stderr, "Memory allocation failed.\n");
+ abort ();
+ }
+ /* Otherwise, it might not have been a mangled name. Just
+ print out the original text. */
+ else
+ fputs (dyn_string_buf (mangled), stdout);
+
+ /* If we haven't hit EOF yet, we've read one character that
+ can't occur in a mangled name, so print it out. */
+ if (!feof (stdin))
+ putchar (c);
+
+ /* Clear the candidate mangled name, to start afresh next
+ time we hit a `_Z'. */
+ dyn_string_clear (mangled);
+ }
+
+ dyn_string_delete (mangled);
+ dyn_string_delete (demangled);
+ }
+ else
+ /* Demangle command line arguments. */
+ {
+ dyn_string_t result = dyn_string_new (0);
+
+ /* Loop over command line arguments. */
+ for (i = optind; i < argc; ++i)
+ {
+ /* Attempt to demangle. */
+ status = cp_demangle (argv[i], result, 0);
+
+ /* If it worked, print the demangled name. */
+ if (STATUS_NO_ERROR (status))
+ printf ("%s\n", dyn_string_buf (result));
+ /* Abort on allocaiton failures. */
+ else if (status == STATUS_ALLOCATION_FAILED)
+ {
+ fprintf (stderr, "Memory allocation failed.\n");
+ abort ();
+ }
+ /* If not, print the error message to stderr instead. */
+ else
+ fprintf (stderr, "%s\n", status);
+ }
+ dyn_string_delete (result);
+ }
+
+ return 0;
+}
+
+#endif /* STANDALONE_DEMANGLER */
diff --git a/contrib/gcc/cp/ChangeLog b/contrib/gcc/cp/ChangeLog
index 63c8747..b2b71e9 100644
--- a/contrib/gcc/cp/ChangeLog
+++ b/contrib/gcc/cp/ChangeLog
@@ -1,5 +1,709 @@
+2002-05-03 Jason Merrill <jason@redhat.com>
+
+ * decl.c (BOOL_TYPE_SIZE): Move default to defaults.h.
+
+2002-05-02 Mark Mitchell <mark@codesourcery.com>
+
+ * init.c (perform_base_cleanups): Correct order of base class
+ cleanups.
+
+2002-05-01 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/6527
+ * init.c (perform_base_cleanups): Emit cleanups in reverse order
+ of construction.
+
+2002-05-01 Gabriel Dos Reis <gdr@codesourcery.com>
+
+ * error.c (dump_type): Be careful about implicit typenames.
+
+2002-04-30 Mark Mitchell <mark@codesourcery.com>
+
+ ABI change, returning simple classes from functions.
+ * class.c (finish_struct_bits): Only mark TREE_ADDRESSABLE if
+ TYPE_HAS_TRIVIAL_INIT_REF is false or
+ TYPE_HAS_NONTRIVIAL_DESTRUCTOR is true.
+
+2002-04-30 Jason Merrill <jason@redhat.com>
+
+ * decl.c (grokdeclarator): Don't override TYPE_NAME of an
+ anonymous class with a typedef if there are attributes.
+
+2002-04-29 Paul Eggert <eggert@twinsun.com>
+
+ * parse.y (nomods_initdcl0): Replace $<ttype>3 with $<ttype>$.
+
+2002-04-29 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/6477
+ * decl.c (follow_tag_typedef): Check if TYPE_NAME (original) is
+ non-NULL first.
+
+2002-04-29 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/6492
+ * pt.c (tsubst_friend_class): If the friend has an explicit scope,
+ enter that scope before name lookup.
+
+ PR c++/6486
+ * method.c (do_build_copy_constructor): Avoid building
+ cv-qualified reference types.
+
+2002-04-29 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/5719
+ * decl.c (grok_op_properties): Assignment ops don't have to return
+ by value. operator% should.
+
+2002-04-28 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ PR c/6343
+ * decl.c (duplicate_decls): Call merge_weak.
+
+2002-04-26 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/6479
+ * method.c (do_build_assign_ref): Pass a derivation to
+ build_method_call when calling base class assignment operators.
+
+2002-04-24 Mark Mitchell <mark@codesourcery.com>
+
+ * mangle.c (write_type): Don't use TYPE_MAIN_VARIANT when writing
+ out an array type.
+ (write_CV_qualifiers_for_type): Use TYPE_QUALS, not cp_type_quals,
+ to determine qualifiers.
+
+ * cvt.c (convert_to_void): Don't unconditionally make COND_EXPRs
+ void.
+
+2002-04-24 Jason Merrill <jason@redhat.com>
+
+ PR c++/6331
+ * method.c (do_build_copy_constructor): Use cp_build_qualified_type.
+ * typeck.c (build_modify_expr): Allow arrays to differ in cv-quals.
+ The pedwarn for array assignment is now unconditional.
+ * tree.c (build_cplus_array_type_1): Still process simple array types
+ normally in templates.
+
+ PR c++/6395
+ * decl.c (make_rtl_for_nonlocal_decl): Don't mess with #pragma i/i
+ stuff for comdats.
+
+2002-04-23 Jason Merrill <jason@redhat.com>
+
+ PR c++/5504 - but re-breaks c++/411
+ * init.c (push_base_cleanups): Rename to perform_base_cleanups.
+ Expand base cleanups now rather than pushing them.
+ * decl.c (begin_destructor_body): Don't call push_base_cleanups.
+ (finish_destructor_body): Call perform_base_cleanups.
+ * cp-tree.h: Adjust prototype.
+
+2002-04-23 Jakub Jelinek <jakub@redhat.com>
+
+ * parse.y (check_class_key): Allow KEY to be union/enum/struct/class
+ node with attributes.
+
+2002-2-23 David O'Brien <obrien@FreeBSD.org>
+
+ * g++spec.c (MATH_LIBRARY_PROFILE, LIBSTDCXX_PROFILE): Add.
+ Use MATH_LIBRARY_PROFILE and LIBSTDCXX_PROFILE if profile flag given.
+
+2002-04-23 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/6256:
+ * pt.c (tsubst_friend_class): Handle templates with explicit
+ nested names.
+
+ PR c++/6331:
+ * typeck.c (merge_types): Remember the cv-qualification of pointer
+ types when merging them.
+
+2002-04-18 Jason Merrill <jason@redhat.com>
+
+ PR c++/5658
+ * search.c (setup_class_bindings): A class template qualifies as a
+ type binding.
+
+2002-04-17 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/6316
+ * decl2.c (finish_file): Clear DECL_EXTERNAL in a separate loop
+ before expanding.
+
+2002-04-16 Mark Mitchell <mark@codesourcery.com>
+
+ * init.c (begin_init_stmts): Remove commented out code.
+ (finish_init_stmts): Set STMT_EXPR_NO_SCOPE.
+ * semantics.c (begin_gobal_stmt_expr): Adjust call to
+ expand_start_stmt_expr.
+
+2002-04-15 Mark Mitchell <mark@codesourcery.com>
+
+ * decl.c (register_dtor_fn): Pass the address of dso_handle, not
+ dso_handle itself, to __cxa_atexit.
+
+2002-04-14 Jakub Jelinek <jakub@redhat.com>
+
+ * class.c (layout_virtual_bases): Do all dsize computation on trees.
+
+2002-04-12 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/5373.
+ * semantics.c (finish_expr_stmt): Remember the type of the
+ expression before any conversions are performed.
+
+ PR c++/5189.
+ * call.c (add_template_candidate_real): Do not treat member
+ templates as copy constructors.
+
+ * decl.c (duplicate_decls): Do not copy the RTL for a variable
+ declaration if the old variable had an incomplete type and the new
+ variable does not.
+ (complete_vars): Do not call layout_decl for completed variables.
+
+2002-04-11 Andrew Haley <aph@redhat.com>
+
+ * typeck.c (type_after_usual_arithmetic_conversions):
+ If two types have the same variant, return immediately.
+ When two floating-point operands are the same precision:
+ convert to float if one of the operands is float;
+ if neither operand is one of the standard types, return the type
+ of the first operand.
+
+2002-04-12 Richard Sandiford <rsandifo@redhat.com>
+
+ * decl.c (duplicate_decls): Don't try to unify an implicit typedef
+ with an explicit one.
+ (follow_tag_typedef): New.
+ (lookup_tag): Use it to extract the tag of an explicit typedef.
+ (xref_tag): Likewise.
+
+2002-04-10 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/5507
+ * decl.c (make_typename_type): Remove implicit typenameness.
+
+2002-04-09 Jason Merrill <jason@redhat.com>
+
+ PR optimization/6189
+ * semantics.c (genrtl_start_function): Don't free
+ DECL_SAVED_FUNCTION_DATA for inline functions.
+
+2002-04-08 Paolo Carlini <pcarlini@unitus.it>
+
+ * parse.y (namespace_qualifier, maybe_identifier,
+ begin_explicit_instantiation, end_explicit_instantiation,
+ apparent_template_type, .finish_template_type,
+ do_id, maybe_init, defarg_again, component_decl_1):
+ Add ending ';', in accordance with POSIX.
+
+2002-04-06 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/5571
+ * class.c (layout_class_type): Remember incomplete static
+ variables.
+ (finish_struct_1): Call complete_vars, not
+ hack_incomplete_structures.
+ * cp-tree.h (hack_incomplete_structures): Rename to ...
+ (complete_vars): ... this.
+ (struct saved_scope): Remove incomplete.
+ (namespace_scope_incomplete): Remove.
+ * decl.c (struct binding_level): Remove incomplete.
+ (incomplete_vars): New variable.
+ (mark_binding_level): Don't mark incomplete.
+ (print_binding_level): Don't print it.
+ (mark_saved_scope): Don't mark incomplete.
+ (pushdecl): Use maybe_register_incopmlete_var.
+ (cxx_init_decl_processing): Register incomplete_vars for GC.
+ (start_decl_1): Clarify error message.
+ (hack_incomplete_vars): Remove.
+ (maybe_register_incomplete_var): New function.
+ (complete_vars): Likewise.
+
+2002-04-06 Jason Merrill <jason@redhat.com>
+
+ PR c++/4934
+ * error.c (dump_expr) [CONVERT_EXPR]: Make sure TREE_TYPE (t) is
+ set before checking it.
+
+ PR c++/6179
+ * method.c (implicitly_declare_fn): Pass unqualified type to
+ synthesize_exception_spec.
+
+2002-04-03 Jason Merrill <jason@redhat.com>
+
+ PR c++/525
+ * init.c (build_member_call): Convert to intermediate base even
+ with -pedantic.
+
+ PR c++/5636
+ * semantics.c (nullify_returns_r): Just set CLEANUP_EH_ONLY on
+ cleanup for nrv.
+
+ PR c++/5104
+ * typeck.c (comptypes) [FUNCTION_TYPE]: Don't compare exception
+ specifiers.
+ [METHOD_TYPE]: Use same code as FUNCTION_TYPE.
+
+2002-04-03 Roger Sayle <roger@eyesopen.com>
+
+ PR c++/5998:
+ * decl.c (duplicate_decls): Don't mess with assembler names when
+ redeclaring builtin functions as static.
+
+2002-04-01 Roger Sayle <roger@eyesopen.com>
+
+ PR c++/5998:
+ * decl.c (duplicate_decls): Overwrite the RTL when (and only
+ when) overwriting a built-in function. Don't use COPY_DECL_RTL,
+ but follow the SET_DECL_RTL idiom used elsewhere in the function.
+
+2002-03-28 Roger Sayle <roger@eyesopen.com>
+
+ PR c++/5998:
+ * decl.c (cxx_init_decl_processing): Re-enable built-in functions
+ in the g++ front-end.
+ (duplicate_decl): Allow redefinition of anticipated built-ins.
+ Fix inlining problem by over-writing the old DECL_RTL.
+ (lookup_namespace_name): Fail to find an identifier in the
+ specified namespace if its still anticipated.
+ (builtin_function_1): New function split out from builtin_function
+ to create a builtin in the current namespace with given context.
+ (builtin_function): Call builtin_function_1 to define the
+ appropriate builtins in both the std and global namespaces.
+ (select_decl): Don't test for anticipated decls here.
+ (unqualified_namespace_lookup): Instead ignore them whilst
+ searching through scopes and namespaces.
+ * decl2.c (do_nonmember_using_decl): If a using declaration
+ specifies an anticipated built-in function, mark it as no longer
+ anticipated in that scope.
+ (ambiguous_decl): Avoid resolving to an anticipated decl.
+ * lex.c (do_scoped_id): Fail to find an identifier in the global
+ namespace if its still anticipated.
+
+2002-03-29 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/6073
+ * class.c (finish_struct_1): Update static field's DECL_MODE even
+ if its type is a variant of t.
+
+2002-03-27 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/4884
+ * call.c (build_op_delete_call): Allow for the fact the placement
+ may be a COMPOUND_EXPR.
+
+2002-03-26 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/5682
+ * cp-tree.h (BINFO_PRIMARY_P): Explain meaning better.
+ (dfs_skip_nonprimary_vbases_unmarkedp): Remove.
+ (dfs_skip_nonprimary_vbases_markedp): Remove.
+ * search.c (get_shared_vbase_if_not_primary): Remove.
+ (dfs_skip_nonprimary_vbases_unmarkedp): Remove.
+ (dfs_skip_nonprimary_vbases_markedp): Remove.
+ (dfs_unmarked_real_bases_queue_p): Just get the canonical binfo.
+ (dfs_marked_real_bases_queue_p): Likewise.
+
+2002-03-26 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/4884
+ * init.c (build_new_1): Allow for the fact the result of
+ build_function_call may be a COMPOUND_EXPR.
+
+2002-03-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/6037
+ * decl.c (start_enum): Don't set TREE_ADDRESSABLE on TREE_LIST node.
+
+2002-03-22 Jeff Knaggs <jknaggs@redhat.com>
+
+ * typeck.c (expand_ptrmemfunc_cst): Scale idx down to an index
+ into the vtable_entry array regardless of
+ TARGET_PTRMEMFUNC_VBIT_LOCATION.
+
+2002-03-21 Aldy Hernandez <aldyh@redhat.com>
+
+ * tree.c (cp_cannot_inline_tree_fn): Same.
+
+2002-03-20 Jason Merrill <jason@redhat.com>
+
+ PR c++/2136
+ * init.c (build_delete): Check access for a member op delete here.
+ * decl2.c (delete_sanity): Not here.
+
+2002-03-19 Jason Merrill <jason@redhat.com>
+
+ PR c++/5118
+ * class.c (get_vfield_name): Use the constructor_name.
+
+2002-03-18 Eric Botcazou <ebotcazou@multimania.com>
+
+ PR c++/3882
+ * pt.c (tsubst_decl): Move __PRETTY_FUNCTION__ handling...
+ (tsubst_expr) [DECL_STMT]: ...here. And substitute the initializer
+ only after recording the declaration.
+
+2002-03-18 Ashif Harji <asharji@uwaterloo.ca>
+
+ * lang-specs.h (compiler default_compilers): Add
+ -no-integrated-cpp flag to invoke an external cpp.
+
+2002-03-18 Jason Merrill <jason@redhat.com>
+
+ PR c++/2039
+ * init.c (resolve_offset_ref): Hand off to build_component_ref.
+
+ PR c++/4222, c++/5995
+ * call.c (build_over_call): Fix empty class logic.
+
+ PR c++/3870
+ * cp-tree.h (struct saved_scope): Add last_parms field.
+ * decl.c (maybe_push_to_top_level): Save last_function_parms.
+ (pop_from_top_level): Restore it.
+
+ PR c++/4377
+ * mangle.c (write_expression): Strip NOP_EXPRs sooner. Also strip
+ NON_LVALUE_EXPRs.
+
+ PR c++/4003
+ * pt.c (tsubst_friend_function): Use decl_namespace_context.
+
+ PR c++/3948 -- C++ ABI change, followup to 2001-12-18 patch.
+ * class.c (finish_struct_bits): Also set TREE_ADDRESSABLE for a
+ type with a nontrivial destructor.
+
+2002-03-17 Jason Merrill <jason@redhat.com>
+
+ PR c++/4460
+ * class.c (build_base_path): Virtual base layout is fixed in
+ in-charge [cd]tors.
+
+ PR c++/5757
+ * init.c (build_new_1): Pass the right pointer to op delete.
+
+2002-03-15 Richard Henderson <rth@redhat.com>
+
+ * init.c (build_new_1): Use size_binop instead of cp_build_binary_op.
+
+2002-03-15 Richard Henderson <rth@redhat.com>
+
+ * decl.c (finish_function): Reapply accidentally reverted
+ 2002-02-28 patch.
+
+2002-03-15 Mark Mitchell <mark@codesourcery.com>
+
+ * cp-tree.h (CLEANUP_DECL): Remove.
+ (CLEANUP_EXPR): Likewise.
+ * decl.c (destroy_local_var): Simplify.
+ (maybe_build_cleanup): Tidy.
+ * dump.c (cp_dump_tree): Remove handling of CLEANUP_STMT.
+ * semantics.c (cp_expand_stmt): Likewise.
+ * cp/tree.c (cp_statement_code_p): Likewise.
+
+2002-03-15 Richard Henderson <rth@redhat.com>
+
+ * decl.c: Include c-pragma.h.
+ (start_decl, start_function): Invoke maybe_apply_pragma_weak.
+ * Make-lang.in: Update dependencies.
+
+2002-03-15 Jason Merrill <jason@redhat.com>
+
+ PR c++/5857
+ * decl.c (duplicate_decls): Use merge_types instead of common_type.
+ * typeck.c (common_type): Just hand off to
+ type_after_usual_arithmetic_conversions and
+ composite_pointer_type.
+ (merge_types): New fn.
+ (commonparms): Use it instead of common_type.
+ (type_after_usual_arithmetic_conversions): Also handle COMPLEX_TYPE.
+ (composite_pointer_type): Also handle attributes.
+ * cp-tree.h: Declare merge_types.
+
+ * decl.c (make_rtl_for_nonlocal_decl): Also defer COMDAT
+ variables.
+ * decl2.c (maybe_make_one_only): Also mark the decl as needed.
+
+2002-03-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/5908
+ * call.c (build_over_call): Set TREE_NO_UNUSED_WARNING too.
+ * cvt.c (convert_to_void): Preserve TREE_NO_UNUSED_WARNING.
+
+2002-03-12 Richard Sandiford <rsandifo@redhat.com>
+
+ * mangle.c (write_builtin_type): Handle 128-bit integers even if
+ they are not a standard integer type.
+
+2002-03-12 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/5659
+ * decl.c (xref_tag): Don't set CLASSTYPE_DECLARED_CLASS here.
+ * decl2.c (handle_class_head): Set CLASSTYPE_DECLARED_CLASS for
+ definitions.
+
+2002-03-11 Nathan Sidwell <nathan@codesourcery.com>
+
+ Revert 2001-03-26 Nathan Sidwell <nathan@codesourcery.com>,
+ DR209 is now not a defect.
+ * cp-tree.h (skip_type_access_control): Remove.
+ * decl.c (grokdeclarator): Do type access control for friend
+ declarations.
+ * semantics.c (decl_type_access_control): Don't reset
+ current_type_lookups.
+ (save_type_access_control): Always save the lookups.
+ (skip_type_access_control): Remove.
+ (finish_class_definition): Don't change type_lookups.
+
+2002-03-11 Nathan Sidwell <nathan@codesourcery.com>
+
+ Revert 2000-12-01 Nathan Sidwell <nathan@codesourcery.com>,
+ It is incorrect.
+ * typeck.c (build_static_cast): Compare non-qualified types
+ with pointer to member conversions.
+
+2002-03-08 Craig Rodrigues <rodrigc@gcc.gnu.org>
+
+ * cp-tree.h (CLEAR_BINFO_MARKED): Make both parts of
+ conditional return void.
+
+2002-03-02 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/775
+ * decl.c (lookup_tag): Only reject enum/class mismatch, not
+ class/union mismatch.
+ * parse.y (check_class_key): New function.
+ (structsp): Call it.
+
+2002-03-01 Michael Matz <matz@suse.de>
+
+ * typeck.c (cp_pointer_int_sum): Complete inner type which is
+ used later by size_in_bytes().
+
+2002-03-01 Phil Edwards <pme@gcc.gnu.org>
+
+ * cp-tree.h (build_init): Remove prototype.
+
+2002-03-01 Phil Edwards <pme@gcc.gnu.org>
+
+ * cp-tree.h: Require __GNUC__ to be #defined.
+ (build_init): Add missing prototype.
+
+2002-02-28 Jason Merrill <jason@redhat.com>
+
+ * search.c (lookup_base_r): Don't clear is_non_public just because
+ we found a friendly scope.
+
+ * decl.c (finish_function): Only warn about missing return
+ statement with -Wreturn-type.
+
+2002-02-24 Craig Rodrigues <rodrigc@gcc.gnu.org>
+
+ PR c++/4093
+ * cp-tree.h (SET_BINFO_MARKED): Cast false part of condition
+ to void.
+
+2002-02-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR other/5746
+ * semantics.c (finish_switch_cond): Don't call get_unwidened
+ if error_mark_node.
+
+2002-02-22 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/2645, DR 295
+ * cp-tree.h (tsubst_flags_t): Add tf_ignore_bad_quals,
+ tf_keep_type_decl.
+ (make_typename_type): Use tsubst_flags_t.
+ * decl.c (make_typename_type): Adjust. Return non-artificial
+ TYPE_DECLs, if required.
+ (grokdeclarator): Simplify CVR qualification handling. Allow bad
+ qualifiers on typedef types.
+ * decl2.c (handle_class_head): Adjust make_typename_type call.
+ * parse.y (nested_name_specifier): Likewise.
+ (typename_sub0): Likewise.
+ (typename_sub1): Likewise.
+ * pt.c (convert_template_argument): Adjust make_typename_type
+ return value.
+ (tsubst): Adjust cp_build_qualified_type_real calls.
+ (check_cv_quals_for_unify): Cope with alowing bad qualifications
+ on template type parms.
+ (instantiate_decl): Recheck substitutions to give warnings on bad
+ qualifications.
+ * tree.c (cp_build_qualified_type_real): Use tf_allow_bad_quals.
+
+2002-02-21 Aldy Hernandez <aldyh@redhat.com>
+
+ * cp/decl.c (duplicate_decls): Merge always_inline attribute.
+
+ * cp/tree.c (cp_cannot_inline_tree_fn): Do not inline at -O0
+ unless DECL_ALWAYS_INLINE.
+
+2002-02-20 Jakub Jelinek <jakub@redhat.com>
+
+ * typeck.c (cp_pointer_int_sum): Renamed from
+ pointer_int_sum, call pointer_int_sum.
+
+2002-02-20 Jakub Jelinek <jakub@redhat.com>
+
+ * decl.c (duplicate_decls): Return 0 if issued error about
+ redeclaration.
+
+2002-02-19 Jason Merrill <jason@redhat.com>
+
+ ABI change: Mangle `void (A::*)() const' as
+ M1AKFvvE, not MK1AFvvE.
+ * mangle.c (write_function_type): Write cv-quals for member
+ function type here.
+ (write_pointer_to_member_type): Not here.
+
+2002-02-18 Jason Merrill <jason@redhat.com>
+
+ * pt.c (do_type_instantiation): Don't pedwarn if in_system_header.
+ (do_decl_instantiation): Likewise.
+
+2002-02-17 Craig Rodrigues <rodrigc@gcc.gnu.org>
+
+ PR c++/5685
+ * decl.c (duplicate_decls): Make warning unconditional
+ if duplicate default argument declarations are present.
+
+2002-02-17 Jakub Jelinek <jakub@redhat.com>
+
+ * typeck.c (build_binary_op) [BIT_XOR_EXPR]: Remove explicit
+ shortening.
+
+2002-02-15 Nathan Sidwell <nathan@codesourcery.com>
+
+ * decl.c (grokdeclarator): Set typedef_decl for all TYPE_DECLs,
+ remove incorrect comment. Move #if 0'd code to common path. Use
+ IMPLICIT_TYPENAME_P. Simplify & reformat ARRAY_TYPE duplication.
+
+2002-02-13 Jason Merrill <jason@redhat.com>
+
+ * decl.c (builtin_function): Set TREE_THIS_VOLATILE on return fns.
+ (finish_function): Don't warn if current_function_returns_null.
+
+ * typeck2.c (digest_init): Do handle values of vector type.
+
+ * typeck2.c (digest_init, process_init_constructor): Treat vectors
+ like arrays.
+
+2002-02-11 Jason Merrill <jason@redhat.com>
+
+ * parse.y (reserved_declspecs): Don't handle attributes.
+ (reserved_typespecquals): Handle them here.
+ * Make-lang.in (parse.c): Adjust expected conflicts.
+
+2002-02-08 Jakub Jelinek <jakub@redhat.com>
+
+ * parse.y (primary, primary_no_id): Use compstmt_or_stmtexpr
+ instead of compstmt.
+ (compstmt_or_stmtexpr): Renamed from compstmt.
+ (compstmt): In addition to compstmt_or_stmtexpr clear last_expr_type.
+
+2002-02-07 Nathan Sidwell <nathan@codesourcery.com>
+
+ Rename instantiate_type_flags to tsubst_flags_t & expand use.
+ * cp-tree.h (instantiate_type_flags): Rename to ...
+ (tsubst_flags_t): ... here. Rename itf_complain to tf_error,
+ add tf_warning flag.
+ (instantiate_type): Adjust prototype.
+ (tsubst, tsubst_expr, tsubst_copy, lookup_template_class,
+ do_type_instantiation, cp_build_qualified_type_real): Likewise.
+ cp_build_qualified_type: Adjust.
+ * class.c (instantiate_type): Adjust parameter. Rename itf_* to
+ tf_*.
+ * call.c (standard_conversion): Rename itf_* to tf_*.
+ (reference_binding): Likewise.
+ (convert_like_real): Likewise.
+ * cvt.c (cp_convert_to_pointer): Likewise.
+ (convert_to_reference): Likewise.
+ * decl.c (lookup_namespace_name): Use tf_* flags.
+ (make_typename_type): Likewise.
+ (grokdeclarator): Likewise.
+ * pt.c (convert_nontype_argument): Adjust COMPLAIN usage.
+ (coerce_template_template_parms, convert_template_argument,
+ coerce_template_parms, maybe_get_template_decl_from_type_decl,
+ lookup_template_class, tsubst_friend_function, tsubst_friend_class,
+ instantiate_class_template, tsubst_template_arg_vector,
+ tsubst_template_parms, tsubst_aggr_type, tsubst_default_argument,
+ tsubst_decl, tsubst_arg_types, tsubst_function_type,
+ tsubst_call_declarator_parms, tsubst, tsubst_copy, tsubst_expr,
+ instantiate_template, fn_type_unification,
+ resolve_overloaded_unification, verify_class_unification,
+ unify, get_bindings_real, do_type_instantiation,
+ regenerate_decl_from_template, instantiate_decl,
+ tsubst_initializer_list, tsubst_enum,
+ get_mostly_instantiated_function_type,
+ invalid_nontype_parm_type_p): Likewise.
+ * tree.c (cp_build_qualified_type_real): Likewise.
+ * typeck.c (build_binary_op): Rename itf_* to tf_*.
+ (build_ptrmemfunc): Likewise.
+ (convert_for_assignment): Likewise.
+
+2002-02-07 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/109
+ * decl.c (grokdeclarator): Allow friend declarations from
+ dependent types.
+ * decl2.c (handle_class_head): Don't push into template parm contexts.
+ * pt.c (push_template_decl_real): Template parm contexts are never
+ being defined.
+
+2002-02-05 Alexandre Oliva <aoliva@redhat.com>
+
+ * class.c: Include target.h.
+ (check_bitfield_decl): Disregard EMPTY_FIELD_BOUNDARY,
+ BITFIELDS_NBYTES_LIMITED and PCC_BITFIELD_TYPE_MATTERS for MS
+ bit-field layout.
+ * Make-lang.in: Adjust deps.
+
+2002-02-05 Jason Merrill <jason@redhat.com>
+
+ * error.c (dump_type): Be more helpful about VECTOR_TYPE.
+
+2002-02-04 Jakub Jelinek <jakub@redhat.com>
+
+ * semantics.c (begin_switch_stmt): Clear SWITCH_TYPE.
+ (finish_switch_cond): Set SWITCH_TYPE.
+
+2002-02-04 Richard Henderson <rth@redhat.com>
+
+ * method.c (use_thunk): Always initialize the block tree. Reindent.
+ * semantics.c (expand_body): Emit thunks after function, not before.
+
+2002-02-04 Jason Merrill <jason@redhat.com>
+
+ * decl.c (start_function): Call cplus_decl_attributes immediately
+ after grokdeclarator.
+
+ * decl.c (start_function): Combine DECL_RESULT handling code.
+
+2002-02-03 Jason Merrill <jason@redhat.com>
+
+ * xref.c: Remove.
+ * Make-lang.in (CXX_OBJS): Remove cp/xref.o
+ (cp/xref.o): Remove dependencies.
+ * class.c (finish_struct_1, check_methods): Don't call xref fns.
+ (finish_struct_1): Likewise.
+ * friend.c (make_friend_class): Likewise.
+ * lex.c (cxx_init, cxx_finish, extract_interface_info): Likewise.
+ * spew.c (read_process_identifier): Likewise.
+
2002-02-01 Jason Merrill <jason@redhat.com>
+ PR c++/4872
+ * decl.c (finish_function): Warn about a non-void function with
+ no return statement and no abnormal exit.
+ * cp-tree.h (struct cp_language_function): Add returns_abnormally.
+ (current_function_returns_abnormally): New macro.
+ * call.c (build_call): Set it.
+
+ * typeck.c (build_component_ref): Always complain about offsetof
+ constructs on non-PODs. Only make it an error for members of
+ virtual bases.
+
* error.c (dump_scope): Don't add TFF_DECL_SPECIFIERS.
(dump_function_decl): Always dump parms.
@@ -1496,8 +2200,8 @@ Fri Sep 21 08:16:19 2001 J"orn Rennecke <amylaar@redhat.com>
2001-09-15 Gabriel Dos Reis <gdr@merlin.codesourcery.com>
- * Make-lang.in (cp/error.o): Depend on real.h
- * error.c: #include "real.h"
+ * Make-lang.in (cp/error.o): Depend on real.h
+ * error.c: #include "real.h"
2001-09-15 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
diff --git a/contrib/gcc/cp/Make-lang.in b/contrib/gcc/cp/Make-lang.in
index 895b410..de4a372 100644
--- a/contrib/gcc/cp/Make-lang.in
+++ b/contrib/gcc/cp/Make-lang.in
@@ -102,7 +102,7 @@ CXX_C_OBJS = attribs.o c-common.o c-format.o c-pragma.o c-semantics.o c-lex.o \
CXX_OBJS = cp/call.o cp/decl.o cp/expr.o cp/pt.o cp/typeck2.o \
cp/class.o cp/decl2.o cp/error.o cp/lex.o cp/parse.o cp/ptree.o cp/rtti.o \
cp/spew.o cp/typeck.o cp/cvt.o cp/except.o cp/friend.o cp/init.o cp/method.o \
- cp/search.o cp/semantics.o cp/tree.o cp/xref.o cp/repo.o cp/dump.o \
+ cp/search.o cp/semantics.o cp/tree.o cp/repo.o cp/dump.o \
cp/optimize.o cp/mangle.o cp/cp-lang.o
# Use loose warnings for this front end.
@@ -120,7 +120,7 @@ $(srcdir)/cp/cfns.h: $(srcdir)/cp/cfns.gperf
$(srcdir)/cp/parse.h: $(srcdir)/cp/parse.c
$(srcdir)/cp/parse.c: $(srcdir)/cp/parse.y
- @echo "Expect 31 shift/reduce conflicts and 58 reduce/reduce conflicts."
+ @echo "Expect 33 shift/reduce conflicts and 58 reduce/reduce conflicts."
cd $(srcdir)/cp && \
if $(BISON) $(BISONFLAGS) -d -o p$$$$.c parse.y; then \
grep '^#define[ ]*YYEMPTY' p$$$$.c >> p$$$$.h ; \
@@ -255,14 +255,14 @@ cp/cp-lang.o: cp/cp-lang.c $(CXX_TREE_H) toplev.h langhooks.h langhooks-def.h \
c-common.h
cp/decl.o: cp/decl.c $(CXX_TREE_H) flags.h cp/lex.h cp/decl.h stack.h \
output.h $(EXPR_H) except.h toplev.h hash.h $(GGC_H) $(RTL_H) \
- cp/operators.def $(TM_P_H) tree-inline.h diagnostic.h
+ cp/operators.def $(TM_P_H) tree-inline.h diagnostic.h c-pragma.h
cp/decl2.o: cp/decl2.c $(CXX_TREE_H) flags.h cp/lex.h cp/decl.h $(EXPR_H) \
output.h except.h toplev.h $(GGC_H) $(RTL_H)
cp/typeck2.o: cp/typeck2.c $(CXX_TREE_H) flags.h toplev.h output.h $(TM_P_H) \
diagnostic.h
cp/typeck.o: cp/typeck.c $(CXX_TREE_H) flags.h $(RTL_H) $(EXPR_H) toplev.h \
diagnostic.h
-cp/class.o: cp/class.c $(CXX_TREE_H) flags.h toplev.h $(RTL_H)
+cp/class.o: cp/class.c $(CXX_TREE_H) flags.h toplev.h $(RTL_H) $(TARGET_H)
cp/call.o: cp/call.c $(CXX_TREE_H) flags.h toplev.h $(RTL_H) $(EXPR_H) \
$(GGC_H) diagnostic.h
cp/friend.o: cp/friend.c $(CXX_TREE_H) flags.h $(RTL_H) toplev.h $(EXPR_H)
@@ -280,7 +280,6 @@ cp/except.o: cp/except.c $(CXX_TREE_H) flags.h $(RTL_H) except.h toplev.h \
cp/cfns.h $(EXPR_H) libfuncs.h cp/decl.h $(OBSTACK_H)
cp/expr.o: cp/expr.c $(CXX_TREE_H) $(RTL_H) flags.h $(EXPR_H) toplev.h \
except.h $(TM_P_H)
-cp/xref.o: cp/xref.c $(CXX_TREE_H) input.h toplev.h
cp/pt.o: cp/pt.c $(CXX_TREE_H) cp/decl.h cp/parse.h cp/lex.h toplev.h \
$(GGC_H) $(RTL_H) except.h tree-inline.h
cp/error.o: cp/error.c $(CXX_TREE_H) toplev.h diagnostic.h flags.h real.h
diff --git a/contrib/gcc/cp/NEWS b/contrib/gcc/cp/NEWS
index a55b484..caee3fb 100644
--- a/contrib/gcc/cp/NEWS
+++ b/contrib/gcc/cp/NEWS
@@ -4,6 +4,10 @@
a workaround to allow std compliant code to work with the non-std
compliant libstdc++-v2. libstdc++-v3 is std compliant.
+* The C++ ABI has been fixed so that `void (A::*)() const' is mangled as
+ "M1AKFvvE", rather than "MK1AFvvE" as before. This change only affects
+ pointer to cv-qualified member function types.
+
* The C++ ABI has been changed to correctly handle this code:
struct A {
@@ -42,7 +46,22 @@
* The C++ ABI has been changed so that when a parameter is passed by value,
any cleanup for that parameter is performed in the caller, as specified
- by the ia64 C++ ABI, rather than the called function as before.
+ by the ia64 C++ ABI, rather than the called function as before. As a
+ result, classes with a non-trivial destructor but a trivial copy
+ constructor will be passed and returned by invisible reference, rather
+ than by bitwise copy as before.
+
+* G++ now supports the "named return value optimization": for code like
+
+ A f () {
+ A a;
+ ...
+ return a;
+ }
+
+ G++ will allocate 'a' in the return value slot, so that the return
+ becomes a no-op. For this to work, all return statements in the function
+ must return the same variable.
*** Changes in GCC 3.0:
diff --git a/contrib/gcc/cp/call.c b/contrib/gcc/cp/call.c
index cf6f0b4..5527066 100644
--- a/contrib/gcc/cp/call.c
+++ b/contrib/gcc/cp/call.c
@@ -408,6 +408,9 @@ build_call (function, parms)
nothrow = ((decl && TREE_NOTHROW (decl))
|| TYPE_NOTHROW_P (TREE_TYPE (TREE_TYPE (function))));
+ if (decl && TREE_THIS_VOLATILE (decl))
+ current_function_returns_abnormally = 1;
+
if (decl && TREE_DEPRECATED (decl))
warn_deprecated_use (decl);
@@ -702,7 +705,7 @@ standard_conversion (to, from, expr)
if ((TYPE_PTRFN_P (to) || TYPE_PTRMEMFUNC_P (to))
&& expr && type_unknown_p (expr))
{
- expr = instantiate_type (to, expr, itf_none);
+ expr = instantiate_type (to, expr, tf_none);
if (expr == error_mark_node)
return NULL_TREE;
from = TREE_TYPE (expr);
@@ -792,9 +795,8 @@ standard_conversion (to, from, expr)
{
tree fbase = TYPE_OFFSET_BASETYPE (TREE_TYPE (from));
tree tbase = TYPE_OFFSET_BASETYPE (TREE_TYPE (to));
- tree binfo = lookup_base (tbase, fbase, ba_check, NULL);
- if (binfo && !binfo_from_vbase (binfo)
+ if (DERIVED_FROM_P (fbase, tbase)
&& (same_type_ignoring_top_level_qualifiers_p
(TREE_TYPE (TREE_TYPE (from)),
TREE_TYPE (TREE_TYPE (to)))))
@@ -840,9 +842,8 @@ standard_conversion (to, from, expr)
tree tofn = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (to));
tree fbase = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fromfn)));
tree tbase = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (tofn)));
- tree binfo = lookup_base (tbase, fbase, ba_check, NULL);
- if (!binfo || binfo_from_vbase (binfo)
+ if (!DERIVED_FROM_P (fbase, tbase)
|| !same_type_p (TREE_TYPE (fromfn), TREE_TYPE (tofn))
|| !compparms (TREE_CHAIN (TYPE_ARG_TYPES (fromfn)),
TREE_CHAIN (TYPE_ARG_TYPES (tofn)))
@@ -1105,7 +1106,7 @@ reference_binding (rto, rfrom, expr, flags)
if (TREE_CODE (to) == FUNCTION_TYPE && expr && type_unknown_p (expr))
{
- expr = instantiate_type (to, expr, itf_none);
+ expr = instantiate_type (to, expr, tf_none);
if (expr == error_mark_node)
return NULL_TREE;
from = TREE_TYPE (expr);
@@ -2237,6 +2238,36 @@ add_template_candidate_real (candidates, tmpl, ctype, explicit_targs,
if (fn == error_mark_node)
return candidates;
+ /* In [class.copy]:
+
+ A member function template is never instantiated to perform the
+ copy of a class object to an object of its class type.
+
+ It's a little unclear what this means; the standard explicitly
+ does allow a template to be used to copy a class. For example,
+ in:
+
+ struct A {
+ A(A&);
+ template <class T> A(const T&);
+ };
+ const A f ();
+ void g () { A a (f ()); }
+
+ the member template will be used to make the copy. The section
+ quoted above appears in the paragraph that forbids constructors
+ whose only parameter is (a possibly cv-qualified variant of) the
+ class type, and a logical interpretation is that the intent was
+ to forbid the instantiation of member templates which would then
+ have that form. */
+ if (DECL_CONSTRUCTOR_P (fn) && list_length (arglist) == 2)
+ {
+ tree arg_types = FUNCTION_FIRST_USER_PARMTYPE (fn);
+ if (arg_types && same_type_p (TYPE_MAIN_VARIANT (TREE_VALUE (arg_types)),
+ ctype))
+ return candidates;
+ }
+
if (obj != NULL_TREE)
/* Aha, this is a conversion function. */
cand = add_conv_candidate (candidates, fn, obj, arglist);
@@ -3577,8 +3608,7 @@ builtin:
match with the placement new is accepted.
CODE is either DELETE_EXPR or VEC_DELETE_EXPR.
- ADDR is the pointer to be deleted. For placement delete, it is also
- used to determine what the corresponding new looked like.
+ ADDR is the pointer to be deleted.
SIZE is the size of the memory block to be deleted.
FLAGS are the usual overloading flags.
PLACEMENT is the corresponding placement new call, or NULL_TREE. */
@@ -3623,15 +3653,22 @@ build_op_delete_call (code, addr, size, flags, placement)
if (placement)
{
- /* placement is a CALL_EXPR around an ADDR_EXPR around a function. */
+ tree alloc_fn;
+ tree call_expr;
+ /* Find the allocation function that is being called. */
+ call_expr = placement;
+ /* Sometimes we have a COMPOUND_EXPR, rather than a simple
+ CALL_EXPR. */
+ while (TREE_CODE (call_expr) == COMPOUND_EXPR)
+ call_expr = TREE_OPERAND (call_expr, 1);
/* Extract the function. */
- argtypes = TREE_OPERAND (TREE_OPERAND (placement, 0), 0);
+ alloc_fn = get_callee_fndecl (call_expr);
+ my_friendly_assert (alloc_fn != NULL_TREE, 20020327);
/* Then the second parm type. */
- argtypes = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (argtypes)));
-
+ argtypes = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (alloc_fn)));
/* Also the second argument. */
- args = TREE_CHAIN (TREE_OPERAND (placement, 1));
+ args = TREE_CHAIN (TREE_OPERAND (call_expr, 1));
}
else
{
@@ -3861,7 +3898,7 @@ convert_like_real (convs, expr, fn, argnum, inner)
}
case IDENTITY_CONV:
if (type_unknown_p (expr))
- expr = instantiate_type (totype, expr, itf_complain);
+ expr = instantiate_type (totype, expr, tf_error | tf_warning);
return expr;
case AMBIG_CONV:
/* Call build_user_type_conversion again for the error. */
@@ -4268,7 +4305,8 @@ build_over_call (cand, args, flags)
be touched as it might overlay things. When the
gcc core learns about empty classes, we can treat it
like other classes. */
- && !is_empty_class (DECL_CONTEXT (fn)))
+ && !(is_empty_class (DECL_CONTEXT (fn))
+ && TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn))))
{
tree address;
tree to = stabilize_reference
@@ -4304,6 +4342,7 @@ build_over_call (cand, args, flags)
Ideally, the notions of having side-effects and of being
useless would be orthogonal. */
TREE_SIDE_EFFECTS (val) = 1;
+ TREE_NO_UNUSED_WARNING (val) = 1;
}
else
val = build (MODIFY_EXPR, TREE_TYPE (to), to, arg);
diff --git a/contrib/gcc/cp/class.c b/contrib/gcc/cp/class.c
index aa83b8d..82360b0 100644
--- a/contrib/gcc/cp/class.c
+++ b/contrib/gcc/cp/class.c
@@ -33,6 +33,7 @@ Boston, MA 02111-1307, USA. */
#include "toplev.h"
#include "ggc.h"
#include "lex.h"
+#include "target.h"
#include "obstack.h"
#define obstack_chunk_alloc xmalloc
@@ -289,12 +290,9 @@ build_base_path (code, expr, binfo, nonnull)
}
fixed_type_p = resolves_to_fixed_type_p (expr, &nonnull);
- if (fixed_type_p < 0)
- /* Virtual base layout is not fixed, even in ctors and dtors. */
- fixed_type_p = 0;
- if (!fixed_type_p && TREE_SIDE_EFFECTS (expr))
+ if (fixed_type_p <= 0 && TREE_SIDE_EFFECTS (expr))
expr = save_expr (expr);
-
+
if (!want_pointer)
expr = build_unary_op (ADDR_EXPR, expr, 0);
else if (!nonnull)
@@ -302,7 +300,7 @@ build_base_path (code, expr, binfo, nonnull)
offset = BINFO_OFFSET (binfo);
- if (v_binfo && !fixed_type_p)
+ if (v_binfo && fixed_type_p <= 0)
{
/* Going via virtual base V_BINFO. We need the static offset
from V_BINFO to BINFO, and the dynamic offset from D_BINFO to
@@ -323,7 +321,17 @@ build_base_path (code, expr, binfo, nonnull)
size_diffop (offset, BINFO_OFFSET (v_binfo)));
if (!integer_zerop (offset))
- offset = build (code, ptrdiff_type_node, v_offset, offset);
+ v_offset = build (code, ptrdiff_type_node, v_offset, offset);
+
+ if (fixed_type_p < 0)
+ /* Negative fixed_type_p means this is a constructor or destructor;
+ virtual base layout is fixed in in-charge [cd]tors, but not in
+ base [cd]tors. */
+ offset = build (COND_EXPR, ptrdiff_type_node,
+ build (EQ_EXPR, boolean_type_node,
+ current_in_charge_parm, integer_zero_node),
+ v_offset,
+ BINFO_OFFSET (binfo));
else
offset = v_offset;
}
@@ -350,7 +358,7 @@ build_base_path (code, expr, binfo, nonnull)
expr = build (COND_EXPR, target_type, null_test,
build1 (NOP_EXPR, target_type, integer_zero_node),
expr);
-
+
return expr;
}
@@ -1842,17 +1850,11 @@ finish_struct_bits (t)
}
}
- /* If this type has a copy constructor, force its mode to be BLKmode, and
- force its TREE_ADDRESSABLE bit to be nonzero. This will cause it to
- be passed by invisible reference and prevent it from being returned in
- a register.
-
- Also do this if the class has BLKmode but can still be returned in
- registers, since function_cannot_inline_p won't let us inline
- functions returning such a type. This affects the HP-PA. */
- if (! TYPE_HAS_TRIVIAL_INIT_REF (t)
- || (TYPE_MODE (t) == BLKmode && ! aggregate_value_p (t)
- && CLASSTYPE_NON_AGGREGATE (t)))
+ /* If this type has a copy constructor or a destructor, force its mode to
+ be BLKmode, and force its TREE_ADDRESSABLE bit to be nonzero. This
+ will cause it to be passed by invisible reference and prevent it from
+ being returned in a register. */
+ if (! TYPE_HAS_TRIVIAL_INIT_REF (t) || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t))
{
tree variants;
DECL_MODE (TYPE_MAIN_DECL (t)) = BLKmode;
@@ -3106,7 +3108,8 @@ check_bitfield_decl (field)
DECL_SIZE (field) = convert (bitsizetype, w);
DECL_BIT_FIELD (field) = 1;
- if (integer_zerop (w))
+ if (integer_zerop (w)
+ && ! (* targetm.ms_bitfield_layout_p) (DECL_FIELD_CONTEXT (field)))
{
#ifdef EMPTY_FIELD_BOUNDARY
DECL_ALIGN (field) = MAX (DECL_ALIGN (field),
@@ -3284,8 +3287,6 @@ check_field_decls (t, access_decls, empty_p,
tree x = *field;
tree type = TREE_TYPE (x);
- GNU_xref_member (current_class_name, x);
-
next = &TREE_CHAIN (x);
if (TREE_CODE (x) == FIELD_DECL)
@@ -3925,8 +3926,6 @@ check_methods (t)
for (x = TYPE_METHODS (t); x; x = TREE_CHAIN (x))
{
- GNU_xref_member (current_class_name, x);
-
/* If this was an evil function, don't keep it in class. */
if (DECL_ASSEMBLER_NAME_SET_P (x)
&& IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (x)))
@@ -4607,8 +4606,7 @@ layout_virtual_bases (t, offsets)
tree t;
splay_tree offsets;
{
- tree vbases;
- unsigned HOST_WIDE_INT dsize;
+ tree vbases, dsize;
unsigned HOST_WIDE_INT eoc;
if (CLASSTYPE_N_BASECLASSES (t) == 0)
@@ -4621,7 +4619,7 @@ layout_virtual_bases (t, offsets)
#endif
/* DSIZE is the size of the class without the virtual bases. */
- dsize = tree_low_cst (TYPE_SIZE (t), 1);
+ dsize = TYPE_SIZE (t);
/* Make every class have alignment of at least one. */
TYPE_ALIGN (t) = MAX (TYPE_ALIGN (t), BITS_PER_UNIT);
@@ -4643,7 +4641,7 @@ layout_virtual_bases (t, offsets)
{
/* This virtual base is not a primary base of any class in the
hierarchy, so we have to add space for it. */
- tree basetype;
+ tree basetype, usize;
unsigned int desired_align;
basetype = BINFO_TYPE (vbase);
@@ -4653,19 +4651,21 @@ layout_virtual_bases (t, offsets)
/* Add padding so that we can put the virtual base class at an
appropriately aligned offset. */
- dsize = CEIL (dsize, desired_align) * desired_align;
+ dsize = round_up (dsize, desired_align);
+
+ usize = size_binop (CEIL_DIV_EXPR, dsize, bitsize_unit_node);
/* We try to squish empty virtual bases in just like
ordinary empty bases. */
if (is_empty_class (basetype))
layout_empty_base (vbase,
- size_int (CEIL (dsize, BITS_PER_UNIT)),
+ convert (sizetype, usize),
offsets, t);
else
{
tree offset;
- offset = ssize_int (CEIL (dsize, BITS_PER_UNIT));
+ offset = convert (ssizetype, usize);
offset = size_diffop (offset,
convert (ssizetype,
BINFO_OFFSET (vbase)));
@@ -4675,8 +4675,9 @@ layout_virtual_bases (t, offsets)
/* Every virtual baseclass takes a least a UNIT, so that
we can take it's address and get something different
for each base. */
- dsize += MAX (BITS_PER_UNIT,
- tree_low_cst (CLASSTYPE_SIZE (basetype), 0));
+ dsize = size_binop (PLUS_EXPR, dsize,
+ size_binop (MAX_EXPR, bitsize_unit_node,
+ CLASSTYPE_SIZE (basetype)));
}
/* Keep track of the offsets assigned to this virtual base. */
@@ -4698,13 +4699,12 @@ layout_virtual_bases (t, offsets)
class, we didn't update DSIZE above; we were hoping to overlay
multiple such bases at the same location. */
eoc = end_of_class (t, /*include_virtuals_p=*/1);
- if (eoc * BITS_PER_UNIT > dsize)
- dsize = eoc * BITS_PER_UNIT;
+ dsize = size_binop (MAX_EXPR, dsize, bitsize_int (eoc * BITS_PER_UNIT));
/* Now, make sure that the total size of the type is a multiple of
its alignment. */
- dsize = CEIL (dsize, TYPE_ALIGN (t)) * TYPE_ALIGN (t);
- TYPE_SIZE (t) = bitsize_int (dsize);
+ dsize = round_up (dsize, TYPE_ALIGN (t));
+ TYPE_SIZE (t) = dsize;
TYPE_SIZE_UNIT (t) = convert (sizetype,
size_binop (CEIL_DIV_EXPR, TYPE_SIZE (t),
bitsize_unit_node));
@@ -4863,6 +4863,18 @@ layout_class_type (t, empty_p, vfuns_p,
if (TREE_CODE (field) != FIELD_DECL)
{
place_field (rli, field);
+ /* If the static data member has incomplete type, keep track
+ of it so that it can be completed later. (The handling
+ of pending statics in finish_record_layout is
+ insufficient; consider:
+
+ struct S1;
+ struct S2 { static S1 s1; };
+
+ At this point, finish_record_layout will be called, but
+ S1 is still incomplete.) */
+ if (TREE_CODE (field) == VAR_DECL)
+ maybe_register_incomplete_var (field);
continue;
}
@@ -5049,8 +5061,6 @@ finish_struct_1 (t)
return;
}
- GNU_xref_decl (current_function_decl, t);
-
/* If this type was previously laid out as a forward reference,
make sure we lay it out again. */
TYPE_SIZE (t) = NULL_TREE;
@@ -5158,7 +5168,7 @@ finish_struct_1 (t)
working on. */
for (x = TYPE_FIELDS (t); x; x = TREE_CHAIN (x))
if (TREE_CODE (x) == VAR_DECL && TREE_STATIC (x)
- && TREE_TYPE (x) == t)
+ && same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (x)), t))
DECL_MODE (x) = TYPE_MODE (t);
/* Done with FIELDS...now decide whether to sort these for
@@ -5207,7 +5217,7 @@ finish_struct_1 (t)
&& DECL_VINDEX (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (t), 1)) == NULL_TREE)
warning ("`%#T' has virtual functions but non-virtual destructor", t);
- hack_incomplete_structures (t);
+ complete_vars (t);
if (warn_overloaded_virtual)
warn_hidden (t);
@@ -6047,14 +6057,14 @@ cannot resolve overloaded function `%D' based on conversion to type `%T'",
tree
instantiate_type (lhstype, rhs, flags)
tree lhstype, rhs;
- enum instantiate_type_flags flags;
+ tsubst_flags_t flags;
{
- int complain = (flags & itf_complain);
- int strict = (flags & itf_no_attributes)
+ int complain = (flags & tf_error);
+ int strict = (flags & tf_no_attributes)
? COMPARE_NO_ATTRIBUTES : COMPARE_STRICT;
- int allow_ptrmem = flags & itf_ptrmem_ok;
+ int allow_ptrmem = flags & tf_ptrmem_ok;
- flags &= ~itf_ptrmem_ok;
+ flags &= ~tf_ptrmem_ok;
if (TREE_CODE (lhstype) == UNKNOWN_TYPE)
{
@@ -6261,7 +6271,7 @@ instantiate_type (lhstype, rhs, flags)
case ADDR_EXPR:
{
if (PTRMEM_OK_P (rhs))
- flags |= itf_ptrmem_ok;
+ flags |= tf_ptrmem_ok;
return instantiate_type (lhstype, TREE_OPERAND (rhs, 0), flags);
}
@@ -6299,7 +6309,8 @@ get_vfield_name (type)
type = BINFO_TYPE (binfo);
buf = (char *) alloca (sizeof (VFIELD_NAME_FORMAT)
+ TYPE_NAME_LENGTH (type) + 2);
- sprintf (buf, VFIELD_NAME_FORMAT, TYPE_NAME_STRING (type));
+ sprintf (buf, VFIELD_NAME_FORMAT,
+ IDENTIFIER_POINTER (constructor_name (type)));
return get_identifier (buf);
}
diff --git a/contrib/gcc/cp/cp-tree.def b/contrib/gcc/cp/cp-tree.def
index dbe990a..3854525 100644
--- a/contrib/gcc/cp/cp-tree.def
+++ b/contrib/gcc/cp/cp-tree.def
@@ -230,10 +230,6 @@ DEFTREECODE (SUBOBJECT, "subobject", 'e', 1)
the cleanups associated with any SUBOBJECT_CLEANUPS need no longer
be run. */
DEFTREECODE (CTOR_STMT, "ctor_stmt", 'e', 0)
-/* A CLEANUP_STMT marks the point at which a declaration is fully
- constructed. If, after this point, the CLEANUP_DECL goes out of
- scope, the CLEANUP_EXPR must be run. */
-DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", 'e', 2)
/* CTOR_INITIALIZER is a placeholder in template code for a call to
setup_vtbl_pointer (and appears in all functions, not just ctors). */
DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", 'e', 2)
diff --git a/contrib/gcc/cp/cp-tree.h b/contrib/gcc/cp/cp-tree.h
index f7cddac..584491a 100644
--- a/contrib/gcc/cp/cp-tree.h
+++ b/contrib/gcc/cp/cp-tree.h
@@ -28,6 +28,10 @@ Boston, MA 02111-1307, USA. */
#ifndef GCC_CP_TREE_H
#define GCC_CP_TREE_H
+#ifndef __GNUC__
+#error "You should be using 'make bootstrap' -- see installation instructions"
+#endif
+
#include "c-common.h"
/* Usage of TREE_LANG_FLAG_?:
@@ -318,8 +322,6 @@ typedef struct ptrmem_cst
set_namespace_binding ((NODE), current_namespace, (VAL))
#define CLEANUP_P(NODE) TREE_LANG_FLAG_0 (TRY_BLOCK_CHECK (NODE))
-#define CLEANUP_DECL(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 0)
-#define CLEANUP_EXPR(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 1)
/* Returns nonzero iff TYPE1 and TYPE2 are the same type, in the usual
sense of `same'. */
@@ -727,8 +729,8 @@ struct saved_scope
tree x_previous_class_type;
tree x_previous_class_values;
tree x_saved_tree;
- tree incomplete;
tree lookups;
+ tree last_parms;
HOST_WIDE_INT x_processing_template_decl;
int x_processing_specialization;
@@ -791,10 +793,6 @@ struct saved_scope
#define previous_class_values scope_chain->x_previous_class_values
-/* A list of the declarations with incomplete type at namespace scope. */
-
-#define namespace_scope_incomplete scope_chain->incomplete
-
/* A list of private types mentioned, for deferred access checking. */
#define type_lookups scope_chain->lookups
@@ -821,6 +819,7 @@ struct cp_language_function
int returns_value;
int returns_null;
+ int returns_abnormally;
int in_function_try_handler;
int x_expanding_p;
@@ -883,6 +882,12 @@ struct cp_language_function
#define current_function_returns_null cp_function_chain->returns_null
+/* Set to 0 at beginning of a function definition, set to 1 if
+ a call to a noreturn function is seen. */
+
+#define current_function_returns_abnormally \
+ cp_function_chain->returns_abnormally
+
/* Non-zero if we should generate RTL for functions that we process.
When this is zero, we just accumulate tree structure, without
interacting with the back end. */
@@ -925,10 +930,6 @@ extern int flag_no_gnu_keywords;
extern int flag_operator_names;
-/* For cross referencing. */
-
-extern int flag_gnu_xref;
-
/* For environments where you can use GNU binutils (as, ld in particular). */
extern int flag_gnu_binutils;
@@ -1583,11 +1584,11 @@ struct lang_type
#define SET_BINFO_MARKED(NODE) \
(TREE_VIA_VIRTUAL(NODE) \
? SET_CLASSTYPE_MARKED (BINFO_TYPE (NODE)) \
- : (TREE_LANG_FLAG_0 (NODE) = 1))
+ : (void)(TREE_LANG_FLAG_0 (NODE) = 1))
#define CLEAR_BINFO_MARKED(NODE) \
(TREE_VIA_VIRTUAL (NODE) \
? CLEAR_CLASSTYPE_MARKED (BINFO_TYPE (NODE)) \
- : (TREE_LANG_FLAG_0 (NODE) = 0))
+ : (void)(TREE_LANG_FLAG_0 (NODE) = 0))
/* Nonzero means that this class is on a path leading to a new vtable. */
#define BINFO_VTABLE_PATH_MARKED(NODE) \
@@ -1626,12 +1627,10 @@ struct lang_type
#define SET_BINFO_PUSHDECLS_MARKED(NODE) SET_BINFO_VTABLE_PATH_MARKED (NODE)
#define CLEAR_BINFO_PUSHDECLS_MARKED(NODE) CLEAR_BINFO_VTABLE_PATH_MARKED (NODE)
-/* Nonzero if this BINFO is a primary base class.
+/* Nonzero if this BINFO is a primary base class. Note, this can be
+ set for non-canononical virtual bases. For a virtual primary base
+ you might also need to check whether it is canonical. */
- In the TYPE_BINFO hierarchy, this flag is never set for a base
- class of a non-primary virtual base. This flag is only valid for
- paths (given by BINFO_INHERITANCE_CHAIN) that really exist in the
- final object. */
#define BINFO_PRIMARY_P(NODE) \
(BINFO_PRIMARY_BASE_OF (NODE) != NULL_TREE)
@@ -3060,13 +3059,19 @@ typedef enum linkage_kind {
lk_external /* External linkage. */
} linkage_kind;
-/* Bitmask flags to pass to instantiate_type. */
-typedef enum instantiate_type_flags {
- itf_none = 0, /* nothing special */
- itf_complain = 1 << 0, /* complain about errors */
- itf_no_attributes = 1 << 1, /* ignore attributes on comparisons */
- itf_ptrmem_ok = 1 << 2, /* pointers to member ok (internal use) */
-} instantiate_type_flags;
+/* Bitmask flags to control type substitution. */
+typedef enum tsubst_flags_t {
+ tf_none = 0, /* nothing special */
+ tf_error = 1 << 0, /* give error messages */
+ tf_warning = 1 << 1, /* give warnings too */
+ tf_no_attributes = 1 << 2, /* ignore attributes on comparisons
+ (instantiate_type use) */
+ tf_ignore_bad_quals = 1 << 3, /* ignore bad cvr qualifiers */
+ tf_keep_type_decl = 1 << 4, /* retain typedef type decls
+ (make_typename_type use) */
+ tf_ptrmem_ok = 1 << 5 /* pointers to member ok (internal
+ instantiate_type use) */
+} tsubst_flags_t;
/* The kind of checking we can do looking in a class hierarchy. */
typedef enum base_access {
@@ -3595,7 +3600,7 @@ extern void pop_nested_class PARAMS ((void));
extern int current_lang_depth PARAMS ((void));
extern void push_lang_context PARAMS ((tree));
extern void pop_lang_context PARAMS ((void));
-extern tree instantiate_type PARAMS ((tree, tree, enum instantiate_type_flags));
+extern tree instantiate_type PARAMS ((tree, tree, tsubst_flags_t));
extern void print_class_statistics PARAMS ((void));
extern void cxx_print_statistics PARAMS ((void));
extern void cxx_print_xnode PARAMS ((FILE *, tree, int));
@@ -3687,7 +3692,7 @@ extern tree namespace_binding PARAMS ((tree, tree));
extern void set_namespace_binding PARAMS ((tree, tree, tree));
extern tree lookup_namespace_name PARAMS ((tree, tree));
extern tree build_typename_type PARAMS ((tree, tree, tree, tree));
-extern tree make_typename_type PARAMS ((tree, tree, int));
+extern tree make_typename_type PARAMS ((tree, tree, tsubst_flags_t));
extern tree make_unbound_class_template PARAMS ((tree, tree, int));
extern tree lookup_name_nonclass PARAMS ((tree));
extern tree lookup_function_nonclass PARAMS ((tree, tree));
@@ -3739,7 +3744,8 @@ extern void finish_function_body PARAMS ((tree));
extern tree finish_function PARAMS ((int));
extern tree start_method PARAMS ((tree, tree, tree));
extern tree finish_method PARAMS ((tree));
-extern void hack_incomplete_structures PARAMS ((tree));
+extern void maybe_register_incomplete_var PARAMS ((tree));
+extern void complete_vars PARAMS ((tree));
extern void finish_stmt PARAMS ((void));
extern void print_other_binding_stack PARAMS ((struct binding_level *));
extern void revert_static_member_fn PARAMS ((tree));
@@ -3901,7 +3907,7 @@ extern tree build_new PARAMS ((tree, tree, tree, int));
extern tree build_vec_init PARAMS ((tree, tree, int));
extern tree build_x_delete PARAMS ((tree, int, tree));
extern tree build_delete PARAMS ((tree, tree, special_function_kind, int, int));
-extern void push_base_cleanups PARAMS ((void));
+extern void perform_base_cleanups PARAMS ((void));
extern tree build_vbase_delete PARAMS ((tree, tree));
extern tree build_vec_delete PARAMS ((tree, tree, special_function_kind, int));
extern tree create_temporary_var PARAMS ((tree));
@@ -3969,9 +3975,9 @@ extern int maybe_clone_body PARAMS ((tree));
extern void init_pt PARAMS ((void));
extern void check_template_shadow PARAMS ((tree));
extern tree get_innermost_template_args PARAMS ((tree, int));
-extern tree tsubst PARAMS ((tree, tree, int, tree));
-extern tree tsubst_expr PARAMS ((tree, tree, int, tree));
-extern tree tsubst_copy PARAMS ((tree, tree, int, tree));
+extern tree tsubst PARAMS ((tree, tree, tsubst_flags_t, tree));
+extern tree tsubst_expr PARAMS ((tree, tree, tsubst_flags_t, tree));
+extern tree tsubst_copy PARAMS ((tree, tree, tsubst_flags_t, tree));
extern void maybe_begin_member_template_processing PARAMS ((tree));
extern void maybe_end_member_template_processing PARAMS ((void));
extern tree finish_member_template_decl PARAMS ((tree));
@@ -3989,7 +3995,7 @@ extern tree current_template_args PARAMS ((void));
extern tree push_template_decl PARAMS ((tree));
extern tree push_template_decl_real PARAMS ((tree, int));
extern void redeclare_class_template PARAMS ((tree, tree));
-extern tree lookup_template_class PARAMS ((tree, tree, tree, tree, int, int));
+extern tree lookup_template_class PARAMS ((tree, tree, tree, tree, int, tsubst_flags_t));
extern tree lookup_template_function PARAMS ((tree, tree));
extern int uses_template_parms PARAMS ((tree));
extern tree instantiate_class_template PARAMS ((tree));
@@ -4000,7 +4006,7 @@ extern void mark_decl_instantiated PARAMS ((tree, int));
extern int more_specialized PARAMS ((tree, tree, int, int));
extern void mark_class_instantiated PARAMS ((tree, int));
extern void do_decl_instantiation PARAMS ((tree, tree, tree));
-extern void do_type_instantiation PARAMS ((tree, tree, int));
+extern void do_type_instantiation PARAMS ((tree, tree, tsubst_flags_t));
extern tree instantiate_decl PARAMS ((tree, int));
extern tree get_bindings PARAMS ((tree, tree, tree));
extern int push_tinst_level PARAMS ((tree));
@@ -4047,8 +4053,6 @@ extern int types_overlap_p PARAMS ((tree, tree));
extern tree get_vbase PARAMS ((tree, tree));
extern tree get_dynamic_cast_base_type PARAMS ((tree, tree));
extern void type_access_control PARAMS ((tree, tree));
-extern void skip_type_access_control PARAMS ((void));
-extern void reset_type_access_control PARAMS ((void));
extern int accessible_p PARAMS ((tree, tree));
extern tree lookup_field PARAMS ((tree, tree, int, int));
extern int lookup_fnfields_1 PARAMS ((tree, tree));
@@ -4084,8 +4088,6 @@ extern tree dfs_walk_real PARAMS ((tree,
extern tree dfs_unmark PARAMS ((tree, void *));
extern tree markedp PARAMS ((tree, void *));
extern tree unmarkedp PARAMS ((tree, void *));
-extern tree dfs_skip_nonprimary_vbases_unmarkedp PARAMS ((tree, void *));
-extern tree dfs_skip_nonprimary_vbases_markedp PARAMS ((tree, void *));
extern tree dfs_unmarked_real_bases_queue_p PARAMS ((tree, void *));
extern tree dfs_marked_real_bases_queue_p PARAMS ((tree, void *));
extern tree dfs_skip_vbases PARAMS ((tree, void *));
@@ -4156,6 +4158,7 @@ extern tree finish_qualified_call_expr PARAMS ((tree, tree));
extern tree finish_unary_op_expr PARAMS ((enum tree_code, tree));
extern tree finish_id_expr PARAMS ((tree));
extern void save_type_access_control PARAMS ((tree));
+extern void reset_type_access_control PARAMS ((void));
extern void decl_type_access_control PARAMS ((tree));
extern int begin_function_definition PARAMS ((tree, tree));
extern tree begin_constructor_declarator PARAMS ((tree, tree));
@@ -4259,9 +4262,9 @@ extern tree maybe_dummy_object PARAMS ((tree, tree *));
extern int is_dummy_object PARAMS ((tree));
extern const struct attribute_spec cp_attribute_table[];
extern tree make_ptrmem_cst PARAMS ((tree, tree));
-extern tree cp_build_qualified_type_real PARAMS ((tree, int, int));
+extern tree cp_build_qualified_type_real PARAMS ((tree, int, tsubst_flags_t));
#define cp_build_qualified_type(TYPE, QUALS) \
- cp_build_qualified_type_real ((TYPE), (QUALS), /*complain=*/1)
+ cp_build_qualified_type_real ((TYPE), (QUALS), tf_error | tf_warning)
extern tree build_shared_int_cst PARAMS ((int));
extern special_function_kind special_function_p PARAMS ((tree));
extern int count_trees PARAMS ((tree));
@@ -4340,6 +4343,7 @@ extern tree pfn_from_ptrmemfunc PARAMS ((tree));
extern tree type_after_usual_arithmetic_conversions PARAMS ((tree, tree));
extern tree composite_pointer_type PARAMS ((tree, tree, tree, tree,
const char*));
+extern tree merge_types PARAMS ((tree, tree));
extern tree check_return_expr PARAMS ((tree));
#define cp_build_binary_op(code, arg1, arg2) \
build_binary_op(code, arg1, arg2, 1)
@@ -4363,20 +4367,6 @@ extern void check_for_new_type PARAMS ((const char *, flagged_type_tree));
extern tree add_exception_specifier PARAMS ((tree, tree, int));
extern tree merge_exception_specifiers PARAMS ((tree, tree));
-/* in xref.c */
-extern void GNU_xref_begin PARAMS ((const char *));
-extern void GNU_xref_end PARAMS ((int));
-extern void GNU_xref_file PARAMS ((const char *));
-extern void GNU_xref_start_scope PARAMS ((HOST_WIDE_INT));
-extern void GNU_xref_end_scope PARAMS ((HOST_WIDE_INT, HOST_WIDE_INT, int, int));
-extern void GNU_xref_ref PARAMS ((tree, const char *));
-extern void GNU_xref_decl PARAMS ((tree, tree));
-extern void GNU_xref_call PARAMS ((tree, const char *));
-extern void GNU_xref_function PARAMS ((tree, tree));
-extern void GNU_xref_assign PARAMS ((tree));
-extern void GNU_xref_hier PARAMS ((tree, tree, int, int, int));
-extern void GNU_xref_member PARAMS ((tree, tree));
-
/* in mangle.c */
extern void init_mangle PARAMS ((void));
extern void mangle_decl PARAMS ((tree));
diff --git a/contrib/gcc/cp/cvt.c b/contrib/gcc/cp/cvt.c
index 6029e84..41cf21f 100644
--- a/contrib/gcc/cp/cvt.c
+++ b/contrib/gcc/cp/cvt.c
@@ -267,7 +267,7 @@ cp_convert_to_pointer (type, expr, force)
}
if (type_unknown_p (expr))
- return instantiate_type (type, expr, itf_complain);
+ return instantiate_type (type, expr, tf_error | tf_warning);
error ("cannot convert `%E' from type `%T' to type `%T'",
expr, intype, type);
@@ -478,7 +478,7 @@ convert_to_reference (reftype, expr, convtype, flags, decl)
{
expr = instantiate_type (type, expr,
(flags & LOOKUP_COMPLAIN)
- ? itf_complain : itf_none);
+ ? tf_error | tf_warning : tf_none);
if (expr == error_mark_node)
return error_mark_node;
@@ -836,7 +836,7 @@ convert_to_void (expr, implicit)
tree new_op1 = convert_to_void (op1, implicit);
tree new_op2 = convert_to_void (op2, implicit);
- expr = build (COND_EXPR, void_type_node,
+ expr = build (COND_EXPR, TREE_TYPE (new_op1),
TREE_OPERAND (expr, 0), new_op1, new_op2);
break;
}
@@ -852,6 +852,7 @@ convert_to_void (expr, implicit)
tree t = build (COMPOUND_EXPR, TREE_TYPE (new_op1),
TREE_OPERAND (expr, 0), new_op1);
TREE_SIDE_EFFECTS (t) = TREE_SIDE_EFFECTS (expr);
+ TREE_NO_UNUSED_WARNING (t) = TREE_NO_UNUSED_WARNING (expr);
expr = t;
}
diff --git a/contrib/gcc/cp/decl2.c b/contrib/gcc/cp/decl2.c
index 9b1c355..c419d55 100644
--- a/contrib/gcc/cp/decl2.c
+++ b/contrib/gcc/cp/decl2.c
@@ -1153,21 +1153,8 @@ delete_sanity (exp, size, doing_vec, use_global_delete)
return build_vec_delete (t, maxindex, sfk_deleting_destructor,
use_global_delete);
else
- {
- if (IS_AGGR_TYPE (TREE_TYPE (type))
- && TYPE_GETS_REG_DELETE (TREE_TYPE (type)))
- {
- /* Only do access checking here; we'll be calling op delete
- from the destructor. */
- tree tmp = build_op_delete_call (DELETE_EXPR, t, size_zero_node,
- LOOKUP_NORMAL, NULL_TREE);
- if (tmp == error_mark_node)
- return error_mark_node;
- }
-
- return build_delete (type, t, sfk_deleting_destructor,
- LOOKUP_NORMAL, use_global_delete);
- }
+ return build_delete (type, t, sfk_deleting_destructor,
+ LOOKUP_NORMAL, use_global_delete);
}
/* Report an error if the indicated template declaration is not the
@@ -1702,8 +1689,6 @@ grokbitfield (declarator, declspecs, width)
return void_type_node;
}
- GNU_xref_member (current_class_name, value);
-
if (TREE_STATIC (value))
{
error ("static member `%D' cannot be a bit-field", value);
@@ -2223,8 +2208,12 @@ maybe_make_one_only (decl)
make_decl_one_only (decl);
- if (TREE_CODE (decl) == VAR_DECL && DECL_LANG_SPECIFIC (decl))
- DECL_COMDAT (decl) = 1;
+ if (TREE_CODE (decl) == VAR_DECL)
+ {
+ DECL_COMDAT (decl) = 1;
+ /* Mark it needed so we don't forget to emit it. */
+ TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) = 1;
+ }
}
/* Returns the virtual function with which the vtable for TYPE is
@@ -3452,7 +3441,11 @@ finish_file ()
not defined when they really are. This keeps these functions
from being put out unnecessarily. But, we must stop lying
when the functions are referenced, or if they are not comdat
- since they need to be put out now. */
+ since they need to be put out now.
+ This is done in a separate for cycle, because if some deferred
+ function is contained in another deferred function later in
+ deferred_fns varray, rest_of_compilation would skip this
+ function and we really cannot expand the same function twice. */
for (i = 0; i < deferred_fns_used; ++i)
{
tree decl = VARRAY_TREE (deferred_fns, i);
@@ -3461,6 +3454,11 @@ finish_file ()
&& DECL_INITIAL (decl)
&& DECL_NEEDED_P (decl))
DECL_EXTERNAL (decl) = 0;
+ }
+
+ for (i = 0; i < deferred_fns_used; ++i)
+ {
+ tree decl = VARRAY_TREE (deferred_fns, i);
/* If we're going to need to write this function out, and
there's already a body for it, create RTL for it now.
@@ -4198,6 +4196,11 @@ ambiguous_decl (name, old, new, flags)
if (LOOKUP_TYPES_ONLY (flags))
val = NULL_TREE;
break;
+ case FUNCTION_DECL:
+ /* Ignore built-in functions that are still anticipated. */
+ if (LOOKUP_QUALIFIERS_ONLY (flags) || DECL_ANTICIPATED (val))
+ val = NULL_TREE;
+ break;
default:
if (LOOKUP_QUALIFIERS_ONLY (flags))
val = NULL_TREE;
@@ -4950,6 +4953,15 @@ do_nonmember_using_decl (scope, name, oldval, oldtype, newval, newtype)
else if (compparms (TYPE_ARG_TYPES (TREE_TYPE (new_fn)),
TYPE_ARG_TYPES (TREE_TYPE (old_fn))))
{
+ /* If this using declaration introduces a function
+ recognized as a built-in, no longer mark it as
+ anticipated in this scope. */
+ if (DECL_ANTICIPATED (old_fn))
+ {
+ DECL_ANTICIPATED (old_fn) = 0;
+ break;
+ }
+
/* There was already a non-using declaration in
this scope with the same parameter types. If both
are the same extern "C" functions, that's ok. */
@@ -5221,7 +5233,7 @@ handle_class_head (aggr, scope, id, defn_p, new_type_p)
{
/* According to the suggested resolution of core issue
180, 'typename' is assumed after a class-key. */
- decl = make_typename_type (scope, id, 1);
+ decl = make_typename_type (scope, id, tf_error);
if (decl != error_mark_node)
decl = TYPE_MAIN_DECL (decl);
else
@@ -5260,10 +5272,18 @@ handle_class_head (aggr, scope, id, defn_p, new_type_p)
is different to the current scope. */
tree context = CP_DECL_CONTEXT (decl);
- *new_type_p = current != context;
+ *new_type_p = (current != context
+ && TREE_CODE (context) != TEMPLATE_TYPE_PARM
+ && TREE_CODE (context) != BOUND_TEMPLATE_TEMPLATE_PARM);
if (*new_type_p)
push_scope (context);
-
+
+ if (TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE)
+ /* It is legal to define a class with a different class key,
+ and this changes the default member access. */
+ CLASSTYPE_DECLARED_CLASS (TREE_TYPE (decl))
+ = aggr == class_type_node;
+
if (!xrefd_p && PROCESSING_REAL_TEMPLATE_DECL_P ())
decl = push_template_decl (decl);
}
diff --git a/contrib/gcc/cp/dump.c b/contrib/gcc/cp/dump.c
index 98c1fc4..6dd60ba 100644
--- a/contrib/gcc/cp/dump.c
+++ b/contrib/gcc/cp/dump.c
@@ -1,5 +1,5 @@
/* Tree-dumping functionality for intermediate representation.
- Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Written by Mark Mitchell <mark@codesourcery.com>
This file is part of GNU CC.
@@ -390,13 +390,6 @@ cp_dump_tree (dump_info, t)
dump_child ("decl", TREE_OPERAND (t, 2));
break;
- case CLEANUP_STMT:
- dump_stmt (di, t);
- dump_child ("decl", CLEANUP_DECL (t));
- dump_child ("expr", CLEANUP_EXPR (t));
- dump_next_stmt (di, t);
- break;
-
case CTOR_STMT:
dump_stmt (di, t);
if (CTOR_BEGIN_P (t))
diff --git a/contrib/gcc/cp/error.c b/contrib/gcc/cp/error.c
index 594d4e4..aa075ee 100644
--- a/contrib/gcc/cp/error.c
+++ b/contrib/gcc/cp/error.c
@@ -382,7 +382,14 @@ dump_type (t, flags)
case VECTOR_TYPE:
output_add_string (scratch_buffer, "vector ");
- dump_type (TREE_TYPE (t), flags);
+ {
+ /* The subtype of a VECTOR_TYPE is something like intQI_type_node,
+ which has no name and is not very useful for diagnostics. So
+ look up the equivalent C type and print its name. */
+ tree elt = TREE_TYPE (t);
+ elt = type_for_mode (TYPE_MODE (elt), TREE_UNSIGNED (elt));
+ dump_type (elt, flags);
+ }
break;
case INTEGER_TYPE:
@@ -452,7 +459,8 @@ dump_type (t, flags)
break;
}
case TYPENAME_TYPE:
- output_add_string (scratch_buffer, "typename ");
+ if (IMPLICIT_TYPENAME_P (t))
+ output_add_string (scratch_buffer, "typename ");
dump_typename (t, flags);
break;
@@ -1727,7 +1735,7 @@ dump_expr (t, flags)
break;
case CONVERT_EXPR:
- if (VOID_TYPE_P (TREE_TYPE (t)))
+ if (TREE_TYPE (t) && VOID_TYPE_P (TREE_TYPE (t)))
{
print_left_paren (scratch_buffer);
dump_type (TREE_TYPE (t), flags);
diff --git a/contrib/gcc/cp/friend.c b/contrib/gcc/cp/friend.c
index 1d96701..441be67 100644
--- a/contrib/gcc/cp/friend.c
+++ b/contrib/gcc/cp/friend.c
@@ -252,8 +252,6 @@ make_friend_class (type, friend_type)
return;
}
- GNU_xref_hier (type, friend_type, 0, 0, 1);
-
if (is_template_friend)
friend_type = CLASSTYPE_TI_TEMPLATE (friend_type);
diff --git a/contrib/gcc/cp/g++spec.c b/contrib/gcc/cp/g++spec.c
index fbbe599..c0e5c73 100644
--- a/contrib/gcc/cp/g++spec.c
+++ b/contrib/gcc/cp/g++spec.c
@@ -32,10 +32,16 @@ Boston, MA 02111-1307, USA. */
#ifndef MATH_LIBRARY
#define MATH_LIBRARY "-lm"
#endif
+#ifndef MATH_LIBRARY_PROFILE
+#define MATH_LIBRARY_PROFILE "-lm"
+#endif
#ifndef LIBSTDCXX
#define LIBSTDCXX "-lstdc++"
#endif
+#ifndef LIBSTDCXX_PROFILE
+#define LIBSTDCXX_PROFILE "-lstdc++"
+#endif
void
lang_specific_driver (in_argc, in_argv, in_added_libraries)
@@ -45,6 +51,9 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
{
int i, j;
+ /* If non-zero, the user gave us the `-p' or `-pg' flag. */
+ int saw_profile_flag = 0;
+
/* If non-zero, the user gave us the `-v' flag. */
int saw_verbose_flag = 0;
@@ -137,6 +146,8 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
}
else if (strcmp (argv[i], "-lc") == 0)
args[i] |= WITHLIBC;
+ else if (strcmp (argv[i], "-pg") == 0 || strcmp (argv[i], "-p") == 0)
+ saw_profile_flag++;
else if (strcmp (argv[i], "-v") == 0)
{
saw_verbose_flag = 1;
@@ -259,14 +270,14 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
/* Add `-lstdc++' if we haven't already done so. */
if (library)
{
- arglist[j++] = LIBSTDCXX;
+ arglist[j++] = saw_profile_flag ? LIBSTDCXX_PROFILE : LIBSTDCXX;
added_libraries++;
}
if (saw_math)
arglist[j++] = saw_math;
else if (library && need_math)
{
- arglist[j++] = MATH_LIBRARY;
+ arglist[j++] = saw_profile_flag ? MATH_LIBRARY_PROFILE : MATH_LIBRARY;
added_libraries++;
}
if (saw_libc)
diff --git a/contrib/gcc/cp/init.c b/contrib/gcc/cp/init.c
index 017b894..4cb0dab 100644
--- a/contrib/gcc/cp/init.c
+++ b/contrib/gcc/cp/init.c
@@ -97,10 +97,6 @@ begin_init_stmts (stmt_expr_p, compound_stmt_p)
if (building_stmt_tree ())
*compound_stmt_p = begin_compound_stmt (/*has_no_scope=*/1);
- /*
- else
- *compound_stmt_p = genrtl_begin_compound_stmt (has_no_scope=1);
- */
}
/* Finish out the statement-expression begun by the previous call to
@@ -116,7 +112,10 @@ finish_init_stmts (stmt_expr, compound_stmt)
finish_compound_stmt (/*has_no_scope=*/1, compound_stmt);
if (building_stmt_tree ())
- stmt_expr = finish_stmt_expr (stmt_expr);
+ {
+ stmt_expr = finish_stmt_expr (stmt_expr);
+ STMT_EXPR_NO_SCOPE (stmt_expr) = true;
+ }
else
stmt_expr = finish_global_stmt_expr (stmt_expr);
@@ -1496,10 +1495,8 @@ build_member_call (type, name, parmlist)
decl = maybe_dummy_object (type, &basetype_path);
/* Convert 'this' to the specified type to disambiguate conversion
- to the function's context. Apparently Standard C++ says that we
- shouldn't do this. */
+ to the function's context. */
if (decl == current_class_ref
- && ! pedantic
&& ACCESSIBLY_UNIQUELY_DERIVED_P (type, current_class_type))
{
tree olddecl = current_class_ptr;
@@ -1819,9 +1816,7 @@ resolve_offset_ref (exp)
if (TREE_CODE (member) == FIELD_DECL
&& (base == current_class_ref || is_dummy_object (base)))
{
- tree expr;
-
- basetype = DECL_CONTEXT (member);
+ tree binfo = TYPE_BINFO (current_class_type);
/* Try to get to basetype from 'this'; if that doesn't work,
nothing will. */
@@ -1829,30 +1824,15 @@ resolve_offset_ref (exp)
/* First convert to the intermediate base specified, if appropriate. */
if (TREE_CODE (exp) == OFFSET_REF && TREE_CODE (type) == OFFSET_TYPE)
- base = build_scoped_ref (base, TYPE_OFFSET_BASETYPE (type));
-
- /* Don't check access on the conversion; we might be after a member
- promoted by an access- or using-declaration, and we have already
- checked access for the member itself. */
- basetype = lookup_base (TREE_TYPE (base), basetype, ba_ignore, NULL);
- expr = build_base_path (PLUS_EXPR, base, basetype, 1);
-
- if (expr == error_mark_node)
- return error_mark_node;
-
- type = TREE_TYPE (member);
- if (TREE_CODE (type) != REFERENCE_TYPE)
{
- int quals = cp_type_quals (type) | cp_type_quals (TREE_TYPE (expr));
-
- if (DECL_MUTABLE_P (member))
- quals &= ~TYPE_QUAL_CONST;
-
- type = cp_build_qualified_type (type, quals);
+ binfo = binfo_or_else (TYPE_OFFSET_BASETYPE (type),
+ current_class_type);
+ if (!binfo)
+ return error_mark_node;
+ base = build_base_path (PLUS_EXPR, base, binfo, 1);
}
-
- expr = build (COMPONENT_REF, type, expr, member);
- return convert_from_reference (expr);
+
+ return build_component_ref (base, member, binfo, 1);
}
/* Ensure that we have an object. */
@@ -2206,6 +2186,7 @@ build_new_1 (exp)
tree full_type;
tree nelts = NULL_TREE;
tree alloc_call, alloc_expr, alloc_node;
+ tree alloc_fn;
tree cookie_expr, init_expr;
int has_array = 0;
enum tree_code code;
@@ -2260,7 +2241,7 @@ build_new_1 (exp)
size = size_in_bytes (true_type);
if (has_array)
- size = fold (cp_build_binary_op (MULT_EXPR, size, nelts));
+ size = size_binop (MULT_EXPR, size, convert (sizetype, nelts));
if (TREE_CODE (true_type) == VOID_TYPE)
{
@@ -2288,7 +2269,7 @@ build_new_1 (exp)
use_cookie = 0;
/* When using placement new, users may not realize that they need
the extra storage. We require that the operator called be
- the global placement operator delete[]. */
+ the global placement operator new[]. */
else if (placement && !TREE_CHAIN (placement)
&& same_type_p (TREE_TYPE (TREE_VALUE (placement)),
ptr_type_node))
@@ -2346,13 +2327,14 @@ build_new_1 (exp)
if (alloc_call == error_mark_node)
return error_mark_node;
- /* The ALLOC_CALL should be a CALL_EXPR, and the first operand
- should be the address of a known FUNCTION_DECL. */
- my_friendly_assert (TREE_CODE (alloc_call) == CALL_EXPR, 20000521);
- t = TREE_OPERAND (alloc_call, 0);
- my_friendly_assert (TREE_CODE (t) == ADDR_EXPR, 20000521);
- t = TREE_OPERAND (t, 0);
- my_friendly_assert (TREE_CODE (t) == FUNCTION_DECL, 20000521);
+ /* The ALLOC_CALL should be a CALL_EXPR -- or a COMPOUND_EXPR whose
+ right-hand-side is ultimately a CALL_EXPR -- and the first
+ operand should be the address of a known FUNCTION_DECL. */
+ t = alloc_call;
+ while (TREE_CODE (t) == COMPOUND_EXPR)
+ t = TREE_OPERAND (t, 1);
+ alloc_fn = get_callee_fndecl (t);
+ my_friendly_assert (alloc_fn != NULL_TREE, 20020325);
/* Now, check to see if this function is actually a placement
allocation function. This can happen even when PLACEMENT is NULL
because we might have something like:
@@ -2364,7 +2346,8 @@ build_new_1 (exp)
one argument, or there are variable arguments, then this is a
placement allocation function. */
placement_allocation_fn_p
- = (type_num_arguments (TREE_TYPE (t)) > 1 || varargs_function_p (t));
+ = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1
+ || varargs_function_p (alloc_fn));
/* unless an allocation function is declared with an empty excep-
tion-specification (_except.spec_), throw(), it indicates failure to
@@ -2376,11 +2359,7 @@ build_new_1 (exp)
So check for a null exception spec on the op new we just called. */
- /* The ADDR_EXPR. */
- t = TREE_OPERAND (alloc_call, 0);
- /* The function. */
- t = TREE_OPERAND (t, 0);
- nothrow = TYPE_NOTHROW_P (TREE_TYPE (t));
+ nothrow = TYPE_NOTHROW_P (TREE_TYPE (alloc_fn));
check_new = (flag_check_new || nothrow) && ! use_java_new;
alloc_expr = alloc_call;
@@ -2473,13 +2452,22 @@ build_new_1 (exp)
tree cleanup;
int flags = (LOOKUP_NORMAL
| (globally_qualified_p * LOOKUP_GLOBAL));
+ tree delete_node;
+
+ if (use_cookie)
+ /* Subtract the padding back out to get to the pointer returned
+ from operator new. */
+ delete_node = fold (build (MINUS_EXPR, TREE_TYPE (alloc_node),
+ alloc_node, cookie_size));
+ else
+ delete_node = alloc_node;
/* The Standard is unclear here, but the right thing to do
is to use the same method for finding deallocation
functions that we use for finding allocation functions. */
flags |= LOOKUP_SPECULATIVELY;
- cleanup = build_op_delete_call (dcode, alloc_node, size, flags,
+ cleanup = build_op_delete_call (dcode, delete_node, size, flags,
(placement_allocation_fn_p
? alloc_call : NULL_TREE));
@@ -3200,6 +3188,14 @@ build_delete (type, addr, auto_delete, flags, use_global_delete)
/* Call the complete object destructor. */
auto_delete = sfk_complete_destructor;
}
+ else if (auto_delete == sfk_deleting_destructor
+ && TYPE_GETS_REG_DELETE (type))
+ {
+ /* Make sure we have access to the member op delete, even though
+ we'll actually be calling it from the destructor. */
+ build_op_delete_call (DELETE_EXPR, addr, c_sizeof_nowarn (type),
+ LOOKUP_NORMAL, NULL_TREE);
+ }
expr = build_dtor_call (build_indirect_ref (addr, NULL),
auto_delete, flags);
@@ -3221,18 +3217,65 @@ build_delete (type, addr, auto_delete, flags, use_global_delete)
}
}
-/* At the beginning of a destructor, push cleanups that will call the
- destructors for our base classes and members.
+/* At the end of a destructor, call the destructors for our base classes
+ and members.
- Called from setup_vtbl_ptr. */
+ Called from finish_destructor_body. */
void
-push_base_cleanups ()
+perform_base_cleanups ()
{
tree binfos;
int i, n_baseclasses;
tree member;
tree expr;
+ tree member_destructions = NULL;
+ tree vbase_destructions = NULL;
+
+ for (member = TYPE_FIELDS (current_class_type); member;
+ member = TREE_CHAIN (member))
+ {
+ if (TREE_CODE (member) != FIELD_DECL)
+ continue;
+ if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (member)))
+ {
+ tree this_member = (build_component_ref
+ (current_class_ref, member,
+ NULL_TREE, 0));
+ tree this_type = TREE_TYPE (member);
+ expr = build_delete (this_type, this_member,
+ sfk_complete_destructor,
+ LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL,
+ 0);
+ if (!member_destructions)
+ member_destructions = expr;
+ else
+ member_destructions = build (COMPOUND_EXPR,
+ TREE_TYPE (member_destructions),
+ expr,
+ member_destructions);
+ }
+ }
+ if (member_destructions)
+ finish_expr_stmt (member_destructions);
+
+ binfos = BINFO_BASETYPES (TYPE_BINFO (current_class_type));
+ n_baseclasses = CLASSTYPE_N_BASECLASSES (current_class_type);
+
+ /* Take care of the remaining baseclasses. */
+ for (i = n_baseclasses - 1; i >= 0; i--)
+ {
+ tree base_binfo = TREE_VEC_ELT (binfos, i);
+ if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo))
+ || TREE_VIA_VIRTUAL (base_binfo))
+ continue;
+
+ expr = build_scoped_method_call (current_class_ref, base_binfo,
+ base_dtor_identifier,
+ NULL_TREE);
+
+ finish_expr_stmt (expr);
+ }
/* Run destructors for all virtual baseclasses. */
if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
@@ -3271,47 +3314,18 @@ push_base_cleanups ()
LOOKUP_NORMAL);
expr = build (COND_EXPR, void_type_node, cond,
expr, void_zero_node);
- finish_decl_cleanup (NULL_TREE, expr);
+ if (!vbase_destructions)
+ vbase_destructions = expr;
+ else
+ vbase_destructions = build (COMPOUND_EXPR,
+ TREE_TYPE (vbase_destructions),
+ expr,
+ vbase_destructions);
}
}
}
-
- binfos = BINFO_BASETYPES (TYPE_BINFO (current_class_type));
- n_baseclasses = CLASSTYPE_N_BASECLASSES (current_class_type);
-
- /* Take care of the remaining baseclasses. */
- for (i = 0; i < n_baseclasses; i++)
- {
- tree base_binfo = TREE_VEC_ELT (binfos, i);
- if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo))
- || TREE_VIA_VIRTUAL (base_binfo))
- continue;
-
- expr = build_scoped_method_call (current_class_ref, base_binfo,
- base_dtor_identifier,
- NULL_TREE);
-
- finish_decl_cleanup (NULL_TREE, expr);
- }
-
- for (member = TYPE_FIELDS (current_class_type); member;
- member = TREE_CHAIN (member))
- {
- if (TREE_CODE (member) != FIELD_DECL)
- continue;
- if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (member)))
- {
- tree this_member = (build_component_ref
- (current_class_ref, DECL_NAME (member),
- NULL_TREE, 0));
- tree this_type = TREE_TYPE (member);
- expr = build_delete (this_type, this_member,
- sfk_complete_destructor,
- LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL,
- 0);
- finish_decl_cleanup (NULL_TREE, expr);
- }
- }
+ if (vbase_destructions)
+ finish_expr_stmt (vbase_destructions);
}
/* For type TYPE, delete the virtual baseclass objects of DECL. */
diff --git a/contrib/gcc/cp/lang-specs.h b/contrib/gcc/cp/lang-specs.h
index e48bf74..a8efd10 100644
--- a/contrib/gcc/cp/lang-specs.h
+++ b/contrib/gcc/cp/lang-specs.h
@@ -41,20 +41,20 @@ Boston, MA 02111-1307, USA. */
-D__GXX_ABI_VERSION=100\
%{ansi:-D__STRICT_ANSI__ -trigraphs -$} %(cpp_options)}\
%{!E:%{!M:%{!MM:\
- %{save-temps:cpp0 -lang-c++ \
+ %{save-temps|no-integrated-cpp:cpp0 -lang-c++ \
%{!no-gcc:-D__GNUG__=%v1}\
%{!Wno-deprecated:-D__DEPRECATED}\
%{!fno-exceptions:-D__EXCEPTIONS}\
-D__GXX_ABI_VERSION=100\
%{ansi:-D__STRICT_ANSI__ -trigraphs -$}\
- %(cpp_options) %b.ii \n}\
- cc1plus %{save-temps:-fpreprocessed %b.ii}\
- %{!save-temps:%(cpp_unique_options)\
+ %(cpp_options) %{save-temps:%b.ii} %{!save-temps:%g.ii} \n}\
+ cc1plus %{save-temps|no-integrated-cpp:-fpreprocessed %{save-temps:%b.ii} %{!save-temps:%g.ii}}\
+ %{!save-temps:%{!no-integrated-cpp:%(cpp_unique_options)\
%{!no-gcc:-D__GNUG__=%v1} \
%{!Wno-deprecated:-D__DEPRECATED}\
%{!fno-exceptions:-D__EXCEPTIONS}\
-D__GXX_ABI_VERSION=100\
- %{ansi:-D__STRICT_ANSI__}}\
+ %{ansi:-D__STRICT_ANSI__}}}\
%{ansi:-trigraphs -$}\
%(cc1_options) %2 %{+e1*}\
%{!fsyntax-only:%(invoke_as)}}}}",
diff --git a/contrib/gcc/cp/lex.c b/contrib/gcc/cp/lex.c
index 0287f70..61e34a8 100644
--- a/contrib/gcc/cp/lex.c
+++ b/contrib/gcc/cp/lex.c
@@ -263,8 +263,6 @@ cxx_init_options ()
void
cxx_finish ()
{
- if (flag_gnu_xref)
- GNU_xref_end (errorcount + sorrycount);
c_common_finish ();
}
@@ -733,8 +731,6 @@ cxx_init (filename)
init_cp_pragma ();
- if (flag_gnu_xref)
- GNU_xref_begin (filename);
init_repo (filename);
return filename;
@@ -931,9 +927,6 @@ extract_interface_info ()
interface_only = finfo->interface_only;
interface_unknown = finfo->interface_unknown;
-
- /* This happens to be a convenient place to put this. */
- if (flag_gnu_xref) GNU_xref_file (input_filename);
}
/* Return nonzero if S is not considered part of an
@@ -1372,7 +1365,8 @@ do_scoped_id (token, parsing)
id = IDENTIFIER_GLOBAL_VALUE (token);
if (parsing && yychar == YYEMPTY)
yychar = yylex ();
- if (! id)
+ if (!id || (TREE_CODE (id) == FUNCTION_DECL
+ && DECL_ANTICIPATED (id)))
{
if (processing_template_decl)
{
diff --git a/contrib/gcc/cp/mangle.c b/contrib/gcc/cp/mangle.c
index 00e5143..2e79581 100644
--- a/contrib/gcc/cp/mangle.c
+++ b/contrib/gcc/cp/mangle.c
@@ -1353,6 +1353,11 @@ write_type (type)
since both the qualified and uqualified types are substitution
candidates. */
write_type (TYPE_MAIN_VARIANT (type));
+ else if (TREE_CODE (type) == ARRAY_TYPE)
+ /* It is important not to use the TYPE_MAIN_VARIANT of TYPE here
+ so that the cv-qualification of the element type is available
+ in write_array_type. */
+ write_array_type (type);
else
{
/* See through any typedefs. */
@@ -1399,10 +1404,6 @@ write_type (type)
write_nested_name (TYPE_STUB_DECL (type));
break;
- case ARRAY_TYPE:
- write_array_type (type);
- break;
-
case POINTER_TYPE:
/* A pointer-to-member variable is represented by a POINTER_TYPE
to an OFFSET_TYPE, so check for this first. */
@@ -1469,19 +1470,23 @@ write_CV_qualifiers_for_type (type)
"In cases where multiple order-insensitive qualifiers are
present, they should be ordered 'K' (closest to the base type),
- 'V', 'r', and 'U' (farthest from the base type) ..." */
+ 'V', 'r', and 'U' (farthest from the base type) ..."
- if (CP_TYPE_RESTRICT_P (type))
+ Note that we do not use cp_type_quals below; given "const
+ int[3]", the "const" is emitted with the "int", not with the
+ array. */
+
+ if (TYPE_QUALS (type) & TYPE_QUAL_RESTRICT)
{
write_char ('r');
++num_qualifiers;
}
- if (CP_TYPE_VOLATILE_P (type))
+ if (TYPE_QUALS (type) & TYPE_QUAL_VOLATILE)
{
write_char ('V');
++num_qualifiers;
}
- if (CP_TYPE_CONST_P (type))
+ if (TYPE_QUALS (type) & TYPE_QUAL_CONST)
{
write_char ('K');
++num_qualifiers;
@@ -1506,8 +1511,8 @@ write_CV_qualifiers_for_type (type)
::= m # unsigned long
::= x # long long, __int64
::= y # unsigned long long, __int64
- ::= n # __int128 [not supported]
- ::= o # unsigned __int128 [not supported]
+ ::= n # __int128
+ ::= o # unsigned __int128
::= f # float
::= d # double
::= e # long double, __float80
@@ -1552,15 +1557,23 @@ write_builtin_type (type)
write_char (integer_type_codes[itk]);
break;
}
-
+
if (itk == itk_none)
{
tree t = type_for_mode (TYPE_MODE (type), TREE_UNSIGNED (type));
if (type == t)
- /* Couldn't find this type. */
- abort ();
- type = t;
- goto iagain;
+ {
+ if (TYPE_PRECISION (type) == 128)
+ write_char (TREE_UNSIGNED (type) ? 'o' : 'n');
+ else
+ /* Couldn't find this type. */
+ abort ();
+ }
+ else
+ {
+ type = t;
+ goto iagain;
+ }
}
}
break;
@@ -1595,6 +1608,17 @@ write_function_type (type)
{
MANGLE_TRACE_TREE ("function-type", type);
+ /* For a pointer to member function, the function type may have
+ cv-qualifiers, indicating the quals for the artificial 'this'
+ parameter. */
+ if (TREE_CODE (type) == METHOD_TYPE)
+ {
+ /* The first parameter must be a POINTER_TYPE pointing to the
+ `this' parameter. */
+ tree this_type = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (type)));
+ write_CV_qualifiers_for_type (this_type);
+ }
+
write_char ('F');
/* We don't track whether or not a type is `extern "C"'. Note that
you can have an `extern "C"' function that does not have
@@ -1769,6 +1793,16 @@ write_expression (expr)
code = TREE_CODE (expr);
}
+ /* Skip NOP_EXPRs. They can occur when (say) a pointer argument
+ is converted (via qualification conversions) to another
+ type. */
+ while (TREE_CODE (expr) == NOP_EXPR
+ || TREE_CODE (expr) == NON_LVALUE_EXPR)
+ {
+ expr = TREE_OPERAND (expr, 0);
+ code = TREE_CODE (expr);
+ }
+
/* Handle template parameters. */
if (code == TEMPLATE_TYPE_PARM
|| code == TEMPLATE_TEMPLATE_PARM
@@ -1788,15 +1822,6 @@ write_expression (expr)
{
int i;
- /* Skip NOP_EXPRs. They can occur when (say) a pointer argument
- is converted (via qualification conversions) to another
- type. */
- while (TREE_CODE (expr) == NOP_EXPR)
- {
- expr = TREE_OPERAND (expr, 0);
- code = TREE_CODE (expr);
- }
-
/* When we bind a variable or function to a non-type template
argument with reference type, we create an ADDR_EXPR to show
the fact that the entity's address has been taken. But, we
@@ -2021,24 +2046,7 @@ write_pointer_to_member_type (type)
tree type;
{
write_char ('M');
- /* For a pointer-to-function member, the class type may be
- cv-qualified, but that won't be reflected in
- TYPE_PTRMEM_CLASS_TYPE. So, we go fishing around in
- TYPE_PTRMEM_POINTED_TO_TYPE instead. */
- if (TYPE_PTRMEMFUNC_P (type))
- {
- tree fn_type;
- tree this_type;
-
- fn_type = TYPE_PTRMEM_POINTED_TO_TYPE (type);
- /* The first parameter must be a POINTER_TYPE pointing to the
- `this' parameter. */
- this_type = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fn_type)));
- write_type (this_type);
- }
- /* For a pointer-to-data member, things are simpler. */
- else
- write_type (TYPE_PTRMEM_CLASS_TYPE (type));
+ write_type (TYPE_PTRMEM_CLASS_TYPE (type));
write_type (TYPE_PTRMEM_POINTED_TO_TYPE (type));
}
diff --git a/contrib/gcc/cp/method.c b/contrib/gcc/cp/method.c
index b0cc63a..e4af0ab 100644
--- a/contrib/gcc/cp/method.c
+++ b/contrib/gcc/cp/method.c
@@ -392,6 +392,12 @@ use_thunk (thunk_fndecl, emit_p)
push_to_top_level ();
+ /* The back-end expects DECL_INITIAL to contain a BLOCK, so we
+ create one. */
+ DECL_INITIAL (thunk_fndecl) = make_node (BLOCK);
+ BLOCK_VARS (DECL_INITIAL (thunk_fndecl))
+ = DECL_ARGUMENTS (thunk_fndecl);
+
#ifdef ASM_OUTPUT_MI_THUNK
if (!vcall_offset)
{
@@ -411,88 +417,83 @@ use_thunk (thunk_fndecl, emit_p)
}
else
#endif /* ASM_OUTPUT_MI_THUNK */
- {
- /* If we don't have the necessary macro for efficient thunks, generate a
- thunk function that just makes a call to the real function.
- Unfortunately, this doesn't work for varargs. */
-
- tree a, t;
-
- if (varargs_function_p (function))
- error ("generic thunk code fails for method `%#D' which uses `...'",
- function);
-
- /* Set up clone argument trees for the thunk. */
- t = NULL_TREE;
- for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a))
- {
- tree x = copy_node (a);
- TREE_CHAIN (x) = t;
- DECL_CONTEXT (x) = thunk_fndecl;
- t = x;
- }
- a = nreverse (t);
- DECL_ARGUMENTS (thunk_fndecl) = a;
- DECL_RESULT (thunk_fndecl) = NULL_TREE;
-
- start_function (NULL_TREE, thunk_fndecl, NULL_TREE, SF_PRE_PARSED);
- /* We don't bother with a body block for thunks. */
-
- /* Adjust the this pointer by the constant. */
- t = ssize_int (delta);
- t = fold (build (PLUS_EXPR, TREE_TYPE (a), a, t));
- /* If there's a vcall offset, look up that value in the vtable and
- adjust the `this' pointer again. */
- if (vcall_offset && !integer_zerop (vcall_offset))
- {
- tree orig_this;
-
- t = save_expr (t);
- orig_this = t;
- /* The vptr is always at offset zero in the object. */
- t = build1 (NOP_EXPR,
- build_pointer_type (build_pointer_type
- (vtable_entry_type)),
- t);
- /* Form the vtable address. */
- t = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t);
- /* Find the entry with the vcall offset. */
- t = build (PLUS_EXPR, TREE_TYPE (t), t, vcall_offset);
- /* Calculate the offset itself. */
- t = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t);
- /* Adjust the `this' pointer. */
- t = fold (build (PLUS_EXPR,
- TREE_TYPE (orig_this),
- orig_this,
- t));
- }
-
- /* Build up the call to the real function. */
- t = tree_cons (NULL_TREE, t, NULL_TREE);
- for (a = TREE_CHAIN (a); a; a = TREE_CHAIN (a))
- t = tree_cons (NULL_TREE, a, t);
- t = nreverse (t);
- t = build_call (function, t);
- if (VOID_TYPE_P (TREE_TYPE (t)))
- finish_expr_stmt (t);
- else
- finish_return_stmt (t);
+ {
+ /* If we don't have the necessary macro for efficient thunks, generate
+ a thunk function that just makes a call to the real function.
+ Unfortunately, this doesn't work for varargs. */
- /* The back-end expects DECL_INITIAL to contain a BLOCK, so we
- create one. */
- DECL_INITIAL (thunk_fndecl) = make_node (BLOCK);
- BLOCK_VARS (DECL_INITIAL (thunk_fndecl))
- = DECL_ARGUMENTS (thunk_fndecl);
+ tree a, t;
- /* Since we want to emit the thunk, we explicitly mark its name as
- referenced. */
- TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (thunk_fndecl)) = 1;
+ if (varargs_function_p (function))
+ error ("generic thunk code fails for method `%#D' which uses `...'",
+ function);
- /* But we don't want debugging information about it. */
- DECL_IGNORED_P (thunk_fndecl) = 1;
+ /* Set up clone argument trees for the thunk. */
+ t = NULL_TREE;
+ for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a))
+ {
+ tree x = copy_node (a);
+ TREE_CHAIN (x) = t;
+ DECL_CONTEXT (x) = thunk_fndecl;
+ t = x;
+ }
+ a = nreverse (t);
+ DECL_ARGUMENTS (thunk_fndecl) = a;
+ DECL_RESULT (thunk_fndecl) = NULL_TREE;
- expand_body (finish_function (0));
- }
+ start_function (NULL_TREE, thunk_fndecl, NULL_TREE, SF_PRE_PARSED);
+ /* We don't bother with a body block for thunks. */
+
+ /* Adjust the this pointer by the constant. */
+ t = ssize_int (delta);
+ t = fold (build (PLUS_EXPR, TREE_TYPE (a), a, t));
+
+ /* If there's a vcall offset, look up that value in the vtable and
+ adjust the `this' pointer again. */
+ if (vcall_offset && !integer_zerop (vcall_offset))
+ {
+ tree orig_this;
+
+ t = save_expr (t);
+ orig_this = t;
+ /* The vptr is always at offset zero in the object. */
+ t = build1 (NOP_EXPR,
+ build_pointer_type (build_pointer_type
+ (vtable_entry_type)),
+ t);
+ /* Form the vtable address. */
+ t = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t);
+ /* Find the entry with the vcall offset. */
+ t = build (PLUS_EXPR, TREE_TYPE (t), t, vcall_offset);
+ /* Calculate the offset itself. */
+ t = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t);
+ /* Adjust the `this' pointer. */
+ t = fold (build (PLUS_EXPR,
+ TREE_TYPE (orig_this),
+ orig_this,
+ t));
+ }
+
+ /* Build up the call to the real function. */
+ t = tree_cons (NULL_TREE, t, NULL_TREE);
+ for (a = TREE_CHAIN (a); a; a = TREE_CHAIN (a))
+ t = tree_cons (NULL_TREE, a, t);
+ t = nreverse (t);
+ t = build_call (function, t);
+ if (VOID_TYPE_P (TREE_TYPE (t)))
+ finish_expr_stmt (t);
+ else
+ finish_return_stmt (t);
+
+ /* Since we want to emit the thunk, we explicitly mark its name as
+ referenced. */
+ TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (thunk_fndecl)) = 1;
+
+ /* But we don't want debugging information about it. */
+ DECL_IGNORED_P (thunk_fndecl) = 1;
+
+ expand_body (finish_function (0));
+ }
pop_from_top_level ();
}
@@ -561,6 +562,7 @@ do_build_copy_constructor (fndecl)
{
tree init;
tree field = fields;
+ tree expr_type;
if (TREE_CODE (field) != FIELD_DECL)
continue;
@@ -583,9 +585,15 @@ do_build_copy_constructor (fndecl)
else
continue;
- init = build (COMPONENT_REF,
- build_qualified_type (TREE_TYPE (field), cvquals),
- init, field);
+ /* Compute the type of "init->field". If the copy-constructor
+ parameter is, for example, "const S&", and the type of
+ the field is "T", then the type will usually be "const
+ T". (There are no cv-qualified variants of reference
+ types.) */
+ expr_type = TREE_TYPE (field);
+ if (TREE_CODE (expr_type) != REFERENCE_TYPE)
+ expr_type = cp_build_qualified_type (expr_type, cvquals);
+ init = build (COMPONENT_REF, expr_type, init, field);
init = build_tree_list (NULL_TREE, init);
member_init_list
@@ -635,7 +643,7 @@ do_build_assign_ref (fndecl)
tree expr = build_method_call (dst,
ansi_assopname (NOP_EXPR),
build_tree_list (NULL_TREE, src),
- NULL,
+ binfo,
LOOKUP_NORMAL | LOOKUP_NONVIRTUAL);
finish_expr_stmt (expr);
}
@@ -769,8 +777,9 @@ synthesize_method (fndecl)
/* Use EXTRACTOR to locate the relevant function called for each base &
class field of TYPE. CLIENT allows additional information to be passed
- to EXTRACTOR. Generates the union of all exceptions generated by
- those functions. */
+ to EXTRACTOR. Generates the union of all exceptions generated by those
+ functions. Note that we haven't updated TYPE_FIELDS and such of any
+ variants yet, so we need to look at the main one. */
static tree
synthesize_exception_spec (type, extractor, client)
@@ -782,7 +791,7 @@ synthesize_exception_spec (type, extractor, client)
tree fields = TYPE_FIELDS (type);
int i, n_bases = CLASSTYPE_N_BASECLASSES (type);
tree binfos = TYPE_BINFO_BASETYPES (type);
-
+
for (i = 0; i != n_bases; i++)
{
tree base = BINFO_TYPE (TREE_VEC_ELT (binfos, i));
@@ -961,7 +970,7 @@ implicitly_declare_fn (kind, type, const_p)
case sfk_assignment_operator:
{
struct copy_data data;
- tree argtype;
+ tree argtype = type;
has_parm = 1;
data.name = NULL;
@@ -977,10 +986,10 @@ implicitly_declare_fn (kind, type, const_p)
if (const_p)
{
data.quals = TYPE_QUAL_CONST;
- type = build_qualified_type (type, TYPE_QUAL_CONST);
+ argtype = build_qualified_type (argtype, TYPE_QUAL_CONST);
}
- argtype = build_reference_type (type);
+ argtype = build_reference_type (argtype);
args = build_tree_list (hash_tree_chain (argtype, NULL_TREE),
get_identifier ("_ctor_arg"));
args = tree_cons (NULL_TREE, args, void_list_node);
diff --git a/contrib/gcc/cp/parse.y b/contrib/gcc/cp/parse.y
index 7941a89..d1e3761 100644
--- a/contrib/gcc/cp/parse.y
+++ b/contrib/gcc/cp/parse.y
@@ -87,7 +87,8 @@ static tree parse_field PARAMS ((tree, tree, tree, tree));
static tree parse_bitfield0 PARAMS ((tree, tree, tree, tree, tree));
static tree parse_bitfield PARAMS ((tree, tree, tree));
static tree parse_method PARAMS ((tree, tree, tree));
-static void frob_specs PARAMS ((tree, tree));
+static void frob_specs PARAMS ((tree, tree));
+static void check_class_key PARAMS ((tree, tree));
/* Cons up an empty parameter list. */
static inline tree
@@ -208,6 +209,19 @@ parse_method (declarator, specs_attrs, lookups)
return d;
}
+static void
+check_class_key (key, aggr)
+ tree key;
+ tree aggr;
+{
+ if (TREE_CODE (key) == TREE_LIST)
+ key = TREE_VALUE (key);
+ if ((key == union_type_node) != (TREE_CODE (aggr) == UNION_TYPE))
+ pedwarn ("`%s' tag used in naming `%#T'",
+ key == union_type_node ? "union"
+ : key == record_type_node ? "struct" : "class", aggr);
+}
+
void
cp_parse_init ()
{
@@ -584,6 +598,7 @@ namespace_qualifier:
$$ = lastiddecl;
got_scope = $$;
}
+ ;
any_id:
unqualified_id
@@ -633,6 +648,7 @@ maybe_identifier:
{ $$ = $1; }
| /* empty */
{ $$ = NULL_TREE; }
+ ;
template_type_parm:
aggr maybe_identifier
@@ -1030,9 +1046,11 @@ explicit_instantiation:
begin_explicit_instantiation:
{ begin_explicit_instantiation(); }
+ ;
end_explicit_instantiation:
{ end_explicit_instantiation(); }
+ ;
/* The TYPENAME expansions are to deal with use of a template class name as
a template within the class itself, where the template decl is hidden by
@@ -1053,6 +1071,7 @@ apparent_template_type:
| identifier '<' template_arg_list_opt '>'
.finish_template_type
{ $$ = $5; }
+ ;
self_template_type:
SELFNAME '<' template_arg_list_opt template_close_bracket
@@ -1068,6 +1087,7 @@ self_template_type:
$$ = finish_template_type ($<ttype>-3, $<ttype>-1,
yychar == SCOPE);
}
+ ;
template_close_bracket:
'>'
@@ -1487,6 +1507,7 @@ do_id:
else
$$ = $<ttype>-1;
}
+ ;
template_id:
PFUNCNAME '<' do_id template_arg_list_opt template_close_bracket
@@ -1592,7 +1613,7 @@ primary:
pedwarn ("ISO C++ forbids braced-groups within expressions");
$<ttype>$ = begin_stmt_expr ();
}
- compstmt ')'
+ compstmt_or_stmtexpr ')'
{ $$ = finish_stmt_expr ($<ttype>2); }
/* Koenig lookup support
We could store lastiddecl in $1 to avoid another lookup,
@@ -1717,7 +1738,7 @@ primary_no_id:
YYERROR;
}
$<ttype>$ = expand_start_stmt_expr (); }
- compstmt ')'
+ compstmt_or_stmtexpr ')'
{ if (pedantic)
pedwarn ("ISO C++ forbids braced-groups within expressions");
$$ = expand_end_stmt_expr ($<ttype>2); }
@@ -1895,10 +1916,6 @@ reserved_declspecs:
warning ("`%s' is not at beginning of declaration",
IDENTIFIER_POINTER ($2));
$$ = tree_cons (NULL_TREE, $2, $$); }
- | reserved_declspecs attributes
- { $$ = tree_cons ($2, NULL_TREE, $1); }
- | attributes
- { $$ = tree_cons ($1, NULL_TREE, NULL_TREE); }
;
/* List of just storage classes and type modifiers.
@@ -1966,6 +1983,10 @@ reserved_typespecquals:
{ $$ = build_tree_list (NULL_TREE, $1.t); }
| reserved_typespecquals typespecqual_reserved
{ $$ = tree_cons (NULL_TREE, $2.t, $1); }
+ | reserved_typespecquals attributes
+ { $$ = tree_cons ($2, NULL_TREE, $1); }
+ | attributes %prec EMPTY
+ { $$ = tree_cons ($1, NULL_TREE, NULL_TREE); }
;
/* A typespec (but not a type qualifier).
@@ -2098,7 +2119,7 @@ notype_initdcl0:
nomods_initdcl0:
notype_declarator maybeasm
{ /* Set things up as initdcl0_innards expects. */
- $<ttype>3 = $2;
+ $<ttype>$ = $2;
$2 = $1;
$<ftype>1.t = NULL_TREE;
$<ftype>1.lookups = NULL_TREE; }
@@ -2173,6 +2194,7 @@ maybe_init:
{ $$ = NULL_TREE; }
| '=' init
{ $$ = $2; }
+ ;
/* If we are processing a template, we don't want to expand this
initializer yet. */
@@ -2237,6 +2259,7 @@ defarg_again:
{ replace_defarg ($1, $2); }
| DEFARG_MARKER error END_OF_SAVED_INPUT
{ replace_defarg ($1, error_mark_node); }
+ ;
pending_defargs:
/* empty */ %prec EMPTY
@@ -2292,6 +2315,7 @@ structsp:
xref_basetypes (current_aggr, $1.t, type, $2);
}
$1.t = begin_class_definition (TREE_TYPE ($1.t));
+ check_class_key (current_aggr, $1.t);
current_aggr = NULL_TREE; }
opt.component_decl_list '}' maybe_attribute
{
@@ -2326,6 +2350,7 @@ structsp:
{
$$.t = TREE_TYPE ($1.t);
$$.new_type_flag = $1.new_type_flag;
+ check_class_key (current_aggr, $$.t);
}
;
@@ -2666,6 +2691,7 @@ component_decl_1:
{ $$ = grokfield ($$, NULL_TREE, $4, $2, $3); }
| using_decl
{ $$ = do_class_using_decl ($1); }
+ ;
/* The case of exactly one component is handled directly by component_decl. */
/* ??? Huh? ^^^ */
@@ -3029,14 +3055,14 @@ nested_name_specifier:
{ $$ = $2; }
| nested_name_specifier TEMPLATE explicit_template_type SCOPE
{ got_scope = $$
- = make_typename_type ($1, $3, /*complain=*/1); }
+ = make_typename_type ($1, $3, tf_error); }
/* Error handling per Core 125. */
| nested_name_specifier IDENTIFIER SCOPE
{ got_scope = $$
- = make_typename_type ($1, $2, /*complain=*/1); }
+ = make_typename_type ($1, $2, tf_error); }
| nested_name_specifier PTYPENAME SCOPE
{ got_scope = $$
- = make_typename_type ($1, $2, /*complain=*/1); }
+ = make_typename_type ($1, $2, tf_error); }
;
/* Why the @#$%^& do type_name and notype_identifier need to be expanded
@@ -3078,7 +3104,7 @@ typename_sub0:
typename_sub1 identifier %prec EMPTY
{
if (TYPE_P ($1))
- $$ = make_typename_type ($1, $2, /*complain=*/1);
+ $$ = make_typename_type ($1, $2, tf_error);
else if (TREE_CODE ($2) == IDENTIFIER_NODE)
error ("`%T' is not a class or namespace", $2);
else
@@ -3091,9 +3117,9 @@ typename_sub0:
| typename_sub1 template_type %prec EMPTY
{ $$ = TREE_TYPE ($2); }
| typename_sub1 explicit_template_type %prec EMPTY
- { $$ = make_typename_type ($1, $2, /*complain=*/1); }
+ { $$ = make_typename_type ($1, $2, tf_error); }
| typename_sub1 TEMPLATE explicit_template_type %prec EMPTY
- { $$ = make_typename_type ($1, $3, /*complain=*/1); }
+ { $$ = make_typename_type ($1, $3, tf_error); }
;
typename_sub1:
@@ -3107,7 +3133,7 @@ typename_sub1:
| typename_sub1 typename_sub2
{
if (TYPE_P ($1))
- $$ = make_typename_type ($1, $2, /*complain=*/1);
+ $$ = make_typename_type ($1, $2, tf_error);
else if (TREE_CODE ($2) == IDENTIFIER_NODE)
error ("`%T' is not a class or namespace", $2);
else
@@ -3119,10 +3145,10 @@ typename_sub1:
}
| typename_sub1 explicit_template_type SCOPE
{ got_scope = $$
- = make_typename_type ($1, $2, /*complain=*/1); }
+ = make_typename_type ($1, $2, tf_error); }
| typename_sub1 TEMPLATE explicit_template_type SCOPE
{ got_scope = $$
- = make_typename_type ($1, $3, /*complain=*/1); }
+ = make_typename_type ($1, $3, tf_error); }
;
/* This needs to return a TYPE_DECL for simple names so that we don't
@@ -3324,7 +3350,7 @@ label_decl:
}
;
-compstmt:
+compstmt_or_stmtexpr:
save_lineno '{'
{ $<ttype>$ = begin_compound_stmt (0); }
compstmtend
@@ -3332,6 +3358,11 @@ compstmt:
finish_compound_stmt (0, $<ttype>3); }
;
+compstmt:
+ compstmt_or_stmtexpr
+ { last_expr_type = NULL_TREE; }
+ ;
+
simple_if:
IF
{ $<ttype>$ = begin_if_stmt ();
diff --git a/contrib/gcc/cp/pt.c b/contrib/gcc/cp/pt.c
index 5084f72..989cf1a 100644
--- a/contrib/gcc/cp/pt.c
+++ b/contrib/gcc/cp/pt.c
@@ -93,30 +93,32 @@ static htab_t local_specializations;
type with the desired type. */
static int resolve_overloaded_unification PARAMS ((tree, tree, tree, tree,
- unification_kind_t, int));
+ unification_kind_t, int));
static int try_one_overload PARAMS ((tree, tree, tree, tree, tree,
- unification_kind_t, int));
+ unification_kind_t, int));
static int unify PARAMS ((tree, tree, tree, tree, int));
static void add_pending_template PARAMS ((tree));
static void reopen_tinst_level PARAMS ((tree));
static tree classtype_mangled_name PARAMS ((tree));
-static char *mangle_class_name_for_template PARAMS ((const char *, tree, tree));
+static char *mangle_class_name_for_template PARAMS ((const char *,
+ tree, tree));
static tree tsubst_initializer_list PARAMS ((tree, tree));
static int list_eq PARAMS ((tree, tree));
static tree get_class_bindings PARAMS ((tree, tree, tree));
-static tree coerce_template_parms PARAMS ((tree, tree, tree, int, int));
+static tree coerce_template_parms PARAMS ((tree, tree, tree,
+ tsubst_flags_t, int));
static void tsubst_enum PARAMS ((tree, tree, tree));
static tree add_to_template_args PARAMS ((tree, tree));
static tree add_outermost_template_args PARAMS ((tree, tree));
static int maybe_adjust_types_for_deduction PARAMS ((unification_kind_t, tree*,
- tree*));
+ tree*));
static int type_unification_real PARAMS ((tree, tree, tree, tree,
- int, unification_kind_t, int, int));
+ int, unification_kind_t, int, int));
static void note_template_header PARAMS ((int));
static tree maybe_fold_nontype_arg PARAMS ((tree));
static tree convert_nontype_argument PARAMS ((tree, tree));
-static tree convert_template_argument PARAMS ((tree, tree, tree, int,
- int , tree));
+static tree convert_template_argument PARAMS ((tree, tree, tree,
+ tsubst_flags_t, int, tree));
static tree get_bindings_overload PARAMS ((tree, tree, tree));
static int for_each_template_parm PARAMS ((tree, tree_fn_t, void*));
static tree build_template_parm_index PARAMS ((int, int, int, tree, tree));
@@ -136,35 +138,36 @@ static tree get_bindings_real PARAMS ((tree, tree, tree, int, int, int));
static int template_decl_level PARAMS ((tree));
static tree maybe_get_template_decl_from_type_decl PARAMS ((tree));
static int check_cv_quals_for_unify PARAMS ((int, tree, tree));
-static tree tsubst_template_arg_vector PARAMS ((tree, tree, int));
-static tree tsubst_template_parms PARAMS ((tree, tree, int));
+static tree tsubst_template_arg_vector PARAMS ((tree, tree, tsubst_flags_t));
+static tree tsubst_template_parms PARAMS ((tree, tree, tsubst_flags_t));
static void regenerate_decl_from_template PARAMS ((tree, tree));
static tree most_specialized PARAMS ((tree, tree, tree));
static tree most_specialized_class PARAMS ((tree, tree));
static int template_class_depth_real PARAMS ((tree, int));
-static tree tsubst_aggr_type PARAMS ((tree, tree, int, tree, int));
-static tree tsubst_decl PARAMS ((tree, tree, tree));
-static tree tsubst_arg_types PARAMS ((tree, tree, int, tree));
-static tree tsubst_function_type PARAMS ((tree, tree, int, tree));
+static tree tsubst_aggr_type PARAMS ((tree, tree, tsubst_flags_t, tree, int));
+static tree tsubst_decl PARAMS ((tree, tree, tree, tsubst_flags_t));
+static tree tsubst_arg_types PARAMS ((tree, tree, tsubst_flags_t, tree));
+static tree tsubst_function_type PARAMS ((tree, tree, tsubst_flags_t, tree));
static void check_specialization_scope PARAMS ((void));
static tree process_partial_specialization PARAMS ((tree));
static void set_current_access_from_decl PARAMS ((tree));
static void check_default_tmpl_args PARAMS ((tree, tree, int, int));
-static tree tsubst_call_declarator_parms PARAMS ((tree, tree, int, tree));
+static tree tsubst_call_declarator_parms PARAMS ((tree, tree,
+ tsubst_flags_t, tree));
static tree get_template_base_recursive PARAMS ((tree, tree,
- tree, tree, tree, int));
+ tree, tree, tree, int));
static tree get_template_base PARAMS ((tree, tree, tree, tree));
static int verify_class_unification PARAMS ((tree, tree, tree));
static tree try_class_unification PARAMS ((tree, tree, tree, tree));
-static int coerce_template_template_parms PARAMS ((tree, tree, int,
- tree, tree));
+static int coerce_template_template_parms PARAMS ((tree, tree, tsubst_flags_t,
+ tree, tree));
static tree determine_specialization PARAMS ((tree, tree, tree *, int));
static int template_args_equal PARAMS ((tree, tree));
static void tsubst_default_arguments PARAMS ((tree));
static tree for_each_template_parm_r PARAMS ((tree *, int *, void *));
static tree copy_default_args_to_explicit_spec_1 PARAMS ((tree, tree));
static void copy_default_args_to_explicit_spec PARAMS ((tree));
-static int invalid_nontype_parm_type_p PARAMS ((tree, int));
+static int invalid_nontype_parm_type_p PARAMS ((tree, tsubst_flags_t));
/* Called once to initialize pt.c. */
@@ -2571,7 +2574,9 @@ push_template_decl_real (decl, is_friend)
if (!ctx
|| TREE_CODE (ctx) == FUNCTION_DECL
- || TYPE_BEING_DEFINED (ctx)
+ || (TREE_CODE (ctx) != TEMPLATE_TYPE_PARM
+ && TREE_CODE (ctx) != BOUND_TEMPLATE_TEMPLATE_PARM
+ && TYPE_BEING_DEFINED (ctx))
|| (is_friend && !DECL_TEMPLATE_INFO (decl)))
{
if (DECL_LANG_SPECIFIC (decl)
@@ -3011,7 +3016,7 @@ convert_nontype_argument (type, expr)
else
fns = expr;
- fn = instantiate_type (type_pointed_to, fns, itf_none);
+ fn = instantiate_type (type_pointed_to, fns, tf_none);
if (fn == error_mark_node)
return error_mark_node;
@@ -3076,7 +3081,7 @@ convert_nontype_argument (type, expr)
set (_over.over_). */
tree fn;
- fn = instantiate_type (type_referred_to, expr, itf_none);
+ fn = instantiate_type (type_referred_to, expr, tf_none);
if (fn == error_mark_node)
return error_mark_node;
@@ -3145,7 +3150,7 @@ convert_nontype_argument (type, expr)
if (TREE_CODE (expr) != ADDR_EXPR)
return error_mark_node;
- expr = instantiate_type (type, expr, itf_none);
+ expr = instantiate_type (type, expr, tf_none);
if (expr == error_mark_node)
return error_mark_node;
@@ -3186,7 +3191,7 @@ static int
coerce_template_template_parms (parm_parms, arg_parms, complain,
in_decl, outer_args)
tree parm_parms, arg_parms;
- int complain;
+ tsubst_flags_t complain;
tree in_decl, outer_args;
{
int nparms, nargs, i;
@@ -3255,17 +3260,17 @@ coerce_template_template_parms (parm_parms, arg_parms, complain,
/* Convert the indicated template ARG as necessary to match the
indicated template PARM. Returns the converted ARG, or
- error_mark_node if the conversion was unsuccessful. Error messages
- are issued if COMPLAIN is non-zero. This conversion is for the Ith
- parameter in the parameter list. ARGS is the full set of template
- arguments deduced so far. */
+ error_mark_node if the conversion was unsuccessful. Error and
+ warning messages are issued under control of COMPLAIN. This
+ conversion is for the Ith parameter in the parameter list. ARGS is
+ the full set of template arguments deduced so far. */
static tree
convert_template_argument (parm, arg, args, complain, i, in_decl)
tree parm;
tree arg;
tree args;
- int complain;
+ tsubst_flags_t complain;
int i;
tree in_decl;
{
@@ -3329,14 +3334,14 @@ convert_template_argument (parm, arg, args, complain, i, in_decl)
arg = make_typename_type (TREE_OPERAND (arg, 0),
TREE_OPERAND (arg, 1),
- complain);
+ complain & tf_error);
is_type = 1;
}
if (is_type != requires_type)
{
if (in_decl)
{
- if (complain)
+ if (complain & tf_error)
{
error ("type/value mismatch at argument %d in template parameter list for `%D'",
i + 1, in_decl);
@@ -3352,7 +3357,7 @@ convert_template_argument (parm, arg, args, complain, i, in_decl)
}
if (is_tmpl_type ^ requires_tmpl_type)
{
- if (in_decl && complain)
+ if (in_decl && (complain & tf_error))
{
error ("type/value mismatch at argument %d in template parameter list for `%D'",
i + 1, in_decl);
@@ -3391,7 +3396,7 @@ convert_template_argument (parm, arg, args, complain, i, in_decl)
}
else
{
- if (in_decl && complain)
+ if (in_decl && (complain & tf_error))
{
error ("type/value mismatch at argument %d in template parameter list for `%D'",
i + 1, in_decl);
@@ -3454,7 +3459,7 @@ convert_template_argument (parm, arg, args, complain, i, in_decl)
if (val == NULL_TREE)
val = error_mark_node;
- else if (val == error_mark_node && complain)
+ else if (val == error_mark_node && (complain & tf_error))
error ("could not convert template argument `%E' to `%T'",
arg, t);
}
@@ -3464,10 +3469,10 @@ convert_template_argument (parm, arg, args, complain, i, in_decl)
/* Convert all template arguments to their appropriate types, and
return a vector containing the innermost resulting template
- arguments. If any error occurs, return error_mark_node, and, if
- COMPLAIN is non-zero, issue an error message. Some error messages
- are issued even if COMPLAIN is zero; for instance, if a template
- argument is composed from a local class.
+ arguments. If any error occurs, return error_mark_node. Error and
+ warning messages are issued under control of COMPLAIN. Some error
+ messages are issued even if COMPLAIN is zero; for instance, if a
+ template argument is composed from a local class.
If REQUIRE_ALL_ARGUMENTS is non-zero, all arguments must be
provided in ARGLIST, or else trailing parameters must have default
@@ -3480,7 +3485,7 @@ coerce_template_parms (parms, args, in_decl,
require_all_arguments)
tree parms, args;
tree in_decl;
- int complain;
+ tsubst_flags_t complain;
int require_all_arguments;
{
int nparms, nargs, i, lost = 0;
@@ -3497,7 +3502,7 @@ coerce_template_parms (parms, args, in_decl,
&& require_all_arguments
&& TREE_PURPOSE (TREE_VEC_ELT (parms, nargs)) == NULL_TREE))
{
- if (complain)
+ if (complain & tf_error)
{
error ("wrong number of template arguments (%d, should be %d)",
nargs, nparms);
@@ -3829,7 +3834,7 @@ maybe_get_template_decl_from_type_decl (decl)
If ENTERING_SCOPE is non-zero, we are about to enter the scope of
the class we are looking up.
- If COMPLAIN is non-zero, issue error messages.
+ Issue error and warning messages under control of COMPLAIN.
If the template class is really a local class in a template
function, then the FUNCTION_CONTEXT is the function in which it is
@@ -3841,7 +3846,7 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope, complain)
tree in_decl;
tree context;
int entering_scope;
- int complain;
+ tsubst_flags_t complain;
{
tree template = NULL_TREE, parmlist;
tree t;
@@ -3899,7 +3904,7 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope, complain)
crash. Alternatively D1 might not be a template type at all. */
if (! template)
{
- if (complain)
+ if (complain & tf_error)
error ("`%T' is not a template", d1);
return error_mark_node;
}
@@ -3911,7 +3916,7 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope, complain)
&& !DECL_TEMPLATE_PARM_P (template)
&& !PRIMARY_TEMPLATE_P (template)))
{
- if (complain)
+ if (complain & tf_error)
{
error ("non-template type `%T' used as a template", d1);
if (in_decl)
@@ -4109,7 +4114,7 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope, complain)
}
context = tsubst (DECL_CONTEXT (template), arglist,
- /*complain=*/0, in_decl);
+ complain, in_decl);
if (!context)
context = global_namespace;
@@ -4216,7 +4221,7 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope, complain)
Create the partial instantiation.
*/
TREE_VEC_LENGTH (arglist)--;
- found = tsubst (template, arglist, /*complain=*/0, NULL_TREE);
+ found = tsubst (template, arglist, complain, NULL_TREE);
TREE_VEC_LENGTH (arglist)++;
}
}
@@ -4583,20 +4588,20 @@ tsubst_friend_function (decl, args)
tree template_id, arglist, fns;
tree new_args;
tree tmpl;
- tree ns = CP_DECL_CONTEXT (TYPE_MAIN_DECL (current_class_type));
+ tree ns = decl_namespace_context (TYPE_MAIN_DECL (current_class_type));
/* Friend functions are looked up in the containing namespace scope.
We must enter that scope, to avoid finding member functions of the
current cless with same name. */
push_nested_namespace (ns);
fns = tsubst_expr (DECL_TI_TEMPLATE (decl), args,
- /*complain=*/1, NULL_TREE);
+ tf_error | tf_warning, NULL_TREE);
pop_nested_namespace (ns);
arglist = tsubst (DECL_TI_ARGS (decl), args,
- /*complain=*/1, NULL_TREE);
+ tf_error | tf_warning, NULL_TREE);
template_id = lookup_template_function (fns, arglist);
- new_friend = tsubst (decl, args, /*complain=*/1, NULL_TREE);
+ new_friend = tsubst (decl, args, tf_error | tf_warning, NULL_TREE);
tmpl = determine_specialization (template_id, new_friend,
&new_args,
/*need_member_template=*/0);
@@ -4604,7 +4609,7 @@ tsubst_friend_function (decl, args)
goto done;
}
- new_friend = tsubst (decl, args, /*complain=*/1, NULL_TREE);
+ new_friend = tsubst (decl, args, tf_error | tf_warning, NULL_TREE);
/* The NEW_FRIEND will look like an instantiation, to the
compiler, but is not an instantiation from the point of view of
@@ -4791,16 +4796,27 @@ tsubst_friend_class (friend_tmpl, args)
{
tree friend_type;
tree tmpl;
+ tree context;
+
+ context = DECL_CONTEXT (friend_tmpl);
+
+ if (context)
+ {
+ if (TREE_CODE (context) == NAMESPACE_DECL)
+ push_nested_namespace (context);
+ else
+ push_nested_class (context, 2);
+ }
/* First, we look for a class template. */
tmpl = lookup_name (DECL_NAME (friend_tmpl), /*prefer_type=*/0);
-
+
/* But, if we don't find one, it might be because we're in a
situation like this:
template <class T>
struct S {
- template <class U>
+ template <class U>
friend struct S;
};
@@ -4820,12 +4836,15 @@ tsubst_friend_class (friend_tmpl, args)
of course. We only need the innermost template parameters
because that is all that redeclare_class_template will look
at. */
- tree parms
- = tsubst_template_parms (DECL_TEMPLATE_PARMS (friend_tmpl),
- args, /*complain=*/1);
- if (!parms)
- return error_mark_node;
- redeclare_class_template (TREE_TYPE (tmpl), parms);
+ if (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (friend_tmpl))
+ > TMPL_ARGS_DEPTH (args))
+ {
+ tree parms;
+ parms = tsubst_template_parms (DECL_TEMPLATE_PARMS (friend_tmpl),
+ args, tf_error | tf_warning);
+ redeclare_class_template (TREE_TYPE (tmpl), parms);
+ }
+
friend_type = TREE_TYPE (tmpl);
}
else
@@ -4833,7 +4852,7 @@ tsubst_friend_class (friend_tmpl, args)
/* The friend template has not already been declared. In this
case, the instantiation of the template class will cause the
injection of this template into the global scope. */
- tmpl = tsubst (friend_tmpl, args, /*complain=*/1, NULL_TREE);
+ tmpl = tsubst (friend_tmpl, args, tf_error | tf_warning, NULL_TREE);
/* The new TMPL is not an instantiation of anything, so we
forget its origins. We don't reset CLASSTYPE_TI_TEMPLATE for
@@ -4847,6 +4866,14 @@ tsubst_friend_class (friend_tmpl, args)
friend_type = TREE_TYPE (pushdecl_top_level (tmpl));
}
+ if (context)
+ {
+ if (TREE_CODE (context) == NAMESPACE_DECL)
+ pop_nested_namespace (context);
+ else
+ pop_nested_class ();
+ }
+
return friend_type;
}
@@ -5060,8 +5087,7 @@ instantiate_class_template (type)
pbase = TREE_VEC_ELT (pbases, i);
/* Substitute to figure out the base class. */
- base = tsubst (BINFO_TYPE (pbase), args,
- /*complain=*/1, NULL_TREE);
+ base = tsubst (BINFO_TYPE (pbase), args, tf_error, NULL_TREE);
if (base == error_mark_node)
continue;
@@ -5115,7 +5141,7 @@ instantiate_class_template (type)
tree name = TYPE_IDENTIFIER (tag);
tree newtag;
- newtag = tsubst (tag, args, /*complain=*/1, NULL_TREE);
+ newtag = tsubst (tag, args, tf_error, NULL_TREE);
my_friendly_assert (newtag != error_mark_node, 20010206);
if (TREE_CODE (newtag) != ENUMERAL_TYPE)
{
@@ -5153,14 +5179,14 @@ instantiate_class_template (type)
lineno = DECL_SOURCE_LINE (t);
input_filename = DECL_SOURCE_FILE (t);
- r = tsubst (t, args, /*complain=*/1, NULL_TREE);
+ r = tsubst (t, args, tf_error | tf_warning, NULL_TREE);
if (TREE_CODE (r) == VAR_DECL)
{
tree init;
if (DECL_INITIALIZED_IN_CLASS_P (r))
init = tsubst_expr (DECL_INITIAL (t), args,
- /*complain=*/1, NULL_TREE);
+ tf_error | tf_warning, NULL_TREE);
else
init = NULL_TREE;
@@ -5188,7 +5214,7 @@ instantiate_class_template (type)
for this instantiation. */
for (t = TYPE_METHODS (pattern); t; t = TREE_CHAIN (t))
{
- tree r = tsubst (t, args, /*complain=*/1, NULL_TREE);
+ tree r = tsubst (t, args, tf_error, NULL_TREE);
set_current_access_from_decl (r);
grok_special_member_properties (r);
finish_member_declaration (r);
@@ -5223,8 +5249,8 @@ instantiate_class_template (type)
if (TREE_CODE (friend_type) == TEMPLATE_DECL)
new_friend_type = tsubst_friend_class (friend_type, args);
else if (uses_template_parms (friend_type))
- new_friend_type = tsubst (friend_type, args, /*complain=*/1,
- NULL_TREE);
+ new_friend_type = tsubst (friend_type, args,
+ tf_error | tf_warning, NULL_TREE);
else
{
tree ns = decl_namespace_context (TYPE_MAIN_DECL (friend_type));
@@ -5348,7 +5374,7 @@ static tree
tsubst_template_arg_vector (t, args, complain)
tree t;
tree args;
- int complain;
+ tsubst_flags_t complain;
{
int len = TREE_VEC_LENGTH (t), need_new = 0, i;
tree *elts = (tree *) alloca (len * sizeof (tree));
@@ -5394,7 +5420,7 @@ static tree
tsubst_template_parms (parms, args, complain)
tree parms;
tree args;
- int complain;
+ tsubst_flags_t complain;
{
tree r = NULL_TREE;
tree* new_parms;
@@ -5441,7 +5467,7 @@ static tree
tsubst_aggr_type (t, args, complain, in_decl, entering_scope)
tree t;
tree args;
- int complain;
+ tsubst_flags_t complain;
tree in_decl;
int entering_scope;
{
@@ -5489,8 +5515,7 @@ tsubst_aggr_type (t, args, complain, in_decl, entering_scope)
r = lookup_template_class (t, argvec, in_decl, context,
entering_scope, complain);
- return cp_build_qualified_type_real (r, TYPE_QUALS (t),
- complain);
+ return cp_build_qualified_type_real (r, TYPE_QUALS (t), complain);
}
else
/* This is not a template type, so there's nothing to do. */
@@ -5525,7 +5550,8 @@ tsubst_default_argument (fn, type, arg)
if (DECL_CLASS_SCOPE_P (fn))
pushclass (DECL_CONTEXT (fn), 2);
- arg = tsubst_expr (arg, DECL_TI_ARGS (fn), /*complain=*/1, NULL_TREE);
+ arg = tsubst_expr (arg, DECL_TI_ARGS (fn),
+ tf_error | tf_warning, NULL_TREE);
if (DECL_CLASS_SCOPE_P (fn))
popclass ();
@@ -5563,19 +5589,23 @@ tsubst_default_arguments (fn)
/* Substitute the ARGS into the T, which is a _DECL. TYPE is the
(already computed) substitution of ARGS into TREE_TYPE (T), if
- appropriate. Return the result of the substitution. */
+ appropriate. Return the result of the substitution. Issue error
+ and warning messages under control of COMPLAIN. */
static tree
-tsubst_decl (t, args, type)
+tsubst_decl (t, args, type, complain)
tree t;
tree args;
tree type;
+ tsubst_flags_t complain;
{
int saved_lineno;
const char *saved_filename;
tree r = NULL_TREE;
tree in_decl = t;
+ my_friendly_assert (complain & tf_error, 20011214);
+
/* Set the filename and linenumber to improve error-reporting. */
saved_lineno = lineno;
saved_filename = input_filename;
@@ -5604,7 +5634,7 @@ tsubst_decl (t, args, type)
tree full_args;
full_args = tsubst_template_arg_vector (tmpl_args, args,
- /*complain=*/1);
+ complain);
/* tsubst_template_arg_vector doesn't copy the vector if
nothing changed. But, *something* should have
@@ -5630,7 +5660,7 @@ tsubst_decl (t, args, type)
if (is_template_template_parm)
{
- tree new_decl = tsubst (decl, args, /*complain=*/1, in_decl);
+ tree new_decl = tsubst (decl, args, complain, in_decl);
DECL_TEMPLATE_RESULT (r) = new_decl;
TREE_TYPE (r) = TREE_TYPE (new_decl);
break;
@@ -5638,18 +5668,17 @@ tsubst_decl (t, args, type)
DECL_CONTEXT (r)
= tsubst_aggr_type (DECL_CONTEXT (t), args,
- /*complain=*/1, in_decl,
+ complain, in_decl,
/*entering_scope=*/1);
DECL_VIRTUAL_CONTEXT (r)
= tsubst_aggr_type (DECL_VIRTUAL_CONTEXT (t), args,
- /*complain=*/1, in_decl,
+ complain, in_decl,
/*entering_scope=*/1);
DECL_TEMPLATE_INFO (r) = build_tree_list (t, args);
if (TREE_CODE (decl) == TYPE_DECL)
{
- tree new_type = tsubst (TREE_TYPE (t), args,
- /*complain=*/1, in_decl);
+ tree new_type = tsubst (TREE_TYPE (t), args, complain, in_decl);
TREE_TYPE (r) = new_type;
CLASSTYPE_TI_TEMPLATE (new_type) = r;
DECL_TEMPLATE_RESULT (r) = TYPE_MAIN_DECL (new_type);
@@ -5657,7 +5686,7 @@ tsubst_decl (t, args, type)
}
else
{
- tree new_decl = tsubst (decl, args, /*complain=*/1, in_decl);
+ tree new_decl = tsubst (decl, args, complain, in_decl);
DECL_TEMPLATE_RESULT (r) = new_decl;
DECL_TI_TEMPLATE (new_decl) = r;
@@ -5674,7 +5703,7 @@ tsubst_decl (t, args, type)
outermost level of parameters. */
DECL_TEMPLATE_PARMS (r)
= tsubst_template_parms (DECL_TEMPLATE_PARMS (t), args,
- /*complain=*/1);
+ complain);
if (PRIMARY_TEMPLATE_P (t))
DECL_PRIMARY_TEMPLATE (r) = r;
@@ -5714,7 +5743,7 @@ tsubst_decl (t, args, type)
argvec
= tsubst_template_arg_vector (DECL_TI_ARGS
(DECL_TEMPLATE_RESULT (gen_tmpl)),
- args, /*complain=*/1);
+ args, complain);
/* Check to see if we already have this specialization. */
spec = retrieve_specialization (gen_tmpl, argvec);
@@ -5791,7 +5820,7 @@ tsubst_decl (t, args, type)
else
member = 1;
ctx = tsubst_aggr_type (DECL_CONTEXT (t), args,
- /*complain=*/1, t,
+ complain, t,
/*entering_scope=*/1);
}
else
@@ -5799,7 +5828,7 @@ tsubst_decl (t, args, type)
member = 0;
ctx = DECL_CONTEXT (t);
}
- type = tsubst (type, args, /*complain=*/1, in_decl);
+ type = tsubst (type, args, complain, in_decl);
if (type == error_mark_node)
return error_mark_node;
@@ -5817,7 +5846,7 @@ tsubst_decl (t, args, type)
DECL_CONTEXT (r) = ctx;
DECL_VIRTUAL_CONTEXT (r)
= tsubst_aggr_type (DECL_VIRTUAL_CONTEXT (t), args,
- /*complain=*/1, t,
+ complain, t,
/*entering_scope=*/1);
if (member && DECL_CONV_FN_P (r))
@@ -5826,7 +5855,7 @@ tsubst_decl (t, args, type)
DECL_NAME (r) = mangle_conv_op_name_for_type (TREE_TYPE (type));
DECL_ARGUMENTS (r) = tsubst (DECL_ARGUMENTS (t), args,
- /*complain=*/1, t);
+ complain, t);
DECL_RESULT (r) = NULL_TREE;
TREE_STATIC (r) = 0;
@@ -5842,7 +5871,7 @@ tsubst_decl (t, args, type)
if (DECL_CLONED_FUNCTION (r))
{
DECL_CLONED_FUNCTION (r) = tsubst (DECL_CLONED_FUNCTION (t),
- args, /*complain=*/1, t);
+ args, complain, t);
TREE_CHAIN (r) = TREE_CHAIN (DECL_CLONED_FUNCTION (r));
TREE_CHAIN (DECL_CLONED_FUNCTION (r)) = r;
}
@@ -5881,7 +5910,7 @@ tsubst_decl (t, args, type)
{
*friends = copy_node (*friends);
TREE_VALUE (*friends) = tsubst (TREE_VALUE (*friends),
- args, /*complain=*/1,
+ args, complain,
in_decl);
}
@@ -5914,7 +5943,7 @@ tsubst_decl (t, args, type)
DECL_INITIAL (r) = TREE_TYPE (r);
else
DECL_INITIAL (r) = tsubst (DECL_INITIAL (r), args,
- /*complain=*/1, in_decl);
+ complain, in_decl);
DECL_CONTEXT (r) = NULL_TREE;
if (!DECL_TEMPLATE_PARM_P (r) && PROMOTE_PROTOTYPES
@@ -5923,7 +5952,7 @@ tsubst_decl (t, args, type)
DECL_ARG_TYPE (r) = integer_type_node;
if (TREE_CHAIN (t))
TREE_CHAIN (r) = tsubst (TREE_CHAIN (t), args,
- /*complain=*/1, TREE_CHAIN (t));
+ complain, TREE_CHAIN (t));
}
break;
@@ -5936,7 +5965,7 @@ tsubst_decl (t, args, type)
/* We don't have to set DECL_CONTEXT here; it is set by
finish_member_declaration. */
DECL_INITIAL (r) = tsubst_expr (DECL_INITIAL (t), args,
- /*complain=*/1, in_decl);
+ complain, in_decl);
TREE_CHAIN (r) = NULL_TREE;
if (VOID_TYPE_P (type))
cp_error_at ("instantiation of `%D' as type `%T'", r, type);
@@ -5947,7 +5976,7 @@ tsubst_decl (t, args, type)
{
r = copy_node (t);
DECL_INITIAL (r)
- = tsubst_copy (DECL_INITIAL (t), args, /*complain=*/1, in_decl);
+ = tsubst_copy (DECL_INITIAL (t), args, complain, in_decl);
TREE_CHAIN (r) = NULL_TREE;
}
break;
@@ -5980,7 +6009,7 @@ tsubst_decl (t, args, type)
if (TYPE_P (CP_DECL_CONTEXT (t)))
ctx = tsubst_aggr_type (DECL_CONTEXT (t), args,
- /*complain=*/1,
+ complain,
in_decl, /*entering_scope=*/1);
else if (DECL_NAMESPACE_SCOPE_P (t))
ctx = DECL_CONTEXT (t);
@@ -5996,7 +6025,7 @@ tsubst_decl (t, args, type)
{
tmpl = DECL_TI_TEMPLATE (t);
gen_tmpl = most_general_template (tmpl);
- argvec = tsubst (DECL_TI_ARGS (t), args, /*complain=*/1, in_decl);
+ argvec = tsubst (DECL_TI_ARGS (t), args, complain, in_decl);
spec = retrieve_specialization (gen_tmpl, argvec);
}
else
@@ -6022,15 +6051,6 @@ tsubst_decl (t, args, type)
SET_DECL_RTL (r, NULL_RTX);
DECL_SIZE (r) = DECL_SIZE_UNIT (r) = 0;
- /* For __PRETTY_FUNCTION__ we have to adjust the initializer. */
- if (DECL_PRETTY_FUNCTION_P (r))
- {
- const char *const name = (*decl_printable_name)
- (current_function_decl, 2);
- DECL_INITIAL (r) = cp_fname_init (name);
- TREE_TYPE (r) = TREE_TYPE (DECL_INITIAL (r));
- }
-
/* Even if the original location is out of scope, the newly
substituted one is not. */
if (TREE_CODE (r) == VAR_DECL)
@@ -6074,7 +6094,7 @@ static tree
tsubst_arg_types (arg_types, args, complain, in_decl)
tree arg_types;
tree args;
- int complain;
+ tsubst_flags_t complain;
tree in_decl;
{
tree remaining_arg_types;
@@ -6093,7 +6113,7 @@ tsubst_arg_types (arg_types, args, complain, in_decl)
return error_mark_node;
if (VOID_TYPE_P (type))
{
- if (complain)
+ if (complain & tf_error)
{
error ("invalid parameter type `%T'", type);
if (in_decl)
@@ -6135,7 +6155,7 @@ static tree
tsubst_function_type (t, args, complain, in_decl)
tree t;
tree args;
- int complain;
+ tsubst_flags_t complain;
tree in_decl;
{
tree return_type;
@@ -6171,7 +6191,7 @@ tsubst_function_type (t, args, complain, in_decl)
-- Attempting to create "pointer to member of T" when T
is not a class type. */
- if (complain)
+ if (complain & tf_error)
error ("creating pointer to member function of non-class type `%T'",
r);
return error_mark_node;
@@ -6180,7 +6200,7 @@ tsubst_function_type (t, args, complain, in_decl)
fntype = build_cplus_method_type (r, return_type, TREE_CHAIN
(arg_types));
}
- fntype = build_qualified_type (fntype, TYPE_QUALS (t));
+ fntype = cp_build_qualified_type_real (fntype, TYPE_QUALS (t), complain);
fntype = build_type_attribute_variant (fntype, TYPE_ATTRIBUTES (t));
return fntype;
@@ -6192,7 +6212,7 @@ static tree
tsubst_call_declarator_parms (parms, args, complain, in_decl)
tree parms;
tree args;
- int complain;
+ tsubst_flags_t complain;
tree in_decl;
{
tree new_parms;
@@ -6226,15 +6246,15 @@ tsubst_call_declarator_parms (parms, args, complain, in_decl)
/* Take the tree structure T and replace template parameters used
therein with the argument vector ARGS. IN_DECL is an associated
decl for diagnostics. If an error occurs, returns ERROR_MARK_NODE.
- An appropriate error message is issued only if COMPLAIN is
- non-zero. Note that we must be relatively non-tolerant of
- extensions here, in order to preserve conformance; if we allow
- substitutions that should not be allowed, we may allow argument
- deductions that should not succeed, and therefore report ambiguous
- overload situations where there are none. In theory, we could
- allow the substitution, but indicate that it should have failed,
- and allow our caller to make sure that the right thing happens, but
- we don't try to do this yet.
+ Issue error and warning messages under control of COMPLAIN. Note
+ that we must be relatively non-tolerant of extensions here, in
+ order to preserve conformance; if we allow substitutions that
+ should not be allowed, we may allow argument deductions that should
+ not succeed, and therefore report ambiguous overload situations
+ where there are none. In theory, we could allow the substitution,
+ but indicate that it should have failed, and allow our caller to
+ make sure that the right thing happens, but we don't try to do this
+ yet.
This function is used for dealing with types, decls and the like;
for expressions, use tsubst_expr or tsubst_copy. */
@@ -6242,7 +6262,7 @@ tsubst_call_declarator_parms (parms, args, complain, in_decl)
tree
tsubst (t, args, complain, in_decl)
tree t, args;
- int complain;
+ tsubst_flags_t complain;
tree in_decl;
{
tree type, r;
@@ -6272,7 +6292,7 @@ tsubst (t, args, complain, in_decl)
return error_mark_node;
if (DECL_P (t))
- return tsubst_decl (t, args, type);
+ return tsubst_decl (t, args, type, complain);
switch (TREE_CODE (t))
{
@@ -6348,7 +6368,7 @@ tsubst (t, args, complain, in_decl)
Attempting to create an array with a size that is
zero or negative. */
- if (complain)
+ if (complain & tf_error)
error ("creating array with size zero (`%E')", max);
return error_mark_node;
@@ -6398,7 +6418,7 @@ tsubst (t, args, complain, in_decl)
my_friendly_assert (TYPE_P (arg), 0);
return cp_build_qualified_type_real
(arg, cp_type_quals (arg) | cp_type_quals (t),
- complain);
+ complain | tf_ignore_bad_quals);
}
else if (TREE_CODE (t) == BOUND_TEMPLATE_TEMPLATE_PARM)
{
@@ -6422,9 +6442,8 @@ tsubst (t, args, complain, in_decl)
DECL_CONTEXT (arg),
/*entering_scope=*/0,
complain);
- return cp_build_qualified_type_real (r,
- TYPE_QUALS (t),
- complain);
+ return cp_build_qualified_type_real
+ (r, TYPE_QUALS (t), complain);
}
else
/* TEMPLATE_TEMPLATE_PARM or TEMPLATE_PARM_INDEX. */
@@ -6451,8 +6470,10 @@ tsubst (t, args, complain, in_decl)
if (cp_type_quals (t))
{
r = tsubst (TYPE_MAIN_VARIANT (t), args, complain, in_decl);
- r = cp_build_qualified_type_real (r, cp_type_quals (t),
- complain);
+ r = cp_build_qualified_type_real
+ (r, cp_type_quals (t),
+ complain | (TREE_CODE (t) == TEMPLATE_TYPE_PARM
+ ? tf_ignore_bad_quals : 0));
}
else
{
@@ -6583,8 +6604,8 @@ tsubst (t, args, complain, in_decl)
/* We keep track of the last time we issued this error
message to avoid spewing a ton of messages during a
single bad template instantiation. */
- if (complain && (last_line != lineno ||
- last_file != input_filename))
+ if (complain & tf_error
+ && (last_line != lineno || last_file != input_filename))
{
if (TREE_CODE (type) == VOID_TYPE)
error ("forming reference to void");
@@ -6626,9 +6647,8 @@ tsubst (t, args, complain, in_decl)
-- Attempting to create "pointer to member of T" when T
is not a class type. */
- if (complain)
- error ("creating pointer to member of non-class type `%T'",
- r);
+ if (complain & tf_error)
+ error ("creating pointer to member of non-class type `%T'", r);
return error_mark_node;
}
if (TREE_CODE (type) == REFERENCE_TYPE)
@@ -6711,7 +6731,7 @@ tsubst (t, args, complain, in_decl)
|| TREE_CODE (type) == FUNCTION_TYPE
|| TREE_CODE (type) == REFERENCE_TYPE)
{
- if (complain)
+ if (complain & tf_error)
error ("creating array of `%T'", type);
return error_mark_node;
}
@@ -6723,10 +6743,8 @@ tsubst (t, args, complain, in_decl)
case PLUS_EXPR:
case MINUS_EXPR:
{
- tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain,
- in_decl);
- tree e2 = tsubst (TREE_OPERAND (t, 1), args, complain,
- in_decl);
+ tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl);
+ tree e2 = tsubst (TREE_OPERAND (t, 1), args, complain, in_decl);
if (e1 == error_mark_node || e2 == error_mark_node)
return error_mark_node;
@@ -6737,8 +6755,7 @@ tsubst (t, args, complain, in_decl)
case NEGATE_EXPR:
case NOP_EXPR:
{
- tree e = tsubst (TREE_OPERAND (t, 0), args, complain,
- in_decl);
+ tree e = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl);
if (e == error_mark_node)
return error_mark_node;
@@ -6757,7 +6774,7 @@ tsubst (t, args, complain, in_decl)
if (!IS_AGGR_TYPE (ctx))
{
- if (complain)
+ if (complain & tf_error)
error ("`%T' is not a class, struct, or union type",
ctx);
return error_mark_node;
@@ -6775,21 +6792,26 @@ tsubst (t, args, complain, in_decl)
ctx = complete_type (ctx);
if (!COMPLETE_TYPE_P (ctx))
{
- if (complain)
+ if (complain & tf_error)
incomplete_type_error (NULL_TREE, ctx);
return error_mark_node;
}
}
- f = make_typename_type (ctx, f, complain);
+ f = make_typename_type (ctx, f,
+ (complain & tf_error) | tf_keep_type_decl);
if (f == error_mark_node)
return f;
- return cp_build_qualified_type_real (f,
- cp_type_quals (f)
- | cp_type_quals (t),
- complain);
+ if (TREE_CODE (f) == TYPE_DECL)
+ {
+ complain |= tf_ignore_bad_quals;
+ f = TREE_TYPE (f);
+ }
+
+ return cp_build_qualified_type_real
+ (f, cp_type_quals (f) | cp_type_quals (t), complain);
}
-
+
case UNBOUND_CLASS_TEMPLATE:
{
tree ctx = tsubst_aggr_type (TYPE_CONTEXT (t), args, complain,
@@ -6804,8 +6826,7 @@ tsubst (t, args, complain, in_decl)
case INDIRECT_REF:
{
- tree e = tsubst (TREE_OPERAND (t, 0), args, complain,
- in_decl);
+ tree e = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl);
if (e == error_mark_node)
return error_mark_node;
return make_pointer_declarator (type, e);
@@ -6813,8 +6834,7 @@ tsubst (t, args, complain, in_decl)
case ADDR_EXPR:
{
- tree e = tsubst (TREE_OPERAND (t, 0), args, complain,
- in_decl);
+ tree e = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl);
if (e == error_mark_node)
return error_mark_node;
return make_reference_declarator (type, e);
@@ -6822,10 +6842,8 @@ tsubst (t, args, complain, in_decl)
case ARRAY_REF:
{
- tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain,
- in_decl);
- tree e2 = tsubst_expr (TREE_OPERAND (t, 1), args, complain,
- in_decl);
+ tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl);
+ tree e2 = tsubst_expr (TREE_OPERAND (t, 1), args, complain, in_decl);
if (e1 == error_mark_node || e2 == error_mark_node)
return error_mark_node;
@@ -6834,8 +6852,7 @@ tsubst (t, args, complain, in_decl)
case CALL_EXPR:
{
- tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain,
- in_decl);
+ tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl);
tree e2 = (tsubst_call_declarator_parms
(CALL_DECLARATOR_PARMS (t), args, complain, in_decl));
tree e3 = tsubst (CALL_DECLARATOR_EXCEPTION_SPEC (t), args,
@@ -6850,8 +6867,7 @@ tsubst (t, args, complain, in_decl)
case SCOPE_REF:
{
- tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain,
- in_decl);
+ tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl);
tree e2 = tsubst (TREE_OPERAND (t, 1), args, complain, in_decl);
if (e1 == error_mark_node || e2 == error_mark_node)
return error_mark_node;
@@ -6861,8 +6877,7 @@ tsubst (t, args, complain, in_decl)
case TYPEOF_TYPE:
{
- tree e1 = tsubst_expr (TYPE_FIELDS (t), args, complain,
- in_decl);
+ tree e1 = tsubst_expr (TYPE_FIELDS (t), args, complain, in_decl);
if (e1 == error_mark_node)
return error_mark_node;
@@ -6883,7 +6898,7 @@ tsubst (t, args, complain, in_decl)
tree
tsubst_copy (t, args, complain, in_decl)
tree t, args;
- int complain;
+ tsubst_flags_t complain;
tree in_decl;
{
enum tree_code code;
@@ -7102,8 +7117,7 @@ tsubst_copy (t, args, complain, in_decl)
if (!processing_template_decl)
{
tree stmt_expr = begin_stmt_expr ();
- tsubst_expr (STMT_EXPR_STMT (t), args,
- complain, in_decl);
+ tsubst_expr (STMT_EXPR_STMT (t), args, complain, in_decl);
return finish_stmt_expr (stmt_expr);
}
@@ -7228,8 +7242,8 @@ tsubst_copy (t, args, complain, in_decl)
case VA_ARG_EXPR:
return build_x_va_arg (tsubst_copy (TREE_OPERAND (t, 0), args, complain,
- in_decl),
- tsubst (TREE_TYPE (t), args, complain, in_decl));
+ in_decl),
+ tsubst (TREE_TYPE (t), args, complain, in_decl));
default:
return t;
@@ -7241,7 +7255,7 @@ tsubst_copy (t, args, complain, in_decl)
tree
tsubst_expr (t, args, complain, in_decl)
tree t, args;
- int complain;
+ tsubst_flags_t complain;
tree in_decl;
{
tree stmt, tmp;
@@ -7261,7 +7275,7 @@ tsubst_expr (t, args, complain, in_decl)
prep_stmt (t);
finish_named_return_value
(TREE_OPERAND (t, 0),
- tsubst_expr (TREE_OPERAND (t, 1), args, /*complain=*/1, in_decl));
+ tsubst_expr (TREE_OPERAND (t, 1), args, complain, in_decl));
break;
case CTOR_INITIALIZER:
@@ -7317,10 +7331,6 @@ tsubst_expr (t, args, complain, in_decl)
{
init = DECL_INITIAL (decl);
decl = tsubst (decl, args, complain, in_decl);
- if (DECL_PRETTY_FUNCTION_P (decl))
- init = DECL_INITIAL (decl);
- else
- init = tsubst_expr (init, args, complain, in_decl);
if (decl != error_mark_node)
{
if (TREE_CODE (decl) != TYPE_DECL)
@@ -7336,6 +7346,17 @@ tsubst_expr (t, args, complain, in_decl)
if (TREE_CODE (decl) == VAR_DECL)
DECL_TEMPLATE_INSTANTIATED (decl) = 1;
maybe_push_decl (decl);
+ if (DECL_PRETTY_FUNCTION_P (decl))
+ {
+ /* For __PRETTY_FUNCTION__ we have to adjust the
+ initializer. */
+ const char *const name
+ = (*decl_printable_name) (current_function_decl, 2);
+ init = cp_fname_init (name);
+ TREE_TYPE (decl) = TREE_TYPE (init);
+ }
+ else
+ init = tsubst_expr (init, args, complain, in_decl);
cp_finish_decl (decl, init, NULL_TREE, 0);
}
}
@@ -7355,8 +7376,8 @@ tsubst_expr (t, args, complain, in_decl)
stmt = begin_for_stmt ();
tsubst_expr (FOR_INIT_STMT (t), args, complain, in_decl);
finish_for_init_stmt (stmt);
- finish_for_cond (tsubst_expr (FOR_COND (t), args,
- complain, in_decl),
+ finish_for_cond (tsubst_expr (FOR_COND (t),
+ args, complain, in_decl),
stmt);
tmp = tsubst_expr (FOR_EXPR (t), args, complain, in_decl);
finish_for_expr (tmp, stmt);
@@ -7383,8 +7404,8 @@ tsubst_expr (t, args, complain, in_decl)
stmt = begin_do_stmt ();
tsubst_expr (DO_BODY (t), args, complain, in_decl);
finish_do_body (stmt);
- finish_do_stmt (tsubst_expr (DO_COND (t), args,
- complain, in_decl),
+ finish_do_stmt (tsubst_expr (DO_COND (t),
+ args, complain, in_decl),
stmt);
}
break;
@@ -7636,7 +7657,7 @@ instantiate_template (tmpl, targ_ptr)
/* substitute template parameters */
fndecl = tsubst (DECL_TEMPLATE_RESULT (gen_tmpl),
- targ_ptr, /*complain=*/1, gen_tmpl);
+ targ_ptr, tf_error, gen_tmpl);
/* The DECL_TI_TEMPLATE should always be the immediate parent
template, not the most general template. */
DECL_TI_TEMPLATE (fndecl) = tmpl;
@@ -7733,12 +7754,12 @@ fn_type_unification (fn, explicit_targs, targs, args, return_type,
converted_args
= (coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (fn),
- explicit_targs, NULL_TREE, /*complain=*/0,
+ explicit_targs, NULL_TREE, tf_none,
/*require_all_arguments=*/0));
if (converted_args == error_mark_node)
return 1;
- fntype = tsubst (fntype, converted_args, /*complain=*/0, NULL_TREE);
+ fntype = tsubst (fntype, converted_args, tf_none, NULL_TREE);
if (fntype == error_mark_node)
return 1;
@@ -7779,7 +7800,7 @@ fn_type_unification (fn, explicit_targs, targs, args, return_type,
the corresponding deduced argument values. If the
substitution results in an invalid type, as described above,
type deduction fails. */
- if (tsubst (TREE_TYPE (fn), targs, /*complain=*/0, NULL_TREE)
+ if (tsubst (TREE_TYPE (fn), targs, tf_none, NULL_TREE)
== error_mark_node)
return 1;
@@ -8115,8 +8136,7 @@ resolve_overloaded_unification (tparms, targs, parm, arg, strict,
expl_subargs);
if (subargs)
{
- elem = tsubst (TREE_TYPE (fn), subargs, /*complain=*/0,
- NULL_TREE);
+ elem = tsubst (TREE_TYPE (fn), subargs, tf_none, NULL_TREE);
if (TREE_CODE (elem) == METHOD_TYPE)
elem = build_ptrmemfunc_type (build_pointer_type (elem));
good += try_one_overload (tparms, targs, tempargs, parm, elem,
@@ -8254,7 +8274,7 @@ verify_class_unification (targs, parms, args)
int i;
int nparms = TREE_VEC_LENGTH (parms);
tree new_parms = tsubst (parms, add_outermost_template_args (args, targs),
- /*complain=*/0, NULL_TREE);
+ tf_none, NULL_TREE);
if (new_parms == error_mark_node)
return 1;
@@ -8470,12 +8490,28 @@ check_cv_quals_for_unify (strict, arg, parm)
tree arg;
tree parm;
{
+ int arg_quals = cp_type_quals (arg);
+ int parm_quals = cp_type_quals (parm);
+
+ if (TREE_CODE (parm) == TEMPLATE_TYPE_PARM)
+ {
+ /* If the cvr quals of parm will not unify with ARG, they'll be
+ ignored in instantiation, so we have to do the same here. */
+ if (TREE_CODE (arg) == REFERENCE_TYPE
+ || TREE_CODE (arg) == FUNCTION_TYPE
+ || TREE_CODE (arg) == METHOD_TYPE)
+ parm_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE);
+ if (!POINTER_TYPE_P (arg) &&
+ TREE_CODE (arg) != TEMPLATE_TYPE_PARM)
+ parm_quals &= ~TYPE_QUAL_RESTRICT;
+ }
+
if (!(strict & (UNIFY_ALLOW_MORE_CV_QUAL | UNIFY_ALLOW_OUTER_MORE_CV_QUAL))
- && !at_least_as_qualified_p (arg, parm))
+ && (arg_quals & parm_quals) != parm_quals)
return 0;
if (!(strict & (UNIFY_ALLOW_LESS_CV_QUAL | UNIFY_ALLOW_OUTER_LESS_CV_QUAL))
- && !at_least_as_qualified_p (parm, arg))
+ && (parm_quals & arg_quals) != arg_quals)
return 0;
return 1;
@@ -8678,11 +8714,8 @@ unify (tparms, targs, parm, arg, strict)
/* Consider the case where ARG is `const volatile int' and
PARM is `const T'. Then, T should be `volatile int'. */
- arg =
- cp_build_qualified_type_real (arg,
- cp_type_quals (arg)
- & ~cp_type_quals (parm),
- /*complain=*/0);
+ arg = cp_build_qualified_type_real
+ (arg, cp_type_quals (arg) & ~cp_type_quals (parm), tf_none);
if (arg == error_mark_node)
return 1;
@@ -9152,13 +9185,11 @@ get_bindings_real (fn, decl, explicit_args, check_rettype, deduce, len)
converted_args
= (coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (tmpl),
explicit_args, NULL_TREE,
- /*complain=*/0,
- /*require_all_arguments=*/0));
+ tf_none, /*require_all_arguments=*/0));
if (converted_args == error_mark_node)
return NULL_TREE;
- decl_type = tsubst (decl_type, converted_args, /*complain=*/0,
- NULL_TREE);
+ decl_type = tsubst (decl_type, converted_args, tf_none, NULL_TREE);
if (decl_type == error_mark_node)
return NULL_TREE;
}
@@ -9514,7 +9545,7 @@ do_decl_instantiation (declspecs, declarator, storage)
;
else if (storage == ridpointers[(int) RID_EXTERN])
{
- if (pedantic)
+ if (pedantic && !in_system_header)
pedwarn ("ISO C++ forbids the use of `extern' on explicit instantiations");
extern_p = 1;
}
@@ -9553,7 +9584,7 @@ mark_class_instantiated (t, extern_p)
void
do_type_instantiation (t, storage, complain)
tree t, storage;
- int complain;
+ tsubst_flags_t complain;
{
int extern_p = 0;
int nomem_p = 0;
@@ -9577,7 +9608,7 @@ do_type_instantiation (t, storage, complain)
if (!COMPLETE_TYPE_P (t))
{
- if (complain)
+ if (complain & tf_error)
error ("explicit instantiation of `%#T' before definition of template",
t);
return;
@@ -9585,7 +9616,7 @@ do_type_instantiation (t, storage, complain)
if (storage != NULL_TREE)
{
- if (pedantic)
+ if (pedantic && !in_system_header)
pedwarn("ISO C++ forbids the use of `%s' on explicit instantiations",
IDENTIFIER_POINTER (storage));
@@ -9609,7 +9640,7 @@ do_type_instantiation (t, storage, complain)
No program shall both explicitly instantiate and explicitly
specialize a template. */
- if (complain)
+ if (complain & tf_error)
{
error ("explicit instantiation of `%#T' after", t);
cp_error_at ("explicit specialization here", t);
@@ -9628,7 +9659,7 @@ do_type_instantiation (t, storage, complain)
are we already got marked as an explicit instantiation because of the
repo file. All these cases are OK. */
if (!CLASSTYPE_INTERFACE_ONLY (t) && !extern_p && !flag_use_repository
- && complain)
+ && (complain & tf_error))
pedwarn ("duplicate explicit instantiation of `%#T'", t);
/* If we've already instantiated the template, just return now. */
@@ -9748,14 +9779,14 @@ regenerate_decl_from_template (decl, tmpl)
pushclass (DECL_CONTEXT (decl), 2);
/* Do the substitution to get the new declaration. */
- new_decl = tsubst (code_pattern, args, /*complain=*/1, NULL_TREE);
+ new_decl = tsubst (code_pattern, args, tf_error, NULL_TREE);
if (TREE_CODE (decl) == VAR_DECL)
{
/* Set up DECL_INITIAL, since tsubst doesn't. */
DECL_INITIAL (new_decl) =
tsubst_expr (DECL_INITIAL (code_pattern), args,
- /*complain=*/1, DECL_TI_TEMPLATE (decl));
+ tf_error, DECL_TI_TEMPLATE (decl));
/* Pop the class context we pushed above. */
popclass ();
}
@@ -9942,6 +9973,27 @@ instantiate_decl (d, defer_ok)
import_export_decl (d);
}
+ if (!defer_ok)
+ {
+ /* Recheck the substitutions to obtain any warning messages
+ about ignoring cv qualifiers. */
+ tree gen = DECL_TEMPLATE_RESULT (gen_tmpl);
+ tree type = TREE_TYPE (gen);
+
+ if (TREE_CODE (gen) == FUNCTION_DECL)
+ {
+ tsubst (DECL_ARGUMENTS (gen), args, tf_error | tf_warning, d);
+ tsubst (TYPE_RAISES_EXCEPTIONS (type), args,
+ tf_error | tf_warning, d);
+ /* Don't simply tsubst the function type, as that will give
+ duplicate warnings about poor parameter qualifications.
+ The function arguments are the same as the decl_arguments
+ without the top level cv qualifiers. */
+ type = TREE_TYPE (type);
+ }
+ tsubst (type, args, tf_error | tf_warning, d);
+ }
+
if (TREE_CODE (d) == VAR_DECL && DECL_INITIALIZED_IN_CLASS_P (d)
&& DECL_INITIAL (d) == NULL_TREE)
/* We should have set up DECL_INITIAL in instantiate_class_template. */
@@ -10025,7 +10077,7 @@ instantiate_decl (d, defer_ok)
/* Substitute into the body of the function. */
tsubst_expr (DECL_SAVED_TREE (code_pattern), args,
- /*complain=*/1, tmpl);
+ tf_error | tf_warning, tmpl);
/* We don't need the local specializations any more. */
htab_delete (local_specializations);
@@ -10157,9 +10209,9 @@ tsubst_initializer_list (t, argvec)
tree init;
tree val;
- decl = tsubst_copy (TREE_PURPOSE (t), argvec, /*complain=*/1,
+ decl = tsubst_copy (TREE_PURPOSE (t), argvec, tf_error | tf_warning,
NULL_TREE);
- init = tsubst_expr (TREE_VALUE (t), argvec, /*complain=*/1,
+ init = tsubst_expr (TREE_VALUE (t), argvec, tf_error | tf_warning,
NULL_TREE);
if (!init)
@@ -10209,7 +10261,7 @@ tsubst_enum (tag, newtag, args)
/* Note that in a template enum, the TREE_VALUE is the
CONST_DECL, not the corresponding INTEGER_CST. */
value = tsubst_expr (DECL_INITIAL (TREE_VALUE (e)),
- args, /*complain=*/1,
+ args, tf_error | tf_warning,
NULL_TREE);
/* Give this enumeration constant the correct access. */
@@ -10278,16 +10330,16 @@ get_mostly_instantiated_function_type (decl, contextp, tparmsp)
/* Now, do the (partial) substitution to figure out the
appropriate function type. */
- fn_type = tsubst (fn_type, partial_args, /*complain=*/1, NULL_TREE);
+ fn_type = tsubst (fn_type, partial_args, tf_error, NULL_TREE);
if (DECL_STATIC_FUNCTION_P (decl))
- context = tsubst (context, partial_args, /*complain=*/1, NULL_TREE);
+ context = tsubst (context, partial_args, tf_error, NULL_TREE);
/* Substitute into the template parameters to obtain the real
innermost set of parameters. This step is important if the
innermost set of template parameters contains value
parameters whose types depend on outer template parameters. */
TREE_VEC_LENGTH (partial_args)--;
- tparms = tsubst_template_parms (tparms, partial_args, /*complain=*/1);
+ tparms = tsubst_template_parms (tparms, partial_args, tf_error);
}
if (contextp)
@@ -10320,13 +10372,13 @@ current_instantiation ()
}
/* [temp.param] Check that template non-type parm TYPE is of an allowable
- type. Return zero for ok, non-zero for disallowed. If COMPLAIN is
- non-zero, then complain. */
+ type. Return zero for ok, non-zero for disallowed. Issue error and
+ warning messages under control of COMPLAIN. */
static int
invalid_nontype_parm_type_p (type, complain)
tree type;
- int complain;
+ tsubst_flags_t complain;
{
if (INTEGRAL_TYPE_P (type))
return 0;
@@ -10341,7 +10393,7 @@ invalid_nontype_parm_type_p (type, complain)
else if (TREE_CODE (type) == TYPENAME_TYPE)
return 0;
- if (complain)
+ if (complain & tf_error)
error ("`%#T' is not a valid type for a template constant parameter",
type);
return 1;
diff --git a/contrib/gcc/cp/search.c b/contrib/gcc/cp/search.c
index 10ebc73..ab6e25d 100644
--- a/contrib/gcc/cp/search.c
+++ b/contrib/gcc/cp/search.c
@@ -127,7 +127,6 @@ static int protected_accessible_p PARAMS ((tree, tree, tree));
static int friend_accessible_p PARAMS ((tree, tree, tree));
static void setup_class_bindings PARAMS ((tree, int));
static int template_self_reference_p PARAMS ((tree, tree));
-static tree get_shared_vbase_if_not_primary PARAMS ((tree, void *));
static tree dfs_find_vbase_instance PARAMS ((tree, void *));
static tree dfs_get_pure_virtuals PARAMS ((tree, void *));
static tree dfs_build_inheritance_graph_order PARAMS ((tree, void *));
@@ -201,8 +200,9 @@ lookup_base_r (binfo, base, access, within_current_scope,
&& !within_current_scope
&& is_friend (BINFO_TYPE (binfo), current_scope ()))
{
+ /* Do not clear is_non_public here. If A is a private base of B, A
+ is not allowed to convert a B* to an A*. */
within_current_scope = 1;
- is_non_public = 0;
}
if (same_type_p (BINFO_TYPE (binfo), base))
@@ -1841,7 +1841,7 @@ check_final_overrider (overrider, basefn)
return 0;
}
- /* Check throw specifier is subset. */
+ /* Check throw specifier is at least as strict. */
if (!comp_except_specs (base_throw, over_throw, 0))
{
cp_error_at ("looser throw specifier for `%#F'", overrider);
@@ -1951,81 +1951,30 @@ look_for_overrides_r (type, fndecl)
return look_for_overrides (type, fndecl);
}
-/* A queue function for dfs_walk that skips any nonprimary virtual
- bases and any already marked bases. */
+/* A queue function to use with dfs_walk that only walks into
+ canonical bases. DATA should be the type of the complete object,
+ or a TREE_LIST whose TREE_PURPOSE is the type of the complete
+ object. By using this function as a queue function, you will walk
+ over exactly those BINFOs that actually exist in the complete
+ object, including those for virtual base classes. If you
+ SET_BINFO_MARKED for each binfo you process, you are further
+ guaranteed that you will walk into each virtual base class exactly
+ once. */
tree
-dfs_skip_nonprimary_vbases_unmarkedp (binfo, data)
- tree binfo;
- void *data ATTRIBUTE_UNUSED;
-{
- if (TREE_VIA_VIRTUAL (binfo) && !BINFO_PRIMARY_P (binfo))
- /* This is a non-primary virtual base. Skip it. */
- return NULL_TREE;
-
- return unmarkedp (binfo, NULL);
-}
-
-/* A queue function for dfs_walk that skips any nonprimary virtual
- bases and any unmarked bases. */
-
-tree
-dfs_skip_nonprimary_vbases_markedp (binfo, data)
- tree binfo;
- void *data ATTRIBUTE_UNUSED;
-{
- if (TREE_VIA_VIRTUAL (binfo) && !BINFO_PRIMARY_P (binfo))
- /* This is a non-primary virtual base. Skip it. */
- return NULL_TREE;
-
- return markedp (binfo, NULL);
-}
-
-/* If BINFO is a non-primary virtual baseclass (in the hierarchy
- dominated by TYPE), and no primary copy appears anywhere in the
- hierarchy, return the shared copy. If a primary copy appears
- elsewhere, return NULL_TREE. Otherwise, return BINFO itself; it is
- either a non-virtual base or a primary virtual base. */
-
-static tree
-get_shared_vbase_if_not_primary (binfo, data)
+dfs_unmarked_real_bases_queue_p (binfo, data)
tree binfo;
void *data;
{
- if (TREE_VIA_VIRTUAL (binfo) && !BINFO_PRIMARY_P (binfo))
+ if (TREE_VIA_VIRTUAL (binfo))
{
tree type = (tree) data;
if (TREE_CODE (type) == TREE_LIST)
type = TREE_PURPOSE (type);
-
- /* This is a non-primary virtual base. If there is no primary
- version, get the shared version. */
binfo = binfo_for_vbase (BINFO_TYPE (binfo), type);
- if (BINFO_PRIMARY_P (binfo))
- return NULL_TREE;
}
-
- return binfo;
-}
-
-/* A queue function to use with dfs_walk that prevents travel into any
- nonprimary virtual base, or its baseclasses. DATA should be the
- type of the complete object, or a TREE_LIST whose TREE_PURPOSE is
- the type of the complete object. By using this function as a queue
- function, you will walk over exactly those BINFOs that actually
- exist in the complete object, including those for virtual base
- classes. If you SET_BINFO_MARKED for each binfo you process, you
- are further guaranteed that you will walk into each virtual base
- class exactly once. */
-
-tree
-dfs_unmarked_real_bases_queue_p (binfo, data)
- tree binfo;
- void *data;
-{
- binfo = get_shared_vbase_if_not_primary (binfo, data);
- return binfo ? unmarkedp (binfo, NULL) : NULL_TREE;
+ return unmarkedp (binfo, NULL);
}
/* Like dfs_unmarked_real_bases_queue_p but walks only into things
@@ -2036,8 +1985,15 @@ dfs_marked_real_bases_queue_p (binfo, data)
tree binfo;
void *data;
{
- binfo = get_shared_vbase_if_not_primary (binfo, data);
- return binfo ? markedp (binfo, NULL) : NULL_TREE;
+ if (TREE_VIA_VIRTUAL (binfo))
+ {
+ tree type = (tree) data;
+
+ if (TREE_CODE (type) == TREE_LIST)
+ type = TREE_PURPOSE (type);
+ binfo = binfo_for_vbase (BINFO_TYPE (binfo), type);
+ }
+ return markedp (binfo, NULL);
}
/* A queue function that skips all virtual bases (and their
@@ -2436,14 +2392,14 @@ setup_class_bindings (name, type_binding_p)
if (type_binding_p
&& (TREE_CODE (value_binding) == TYPE_DECL
+ || DECL_CLASS_TEMPLATE_P (value_binding)
|| (TREE_CODE (value_binding) == TREE_LIST
&& TREE_TYPE (value_binding) == error_mark_node
&& (TREE_CODE (TREE_VALUE (value_binding))
== TYPE_DECL))))
/* We found a type-binding, even when looking for a non-type
binding. This means that we already processed this binding
- above. */
- my_friendly_assert (type_binding_p, 19990401);
+ above. */;
else if (value_binding)
{
if (TREE_CODE (value_binding) == TREE_LIST
diff --git a/contrib/gcc/cp/semantics.c b/contrib/gcc/cp/semantics.c
index 603326c..43d3074 100644
--- a/contrib/gcc/cp/semantics.c
+++ b/contrib/gcc/cp/semantics.c
@@ -205,6 +205,7 @@ finish_expr_stmt (expr)
tree expr;
{
tree r = NULL_TREE;
+ tree expr_type = NULL_TREE;;
if (expr != NULL_TREE)
{
@@ -215,6 +216,9 @@ finish_expr_stmt (expr)
|| TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE))
expr = default_conversion (expr);
+ /* Remember the type of the expression. */
+ expr_type = TREE_TYPE (expr);
+
if (stmts_are_full_exprs_p ())
expr = convert_to_void (expr, "statement");
@@ -225,7 +229,7 @@ finish_expr_stmt (expr)
/* This was an expression-statement, so we save the type of the
expression. */
- last_expr_type = expr ? TREE_TYPE (expr) : NULL_TREE;
+ last_expr_type = expr_type;
return r;
}
@@ -500,7 +504,7 @@ tree
begin_switch_stmt ()
{
tree r;
- r = build_stmt (SWITCH_STMT, NULL_TREE, NULL_TREE);
+ r = build_stmt (SWITCH_STMT, NULL_TREE, NULL_TREE, NULL_TREE);
add_stmt (r);
do_pushlevel ();
return r;
@@ -513,9 +517,9 @@ finish_switch_cond (cond, switch_stmt)
tree cond;
tree switch_stmt;
{
+ tree orig_type = NULL;
if (!processing_template_decl)
{
- tree type;
tree index;
/* Convert the condition to an integer or enumeration type. */
@@ -525,23 +529,27 @@ finish_switch_cond (cond, switch_stmt)
error ("switch quantity not an integer");
cond = error_mark_node;
}
+ orig_type = TREE_TYPE (cond);
if (cond != error_mark_node)
{
cond = default_conversion (cond);
cond = fold (build1 (CLEANUP_POINT_EXPR, TREE_TYPE (cond), cond));
}
- type = TREE_TYPE (cond);
- index = get_unwidened (cond, NULL_TREE);
- /* We can't strip a conversion from a signed type to an unsigned,
- because if we did, int_fits_type_p would do the wrong thing
- when checking case values for being in range,
- and it's too hard to do the right thing. */
- if (TREE_UNSIGNED (TREE_TYPE (cond))
- == TREE_UNSIGNED (TREE_TYPE (index)))
- cond = index;
+ if (cond != error_mark_node)
+ {
+ index = get_unwidened (cond, NULL_TREE);
+ /* We can't strip a conversion from a signed type to an unsigned,
+ because if we did, int_fits_type_p would do the wrong thing
+ when checking case values for being in range,
+ and it's too hard to do the right thing. */
+ if (TREE_UNSIGNED (TREE_TYPE (cond))
+ == TREE_UNSIGNED (TREE_TYPE (index)))
+ cond = index;
+ }
}
FINISH_COND (cond, switch_stmt, SWITCH_COND (switch_stmt));
+ SWITCH_TYPE (switch_stmt) = orig_type;
push_switch (switch_stmt);
}
@@ -1205,7 +1213,7 @@ begin_global_stmt_expr ()
keep_next_level (1);
- return (last_tree != NULL_TREE) ? last_tree : expand_start_stmt_expr();
+ return last_tree ? last_tree : expand_start_stmt_expr(/*has_scope=*/1);
}
/* Finish the STMT_EXPR last begun with begin_global_stmt_expr. */
@@ -1498,32 +1506,13 @@ decl_type_access_control (decl)
added to type_lookups after typed_declspecs saved the copy that
ended up in current_type_lookups. */
type_lookups = current_type_lookups;
-
- current_type_lookups = NULL_TREE;
}
-/* Record the lookups, if we're doing deferred access control. */
-
void
save_type_access_control (lookups)
tree lookups;
{
- if (type_lookups != error_mark_node)
- {
- my_friendly_assert (!current_type_lookups, 20010301);
- current_type_lookups = lookups;
- }
- else
- my_friendly_assert (!lookups || lookups == error_mark_node, 20010301);
-}
-
-/* Set things up so that the next deferred access control will succeed.
- This is needed for friend declarations see grokdeclarator for details. */
-
-void
-skip_type_access_control ()
-{
- type_lookups = NULL_TREE;
+ current_type_lookups = lookups;
}
/* Reset the deferred access control. */
@@ -1907,8 +1896,6 @@ finish_class_definition (t, attributes, semi, pop_scope_p)
check_for_missing_semicolon (t);
if (pop_scope_p)
pop_scope (CP_DECL_CONTEXT (TYPE_MAIN_DECL (t)));
- if (current_function_decl)
- type_lookups = error_mark_node;
if (current_scope () == current_function_decl)
do_pending_defargs ();
@@ -2142,10 +2129,6 @@ cp_expand_stmt (t)
{
switch (TREE_CODE (t))
{
- case CLEANUP_STMT:
- genrtl_decl_cleanup (CLEANUP_DECL (t), CLEANUP_EXPR (t));
- break;
-
case CTOR_STMT:
genrtl_ctor_stmt (t);
break;
@@ -2397,9 +2380,6 @@ expand_body (fn)
if (DECL_EXTERNAL (fn))
return;
- /* Emit any thunks that should be emitted at the same time as FN. */
- emit_associated_thunks (fn);
-
timevar_push (TV_INTEGRATION);
/* Optimize the body of the function before expanding it. */
@@ -2452,6 +2432,9 @@ expand_body (fn)
extract_interface_info ();
timevar_pop (TV_EXPAND);
+
+ /* Emit any thunks that should be emitted at the same time as FN. */
+ emit_associated_thunks (fn);
}
/* Helper function for walk_tree, used by finish_function to override all
@@ -2474,7 +2457,7 @@ nullify_returns_r (tp, walk_subtrees, data)
RETURN_EXPR (*tp) = NULL_TREE;
else if (TREE_CODE (*tp) == CLEANUP_STMT
&& CLEANUP_DECL (*tp) == nrv)
- CLEANUP_EXPR (*tp) = NULL_TREE;
+ CLEANUP_EH_ONLY (*tp) = 1;
/* Keep iterating. */
return NULL_TREE;
@@ -2521,15 +2504,16 @@ genrtl_start_function (fn)
if (!current_function_cannot_inline)
current_function_cannot_inline = cp_function_chain->cannot_inline;
- /* We don't need the saved data anymore. */
- free (DECL_SAVED_FUNCTION_DATA (fn));
- DECL_SAVED_FUNCTION_DATA (fn) = NULL;
+ /* We don't need the saved data anymore. Unless this is an inline
+ function; we need the named return value info for
+ cp_copy_res_decl_for_inlining. */
+ if (! DECL_INLINE (fn))
+ {
+ free (DECL_SAVED_FUNCTION_DATA (fn));
+ DECL_SAVED_FUNCTION_DATA (fn) = NULL;
+ }
}
- /* Tell the cross-reference machinery that we're defining this
- function. */
- GNU_xref_function (fn, DECL_ARGUMENTS (fn));
-
/* Keep track of how many functions we're presently expanding. */
++function_depth;
diff --git a/contrib/gcc/cp/spew.c b/contrib/gcc/cp/spew.c
index e610aec..212dada 100644
--- a/contrib/gcc/cp/spew.c
+++ b/contrib/gcc/cp/spew.c
@@ -221,16 +221,11 @@ read_process_identifier (pyylval)
case RID_NOT_EQ: pyylval->code = NE_EXPR; return EQCOMPARE;
default:
- if (C_RID_YYCODE (id) == TYPESPEC)
- GNU_xref_ref (current_function_decl, IDENTIFIER_POINTER (id));
-
pyylval->ttype = ridpointers[C_RID_CODE (id)];
return C_RID_YYCODE (id);
}
}
- GNU_xref_ref (current_function_decl, IDENTIFIER_POINTER (id));
-
/* Make sure that user does not collide with our internal naming
scheme. This is not necessary if '.' is used to remove them from
the user's namespace, but is if '$' or double underscores are. */
diff --git a/contrib/gcc/cp/tree.c b/contrib/gcc/cp/tree.c
index d353b06..d703b8a 100644
--- a/contrib/gcc/cp/tree.c
+++ b/contrib/gcc/cp/tree.c
@@ -464,7 +464,12 @@ build_cplus_array_type_1 (elt_type, index_type)
if (elt_type == error_mark_node || index_type == error_mark_node)
return error_mark_node;
- if (processing_template_decl
+ /* Don't do the minimal thing just because processing_template_decl is
+ set; we want to give string constants the right type immediately, so
+ we don't have to fix them up at instantiation time. */
+ if ((processing_template_decl
+ && index_type && TYPE_MAX_VALUE (index_type)
+ && TREE_CODE (TYPE_MAX_VALUE (index_type)) != INTEGER_CST)
|| uses_template_parms (elt_type)
|| uses_template_parms (index_type))
{
@@ -505,18 +510,32 @@ build_cplus_array_type (elt_type, index_type)
/* Make a variant of TYPE, qualified with the TYPE_QUALS. Handles
arrays correctly. In particular, if TYPE is an array of T's, and
- TYPE_QUALS is non-empty, returns an array of qualified T's. If
- at attempt is made to qualify a type illegally, and COMPLAIN is
- non-zero, an error is issued. If COMPLAIN is zero, error_mark_node
- is returned. */
-
+ TYPE_QUALS is non-empty, returns an array of qualified T's.
+
+ FLAGS determines how to deal with illformed qualifications. If
+ tf_ignore_bad_quals is set, then bad qualifications are dropped
+ (this is permitted if TYPE was introduced via a typedef or template
+ type parameter). If bad qualifications are dropped and tf_warning
+ is set, then a warning is issued for non-const qualifications. If
+ tf_ignore_bad_quals is not set and tf_error is not set, we
+ return error_mark_node. Otherwise, we issue an error, and ignore
+ the qualifications.
+
+ Qualification of a reference type is valid when the reference came
+ via a typedef or template type argument. [dcl.ref] No such
+ dispensation is provided for qualifying a function type. [dcl.fct]
+ DR 295 queries this and the proposed resolution brings it into line
+ with qualifiying a reference. We implement the DR. We also behave
+ in a similar manner for restricting non-pointer types. */
+
tree
cp_build_qualified_type_real (type, type_quals, complain)
tree type;
int type_quals;
- int complain;
+ tsubst_flags_t complain;
{
tree result;
+ int bad_quals = TYPE_UNQUALIFIED;
if (type == error_mark_node)
return type;
@@ -524,32 +543,51 @@ cp_build_qualified_type_real (type, type_quals, complain)
if (type_quals == cp_type_quals (type))
return type;
- /* A restrict-qualified pointer type must be a pointer (or reference)
+ /* A reference, fucntion or method type shall not be cv qualified.
+ [dcl.ref], [dct.fct] */
+ if (type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)
+ && (TREE_CODE (type) == REFERENCE_TYPE
+ || TREE_CODE (type) == FUNCTION_TYPE
+ || TREE_CODE (type) == METHOD_TYPE))
+ {
+ bad_quals |= type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE);
+ type_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE);
+ }
+
+ /* A restrict-qualified type must be a pointer (or reference)
to object or incomplete type. */
if ((type_quals & TYPE_QUAL_RESTRICT)
&& TREE_CODE (type) != TEMPLATE_TYPE_PARM
- && (!POINTER_TYPE_P (type)
- || TYPE_PTRMEM_P (type)
- || TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE))
+ && TREE_CODE (type) != TYPENAME_TYPE
+ && !POINTER_TYPE_P (type))
{
- if (complain)
- error ("`%T' cannot be `restrict'-qualified", type);
- else
- return error_mark_node;
-
+ bad_quals |= TYPE_QUAL_RESTRICT;
type_quals &= ~TYPE_QUAL_RESTRICT;
}
- if (type_quals != TYPE_UNQUALIFIED
- && TREE_CODE (type) == FUNCTION_TYPE)
+ if (bad_quals == TYPE_UNQUALIFIED)
+ /*OK*/;
+ else if (!(complain & (tf_error | tf_ignore_bad_quals)))
+ return error_mark_node;
+ else
{
- if (complain)
- error ("`%T' cannot be `const'-, `volatile'-, or `restrict'-qualified", type);
- else
- return error_mark_node;
- type_quals = TYPE_UNQUALIFIED;
+ if (complain & tf_ignore_bad_quals)
+ /* We're not going to warn about constifying things that can't
+ be constified. */
+ bad_quals &= ~TYPE_QUAL_CONST;
+ if (bad_quals)
+ {
+ tree bad_type = build_qualified_type (ptr_type_node, bad_quals);
+
+ if (!(complain & tf_ignore_bad_quals))
+ error ("`%V' qualifiers cannot be applied to `%T'",
+ bad_type, type);
+ else if (complain & tf_warning)
+ warning ("ignoring `%V' qualifiers on `%T'", bad_type, type);
+ }
}
- else if (TREE_CODE (type) == ARRAY_TYPE)
+
+ if (TREE_CODE (type) == ARRAY_TYPE)
{
/* In C++, the qualification really applies to the array element
type. Obtain the appropriately qualified element type. */
@@ -591,7 +629,7 @@ cp_build_qualified_type_real (type, type_quals, complain)
{
/* For a pointer-to-member type, we can't just return a
cv-qualified version of the RECORD_TYPE. If we do, we
- haven't change the field that contains the actual pointer to
+ haven't changed the field that contains the actual pointer to
a method, and so TYPE_PTRMEMFUNC_FN_TYPE will be wrong. */
tree t;
@@ -599,7 +637,7 @@ cp_build_qualified_type_real (type, type_quals, complain)
t = cp_build_qualified_type_real (t, type_quals, complain);
return build_ptrmemfunc_type (t);
}
-
+
/* Retrieve (or create) the appropriately qualified variant. */
result = build_qualified_type (type, type_quals);
@@ -999,7 +1037,6 @@ cp_statement_code_p (code)
switch (code)
{
case SUBOBJECT:
- case CLEANUP_STMT:
case CTOR_STMT:
case CTOR_INITIALIZER:
case RETURN_INIT:
@@ -2100,6 +2137,10 @@ cp_cannot_inline_tree_fn (fnp)
{
tree fn = *fnp;
+ if (flag_really_no_inline
+ && lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) == NULL)
+ return 1;
+
/* We can inline a template instantiation only if it's fully
instantiated. */
if (DECL_TEMPLATE_INFO (fn)
diff --git a/contrib/gcc/cp/typeck.c b/contrib/gcc/cp/typeck.c
index 5e69b98..fc37236 100644
--- a/contrib/gcc/cp/typeck.c
+++ b/contrib/gcc/cp/typeck.c
@@ -45,7 +45,7 @@ Boston, MA 02111-1307, USA. */
static tree convert_for_assignment PARAMS ((tree, tree, const char *, tree,
int));
-static tree pointer_int_sum PARAMS ((enum tree_code, tree, tree));
+static tree cp_pointer_int_sum PARAMS ((enum tree_code, tree, tree));
static tree rationalize_conditional_expr PARAMS ((enum tree_code, tree));
static int comp_target_parms PARAMS ((tree, tree));
static int comp_ptr_ttypes_real PARAMS ((tree, tree, int));
@@ -285,7 +285,7 @@ commonparms (p1, p2)
if (TREE_VALUE (p1) != TREE_VALUE (p2))
{
any_change = 1;
- TREE_VALUE (n) = common_type (TREE_VALUE (p1), TREE_VALUE (p2));
+ TREE_VALUE (n) = merge_types (TREE_VALUE (p1), TREE_VALUE (p2));
}
else
TREE_VALUE (n) = TREE_VALUE (p1);
@@ -330,16 +330,38 @@ type_after_usual_arithmetic_conversions (t1, t2)
/* FIXME: Attributes. */
my_friendly_assert (ARITHMETIC_TYPE_P (t1)
+ || TREE_CODE (t1) == COMPLEX_TYPE
|| TREE_CODE (t1) == ENUMERAL_TYPE,
19990725);
my_friendly_assert (ARITHMETIC_TYPE_P (t2)
+ || TREE_CODE (t2) == COMPLEX_TYPE
|| TREE_CODE (t2) == ENUMERAL_TYPE,
19990725);
- /* In what follows, we slightly generalize the rules given in [expr]
- so as to deal with `long long'. First, merge the attributes. */
+ /* In what follows, we slightly generalize the rules given in [expr] so
+ as to deal with `long long' and `complex'. First, merge the
+ attributes. */
attributes = (*targetm.merge_type_attributes) (t1, t2);
+ /* If one type is complex, form the common type of the non-complex
+ components, then make that complex. Use T1 or T2 if it is the
+ required type. */
+ if (code1 == COMPLEX_TYPE || code2 == COMPLEX_TYPE)
+ {
+ tree subtype1 = code1 == COMPLEX_TYPE ? TREE_TYPE (t1) : t1;
+ tree subtype2 = code2 == COMPLEX_TYPE ? TREE_TYPE (t2) : t2;
+ tree subtype
+ = type_after_usual_arithmetic_conversions (subtype1, subtype2);
+
+ if (code1 == COMPLEX_TYPE && TREE_TYPE (t1) == subtype)
+ return build_type_attribute_variant (t1, attributes);
+ else if (code2 == COMPLEX_TYPE && TREE_TYPE (t2) == subtype)
+ return build_type_attribute_variant (t2, attributes);
+ else
+ return build_type_attribute_variant (build_complex_type (subtype),
+ attributes);
+ }
+
/* If only one is real, use it as the result. */
if (code1 == REAL_TYPE && code2 != REAL_TYPE)
return build_type_attribute_variant (t1, attributes);
@@ -359,6 +381,10 @@ type_after_usual_arithmetic_conversions (t1, t2)
else if (TYPE_PRECISION (t2) > TYPE_PRECISION (t1))
return build_type_attribute_variant (t2, attributes);
+ /* The types are the same; no need to do anything fancy. */
+ if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
+ return build_type_attribute_variant (t1, attributes);
+
if (code1 != REAL_TYPE)
{
/* If one is a sizetype, use it so size_binop doesn't blow up. */
@@ -420,9 +446,17 @@ type_after_usual_arithmetic_conversions (t1, t2)
|| same_type_p (TYPE_MAIN_VARIANT (t2), double_type_node))
return build_type_attribute_variant (double_type_node,
attributes);
- else
+ if (same_type_p (TYPE_MAIN_VARIANT (t1), float_type_node)
+ || same_type_p (TYPE_MAIN_VARIANT (t2), float_type_node))
return build_type_attribute_variant (float_type_node,
attributes);
+
+ /* Two floating-point types whose TYPE_MAIN_VARIANTs are none of
+ the standard C++ floating-point types. Logic earlier in this
+ function has already eliminated the possibility that
+ TYPE_PRECISION (t2) != TYPE_PRECISION (t1), so there's no
+ compelling reason to choose one or the other. */
+ return build_type_attribute_variant (t1, attributes);
}
}
@@ -439,6 +473,7 @@ composite_pointer_type (t1, t2, arg1, arg2, location)
const char* location;
{
tree result_type;
+ tree attributes;
/* [expr.rel]
@@ -456,6 +491,9 @@ composite_pointer_type (t1, t2, arg1, arg2, location)
if (TYPE_PTRMEMFUNC_P (t2))
t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
+ /* Merge the attributes. */
+ attributes = (*targetm.merge_type_attributes) (t1, t2);
+
/* We have:
[expr.rel]
@@ -504,21 +542,18 @@ composite_pointer_type (t1, t2, arg1, arg2, location)
}
}
- return result_type;
+ return build_type_attribute_variant (result_type, attributes);
}
-/* Return the common type of two types.
+/* Return the merged type of two types.
We assume that comptypes has already been done and returned 1;
if that isn't so, this may crash.
- This is the type for the result of most arithmetic operations
- if the operands have the given two types.
-
- We do not deal with enumeral types here because they have already been
- converted to integer types. */
+ This just combines attributes and default arguments; any other
+ differences would cause the two types to compare unalike. */
tree
-common_type (t1, t2)
+merge_types (t1, t2)
tree t1, t2;
{
register enum tree_code code1;
@@ -528,9 +563,7 @@ common_type (t1, t2)
/* Save time if the two types are the same. */
if (t1 == t2)
return t1;
- t1 = original_type (t1);
- t2 = original_type (t2);
- if (t1 == t2)
+ if (original_type (t1) == original_type (t2))
return t1;
/* If one type is nonsense, use the other. */
@@ -539,20 +572,11 @@ common_type (t1, t2)
if (t2 == error_mark_node)
return t1;
- if ((ARITHMETIC_TYPE_P (t1) || TREE_CODE (t1) == ENUMERAL_TYPE)
- && (ARITHMETIC_TYPE_P (t2) || TREE_CODE (t2) == ENUMERAL_TYPE))
- return type_after_usual_arithmetic_conversions (t1, t2);
-
/* Merge the attributes. */
attributes = (*targetm.merge_type_attributes) (t1, t2);
/* Treat an enum type as the unsigned integer type of the same width. */
- if (TREE_CODE (t1) == ENUMERAL_TYPE)
- t1 = type_for_size (TYPE_PRECISION (t1), 1);
- if (TREE_CODE (t2) == ENUMERAL_TYPE)
- t2 = type_for_size (TYPE_PRECISION (t2), 1);
-
if (TYPE_PTRMEMFUNC_P (t1))
t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
if (TYPE_PTRMEMFUNC_P (t2))
@@ -561,88 +585,21 @@ common_type (t1, t2)
code1 = TREE_CODE (t1);
code2 = TREE_CODE (t2);
- /* If one type is complex, form the common type of the non-complex
- components, then make that complex. Use T1 or T2 if it is the
- required type. */
- if (code1 == COMPLEX_TYPE || code2 == COMPLEX_TYPE)
- {
- tree subtype1 = code1 == COMPLEX_TYPE ? TREE_TYPE (t1) : t1;
- tree subtype2 = code2 == COMPLEX_TYPE ? TREE_TYPE (t2) : t2;
- tree subtype = common_type (subtype1, subtype2);
-
- if (code1 == COMPLEX_TYPE && TREE_TYPE (t1) == subtype)
- return build_type_attribute_variant (t1, attributes);
- else if (code2 == COMPLEX_TYPE && TREE_TYPE (t2) == subtype)
- return build_type_attribute_variant (t2, attributes);
- else
- return build_type_attribute_variant (build_complex_type (subtype),
- attributes);
- }
-
switch (code1)
{
- case INTEGER_TYPE:
- case REAL_TYPE:
- /* We should have called type_after_usual_arithmetic_conversions
- above. */
- abort ();
- break;
-
case POINTER_TYPE:
case REFERENCE_TYPE:
- /* For two pointers, do this recursively on the target type,
- and combine the qualifiers of the two types' targets. */
- /* This code was turned off; I don't know why.
- But ISO C++ specifies doing this with the qualifiers.
- So I turned it on again. */
+ /* For two pointers, do this recursively on the target type. */
{
- tree tt1 = TREE_TYPE (t1);
- tree tt2 = TREE_TYPE (t2);
- tree b1, b2;
- int type_quals;
- tree target;
-
- if (TREE_CODE (tt1) == OFFSET_TYPE)
- {
- b1 = TYPE_OFFSET_BASETYPE (tt1);
- b2 = TYPE_OFFSET_BASETYPE (tt2);
- tt1 = TREE_TYPE (tt1);
- tt2 = TREE_TYPE (tt2);
- }
- else
- b1 = b2 = NULL_TREE;
-
- type_quals = (cp_type_quals (tt1) | cp_type_quals (tt2));
- tt1 = TYPE_MAIN_VARIANT (tt1);
- tt2 = TYPE_MAIN_VARIANT (tt2);
-
- if (tt1 == tt2)
- target = tt1;
- else if (VOID_TYPE_P (tt1) || VOID_TYPE_P (tt2))
- target = void_type_node;
- else if (tt1 == unknown_type_node)
- target = tt2;
- else if (tt2 == unknown_type_node)
- target = tt1;
- else
- target = common_type (tt1, tt2);
-
- target = cp_build_qualified_type (target, type_quals);
-
- if (b1)
- {
- if (same_type_p (b1, b2)
- || (DERIVED_FROM_P (b1, b2) && binfo_or_else (b1, b2)))
- target = build_offset_type (b2, target);
- else if (binfo_or_else (b2, b1))
- target = build_offset_type (b1, target);
- }
+ tree target = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
+ int quals = cp_type_quals (t1);
if (code1 == POINTER_TYPE)
t1 = build_pointer_type (target);
else
t1 = build_reference_type (target);
t1 = build_type_attribute_variant (t1, attributes);
+ t1 = cp_build_qualified_type (t1, quals);
if (TREE_CODE (target) == METHOD_TYPE)
t1 = build_ptrmemfunc_type (t1);
@@ -650,9 +607,17 @@ common_type (t1, t2)
return t1;
}
+ case OFFSET_TYPE:
+ {
+ tree base = TYPE_OFFSET_BASETYPE (t1);
+ tree target = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
+ t1 = build_offset_type (base, target);
+ break;
+ }
+
case ARRAY_TYPE:
{
- tree elt = common_type (TREE_TYPE (t1), TREE_TYPE (t2));
+ tree elt = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
/* Save space: see if the result is identical to one of the args. */
if (elt == TREE_TYPE (t1) && TYPE_DOMAIN (t1))
return build_type_attribute_variant (t1, attributes);
@@ -661,14 +626,14 @@ common_type (t1, t2)
/* Merge the element types, and have a size if either arg has one. */
t1 = build_cplus_array_type
(elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2));
- return build_type_attribute_variant (t1, attributes);
+ break;
}
case FUNCTION_TYPE:
/* Function types: prefer the one that specified arg types.
If both do, merge the arg types. Also merge the return types. */
{
- tree valtype = common_type (TREE_TYPE (t1), TREE_TYPE (t2));
+ tree valtype = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
tree p1 = TYPE_ARG_TYPES (t1);
tree p2 = TYPE_ARG_TYPES (t2);
tree rval, raises;
@@ -697,73 +662,72 @@ common_type (t1, t2)
}
rval = build_function_type (valtype, commonparms (p1, p2));
- rval = build_exception_variant (rval, raises);
- return build_type_attribute_variant (rval, attributes);
+ t1 = build_exception_variant (rval, raises);
+ break;
}
- case RECORD_TYPE:
- case UNION_TYPE:
- t1 = TYPE_MAIN_VARIANT (t1);
- t2 = TYPE_MAIN_VARIANT (t2);
+ case METHOD_TYPE:
+ {
+ /* Get this value the long way, since TYPE_METHOD_BASETYPE
+ is just the main variant of this. */
+ tree basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t2)));
+ tree raises = TYPE_RAISES_EXCEPTIONS (t1);
+ tree t3;
+
+ /* If this was a member function type, get back to the
+ original type of type member function (i.e., without
+ the class instance variable up front. */
+ t1 = build_function_type (TREE_TYPE (t1),
+ TREE_CHAIN (TYPE_ARG_TYPES (t1)));
+ t2 = build_function_type (TREE_TYPE (t2),
+ TREE_CHAIN (TYPE_ARG_TYPES (t2)));
+ t3 = merge_types (t1, t2);
+ t3 = build_cplus_method_type (basetype, TREE_TYPE (t3),
+ TYPE_ARG_TYPES (t3));
+ t1 = build_exception_variant (t3, raises);
+ break;
+ }
- if (DERIVED_FROM_P (t1, t2) && binfo_or_else (t1, t2))
- return build_type_attribute_variant (t1, attributes);
- else if (binfo_or_else (t2, t1))
- return build_type_attribute_variant (t2, attributes);
- else
- {
- compiler_error ("common_type called with uncommon aggregate types");
- return error_mark_node;
- }
+ default:;
+ }
+ return build_type_attribute_variant (t1, attributes);
+}
- case METHOD_TYPE:
- if (TREE_CODE (TREE_TYPE (t1)) == TREE_CODE (TREE_TYPE (t2)))
- {
- /* Get this value the long way, since TYPE_METHOD_BASETYPE
- is just the main variant of this. */
- tree basetype;
- tree raises, t3;
+/* Return the common type of two types.
+ We assume that comptypes has already been done and returned 1;
+ if that isn't so, this may crash.
- tree b1 = TYPE_OFFSET_BASETYPE (t1);
- tree b2 = TYPE_OFFSET_BASETYPE (t2);
+ This is the type for the result of most arithmetic operations
+ if the operands have the given two types. */
- if (same_type_p (b1, b2)
- || (DERIVED_FROM_P (b1, b2) && binfo_or_else (b1, b2)))
- basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t2)));
- else
- {
- if (binfo_or_else (b2, b1) == NULL_TREE)
- compiler_error ("common_type called with uncommon method types");
- basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t1)));
- }
+tree
+common_type (t1, t2)
+ tree t1, t2;
+{
+ enum tree_code code1;
+ enum tree_code code2;
- raises = TYPE_RAISES_EXCEPTIONS (t1);
-
- /* If this was a member function type, get back to the
- original type of type member function (i.e., without
- the class instance variable up front. */
- t1 = build_function_type (TREE_TYPE (t1),
- TREE_CHAIN (TYPE_ARG_TYPES (t1)));
- t2 = build_function_type (TREE_TYPE (t2),
- TREE_CHAIN (TYPE_ARG_TYPES (t2)));
- t3 = common_type (t1, t2);
- t3 = build_cplus_method_type (basetype, TREE_TYPE (t3),
- TYPE_ARG_TYPES (t3));
- t1 = build_exception_variant (t3, raises);
- }
- else
- compiler_error ("common_type called with uncommon method types");
+ /* If one type is nonsense, bail. */
+ if (t1 == error_mark_node || t2 == error_mark_node)
+ return error_mark_node;
- return build_type_attribute_variant (t1, attributes);
+ code1 = TREE_CODE (t1);
+ code2 = TREE_CODE (t2);
- case OFFSET_TYPE:
- /* Pointers to members should now be handled by the POINTER_TYPE
- case above. */
- abort ();
+ if ((ARITHMETIC_TYPE_P (t1) || code1 == ENUMERAL_TYPE
+ || code1 == COMPLEX_TYPE)
+ && (ARITHMETIC_TYPE_P (t2) || code2 == ENUMERAL_TYPE
+ || code2 == COMPLEX_TYPE))
+ return type_after_usual_arithmetic_conversions (t1, t2);
- default:
- return build_type_attribute_variant (t1, attributes);
- }
+ else if ((TYPE_PTR_P (t1) && TYPE_PTR_P (t2))
+ || (TYPE_PTRMEM_P (t1) && TYPE_PTRMEM_P (t2))
+ || (TYPE_PTRMEMFUNC_P (t1) && TYPE_PTRMEMFUNC_P (t2)))
+ return composite_pointer_type (t1, t2, error_mark_node, error_mark_node,
+ "conversion");
+
+ else
+ abort ();
}
/* Compare two exception specifier types for exactness or subsetness, if
@@ -1037,20 +1001,6 @@ comptypes (t1, t2, strict)
&& comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict));
break;
- case METHOD_TYPE:
- if (! comp_except_specs (TYPE_RAISES_EXCEPTIONS (t1),
- TYPE_RAISES_EXCEPTIONS (t2), 1))
- return 0;
-
- /* This case is anti-symmetrical!
- One can pass a base member (or member function)
- to something expecting a derived member (or member function),
- but not vice-versa! */
-
- val = (comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict)
- && compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2)));
- break;
-
case POINTER_TYPE:
case REFERENCE_TYPE:
t1 = TREE_TYPE (t1);
@@ -1065,11 +1015,8 @@ comptypes (t1, t2, strict)
goto look_hard;
break;
+ case METHOD_TYPE:
case FUNCTION_TYPE:
- if (! comp_except_specs (TYPE_RAISES_EXCEPTIONS (t1),
- TYPE_RAISES_EXCEPTIONS (t2), 1))
- return 0;
-
val = ((TREE_TYPE (t1) == TREE_TYPE (t2)
|| comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict))
&& compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2)));
@@ -1999,6 +1946,8 @@ build_component_ref (datum, component, basetype_path, protect)
register tree ref;
tree field_type;
int type_quals;
+ tree old_datum;
+ tree old_basetype;
if (processing_template_decl)
return build_min_nt (COMPONENT_REF, datum, component);
@@ -2202,6 +2151,9 @@ build_component_ref (datum, component, basetype_path, protect)
if (TREE_DEPRECATED (field))
warn_deprecated_use (field);
+ old_datum = datum;
+ old_basetype = basetype;
+
/* See if we have to do any conversions so that we pick up the field from the
right context. */
if (DECL_FIELD_CONTEXT (field) != basetype)
@@ -2215,12 +2167,17 @@ build_component_ref (datum, component, basetype_path, protect)
/* Handle base classes here... */
if (base != basetype && TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (basetype))
{
- tree binfo = lookup_base (TREE_TYPE (datum), base, ba_check, NULL);
-
+ base_kind kind;
+ tree binfo = lookup_base (TREE_TYPE (datum), base, ba_check, &kind);
+
+ /* Complain about use of offsetof which will break. */
if (TREE_CODE (datum) == INDIRECT_REF
- && integer_zerop (TREE_OPERAND (datum, 0)))
+ && integer_zerop (TREE_OPERAND (datum, 0))
+ && kind == bk_via_virtual)
{
- error ("invalid reference to NULL ptr, use ptr-to-member instead");
+ error ("\
+invalid offsetof from non-POD type `%#T'; use pointer to member instead",
+ basetype);
return error_mark_node;
}
datum = build_base_path (PLUS_EXPR, datum, binfo, 1);
@@ -2239,6 +2196,18 @@ build_component_ref (datum, component, basetype_path, protect)
}
}
+ /* Complain about other invalid uses of offsetof, even though they will
+ give the right answer. Note that we complain whether or not they
+ actually used the offsetof macro, since there's no way to know at this
+ point. So we just give a warning, instead of a pedwarn. */
+ if (protect
+ && CLASSTYPE_NON_POD_P (old_basetype)
+ && TREE_CODE (old_datum) == INDIRECT_REF
+ && integer_zerop (TREE_OPERAND (old_datum, 0)))
+ warning ("\
+invalid offsetof from non-POD type `%#T'; use pointer to member instead",
+ basetype);
+
/* Compute the type of the field, as described in [expr.ref]. */
type_quals = TYPE_UNQUALIFIED;
field_type = TREE_TYPE (field);
@@ -2904,19 +2873,18 @@ get_member_function_from_ptrfunc (instance_ptrptr, function)
load-with-sign-extend, while the second used normal load then
shift to sign-extend. An optimizer flaw, perhaps, but it's
easier to make this change. */
+ idx = cp_build_binary_op (TRUNC_DIV_EXPR,
+ build1 (NOP_EXPR, vtable_index_type, e3),
+ TYPE_SIZE_UNIT (vtable_entry_type));
switch (TARGET_PTRMEMFUNC_VBIT_LOCATION)
{
case ptrmemfunc_vbit_in_pfn:
- idx = cp_build_binary_op (TRUNC_DIV_EXPR,
- build1 (NOP_EXPR, vtable_index_type, e3),
- TYPE_SIZE_UNIT (vtable_entry_type));
e1 = cp_build_binary_op (BIT_AND_EXPR,
build1 (NOP_EXPR, vtable_index_type, e3),
integer_one_node);
break;
case ptrmemfunc_vbit_in_delta:
- idx = build1 (NOP_EXPR, vtable_index_type, e3);
e1 = cp_build_binary_op (BIT_AND_EXPR,
delta, integer_one_node);
delta = cp_build_binary_op (RSHIFT_EXPR,
@@ -2991,10 +2959,6 @@ build_function_call_real (function, params, require_complete, flags)
name = DECL_NAME (function);
assembler_name = DECL_ASSEMBLER_NAME (function);
- GNU_xref_call (current_function_decl,
- IDENTIFIER_POINTER (name ? name
- : TYPE_IDENTIFIER (DECL_CLASS_CONTEXT
- (function))));
mark_used (function);
fndecl = function;
@@ -3396,7 +3360,7 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
/* DTRT if one side is an overloaded function, but complain about it. */
if (type_unknown_p (op0))
{
- tree t = instantiate_type (TREE_TYPE (op1), op0, itf_none);
+ tree t = instantiate_type (TREE_TYPE (op1), op0, tf_none);
if (t != error_mark_node)
{
pedwarn ("assuming cast to type `%T' from overloaded function",
@@ -3406,7 +3370,7 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
}
if (type_unknown_p (op1))
{
- tree t = instantiate_type (TREE_TYPE (op0), op1, itf_none);
+ tree t = instantiate_type (TREE_TYPE (op0), op1, tf_none);
if (t != error_mark_node)
{
pedwarn ("assuming cast to type `%T' from overloaded function",
@@ -3434,9 +3398,9 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
case PLUS_EXPR:
/* Handle the pointer + int case. */
if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
- return pointer_int_sum (PLUS_EXPR, op0, op1);
+ return cp_pointer_int_sum (PLUS_EXPR, op0, op1);
else if (code1 == POINTER_TYPE && code0 == INTEGER_TYPE)
- return pointer_int_sum (PLUS_EXPR, op1, op0);
+ return cp_pointer_int_sum (PLUS_EXPR, op1, op0);
else
common = 1;
break;
@@ -3449,7 +3413,7 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
return pointer_diff (op0, op1, common_type (type0, type1));
/* Handle pointer minus int. Just like pointer plus int. */
else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
- return pointer_int_sum (MINUS_EXPR, op0, op1);
+ return cp_pointer_int_sum (MINUS_EXPR, op0, op1);
else
common = 1;
break;
@@ -3496,31 +3460,6 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
case BIT_XOR_EXPR:
if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
shorten = -1;
- /* If one operand is a constant, and the other is a short type
- that has been converted to an int,
- really do the work in the short type and then convert the
- result to int. If we are lucky, the constant will be 0 or 1
- in the short type, making the entire operation go away. */
- if (TREE_CODE (op0) == INTEGER_CST
- && TREE_CODE (op1) == NOP_EXPR
- && (TYPE_PRECISION (type1)
- > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op1, 0))))
- && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op1, 0))))
- {
- final_type = result_type;
- op1 = TREE_OPERAND (op1, 0);
- result_type = TREE_TYPE (op1);
- }
- if (TREE_CODE (op1) == INTEGER_CST
- && TREE_CODE (op0) == NOP_EXPR
- && (TYPE_PRECISION (type0)
- > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0))))
- && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
- {
- final_type = result_type;
- op0 = TREE_OPERAND (op0, 0);
- result_type = TREE_TYPE (op0);
- }
break;
case TRUNC_MOD_EXPR:
@@ -4079,94 +4018,20 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
of pointer PTROP and integer INTOP. */
static tree
-pointer_int_sum (resultcode, ptrop, intop)
+cp_pointer_int_sum (resultcode, ptrop, intop)
enum tree_code resultcode;
register tree ptrop, intop;
{
- tree size_exp;
+ tree res_type = TREE_TYPE (ptrop);
- register tree result;
- register tree folded = fold (intop);
+ /* pointer_int_sum() uses size_in_bytes() on the TREE_TYPE(res_type)
+ in certain circumstance (when it's valid to do so). So we need
+ to make sure it's complete. We don't need to check here, if we
+ can actually complete it at all, as those checks will be done in
+ pointer_int_sum() anyway. */
+ complete_type (TREE_TYPE (res_type));
- /* The result is a pointer of the same type that is being added. */
-
- register tree result_type = TREE_TYPE (ptrop);
-
- if (!complete_type_or_else (result_type, ptrop))
- return error_mark_node;
-
- if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
- {
- if (pedantic || warn_pointer_arith)
- pedwarn ("ISO C++ forbids using pointer of type `void *' in pointer arithmetic");
- size_exp = integer_one_node;
- }
- else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE)
- {
- if (pedantic || warn_pointer_arith)
- pedwarn ("ISO C++ forbids using a pointer-to-function in pointer arithmetic");
- size_exp = integer_one_node;
- }
- else if (TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE)
- {
- if (pedantic || warn_pointer_arith)
- pedwarn ("ISO C++ forbids using a pointer to member function in pointer arithmetic");
- size_exp = integer_one_node;
- }
- else if (TREE_CODE (TREE_TYPE (result_type)) == OFFSET_TYPE)
- {
- if (pedantic || warn_pointer_arith)
- pedwarn ("ISO C++ forbids using pointer to a member in pointer arithmetic");
- size_exp = integer_one_node;
- }
- else
- size_exp = size_in_bytes (complete_type (TREE_TYPE (result_type)));
-
- /* Needed to make OOPS V2R3 work. */
- intop = folded;
- if (integer_zerop (intop))
- return ptrop;
-
- /* If what we are about to multiply by the size of the elements
- contains a constant term, apply distributive law
- and multiply that constant term separately.
- This helps produce common subexpressions. */
-
- if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR)
- && ! TREE_CONSTANT (intop)
- && TREE_CONSTANT (TREE_OPERAND (intop, 1))
- && TREE_CONSTANT (size_exp))
- {
- enum tree_code subcode = resultcode;
- if (TREE_CODE (intop) == MINUS_EXPR)
- subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR);
- ptrop = cp_build_binary_op (subcode, ptrop, TREE_OPERAND (intop, 1));
- intop = TREE_OPERAND (intop, 0);
- }
-
- /* Convert the integer argument to a type the same size as sizetype
- so the multiply won't overflow spuriously. */
-
- if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype))
- intop = cp_convert (type_for_size (TYPE_PRECISION (sizetype), 0), intop);
-
- /* Replace the integer argument with a suitable product by the object size.
- Do this multiplication as signed, then convert to the appropriate
- pointer type (actually unsigned integral). */
-
- intop = cp_convert (result_type,
- cp_build_binary_op (MULT_EXPR, intop,
- cp_convert (TREE_TYPE (intop),
- size_exp)));
-
- /* Create the sum or difference. */
-
- result = build (resultcode, result_type, ptrop, intop);
-
- folded = fold (result);
- if (folded == result)
- TREE_CONSTANT (folded) = TREE_CONSTANT (ptrop) & TREE_CONSTANT (intop);
- return folded;
+ return pointer_int_sum (resultcode, ptrop, fold (intop));
}
/* Return a tree for the difference of pointers OP0 and OP1.
@@ -5159,6 +5024,22 @@ build_static_cast (type, expr)
&& kind != bk_via_virtual)
ok = 1;
}
+ else if (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
+ {
+ /* They're pointers to members. The pointed to objects must be
+ the same (ignoring CV qualifiers), and the containing classes
+ must be related non-virtually. */
+ base_kind kind;
+
+ if (same_type_p
+ (strip_all_pointer_quals (TREE_TYPE (TREE_TYPE (type))),
+ strip_all_pointer_quals (TREE_TYPE (TREE_TYPE (intype))))
+ && (lookup_base (TYPE_OFFSET_BASETYPE (TREE_TYPE (intype)),
+ TYPE_OFFSET_BASETYPE (TREE_TYPE (type)),
+ ba_ignore | ba_quiet, &kind))
+ && kind != bk_via_virtual)
+ ok = 1;
+ }
else if (TREE_CODE (intype) != BOOLEAN_TYPE
&& TREE_CODE (type) != ARRAY_TYPE
&& TREE_CODE (type) != FUNCTION_TYPE
@@ -5726,8 +5607,6 @@ build_modify_expr (lhs, modifycode, rhs)
if (!lvalue_or_else (lhs, "assignment"))
return error_mark_node;
- GNU_xref_assign (lhs);
-
/* Warn about modifying something that is `const'. Don't warn if
this is initialization. */
if (modifycode != INIT_EXPR
@@ -5777,15 +5656,16 @@ build_modify_expr (lhs, modifycode, rhs)
{
int from_array;
- if (!same_or_base_type_p (lhstype, TREE_TYPE (rhs)))
+ if (!same_or_base_type_p (TYPE_MAIN_VARIANT (lhstype),
+ TYPE_MAIN_VARIANT (TREE_TYPE (rhs))))
{
error ("incompatible types in assignment of `%T' to `%T'",
- TREE_TYPE (rhs), lhstype);
+ TREE_TYPE (rhs), lhstype);
return error_mark_node;
}
/* Allow array assignment in compiler-generated code. */
- if (pedantic && ! DECL_ARTIFICIAL (current_function_decl))
+ if (! DECL_ARTIFICIAL (current_function_decl))
pedwarn ("ISO C++ forbids assignment of arrays");
from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
@@ -6090,7 +5970,7 @@ build_ptrmemfunc (type, pfn, force)
}
if (type_unknown_p (pfn))
- return instantiate_type (type, pfn, itf_complain);
+ return instantiate_type (type, pfn, tf_error | tf_warning);
fn = TREE_OPERAND (pfn, 0);
my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 0);
@@ -6318,7 +6198,7 @@ convert_for_assignment (type, rhs, errtype, fndecl, parmnum)
overloaded function. Call instantiate_type to get error
messages. */
if (rhstype == unknown_type_node)
- instantiate_type (type, rhs, itf_complain);
+ instantiate_type (type, rhs, tf_error | tf_warning);
else if (fndecl)
error ("cannot convert `%T' to `%T' for argument `%P' to `%D'",
rhstype, type, parmnum, fndecl);
diff --git a/contrib/gcc/cp/typeck2.c b/contrib/gcc/cp/typeck2.c
index 314685a..48caade 100644
--- a/contrib/gcc/cp/typeck2.c
+++ b/contrib/gcc/cp/typeck2.c
@@ -544,7 +544,7 @@ digest_init (type, init, tail)
if (code == INTEGER_TYPE || code == REAL_TYPE || code == POINTER_TYPE
|| code == ENUMERAL_TYPE || code == REFERENCE_TYPE
- || code == BOOLEAN_TYPE || code == COMPLEX_TYPE || code == VECTOR_TYPE
+ || code == BOOLEAN_TYPE || code == COMPLEX_TYPE
|| TYPE_PTRMEMFUNC_P (type))
{
if (raw_constructor)
@@ -578,7 +578,7 @@ digest_init (type, init, tail)
return error_mark_node;
}
- if (code == ARRAY_TYPE || IS_AGGR_TYPE_CODE (code))
+ if (code == ARRAY_TYPE || code == VECTOR_TYPE || IS_AGGR_TYPE_CODE (code))
{
if (raw_constructor && TYPE_NON_AGGREGATE_CLASS (type)
&& TREE_HAS_CONSTRUCTOR (init))
@@ -659,18 +659,26 @@ process_init_constructor (type, init, elts)
for each element of this aggregate. Chain them together in result.
If there are too few, use 0 for each scalar ultimate component. */
- if (TREE_CODE (type) == ARRAY_TYPE)
+ if (TREE_CODE (type) == ARRAY_TYPE || TREE_CODE (type) == VECTOR_TYPE)
{
- tree domain = TYPE_DOMAIN (type);
register long len;
register int i;
- if (domain)
- len = (TREE_INT_CST_LOW (TYPE_MAX_VALUE (domain))
- - TREE_INT_CST_LOW (TYPE_MIN_VALUE (domain))
- + 1);
+ if (TREE_CODE (type) == ARRAY_TYPE)
+ {
+ tree domain = TYPE_DOMAIN (type);
+ if (domain)
+ len = (TREE_INT_CST_LOW (TYPE_MAX_VALUE (domain))
+ - TREE_INT_CST_LOW (TYPE_MIN_VALUE (domain))
+ + 1);
+ else
+ len = -1; /* Take as many as there are */
+ }
else
- len = -1; /* Take as many as there are */
+ {
+ /* Vectors are like simple fixed-size arrays. */
+ len = TYPE_VECTOR_SUBPARTS (type);
+ }
for (i = 0; len < 0 || i < len; i++)
{
diff --git a/contrib/gcc/cplus-dem.c b/contrib/gcc/cplus-dem.c
index 6d51710..203e30d 100644
--- a/contrib/gcc/cplus-dem.c
+++ b/contrib/gcc/cplus-dem.c
@@ -1,5 +1,6 @@
/* Demangler for GNU C++
- Copyright 1989, 91, 94, 95, 96, 97, 98, 1999 Free Software Foundation, Inc.
+ Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999,
+ 2000, 2001 Free Software Foundation, Inc.
Written by James Clark (jjc@jclark.uucp)
Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
Modified by Satish Pai (pai@apollo.hp.com) for HP demangling
@@ -33,7 +34,8 @@ Boston, MA 02111-1307, USA. */
#include "config.h"
#endif
-#include <ctype.h>
+#include "safe-ctype.h"
+
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
@@ -51,26 +53,15 @@ char * realloc ();
#include "libiberty.h"
+static char *ada_demangle PARAMS ((const char *, int));
+
#define min(X,Y) (((X) < (Y)) ? (X) : (Y))
-static const char *mystrstr PARAMS ((const char *, const char *));
+/* A value at least one greater than the maximum number of characters
+ that will be output when using the `%d' format with `printf'. */
+#define INTBUF_SIZE 32
-static const char *
-mystrstr (s1, s2)
- const char *s1, *s2;
-{
- register const char *p = s1;
- register int len = strlen (s2);
-
- for (; (p = strchr (p, *s2)) != 0; p++)
- {
- if (strncmp (p, s2, len) == 0)
- {
- return (p);
- }
- }
- return (0);
-}
+extern void fancy_abort PARAMS ((void)) ATTRIBUTE_NORETURN;
/* In order to allow a single demangler executable to demangle strings
using various common values of CPLUS_MARKER, as well as any specific
@@ -92,7 +83,7 @@ mystrstr (s1, s2)
#define CPLUS_MARKER '$'
#endif
-enum demangling_styles current_demangling_style = gnu_demangling;
+enum demangling_styles current_demangling_style = auto_demangling;
static char cplus_markers[] = { CPLUS_MARKER, '.', '$', '\0' };
@@ -147,9 +138,9 @@ struct work_stuff
static const struct optable
{
- const char *in;
- const char *out;
- int flags;
+ const char *const in;
+ const char *const out;
+ const int flags;
} optable[] = {
{"nw", " new", DMGL_ANSI}, /* new (1.92, ansi) */
{"dl", " delete", DMGL_ANSI}, /* new (1.92, ansi) */
@@ -246,6 +237,73 @@ typedef enum type_kind_t
tk_real
} type_kind_t;
+const struct demangler_engine libiberty_demanglers[] =
+{
+ {
+ NO_DEMANGLING_STYLE_STRING,
+ no_demangling,
+ "Demangling disabled"
+ }
+ ,
+ {
+ AUTO_DEMANGLING_STYLE_STRING,
+ auto_demangling,
+ "Automatic selection based on executable"
+ }
+ ,
+ {
+ GNU_DEMANGLING_STYLE_STRING,
+ gnu_demangling,
+ "GNU (g++) style demangling"
+ }
+ ,
+ {
+ LUCID_DEMANGLING_STYLE_STRING,
+ lucid_demangling,
+ "Lucid (lcc) style demangling"
+ }
+ ,
+ {
+ ARM_DEMANGLING_STYLE_STRING,
+ arm_demangling,
+ "ARM style demangling"
+ }
+ ,
+ {
+ HP_DEMANGLING_STYLE_STRING,
+ hp_demangling,
+ "HP (aCC) style demangling"
+ }
+ ,
+ {
+ EDG_DEMANGLING_STYLE_STRING,
+ edg_demangling,
+ "EDG style demangling"
+ }
+ ,
+ {
+ GNU_V3_DEMANGLING_STYLE_STRING,
+ gnu_v3_demangling,
+ "GNU (g++) V3 ABI-style demangling"
+ }
+ ,
+ {
+ JAVA_DEMANGLING_STYLE_STRING,
+ java_demangling,
+ "Java style demangling"
+ }
+ ,
+ {
+ GNAT_DEMANGLING_STYLE_STRING,
+ gnat_demangling,
+ "GNAT style demangling"
+ }
+ ,
+ {
+ NULL, unknown_demangling, NULL
+ }
+};
+
#define STRING_EMPTY(str) ((str) -> b == (str) -> p)
#define PREPEND_BLANK(str) {if (!STRING_EMPTY(str)) \
string_prepend(str, " ");}
@@ -262,12 +320,21 @@ typedef enum type_kind_t
/* Prototypes for local functions */
+static void
+delete_work_stuff PARAMS ((struct work_stuff *));
+
+static void
+delete_non_B_K_work_stuff PARAMS ((struct work_stuff *));
+
static char *
mop_up PARAMS ((struct work_stuff *, string *, int));
static void
squangle_mop_up PARAMS ((struct work_stuff *));
+static void
+work_stuff_copy_to_from PARAMS ((struct work_stuff *, struct work_stuff *));
+
#if 0
static int
demangle_method_args PARAMS ((struct work_stuff *, const char **, string *));
@@ -345,6 +412,9 @@ string_prepend PARAMS ((string *, const char *));
static void
string_prependn PARAMS ((string *, const char *, int));
+static void
+string_append_template_idx PARAMS ((string *, int));
+
static int
get_count PARAMS ((const char **, int *));
@@ -370,6 +440,10 @@ static void
demangle_function_name PARAMS ((struct work_stuff *, const char **, string *,
const char *));
+static int
+iterate_demangle_function PARAMS ((struct work_stuff *,
+ const char **, string *, const char *));
+
static void
remember_type PARAMS ((struct work_stuff *, const char *, int));
@@ -422,6 +496,28 @@ qualifier_string PARAMS ((int));
static const char*
demangle_qualifier PARAMS ((int));
+static int
+demangle_expression PARAMS ((struct work_stuff *, const char **, string *,
+ type_kind_t));
+
+static int
+demangle_integral_value PARAMS ((struct work_stuff *, const char **,
+ string *));
+
+static int
+demangle_real_value PARAMS ((struct work_stuff *, const char **, string *));
+
+static void
+demangle_arm_hp_template PARAMS ((struct work_stuff *, const char **, int,
+ string *));
+
+static void
+recursively_demangle PARAMS ((struct work_stuff *, const char **, string *,
+ int));
+
+static void
+grow_vect PARAMS ((void **, size_t *, size_t, int));
+
/* Translate count to integer, consuming tokens in the process.
Conversion terminates on the first non-digit character.
@@ -436,10 +532,10 @@ consume_count (type)
{
int count = 0;
- if (! isdigit ((unsigned char)**type))
+ if (! ISDIGIT ((unsigned char)**type))
return -1;
- while (isdigit ((unsigned char)**type))
+ while (ISDIGIT ((unsigned char)**type))
{
count *= 10;
@@ -450,7 +546,7 @@ consume_count (type)
ten. */
if ((count % 10) != 0)
{
- while (isdigit ((unsigned char) **type))
+ while (ISDIGIT ((unsigned char) **type))
(*type)++;
return -1;
}
@@ -459,6 +555,9 @@ consume_count (type)
(*type)++;
}
+ if (count < 0)
+ count = -1;
+
return (count);
}
@@ -476,7 +575,7 @@ consume_count_with_underscores (mangled)
if (**mangled == '_')
{
(*mangled)++;
- if (!isdigit ((unsigned char)**mangled))
+ if (!ISDIGIT ((unsigned char)**mangled))
return -1;
idx = consume_count (mangled);
@@ -608,14 +707,14 @@ cplus_demangle_opname (opname, result, options)
}
}
else if (opname[0] == '_' && opname[1] == '_'
- && opname[2] >= 'a' && opname[2] <= 'z'
- && opname[3] >= 'a' && opname[3] <= 'z')
+ && ISLOWER((unsigned char)opname[2])
+ && ISLOWER((unsigned char)opname[3]))
{
if (opname[4] == '\0')
{
/* Operator. */
size_t i;
- for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++)
+ for (i = 0; i < ARRAY_SIZE (optable); i++)
{
if (strlen (optable[i].in) == 2
&& memcmp (optable[i].in, opname + 2, 2) == 0)
@@ -633,7 +732,7 @@ cplus_demangle_opname (opname, result, options)
{
/* Assignment. */
size_t i;
- for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++)
+ for (i = 0; i < ARRAY_SIZE (optable); i++)
{
if (strlen (optable[i].in) == 3
&& memcmp (optable[i].in, opname + 2, 3) == 0)
@@ -657,7 +756,7 @@ cplus_demangle_opname (opname, result, options)
&& memcmp (opname + 3, "assign_", 7) == 0)
{
size_t i;
- for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++)
+ for (i = 0; i < ARRAY_SIZE (optable); i++)
{
len1 = len - 10;
if ((int) strlen (optable[i].in) == len1
@@ -674,7 +773,7 @@ cplus_demangle_opname (opname, result, options)
else
{
size_t i;
- for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++)
+ for (i = 0; i < ARRAY_SIZE (optable); i++)
{
len1 = len - 3;
if ((int) strlen (optable[i].in) == len1
@@ -705,6 +804,7 @@ cplus_demangle_opname (opname, result, options)
return ret;
}
+
/* Takes operator name as e.g. "++" and returns mangled
operator name (e.g. "postincrement_expr"), or NULL if not found.
@@ -720,7 +820,7 @@ cplus_mangle_opname (opname, options)
int len;
len = strlen (opname);
- for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++)
+ for (i = 0; i < ARRAY_SIZE (optable); i++)
{
if ((int) strlen (optable[i].out) == len
&& (options & DMGL_ANSI) == (optable[i].flags & DMGL_ANSI)
@@ -730,10 +830,44 @@ cplus_mangle_opname (opname, options)
return (0);
}
+/* Add a routine to set the demangling style to be sure it is valid and
+ allow for any demangler initialization that maybe necessary. */
+
+enum demangling_styles
+cplus_demangle_set_style (style)
+ enum demangling_styles style;
+{
+ const struct demangler_engine *demangler = libiberty_demanglers;
+
+ for (; demangler->demangling_style != unknown_demangling; ++demangler)
+ if (style == demangler->demangling_style)
+ {
+ current_demangling_style = style;
+ return current_demangling_style;
+ }
+
+ return unknown_demangling;
+}
+
+/* Do string name to style translation */
+
+enum demangling_styles
+cplus_demangle_name_to_style (name)
+ const char *name;
+{
+ const struct demangler_engine *demangler = libiberty_demanglers;
+
+ for (; demangler->demangling_style != unknown_demangling; ++demangler)
+ if (strcmp (name, demangler->demangling_style_name) == 0)
+ return demangler->demangling_style;
+
+ return unknown_demangling;
+}
+
/* char *cplus_demangle (const char *mangled, int options)
If MANGLED is a mangled function name produced by GNU C++, then
- a pointer to a malloced string giving a C++ representation
+ a pointer to a @code{malloc}ed string giving a C++ representation
of the name will be returned; otherwise NULL will be returned.
It is the caller's responsibility to free the string which
is returned.
@@ -765,10 +899,32 @@ cplus_demangle (mangled, options)
{
char *ret;
struct work_stuff work[1];
+
+ if (current_demangling_style == no_demangling)
+ return xstrdup (mangled);
+
memset ((char *) work, 0, sizeof (work));
- work -> options = options;
- if ((work -> options & DMGL_STYLE_MASK) == 0)
- work -> options |= (int) current_demangling_style & DMGL_STYLE_MASK;
+ work->options = options;
+ if ((work->options & DMGL_STYLE_MASK) == 0)
+ work->options |= (int) current_demangling_style & DMGL_STYLE_MASK;
+
+ /* The V3 ABI demangling is implemented elsewhere. */
+ if (GNU_V3_DEMANGLING || AUTO_DEMANGLING)
+ {
+ ret = cplus_demangle_v3 (mangled, work->options);
+ if (ret || GNU_V3_DEMANGLING)
+ return ret;
+ }
+
+ if (JAVA_DEMANGLING)
+ {
+ ret = java_demangle_v3 (mangled);
+ if (ret)
+ return ret;
+ }
+
+ if (GNAT_DEMANGLING)
+ return ada_demangle(mangled,options);
ret = internal_cplus_demangle (work, mangled);
squangle_mop_up (work);
@@ -776,6 +932,139 @@ cplus_demangle (mangled, options)
}
+/* Assuming *OLD_VECT points to an array of *SIZE objects of size
+ ELEMENT_SIZE, grow it to contain at least MIN_SIZE objects,
+ updating *OLD_VECT and *SIZE as necessary. */
+
+static void
+grow_vect (old_vect, size, min_size, element_size)
+ void **old_vect;
+ size_t *size;
+ size_t min_size;
+ int element_size;
+{
+ if (*size < min_size)
+ {
+ *size *= 2;
+ if (*size < min_size)
+ *size = min_size;
+ *old_vect = xrealloc (*old_vect, *size * element_size);
+ }
+}
+
+/* Demangle ada names:
+ 1. Discard final __{DIGIT}+ or ${DIGIT}+
+ 2. Convert other instances of embedded "__" to `.'.
+ 3. Discard leading _ada_.
+ 4. Remove everything after first ___ if it is followed by 'X'.
+ 5. Put symbols that should be suppressed in <...> brackets.
+ The resulting string is valid until the next call of ada_demangle. */
+
+static char *
+ada_demangle (mangled, option)
+ const char *mangled;
+ int option ATTRIBUTE_UNUSED;
+{
+ int i, j;
+ int len0;
+ const char* p;
+ char *demangled = NULL;
+ int at_start_name;
+ int changed;
+ char *demangling_buffer = NULL;
+ size_t demangling_buffer_size = 0;
+
+ changed = 0;
+
+ if (strncmp (mangled, "_ada_", 5) == 0)
+ {
+ mangled += 5;
+ changed = 1;
+ }
+
+ if (mangled[0] == '_' || mangled[0] == '<')
+ goto Suppress;
+
+ p = strstr (mangled, "___");
+ if (p == NULL)
+ len0 = strlen (mangled);
+ else
+ {
+ if (p[3] == 'X')
+ {
+ len0 = p - mangled;
+ changed = 1;
+ }
+ else
+ goto Suppress;
+ }
+
+ /* Make demangled big enough for possible expansion by operator name. */
+ grow_vect ((void **) &(demangling_buffer),
+ &demangling_buffer_size, 2 * len0 + 1,
+ sizeof (char));
+ demangled = demangling_buffer;
+
+ if (ISDIGIT ((unsigned char) mangled[len0 - 1])) {
+ for (i = len0 - 2; i >= 0 && ISDIGIT ((unsigned char) mangled[i]); i -= 1)
+ ;
+ if (i > 1 && mangled[i] == '_' && mangled[i - 1] == '_')
+ {
+ len0 = i - 1;
+ changed = 1;
+ }
+ else if (mangled[i] == '$')
+ {
+ len0 = i;
+ changed = 1;
+ }
+ }
+
+ for (i = 0, j = 0; i < len0 && ! ISALPHA ((unsigned char)mangled[i]);
+ i += 1, j += 1)
+ demangled[j] = mangled[i];
+
+ at_start_name = 1;
+ while (i < len0)
+ {
+ at_start_name = 0;
+
+ if (i < len0 - 2 && mangled[i] == '_' && mangled[i + 1] == '_')
+ {
+ demangled[j] = '.';
+ changed = at_start_name = 1;
+ i += 2; j += 1;
+ }
+ else
+ {
+ demangled[j] = mangled[i];
+ i += 1; j += 1;
+ }
+ }
+ demangled[j] = '\000';
+
+ for (i = 0; demangled[i] != '\0'; i += 1)
+ if (ISUPPER ((unsigned char)demangled[i]) || demangled[i] == ' ')
+ goto Suppress;
+
+ if (! changed)
+ return NULL;
+ else
+ return demangled;
+
+ Suppress:
+ grow_vect ((void **) &(demangling_buffer),
+ &demangling_buffer_size, strlen (mangled) + 3,
+ sizeof (char));
+ demangled = demangling_buffer;
+ if (mangled[0] == '<')
+ strcpy (demangled, mangled);
+ else
+ sprintf (demangled, "<%s>", mangled);
+
+ return demangled;
+}
+
/* This function performs most of what cplus_demangle use to do, but
to be able to demangle a name with a B, K or n code, we need to
have a longer term memory of what types have been seen. The original
@@ -791,7 +1080,7 @@ internal_cplus_demangle (work, mangled)
string decl;
int success = 0;
char *demangled = NULL;
- int s1,s2,s3,s4;
+ int s1, s2, s3, s4;
s1 = work->constructor;
s2 = work->destructor;
s3 = work->static_type;
@@ -844,7 +1133,7 @@ internal_cplus_demangle (work, mangled)
work->destructor = s2;
work->static_type = s3;
work->type_quals = s4;
- return (demangled);
+ return demangled;
}
@@ -865,16 +1154,85 @@ squangle_mop_up (work)
}
}
-/* Clear out any mangled storage */
-static char *
-mop_up (work, declp, success)
- struct work_stuff *work;
- string *declp;
- int success;
+/* Copy the work state and storage. */
+
+static void
+work_stuff_copy_to_from (to, from)
+ struct work_stuff *to;
+ struct work_stuff *from;
{
- char *demangled = NULL;
+ int i;
+
+ delete_work_stuff (to);
+
+ /* Shallow-copy scalars. */
+ memcpy (to, from, sizeof (*to));
+
+ /* Deep-copy dynamic storage. */
+ if (from->typevec_size)
+ to->typevec
+ = (char **) xmalloc (from->typevec_size * sizeof (to->typevec[0]));
+ for (i = 0; i < from->ntypes; i++)
+ {
+ int len = strlen (from->typevec[i]) + 1;
+
+ to->typevec[i] = xmalloc (len);
+ memcpy (to->typevec[i], from->typevec[i], len);
+ }
+
+ if (from->ksize)
+ to->ktypevec
+ = (char **) xmalloc (from->ksize * sizeof (to->ktypevec[0]));
+
+ for (i = 0; i < from->numk; i++)
+ {
+ int len = strlen (from->ktypevec[i]) + 1;
+
+ to->ktypevec[i] = xmalloc (len);
+ memcpy (to->ktypevec[i], from->ktypevec[i], len);
+ }
+
+ if (from->bsize)
+ to->btypevec
+ = (char **) xmalloc (from->bsize * sizeof (to->btypevec[0]));
+
+ for (i = 0; i < from->numb; i++)
+ {
+ int len = strlen (from->btypevec[i]) + 1;
+
+ to->btypevec[i] = xmalloc (len);
+ memcpy (to->btypevec[i], from->btypevec[i], len);
+ }
+
+ if (from->ntmpl_args)
+ to->tmpl_argvec
+ = xmalloc (from->ntmpl_args * sizeof (to->tmpl_argvec[0]));
+
+ for (i = 0; i < from->ntmpl_args; i++)
+ {
+ int len = strlen (from->tmpl_argvec[i]) + 1;
+
+ to->tmpl_argvec[i] = xmalloc (len);
+ memcpy (to->tmpl_argvec[i], from->tmpl_argvec[i], len);
+ }
+
+ if (from->previous_argument)
+ {
+ to->previous_argument = (string*) xmalloc (sizeof (string));
+ string_init (to->previous_argument);
+ string_appends (to->previous_argument, from->previous_argument);
+ }
+}
+
+
+/* Delete dynamic stuff in work_stuff that is not to be re-used. */
+
+static void
+delete_non_B_K_work_stuff (work)
+ struct work_stuff *work;
+{
/* Discard the remembered types, if any. */
forget_types (work);
@@ -901,6 +1259,30 @@ mop_up (work, declp, success)
free ((char*) work->previous_argument);
work->previous_argument = NULL;
}
+}
+
+
+/* Delete all dynamic storage in work_stuff. */
+static void
+delete_work_stuff (work)
+ struct work_stuff *work;
+{
+ delete_non_B_K_work_stuff (work);
+ squangle_mop_up (work);
+}
+
+
+/* Clear out any mangled storage */
+
+static char *
+mop_up (work, declp, success)
+ struct work_stuff *work;
+ string *declp;
+ int success;
+{
+ char *demangled = NULL;
+
+ delete_non_B_K_work_stuff (work);
/* If demangling was successful, ensure that the demangled string is null
terminated and return it. Otherwise, free the demangling decl. */
@@ -912,7 +1294,7 @@ mop_up (work, declp, success)
else
{
string_appendn (declp, "", 1);
- demangled = declp -> b;
+ demangled = declp->b;
}
return (demangled);
}
@@ -1126,7 +1508,7 @@ demangle_signature (work, mangled, declp)
break;
case '_':
- if (GNU_DEMANGLING && expect_return_type)
+ if ((AUTO_DEMANGLING || GNU_DEMANGLING) && expect_return_type)
{
/* Read the return type. */
string return_type;
@@ -1152,7 +1534,7 @@ demangle_signature (work, mangled, declp)
if (HP_DEMANGLING)
{
(*mangled)++;
- while (**mangled && isdigit ((unsigned char)**mangled))
+ while (**mangled && ISDIGIT ((unsigned char)**mangled))
(*mangled)++;
}
else
@@ -1160,7 +1542,7 @@ demangle_signature (work, mangled, declp)
break;
case 'H':
- if (GNU_DEMANGLING)
+ if (AUTO_DEMANGLING || GNU_DEMANGLING)
{
/* A G++ template function. Read the template arguments. */
success = demangle_template (work, mangled, declp, 0, 0,
@@ -1328,82 +1710,151 @@ demangle_template_template_parm (work, mangled, tname)
}
static int
-demangle_integral_value (work, mangled, s)
+demangle_expression (work, mangled, s, tk)
struct work_stuff *work;
const char** mangled;
string* s;
+ type_kind_t tk;
{
+ int need_operator = 0;
int success;
- if (**mangled == 'E')
+ success = 1;
+ string_appendn (s, "(", 1);
+ (*mangled)++;
+ while (success && **mangled != 'W' && **mangled != '\0')
{
- int need_operator = 0;
-
- success = 1;
- string_appendn (s, "(", 1);
- (*mangled)++;
- while (success && **mangled != 'W' && **mangled != '\0')
+ if (need_operator)
{
- if (need_operator)
- {
- size_t i;
- size_t len;
+ size_t i;
+ size_t len;
- success = 0;
+ success = 0;
- len = strlen (*mangled);
+ len = strlen (*mangled);
- for (i = 0;
- i < sizeof (optable) / sizeof (optable [0]);
- ++i)
- {
- size_t l = strlen (optable[i].in);
+ for (i = 0; i < ARRAY_SIZE (optable); ++i)
+ {
+ size_t l = strlen (optable[i].in);
- if (l <= len
- && memcmp (optable[i].in, *mangled, l) == 0)
- {
- string_appendn (s, " ", 1);
- string_append (s, optable[i].out);
- string_appendn (s, " ", 1);
- success = 1;
- (*mangled) += l;
- break;
- }
+ if (l <= len
+ && memcmp (optable[i].in, *mangled, l) == 0)
+ {
+ string_appendn (s, " ", 1);
+ string_append (s, optable[i].out);
+ string_appendn (s, " ", 1);
+ success = 1;
+ (*mangled) += l;
+ break;
}
-
- if (!success)
- break;
}
- else
- need_operator = 1;
- success = demangle_template_value_parm (work, mangled, s,
- tk_integral);
+ if (!success)
+ break;
}
-
- if (**mangled != 'W')
- success = 0;
else
- {
- string_appendn (s, ")", 1);
- (*mangled)++;
- }
+ need_operator = 1;
+
+ success = demangle_template_value_parm (work, mangled, s, tk);
}
+
+ if (**mangled != 'W')
+ success = 0;
+ else
+ {
+ string_appendn (s, ")", 1);
+ (*mangled)++;
+ }
+
+ return success;
+}
+
+static int
+demangle_integral_value (work, mangled, s)
+ struct work_stuff *work;
+ const char** mangled;
+ string* s;
+{
+ int success;
+
+ if (**mangled == 'E')
+ success = demangle_expression (work, mangled, s, tk_integral);
else if (**mangled == 'Q' || **mangled == 'K')
success = demangle_qualified (work, mangled, s, 0, 1);
else
{
+ int value;
+
+ /* By default, we let the number decide whether we shall consume an
+ underscore. */
+ int multidigit_without_leading_underscore = 0;
+ int leave_following_underscore = 0;
+
success = 0;
+ /* Negative numbers are indicated with a leading `m'. */
if (**mangled == 'm')
{
string_appendn (s, "-", 1);
(*mangled)++;
}
- while (isdigit ((unsigned char)**mangled))
+ else if (mangled[0][0] == '_' && mangled[0][1] == 'm')
{
- string_appendn (s, *mangled, 1);
- (*mangled)++;
+ /* Since consume_count_with_underscores does not handle the
+ `m'-prefix we must do it here, using consume_count and
+ adjusting underscores: we have to consume the underscore
+ matching the prepended one. */
+ multidigit_without_leading_underscore = 1;
+ string_appendn (s, "-", 1);
+ (*mangled) += 2;
+ }
+ else if (**mangled == '_')
+ {
+ /* Do not consume a following underscore;
+ multidigit_without_leading_underscore will consume what should be
+ consumed. */
+ leave_following_underscore = 1;
+ }
+ else
+ {
+ /* Since consume_count_with_underscores does not handle
+ multi-digit numbers that do not start with an underscore,
+ and this number can be an integer template parameter,
+ we have to call consume_count. */
+ multidigit_without_leading_underscore = 1;
+ /* These multi-digit numbers never end on an underscore,
+ so if there is one then don't eat it. */
+ leave_following_underscore = 1;
+ }
+
+ /* We must call consume_count if we expect to remove a trailing
+ underscore, since consume_count_with_underscores expects
+ the leading underscore (that we consumed) if it is to handle
+ multi-digit numbers. */
+ if (multidigit_without_leading_underscore)
+ value = consume_count (mangled);
+ else
+ value = consume_count_with_underscores (mangled);
+
+ if (value != -1)
+ {
+ char buf[INTBUF_SIZE];
+ sprintf (buf, "%d", value);
+ string_append (s, buf);
+
+ /* Numbers not otherwise delimited, might have an underscore
+ appended as a delimeter, which we should skip.
+
+ ??? This used to always remove a following underscore, which
+ is wrong. If other (arbitrary) cases are followed by an
+ underscore, we need to do something more radical. */
+
+ if ((value > 9 || multidigit_without_leading_underscore)
+ && ! leave_following_underscore
+ && **mangled == '_')
+ (*mangled)++;
+
+ /* All is well. */
success = 1;
}
}
@@ -1411,6 +1862,51 @@ demangle_integral_value (work, mangled, s)
return success;
}
+/* Demangle the real value in MANGLED. */
+
+static int
+demangle_real_value (work, mangled, s)
+ struct work_stuff *work;
+ const char **mangled;
+ string* s;
+{
+ if (**mangled == 'E')
+ return demangle_expression (work, mangled, s, tk_real);
+
+ if (**mangled == 'm')
+ {
+ string_appendn (s, "-", 1);
+ (*mangled)++;
+ }
+ while (ISDIGIT ((unsigned char)**mangled))
+ {
+ string_appendn (s, *mangled, 1);
+ (*mangled)++;
+ }
+ if (**mangled == '.') /* fraction */
+ {
+ string_appendn (s, ".", 1);
+ (*mangled)++;
+ while (ISDIGIT ((unsigned char)**mangled))
+ {
+ string_appendn (s, *mangled, 1);
+ (*mangled)++;
+ }
+ }
+ if (**mangled == 'e') /* exponent */
+ {
+ string_appendn (s, "e", 1);
+ (*mangled)++;
+ while (ISDIGIT ((unsigned char)**mangled))
+ {
+ string_appendn (s, *mangled, 1);
+ (*mangled)++;
+ }
+ }
+
+ return 1;
+}
+
static int
demangle_template_value_parm (work, mangled, s, tk)
struct work_stuff *work;
@@ -1434,11 +1930,7 @@ demangle_template_value_parm (work, mangled, s, tk)
if (work->tmpl_argvec)
string_append (s, work->tmpl_argvec[idx]);
else
- {
- char buf[10];
- sprintf(buf, "T%d", idx);
- string_append (s, buf);
- }
+ string_append_template_idx (s, idx);
}
else if (tk == tk_integral)
success = demangle_integral_value (work, mangled, s);
@@ -1474,38 +1966,7 @@ demangle_template_value_parm (work, mangled, s, tk)
success = 0;
}
else if (tk == tk_real)
- {
- if (**mangled == 'm')
- {
- string_appendn (s, "-", 1);
- (*mangled)++;
- }
- while (isdigit ((unsigned char)**mangled))
- {
- string_appendn (s, *mangled, 1);
- (*mangled)++;
- }
- if (**mangled == '.') /* fraction */
- {
- string_appendn (s, ".", 1);
- (*mangled)++;
- while (isdigit ((unsigned char)**mangled))
- {
- string_appendn (s, *mangled, 1);
- (*mangled)++;
- }
- }
- if (**mangled == 'e') /* exponent */
- {
- string_appendn (s, "e", 1);
- (*mangled)++;
- while (isdigit ((unsigned char)**mangled))
- {
- string_appendn (s, *mangled, 1);
- (*mangled)++;
- }
- }
- }
+ success = demangle_real_value (work, mangled, s);
else if (tk == tk_pointer || tk == tk_reference)
{
if (**mangled == 'Q')
@@ -1555,7 +2016,7 @@ demangle_template_value_parm (work, mangled, s, tk)
template parameters (e.g. S) is placed in TRAWNAME if TRAWNAME is
non-NULL. If IS_TYPE is nonzero, this template is a type template,
not a function template. If both IS_TYPE and REMEMBER are nonzero,
- the tmeplate is remembered in the list of back-referenceable
+ the template is remembered in the list of back-referenceable
types. */
static int
@@ -1603,11 +2064,9 @@ demangle_template (work, mangled, tname, trawname, is_type, remember)
}
else
{
- char buf[10];
- sprintf(buf, "T%d", idx);
- string_append (tname, buf);
+ string_append_template_idx (tname, idx);
if (trawname)
- string_append (trawname, buf);
+ string_append_template_idx (trawname, idx);
}
}
else
@@ -1786,7 +2245,7 @@ arm_pt (work, mangled, n, anchor, args)
{
/* Check if ARM template with "__pt__" in it ("parameterized type") */
/* Allow HP also here, because HP's cfront compiler follows ARM to some extent */
- if ((ARM_DEMANGLING || HP_DEMANGLING) && (*anchor = mystrstr (mangled, "__pt__")))
+ if ((ARM_DEMANGLING || HP_DEMANGLING) && (*anchor = strstr (mangled, "__pt__")))
{
int len;
*args = *anchor + 6;
@@ -1801,9 +2260,9 @@ arm_pt (work, mangled, n, anchor, args)
}
if (AUTO_DEMANGLING || EDG_DEMANGLING)
{
- if ((*anchor = mystrstr (mangled, "__tm__"))
- || (*anchor = mystrstr (mangled, "__ps__"))
- || (*anchor = mystrstr (mangled, "__pt__")))
+ if ((*anchor = strstr (mangled, "__tm__"))
+ || (*anchor = strstr (mangled, "__ps__"))
+ || (*anchor = strstr (mangled, "__pt__")))
{
int len;
*args = *anchor + 6;
@@ -1816,7 +2275,7 @@ arm_pt (work, mangled, n, anchor, args)
return 1;
}
}
- else if ((*anchor = mystrstr (mangled, "__S")))
+ else if ((*anchor = strstr (mangled, "__S")))
{
int len;
*args = *anchor + 3;
@@ -1955,8 +2414,15 @@ demangle_arm_hp_template (work, mangled, n, declp)
break;
default:
/* Not handling other HP cfront stuff */
- if (!do_type (work, &args, &arg))
- goto cfront_template_args_done;
+ {
+ const char* old_args = args;
+ if (!do_type (work, &args, &arg))
+ goto cfront_template_args_done;
+
+ /* Fail if we didn't make any progress: prevent infinite loop. */
+ if (args == old_args)
+ return;
+ }
}
string_appends (declp, &arg);
string_append (declp, ",");
@@ -2089,6 +2555,86 @@ demangle_class (work, mangled, declp)
return (success);
}
+
+/* Called when there's a "__" in the mangled name, with `scan' pointing to
+ the rightmost guess.
+
+ Find the correct "__"-sequence where the function name ends and the
+ signature starts, which is ambiguous with GNU mangling.
+ Call demangle_signature here, so we can make sure we found the right
+ one; *mangled will be consumed so caller will not make further calls to
+ demangle_signature. */
+
+static int
+iterate_demangle_function (work, mangled, declp, scan)
+ struct work_stuff *work;
+ const char **mangled;
+ string *declp;
+ const char *scan;
+{
+ const char *mangle_init = *mangled;
+ int success = 0;
+ string decl_init;
+ struct work_stuff work_init;
+
+ if (*(scan + 2) == '\0')
+ return 0;
+
+ /* Do not iterate for some demangling modes, or if there's only one
+ "__"-sequence. This is the normal case. */
+ if (ARM_DEMANGLING || LUCID_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING
+ || strstr (scan + 2, "__") == NULL)
+ {
+ demangle_function_name (work, mangled, declp, scan);
+ return 1;
+ }
+
+ /* Save state so we can restart if the guess at the correct "__" was
+ wrong. */
+ string_init (&decl_init);
+ string_appends (&decl_init, declp);
+ memset (&work_init, 0, sizeof work_init);
+ work_stuff_copy_to_from (&work_init, work);
+
+ /* Iterate over occurrences of __, allowing names and types to have a
+ "__" sequence in them. We must start with the first (not the last)
+ occurrence, since "__" most often occur between independent mangled
+ parts, hence starting at the last occurence inside a signature
+ might get us a "successful" demangling of the signature. */
+
+ while (scan[2])
+ {
+ demangle_function_name (work, mangled, declp, scan);
+ success = demangle_signature (work, mangled, declp);
+ if (success)
+ break;
+
+ /* Reset demangle state for the next round. */
+ *mangled = mangle_init;
+ string_clear (declp);
+ string_appends (declp, &decl_init);
+ work_stuff_copy_to_from (work, &work_init);
+
+ /* Leave this underscore-sequence. */
+ scan += 2;
+
+ /* Scan for the next "__" sequence. */
+ while (*scan && (scan[0] != '_' || scan[1] != '_'))
+ scan++;
+
+ /* Move to last "__" in this sequence. */
+ while (*scan && *scan == '_')
+ scan++;
+ scan -= 2;
+ }
+
+ /* Delete saved state. */
+ delete_work_stuff (&work_init);
+ string_delete (&decl_init);
+
+ return success;
+}
+
/*
LOCAL FUNCTION
@@ -2104,6 +2650,8 @@ SYNOPSIS
DESCRIPTION
Consume and demangle the prefix of the mangled name.
+ While processing the function name root, arrange to call
+ demangle_signature if the root is ambiguous.
DECLP points to the string buffer into which demangled output is
placed. On entry, the buffer is empty. On exit it contains
@@ -2178,7 +2726,7 @@ demangle_prefix (work, mangled, declp)
/* This block of code is a reduction in strength time optimization
of:
- scan = mystrstr (*mangled, "__"); */
+ scan = strstr (*mangled, "__"); */
{
scan = *mangled;
@@ -2207,20 +2755,20 @@ demangle_prefix (work, mangled, declp)
}
else if (work -> static_type)
{
- if (!isdigit ((unsigned char)scan[0]) && (scan[0] != 't'))
+ if (!ISDIGIT ((unsigned char)scan[0]) && (scan[0] != 't'))
{
success = 0;
}
}
else if ((scan == *mangled)
- && (isdigit ((unsigned char)scan[2]) || (scan[2] == 'Q')
+ && (ISDIGIT ((unsigned char)scan[2]) || (scan[2] == 'Q')
|| (scan[2] == 't') || (scan[2] == 'K') || (scan[2] == 'H')))
{
/* The ARM says nothing about the mangling of local variables.
But cfront mangles local variables by prepending __<nesting_level>
to them. As an extension to ARM demangling we handle this case. */
if ((LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING)
- && isdigit ((unsigned char)scan[2]))
+ && ISDIGIT ((unsigned char)scan[2]))
{
*mangled = scan + 2;
consume_count (mangled);
@@ -2257,7 +2805,7 @@ demangle_prefix (work, mangled, declp)
/* EDG template? */
demangle_arm_hp_template (work, mangled, strlen (*mangled), declp);
}
- else if ((scan == *mangled) && !isdigit ((unsigned char)scan[2])
+ else if ((scan == *mangled) && !ISDIGIT ((unsigned char)scan[2])
&& (scan[2] != 't'))
{
/* Mangled name starts with "__". Skip over any leading '_' characters,
@@ -2270,36 +2818,23 @@ demangle_prefix (work, mangled, declp)
{
scan++;
}
- if ((scan = mystrstr (scan, "__")) == NULL || (*(scan + 2) == '\0'))
+ if ((scan = strstr (scan, "__")) == NULL || (*(scan + 2) == '\0'))
{
/* No separator (I.E. "__not_mangled"), or empty signature
(I.E. "__not_mangled_either__") */
success = 0;
}
else
- {
- const char *tmp;
-
- /* Look for the LAST occurrence of __, allowing names to
- have the '__' sequence embedded in them. */
- if (!(ARM_DEMANGLING || HP_DEMANGLING))
- {
- while ((tmp = mystrstr (scan + 2, "__")) != NULL)
- scan = tmp;
- }
- if (*(scan + 2) == '\0')
- success = 0;
- else
- demangle_function_name (work, mangled, declp, scan);
- }
+ return iterate_demangle_function (work, mangled, declp, scan);
}
}
else if (*(scan + 2) != '\0')
{
/* Mangled name does not start with "__" but does have one somewhere
in there with non empty stuff after it. Looks like a global
- function name. */
- demangle_function_name (work, mangled, declp, scan);
+ function name. Iterate over all "__":s until the right
+ one is found. */
+ return iterate_demangle_function (work, mangled, declp, scan);
}
else
{
@@ -2392,7 +2927,7 @@ gnu_special (work, mangled, declp)
1);
break;
default:
- if (isdigit((unsigned char)*mangled[0]))
+ if (ISDIGIT((unsigned char)*mangled[0]))
{
n = consume_count(mangled);
/* We may be seeing a too-large size, or else a
@@ -2448,11 +2983,30 @@ gnu_special (work, mangled, declp)
break;
default:
n = consume_count (mangled);
- if (n < 0 || n > strlen (*mangled))
+ if (n < 0 || n > (long) strlen (*mangled))
{
success = 0;
break;
}
+
+ if (n > 10 && strncmp (*mangled, "_GLOBAL_", 8) == 0
+ && (*mangled)[9] == 'N'
+ && (*mangled)[8] == (*mangled)[10]
+ && strchr (cplus_markers, (*mangled)[8]))
+ {
+ /* A member of the anonymous namespace. There's information
+ about what identifier or filename it was keyed to, but
+ it's just there to make the mangled name unique; we just
+ step over it. */
+ string_append (declp, "{anonymous}");
+ (*mangled) += n;
+
+ /* Now p points to the marker before the N, so we need to
+ update it to the first marker after what we consumed. */
+ p = strpbrk (*mangled, cplus_markers);
+ break;
+ }
+
string_appendn (declp, *mangled, n);
(*mangled) += n;
}
@@ -2514,7 +3068,7 @@ gnu_special (work, mangled, declp)
success = demangle_template (work, mangled, declp, 0, 1, 1);
break;
default:
- success = demangle_fund_type (work, mangled, declp);
+ success = do_type (work, mangled, declp);
break;
}
if (success && **mangled != '\0')
@@ -2615,7 +3169,7 @@ arm_special (mangled, declp)
{
n = consume_count (mangled);
if (n == -1
- || n > strlen (*mangled))
+ || n > (long) strlen (*mangled))
return 0;
string_prependn (declp, *mangled, n);
(*mangled) += n;
@@ -2676,7 +3230,6 @@ demangle_qualified (work, mangled, result, isfuncname, append)
{
int qualifiers = 0;
int success = 1;
- const char *p;
char num[2];
string temp;
string last_name;
@@ -2708,19 +3261,10 @@ demangle_qualified (work, mangled, result, isfuncname, append)
/* GNU mangled name with more than 9 classes. The count is preceded
by an underscore (to distinguish it from the <= 9 case) and followed
by an underscore. */
- p = *mangled + 2;
- qualifiers = atoi (p);
- if (!isdigit ((unsigned char)*p) || *p == '0')
- success = 0;
-
- /* Skip the digits. */
- while (isdigit ((unsigned char)*p))
- ++p;
-
- if (*p != '_')
+ (*mangled)++;
+ qualifiers = consume_count_with_underscores (mangled);
+ if (qualifiers == -1)
success = 0;
-
- *mangled = p + 1;
break;
case '1':
@@ -2910,15 +3454,13 @@ get_count (type, count)
const char *p;
int n;
- if (!isdigit ((unsigned char)**type))
- {
- return (0);
- }
+ if (!ISDIGIT ((unsigned char)**type))
+ return (0);
else
{
*count = **type - '0';
(*type)++;
- if (isdigit ((unsigned char)**type))
+ if (ISDIGIT ((unsigned char)**type))
{
p = *type;
n = *count;
@@ -2928,7 +3470,7 @@ get_count (type, count)
n += *p - '0';
p++;
}
- while (isdigit ((unsigned char)*p));
+ while (ISDIGIT ((unsigned char)*p));
if (*p == '_')
{
*type = p + 1;
@@ -3052,8 +3594,13 @@ do_type (work, mangled, result)
(*mangled)++;
string_append (&decl, ")");
- string_prepend (&decl, SCOPE_STRING (work));
- if (isdigit ((unsigned char)**mangled))
+
+ /* We don't need to prepend `::' for a qualified name;
+ demangle_qualified will do that for us. */
+ if (**mangled != 'Q')
+ string_prepend (&decl, SCOPE_STRING (work));
+
+ if (ISDIGIT ((unsigned char)**mangled))
{
n = consume_count (mangled);
if (n == -1
@@ -3085,6 +3632,14 @@ do_type (work, mangled, result)
else
break;
}
+ else if (**mangled == 'Q')
+ {
+ success = demangle_qualified (work, mangled, &decl,
+ /*isfuncnam=*/0,
+ /*append=*/0);
+ if (!success)
+ break;
+ }
else
{
success = 0;
@@ -3197,11 +3752,7 @@ do_type (work, mangled, result)
if (work->tmpl_argvec)
string_append (result, work->tmpl_argvec[idx]);
else
- {
- char buf[10];
- sprintf(buf, "T%d", idx);
- string_append (result, buf);
- }
+ string_append_template_idx (result, idx);
success = 1;
}
@@ -3255,7 +3806,7 @@ demangle_fund_type (work, mangled, result)
int done = 0;
int success = 1;
char buf[10];
- int dec = 0;
+ unsigned int dec = 0;
string btype;
type_kind_t tk = tk_integral;
@@ -3369,7 +3920,7 @@ demangle_fund_type (work, mangled, result)
break;
case 'G':
(*mangled)++;
- if (!isdigit ((unsigned char)**mangled))
+ if (!ISDIGIT ((unsigned char)**mangled))
{
success = 0;
break;
@@ -3381,7 +3932,7 @@ demangle_fund_type (work, mangled, result)
int i;
(*mangled)++;
for (i = 0;
- i < sizeof (buf) - 1 && **mangled && **mangled != '_';
+ i < (long) sizeof (buf) - 1 && **mangled && **mangled != '_';
(*mangled)++, i++)
buf[i] = **mangled;
if (**mangled != '_')
@@ -3399,7 +3950,7 @@ demangle_fund_type (work, mangled, result)
*mangled += min (strlen (*mangled), 2);
}
sscanf (buf, "%x", &dec);
- sprintf (buf, "int%i_t", dec);
+ sprintf (buf, "int%u_t", dec);
APPEND_BLANK (result);
string_append (result, buf);
break;
@@ -3450,7 +4001,7 @@ demangle_fund_type (work, mangled, result)
static int
do_hpacc_template_const_value (work, mangled, result)
- struct work_stuff *work;
+ struct work_stuff *work ATTRIBUTE_UNUSED;
const char **mangled;
string *result;
{
@@ -3481,12 +4032,12 @@ do_hpacc_template_const_value (work, mangled, result)
}
/* We have to be looking at an integer now */
- if (!(isdigit ((unsigned char)**mangled)))
+ if (!(ISDIGIT ((unsigned char)**mangled)))
return 0;
/* We only deal with integral values for template
parameters -- so it's OK to look only for digits */
- while (isdigit ((unsigned char)**mangled))
+ while (ISDIGIT ((unsigned char)**mangled))
{
char_str[0] = **mangled;
string_append (result, char_str);
@@ -3565,10 +4116,10 @@ snarf_numeric_literal (args, arg)
else if (**args == '+')
(*args)++;
- if (!isdigit ((unsigned char)**args))
+ if (!ISDIGIT ((unsigned char)**args))
return 0;
- while (isdigit ((unsigned char)**args))
+ while (ISDIGIT ((unsigned char)**args))
{
char_str[0] = **args;
string_append (arg, char_str);
@@ -4074,7 +4625,7 @@ demangle_function_name (work, mangled, declp, scan)
if (declp->p - declp->b >= 10 /* op$assign_ */
&& memcmp (declp->b + 3, "assign_", 7) == 0)
{
- for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++)
+ for (i = 0; i < ARRAY_SIZE (optable); i++)
{
int len = declp->p - declp->b - 10;
if ((int) strlen (optable[i].in) == len
@@ -4090,7 +4641,7 @@ demangle_function_name (work, mangled, declp, scan)
}
else
{
- for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++)
+ for (i = 0; i < ARRAY_SIZE (optable); i++)
{
int len = declp->p - declp->b - 3;
if ((int) strlen (optable[i].in) == len
@@ -4132,13 +4683,13 @@ demangle_function_name (work, mangled, declp, scan)
}
}
else if (declp->b[0] == '_' && declp->b[1] == '_'
- && declp->b[2] >= 'a' && declp->b[2] <= 'z'
- && declp->b[3] >= 'a' && declp->b[3] <= 'z')
+ && ISLOWER((unsigned char)declp->b[2])
+ && ISLOWER((unsigned char)declp->b[3]))
{
if (declp->b[4] == '\0')
{
/* Operator. */
- for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++)
+ for (i = 0; i < ARRAY_SIZE (optable); i++)
{
if (strlen (optable[i].in) == 2
&& memcmp (optable[i].in, declp->b + 2, 2) == 0)
@@ -4155,7 +4706,7 @@ demangle_function_name (work, mangled, declp, scan)
if (declp->b[2] == 'a' && declp->b[5] == '\0')
{
/* Assignment. */
- for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++)
+ for (i = 0; i < ARRAY_SIZE (optable); i++)
{
if (strlen (optable[i].in) == 3
&& memcmp (optable[i].in, declp->b + 2, 3) == 0)
@@ -4320,6 +4871,16 @@ string_prependn (p, s, n)
}
}
+static void
+string_append_template_idx (s, idx)
+ string *s;
+ int idx;
+{
+ char buf[INTBUF_SIZE + 1 /* 'T' */];
+ sprintf(buf, "T%d", idx);
+ string_append (s, buf);
+}
+
/* To generate a standalone demangler program for testing purposes,
just compile and link this file with -DMAIN and libiberty.a. When
run, it demangles each command line arg, or each stdin string, and
@@ -4329,13 +4890,14 @@ string_prependn (p, s, n)
#include "getopt.h"
-static char *program_name;
-static char *program_version = VERSION;
-static int flags = DMGL_PARAMS | DMGL_ANSI;
+static const char *program_name;
+static const char *program_version = VERSION;
+static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
static void demangle_it PARAMS ((char *));
-static void usage PARAMS ((FILE *, int));
-static void fatal PARAMS ((char *));
+static void usage PARAMS ((FILE *, int)) ATTRIBUTE_NORETURN;
+static void fatal PARAMS ((const char *)) ATTRIBUTE_NORETURN;
+static void print_demangler_list PARAMS ((FILE *));
static void
demangle_it (mangled_name)
@@ -4343,7 +4905,8 @@ demangle_it (mangled_name)
{
char *result;
- result = cplus_demangle (mangled_name, flags);
+ /* For command line args, also try to demangle type encodings. */
+ result = cplus_demangle (mangled_name, flags | DMGL_TYPES);
if (result == NULL)
{
printf ("%s\n", mangled_name);
@@ -4355,16 +4918,43 @@ demangle_it (mangled_name)
}
}
+static void
+print_demangler_list (stream)
+ FILE *stream;
+{
+ const struct demangler_engine *demangler;
+
+ fprintf (stream, "{%s", libiberty_demanglers->demangling_style_name);
+
+ for (demangler = libiberty_demanglers + 1;
+ demangler->demangling_style != unknown_demangling;
+ ++demangler)
+ fprintf (stream, ",%s", demangler->demangling_style_name);
+
+ fprintf (stream, "}");
+}
+
static void
usage (stream, status)
FILE *stream;
int status;
{
fprintf (stream, "\
-Usage: %s [-_] [-n] [-s {gnu,lucid,arm,hp,edg}] [--strip-underscores]\n\
- [--no-strip-underscores] [--format={gnu,lucid,arm,hp,edg}]\n\
- [--help] [--version] [arg...]\n",
+Usage: %s [-_] [-n] [--strip-underscores] [--no-strip-underscores] \n",
program_name);
+
+ fprintf (stream, "\
+ [-s ");
+ print_demangler_list (stream);
+ fprintf (stream, "]\n");
+
+ fprintf (stream, "\
+ [--format ");
+ print_demangler_list (stream);
+ fprintf (stream, "]\n");
+
+ fprintf (stream, "\
+ [--help] [--version] [arg...]\n");
exit (status);
}
@@ -4376,11 +4966,10 @@ extern int prepends_underscore;
int strip_underscore = 0;
-static struct option long_options[] = {
+static const struct option long_options[] = {
{"strip-underscores", no_argument, 0, '_'},
{"format", required_argument, 0, 's'},
{"help", no_argument, 0, 'h'},
- {"java", no_argument, 0, 'j'},
{"no-strip-underscores", no_argument, 0, 'n'},
{"version", no_argument, 0, 'v'},
{0, no_argument, 0, 0}
@@ -4396,6 +4985,15 @@ fancy_abort ()
}
+static const char *
+standard_symbol_characters PARAMS ((void));
+
+static const char *
+hp_symbol_characters PARAMS ((void));
+
+static const char *
+gnu_v3_symbol_characters PARAMS ((void));
+
/* Return the string of non-alnum characters that may occur
as a valid symbol component, in the standard assembler symbol
syntax. */
@@ -4444,6 +5042,19 @@ hp_symbol_characters ()
}
+/* Return the string of non-alnum characters that may occur
+ as a valid symbol component in the GNU C++ V3 ABI mangling
+ scheme. */
+
+static const char *
+gnu_v3_symbol_characters ()
+{
+ return "_$.";
+}
+
+
+extern int main PARAMS ((int, char **));
+
int
main (argc, argv)
int argc;
@@ -4451,13 +5062,14 @@ main (argc, argv)
{
char *result;
int c;
- char *valid_symbols;
+ const char *valid_symbols;
+ enum demangling_styles style = auto_demangling;
program_name = argv[0];
strip_underscore = prepends_underscore;
- while ((c = getopt_long (argc, argv, "_ns:j", long_options, (int *) 0)) != EOF)
+ while ((c = getopt_long (argc, argv, "_ns:", long_options, (int *) 0)) != EOF)
{
switch (c)
{
@@ -4471,40 +5083,22 @@ main (argc, argv)
break;
case 'v':
printf ("GNU %s (C++ demangler), version %s\n", program_name, program_version);
- exit (0);
+ return (0);
case '_':
strip_underscore = 1;
break;
- case 'j':
- flags |= DMGL_JAVA;
- break;
case 's':
- if (strcmp (optarg, "gnu") == 0)
- {
- current_demangling_style = gnu_demangling;
- }
- else if (strcmp (optarg, "lucid") == 0)
- {
- current_demangling_style = lucid_demangling;
- }
- else if (strcmp (optarg, "arm") == 0)
- {
- current_demangling_style = arm_demangling;
- }
- else if (strcmp (optarg, "hp") == 0)
- {
- current_demangling_style = hp_demangling;
- }
- else if (strcmp (optarg, "edg") == 0)
- {
- current_demangling_style = edg_demangling;
- }
- else
- {
- fprintf (stderr, "%s: unknown demangling style `%s'\n",
- program_name, optarg);
- exit (1);
- }
+ {
+ style = cplus_demangle_name_to_style (optarg);
+ if (style == unknown_demangling)
+ {
+ fprintf (stderr, "%s: unknown demangling style `%s'\n",
+ program_name, optarg);
+ return (1);
+ }
+ else
+ cplus_demangle_set_style (style);
+ }
break;
}
}
@@ -4523,12 +5117,18 @@ main (argc, argv)
case gnu_demangling:
case lucid_demangling:
case arm_demangling:
+ case java_demangling:
case edg_demangling:
+ case gnat_demangling:
+ case auto_demangling:
valid_symbols = standard_symbol_characters ();
break;
case hp_demangling:
valid_symbols = hp_symbol_characters ();
break;
+ case gnu_v3_demangling:
+ valid_symbols = gnu_v3_symbol_characters ();
+ break;
default:
/* Folks should explicitly indicate the appropriate alphabet for
each demangling. Providing a default would allow the
@@ -4541,7 +5141,7 @@ main (argc, argv)
int i = 0;
c = getchar ();
/* Try to read a label. */
- while (c != EOF && (isalnum (c) || strchr (valid_symbols, c)))
+ while (c != EOF && (ISALNUM (c) || strchr (valid_symbols, c)))
{
if (i >= MBUF_SIZE-1)
break;
@@ -4552,7 +5152,7 @@ main (argc, argv)
{
int skip_first = 0;
- if (mbuffer[0] == '.')
+ if (mbuffer[0] == '.' || mbuffer[0] == '$')
++skip_first;
if (strip_underscore && mbuffer[skip_first] == '_')
++skip_first;
@@ -4561,7 +5161,7 @@ main (argc, argv)
skip_first = i;
mbuffer[i] = 0;
-
+ flags |= (int) style;
result = cplus_demangle (mbuffer + skip_first, flags);
if (result)
{
@@ -4578,15 +5178,16 @@ main (argc, argv)
if (c == EOF)
break;
putchar (c);
+ fflush (stdout);
}
}
- exit (0);
+ return (0);
}
static void
fatal (str)
- char *str;
+ const char *str;
{
fprintf (stderr, "%s: %s\n", program_name, str);
exit (1);
diff --git a/contrib/gcc/cppexp.c b/contrib/gcc/cppexp.c
index 1f225c3..1d4cecc 100644
--- a/contrib/gcc/cppexp.c
+++ b/contrib/gcc/cppexp.c
@@ -293,8 +293,10 @@ lex (pfile, skip_evaluation)
{
unsigned int chars_seen;
- /* This is always a signed type. */
- op.unsignedp = 0;
+ if (token->type == CPP_CHAR)
+ op.unsignedp = 0;
+ else
+ op.unsignedp = WCHAR_UNSIGNED;
op.op = CPP_NUMBER;
op.value = cpp_interpret_charconst (pfile, token, 1, 0, &chars_seen);
return op;
diff --git a/contrib/gcc/cpphash.c b/contrib/gcc/cpphash.c
index 8be1b2f..69e1a23 100644
--- a/contrib/gcc/cpphash.c
+++ b/contrib/gcc/cpphash.c
@@ -73,7 +73,6 @@ _cpp_init_hashtable (pfile, table)
s->n_true = cpp_lookup (pfile, DSC("true"));
s->n_false = cpp_lookup (pfile, DSC("false"));
s->n__STRICT_ANSI__ = cpp_lookup (pfile, DSC("__STRICT_ANSI__"));
- s->n__CHAR_UNSIGNED__ = cpp_lookup (pfile, DSC("__CHAR_UNSIGNED__"));
s->n__VA_ARGS__ = cpp_lookup (pfile, DSC("__VA_ARGS__"));
s->n__VA_ARGS__->flags |= NODE_DIAGNOSTIC;
}
diff --git a/contrib/gcc/cpphash.h b/contrib/gcc/cpphash.h
index be8d902..03de93f 100644
--- a/contrib/gcc/cpphash.h
+++ b/contrib/gcc/cpphash.h
@@ -152,9 +152,6 @@ struct lexer_state
/* Nonzero when parsing arguments to a function-like macro. */
unsigned char parsing_args;
-
- /* Nonzero when in a # NUMBER directive. */
- unsigned char line_extension;
};
/* Special nodes - identifiers with predefined significance. */
@@ -164,7 +161,6 @@ struct spec_nodes
cpp_hashnode *n_true; /* C++ keyword true */
cpp_hashnode *n_false; /* C++ keyword false */
cpp_hashnode *n__STRICT_ANSI__; /* STDC_0_IN_SYSTEM_HEADERS */
- cpp_hashnode *n__CHAR_UNSIGNED__; /* plain char is unsigned */
cpp_hashnode *n__VA_ARGS__; /* C99 vararg macros */
};
diff --git a/contrib/gcc/cppinit.c b/contrib/gcc/cppinit.c
index ab3dad7..872ba6d 100644
--- a/contrib/gcc/cppinit.c
+++ b/contrib/gcc/cppinit.c
@@ -376,7 +376,8 @@ merge_include_chains (pfile)
qtail->next = brack;
/* If brack == qtail, remove brack as it's simpler. */
- if (INO_T_EQ (qtail->ino, brack->ino) && qtail->dev == brack->dev)
+ if (brack && INO_T_EQ (qtail->ino, brack->ino)
+ && qtail->dev == brack->dev)
brack = remove_dup_dir (pfile, qtail);
}
else
@@ -490,6 +491,11 @@ cpp_create_reader (lang)
CPP_OPTION (pfile, show_column) = 1;
CPP_OPTION (pfile, tabstop) = 8;
CPP_OPTION (pfile, operator_names) = 1;
+#if DEFAULT_SIGNED_CHAR
+ CPP_OPTION (pfile, signed_char) = 1;
+#else
+ CPP_OPTION (pfile, signed_char) = 0;
+#endif
CPP_OPTION (pfile, pending) =
(struct cpp_pending *) xcalloc (1, sizeof (struct cpp_pending));
@@ -761,6 +767,9 @@ init_builtins (pfile)
else if (CPP_OPTION (pfile, c99))
_cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");
+ if (CPP_OPTION (pfile, signed_char) == 0)
+ _cpp_define_builtin (pfile, "__CHAR_UNSIGNED__ 1");
+
if (CPP_OPTION (pfile, lang) == CLK_STDC89
|| CPP_OPTION (pfile, lang) == CLK_STDC94
|| CPP_OPTION (pfile, lang) == CLK_STDC99)
@@ -1075,7 +1084,7 @@ output_deps (pfile)
const char *const deps_mode =
CPP_OPTION (pfile, print_deps_append) ? "a" : "w";
- if (CPP_OPTION (pfile, deps_file) == 0)
+ if (CPP_OPTION (pfile, deps_file)[0] == '\0')
deps_stream = stdout;
else
{
@@ -1093,7 +1102,7 @@ output_deps (pfile)
deps_phony_targets (pfile->deps, deps_stream);
/* Don't close stdout. */
- if (CPP_OPTION (pfile, deps_file))
+ if (deps_stream != stdout)
{
if (ferror (deps_stream) || fclose (deps_stream) != 0)
cpp_fatal (pfile, "I/O error on output");
@@ -1186,7 +1195,9 @@ new_pending_directive (pend, text, handler)
DEF_OPT("fno-show-column", 0, OPT_fno_show_column) \
DEF_OPT("fpreprocessed", 0, OPT_fpreprocessed) \
DEF_OPT("fshow-column", 0, OPT_fshow_column) \
+ DEF_OPT("fsigned-char", 0, OPT_fsigned_char) \
DEF_OPT("ftabstop=", no_num, OPT_ftabstop) \
+ DEF_OPT("funsigned-char", 0, OPT_funsigned_char) \
DEF_OPT("h", 0, OPT_h) \
DEF_OPT("idirafter", no_dir, OPT_idirafter) \
DEF_OPT("imacros", no_fil, OPT_imacros) \
@@ -1395,6 +1406,12 @@ cpp_handle_option (pfile, argc, argv, ignore)
case OPT_fno_show_column:
CPP_OPTION (pfile, show_column) = 0;
break;
+ case OPT_fsigned_char:
+ CPP_OPTION (pfile, signed_char) = 1;
+ break;
+ case OPT_funsigned_char:
+ CPP_OPTION (pfile, signed_char) = 0;
+ break;
case OPT_ftabstop:
/* Silently ignore empty string, non-longs and silly values. */
if (arg[0] != '\0')
@@ -1537,7 +1554,6 @@ cpp_handle_option (pfile, argc, argv, ignore)
{
case 'M':
CPP_OPTION (pfile, dump_macros) = dump_only;
- CPP_OPTION (pfile, no_output) = 1;
break;
case 'N':
CPP_OPTION (pfile, dump_macros) = dump_names;
@@ -1556,10 +1572,16 @@ cpp_handle_option (pfile, argc, argv, ignore)
CPP_OPTION (pfile, print_deps_missing_files) = 1;
break;
case OPT_M:
+ /* When doing dependencies with -M or -MM, suppress normal
+ preprocessed output, but still do -dM etc. as software
+ depends on this. Preprocessed output occurs if -MD, -MMD
+ or environment var dependency generation is used. */
CPP_OPTION (pfile, print_deps) = 2;
+ CPP_OPTION (pfile, no_output) = 1;
break;
case OPT_MM:
CPP_OPTION (pfile, print_deps) = 1;
+ CPP_OPTION (pfile, no_output) = 1;
break;
case OPT_MF:
CPP_OPTION (pfile, deps_file) = arg;
@@ -1573,12 +1595,6 @@ cpp_handle_option (pfile, argc, argv, ignore)
deps_add_target (pfile->deps, arg, opt_code == OPT_MQ);
break;
- /* -MD and -MMD for cpp0 are deprecated and undocumented
- (use -M or -MM with -MF instead), and probably should be
- removed with the next major GCC version. For the moment
- we allow these for the benefit of Automake 1.4, which
- uses these when dependency tracking is enabled. Automake
- 1.5 will fix this. */
case OPT_MD:
CPP_OPTION (pfile, print_deps) = 2;
CPP_OPTION (pfile, deps_file) = arg;
@@ -1804,6 +1820,21 @@ cpp_post_options (pfile)
if (CPP_OPTION (pfile, preprocessed))
pfile->state.prevent_expansion = 1;
+ /* -dM makes no normal output. This is set here so that -dM -dD
+ works as expected. */
+ if (CPP_OPTION (pfile, dump_macros) == dump_only)
+ CPP_OPTION (pfile, no_output) = 1;
+
+ /* Disable -dD, -dN and -dI if we should make no normal output
+ (such as with -M). Allow -M -dM since some software relies on
+ this. */
+ if (CPP_OPTION (pfile, no_output))
+ {
+ if (CPP_OPTION (pfile, dump_macros) != dump_only)
+ CPP_OPTION (pfile, dump_macros) = dump_none;
+ CPP_OPTION (pfile, dump_includes) = 0;
+ }
+
/* We need to do this after option processing and before
cpp_start_read, as cppmain.c relies on the options->no_output to
set its callbacks correctly before calling cpp_start_read. */
@@ -1818,7 +1849,8 @@ cpp_post_options (pfile)
cpp_fatal (pfile, "you must additionally specify either -M or -MM");
}
-/* Set up dependency-file output. */
+/* Set up dependency-file output. On exit, if print_deps is non-zero
+ then deps_file is not NULL; stdout is the empty string. */
static void
init_dependency_output (pfile)
cpp_reader *pfile;
@@ -1857,28 +1889,22 @@ init_dependency_output (pfile)
else
output_file = spec;
- /* Command line overrides environment variables. */
+ /* Command line -MF overrides environment variables and default. */
if (CPP_OPTION (pfile, deps_file) == 0)
CPP_OPTION (pfile, deps_file) = output_file;
- CPP_OPTION (pfile, print_deps_append) = 1;
- }
- /* If dependencies go to standard output, or -MG is used, we should
- suppress output, including -dM, -dI etc. */
- if (CPP_OPTION (pfile, deps_file) == 0
- || CPP_OPTION (pfile, print_deps_missing_files))
- {
- CPP_OPTION (pfile, no_output) = 1;
- CPP_OPTION (pfile, dump_macros) = 0;
- CPP_OPTION (pfile, dump_includes) = 0;
+ CPP_OPTION (pfile, print_deps_append) = 1;
}
+ else if (CPP_OPTION (pfile, deps_file) == 0)
+ /* If -M or -MM was seen without -MF, default output to wherever
+ was specified with -o. out_fname is non-NULL here. */
+ CPP_OPTION (pfile, deps_file) = CPP_OPTION (pfile, out_fname);
}
/* Handle --help output. */
static void
print_help ()
{
- fprintf (stderr, _("Usage: %s [switches] input output\n"), progname);
/* To keep the lines from getting too long for some compilers, limit
to about 500 characters (6 lines) per chunk. */
fputs (_("\
@@ -1941,6 +1967,8 @@ Switches:\n\
fputs (_("\
-M Generate make dependencies\n\
-MM As -M, but ignore system header files\n\
+ -MD Generate make dependencies and compile\n\
+ -MMD As -MD, but ignore system header files\n\
-MF <file> Write dependency output to the given file\n\
-MG Treat missing header file as generated files\n\
"), stdout);
@@ -1952,8 +1980,8 @@ Switches:\n\
fputs (_("\
-D<macro> Define a <macro> with string '1' as its value\n\
-D<macro>=<val> Define a <macro> with <val> as its value\n\
- -A<question> (<answer>) Assert the <answer> to <question>\n\
- -A-<question> (<answer>) Disable the <answer> to <question>\n\
+ -A<question>=<answer> Assert the <answer> to <question>\n\
+ -A-<question>=<answer> Disable the <answer> to <question>\n\
-U<macro> Undefine <macro> \n\
-v Display the version number\n\
"), stdout);
@@ -1970,7 +1998,7 @@ Switches:\n\
-ftabstop=<number> Distance between tab stops for column reporting\n\
-P Do not generate #line directives\n\
-$ Do not allow '$' in identifiers\n\
- -remap Remap file names when including files.\n\
+ -remap Remap file names when including files\n\
--version Display version information\n\
-h or --help Display this information\n\
"), stdout);
diff --git a/contrib/gcc/cpplex.c b/contrib/gcc/cpplex.c
index 8465350..eea6a9e 100644
--- a/contrib/gcc/cpplex.c
+++ b/contrib/gcc/cpplex.c
@@ -1837,6 +1837,7 @@ cpp_interpret_charconst (pfile, token, warn_multi, traditional, pchars_seen)
unsigned int width, max_chars, c;
unsigned HOST_WIDE_INT mask;
HOST_WIDE_INT result = 0;
+ bool unsigned_p;
#ifdef MULTIBYTE_CHARS
(void) local_mbtowc (NULL, NULL, 0);
@@ -1844,9 +1845,15 @@ cpp_interpret_charconst (pfile, token, warn_multi, traditional, pchars_seen)
/* Width in bits. */
if (token->type == CPP_CHAR)
- width = MAX_CHAR_TYPE_SIZE;
+ {
+ width = MAX_CHAR_TYPE_SIZE;
+ unsigned_p = CPP_OPTION (pfile, signed_char) == 0;
+ }
else
- width = MAX_WCHAR_TYPE_SIZE;
+ {
+ width = MAX_WCHAR_TYPE_SIZE;
+ unsigned_p = WCHAR_UNSIGNED;
+ }
if (width < HOST_BITS_PER_WIDE_INT)
mask = ((unsigned HOST_WIDE_INT) 1 << width) - 1;
@@ -1903,15 +1910,13 @@ cpp_interpret_charconst (pfile, token, warn_multi, traditional, pchars_seen)
else if (chars_seen > 1 && !traditional && warn_multi)
cpp_warning (pfile, "multi-character character constant");
- /* If char type is signed, sign-extend the constant. The
- __CHAR_UNSIGNED__ macro is set by the driver if appropriate. */
- if (token->type == CPP_CHAR && chars_seen)
+ /* If relevant type is signed, sign-extend the constant. */
+ if (chars_seen)
{
unsigned int nbits = chars_seen * width;
mask = (unsigned HOST_WIDE_INT) ~0 >> (HOST_BITS_PER_WIDE_INT - nbits);
- if (pfile->spec_nodes.n__CHAR_UNSIGNED__->type == NT_MACRO
- || ((result >> (nbits - 1)) & 1) == 0)
+ if (unsigned_p || ((result >> (nbits - 1)) & 1) == 0)
result &= mask;
else
result |= ~mask;
diff --git a/contrib/gcc/cpplib.c b/contrib/gcc/cpplib.c
index 12baa10..69e9044 100644
--- a/contrib/gcc/cpplib.c
+++ b/contrib/gcc/cpplib.c
@@ -103,6 +103,8 @@ static const cpp_token *parse_include PARAMS ((cpp_reader *));
static void push_conditional PARAMS ((cpp_reader *, int, int,
const cpp_hashnode *));
static unsigned int read_flag PARAMS ((cpp_reader *, unsigned int));
+static U_CHAR *dequote_string PARAMS ((cpp_reader *, const U_CHAR *,
+ unsigned int));
static int strtoul_for_line PARAMS ((const U_CHAR *, unsigned int,
unsigned long *));
static void do_diagnostic PARAMS ((cpp_reader *, enum error_type, int));
@@ -117,6 +119,7 @@ static void do_pragma_once PARAMS ((cpp_reader *));
static void do_pragma_poison PARAMS ((cpp_reader *));
static void do_pragma_system_header PARAMS ((cpp_reader *));
static void do_pragma_dependency PARAMS ((cpp_reader *));
+static void do_linemarker PARAMS ((cpp_reader *));
static const cpp_token *get_token_no_padding PARAMS ((cpp_reader *));
static const cpp_token *get__Pragma_string PARAMS ((cpp_reader *));
static void destringize_and_run PARAMS ((cpp_reader *, const cpp_string *));
@@ -145,7 +148,7 @@ D(if, T_IF, KANDR, COND | IF_COND) /* 18162 */ \
D(else, T_ELSE, KANDR, COND) /* 9863 */ \
D(ifndef, T_IFNDEF, KANDR, COND | IF_COND) /* 9675 */ \
D(undef, T_UNDEF, KANDR, IN_I) /* 4837 */ \
-D(line, T_LINE, KANDR, IN_I) /* 2465 */ \
+D(line, T_LINE, KANDR, 0) /* 2465 */ \
D(elif, T_ELIF, STDC89, COND) /* 610 */ \
D(error, T_ERROR, STDC89, 0) /* 475 */ \
D(pragma, T_PRAGMA, STDC89, IN_I) /* 195 */ \
@@ -167,10 +170,6 @@ SCCS_ENTRY /* 0 SVR4? */
/* Use the table to generate a series of prototypes, an enum for the
directive names, and an array of directive handlers. */
-/* The directive-processing functions are declared to return int
- instead of void, because some old compilers have trouble with
- pointers to functions returning void. */
-
/* Don't invoke CONCAT2 with any whitespace or K&R cc will fail. */
#define D(name, t, o, f) static void CONCAT2(do_,name) PARAMS ((cpp_reader *));
DIRECTIVE_TABLE
@@ -195,6 +194,14 @@ DIRECTIVE_TABLE
#undef D
#undef DIRECTIVE_TABLE
+/* Wrapper struct directive for linemarkers.
+ The origin is more or less true - the original K+R cpp
+ did use this notation in its preprocessed output. */
+static const directive linemarker_dir =
+{
+ do_linemarker, U"#", 1, KANDR, IN_I
+};
+
#define SEEN_EOL() (pfile->cur_token[-1].type == CPP_EOF)
/* Skip any remaining tokens in a directive. */
@@ -256,7 +263,6 @@ end_directive (pfile, skip_line)
pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
pfile->state.in_directive = 0;
pfile->state.angled_headers = 0;
- pfile->state.line_extension = 0;
pfile->directive = 0;
}
@@ -268,39 +274,30 @@ directive_diagnostics (pfile, dir, indented)
const directive *dir;
int indented;
{
- if (pfile->state.line_extension)
- {
- if (CPP_PEDANTIC (pfile)
- && ! pfile->state.skipping)
- cpp_pedwarn (pfile, "style of line directive is a GCC extension");
- }
- else
+ /* Issue -pedantic warnings for extensions. */
+ if (CPP_PEDANTIC (pfile)
+ && ! pfile->state.skipping
+ && dir->origin == EXTENSION)
+ cpp_pedwarn (pfile, "#%s is a GCC extension", dir->name);
+
+ /* Traditionally, a directive is ignored unless its # is in
+ column 1. Therefore in code intended to work with K+R
+ compilers, directives added by C89 must have their #
+ indented, and directives present in traditional C must not.
+ This is true even of directives in skipped conditional
+ blocks. #elif cannot be used at all. */
+ if (CPP_WTRADITIONAL (pfile))
{
- /* Issue -pedantic warnings for extensions. */
- if (CPP_PEDANTIC (pfile)
- && ! pfile->state.skipping
- && dir->origin == EXTENSION)
- cpp_pedwarn (pfile, "#%s is a GCC extension", dir->name);
-
- /* Traditionally, a directive is ignored unless its # is in
- column 1. Therefore in code intended to work with K+R
- compilers, directives added by C89 must have their #
- indented, and directives present in traditional C must not.
- This is true even of directives in skipped conditional
- blocks. */
- if (CPP_WTRADITIONAL (pfile))
- {
- if (dir == &dtable[T_ELIF])
- cpp_warning (pfile, "suggest not using #elif in traditional C");
- else if (indented && dir->origin == KANDR)
- cpp_warning (pfile,
- "traditional C ignores #%s with the # indented",
- dir->name);
- else if (!indented && dir->origin != KANDR)
- cpp_warning (pfile,
- "suggest hiding #%s from traditional C with an indented #",
- dir->name);
- }
+ if (dir == &dtable[T_ELIF])
+ cpp_warning (pfile, "suggest not using #elif in traditional C");
+ else if (indented && dir->origin == KANDR)
+ cpp_warning (pfile,
+ "traditional C ignores #%s with the # indented",
+ dir->name);
+ else if (!indented && dir->origin != KANDR)
+ cpp_warning (pfile,
+ "suggest hiding #%s from traditional C with an indented #",
+ dir->name);
}
}
@@ -330,8 +327,10 @@ _cpp_handle_directive (pfile, indented)
assembler code. */
else if (dname->type == CPP_NUMBER && CPP_OPTION (pfile, lang) != CLK_ASM)
{
- dir = &dtable[T_LINE];
- pfile->state.line_extension = 1;
+ dir = &linemarker_dir;
+ if (CPP_PEDANTIC (pfile) && ! CPP_OPTION (pfile, preprocessed)
+ && ! pfile->state.skipping)
+ cpp_pedwarn (pfile, "style of line directive is a GCC extension");
}
if (dir)
@@ -507,13 +506,12 @@ glue_header_name (pfile)
{
cpp_token *header = NULL;
const cpp_token *token;
- unsigned char *dest;
- size_t len;
+ unsigned char *buffer;
+ size_t len, total_len = 0, capacity = 1024;
/* To avoid lexed tokens overwriting our glued name, we can only
allocate from the string pool once we've lexed everything. */
-
- dest = BUFF_FRONT (pfile->u_buff);
+ buffer = (unsigned char *) xmalloc (capacity);
for (;;)
{
token = cpp_get_token (pfile);
@@ -521,34 +519,35 @@ glue_header_name (pfile)
if (token->type == CPP_GREATER || token->type == CPP_EOF)
break;
- /* + 1 for terminating NUL. */
- len = cpp_token_len (token) + 1;
- if ((size_t) (BUFF_LIMIT (pfile->u_buff) - dest) < len)
+ len = cpp_token_len (token);
+ if (total_len + len > capacity)
{
- size_t len_so_far = dest - BUFF_FRONT (pfile->u_buff);
- _cpp_extend_buff (pfile, &pfile->u_buff, len);
- dest = BUFF_FRONT (pfile->u_buff) + len_so_far;
+ capacity = (capacity + len) * 2;
+ buffer = (unsigned char *) xrealloc (buffer, capacity);
}
if (token->flags & PREV_WHITE)
- *dest++ = ' ';
+ buffer[total_len++] = ' ';
- dest = cpp_spell_token (pfile, token, dest);
+ total_len = cpp_spell_token (pfile, token, &buffer[total_len]) - buffer;
}
if (token->type == CPP_EOF)
cpp_error (pfile, "missing terminating > character");
else
{
+ unsigned char *token_mem = _cpp_unaligned_alloc (pfile, total_len + 1);
+ memcpy (token_mem, buffer, total_len);
+ token_mem[total_len] = '\0';
+
header = _cpp_temp_token (pfile);
header->type = CPP_HEADER_NAME;
header->flags = 0;
- header->val.str.len = dest - BUFF_FRONT (pfile->u_buff);
- header->val.str.text = BUFF_FRONT (pfile->u_buff);
- *dest++ = '\0';
- BUFF_FRONT (pfile->u_buff) = dest;
+ header->val.str.len = total_len;
+ header->val.str.text = token_mem;
}
+ free ((PTR) buffer);
return header;
}
@@ -653,9 +652,10 @@ do_include_next (pfile)
do_include_common (pfile, IT_INCLUDE_NEXT);
}
-/* Subroutine of do_line. Read possible flags after file name. LAST
- is the last flag seen; 0 if this is the first flag. Return the flag
- if it is valid, 0 at the end of the directive. Otherwise complain. */
+/* Subroutine of do_linemarker. Read possible flags after file name.
+ LAST is the last flag seen; 0 if this is the first flag. Return the
+ flag if it is valid, 0 at the end of the directive. Otherwise
+ complain. */
static unsigned int
read_flag (pfile, last)
cpp_reader *pfile;
@@ -679,9 +679,43 @@ read_flag (pfile, last)
return 0;
}
-/* Another subroutine of do_line. Convert a number in STR, of length
- LEN, to binary; store it in NUMP, and return 0 if the number was
- well-formed, 1 if not. Temporary, hopefully. */
+/* Subroutine of do_line and do_linemarker. Returns a version of STR
+ which has a NUL terminator and all escape sequences converted to
+ their equivalents. Temporary, hopefully. */
+static U_CHAR *
+dequote_string (pfile, str, len)
+ cpp_reader *pfile;
+ const U_CHAR *str;
+ unsigned int len;
+{
+ U_CHAR *result = _cpp_unaligned_alloc (pfile, len + 1);
+ U_CHAR *dst = result;
+ const U_CHAR *limit = str + len;
+ unsigned int c;
+ unsigned HOST_WIDE_INT mask;
+
+ /* We need the mask to match the host's 'unsigned char', not the
+ target's. */
+ if (CHAR_BIT < HOST_BITS_PER_WIDE_INT)
+ mask = ((unsigned HOST_WIDE_INT) 1 << CHAR_BIT) - 1;
+ else
+ mask = ~(unsigned HOST_WIDE_INT)0;
+
+ while (str < limit)
+ {
+ c = *str++;
+ if (c != '\\')
+ *dst++ = c;
+ else
+ *dst++ = cpp_parse_escape (pfile, (const U_CHAR **)&str, limit, mask, 0);
+ }
+ *dst++ = '\0';
+ return result;
+}
+
+/* Subroutine of do_line and do_linemarker. Convert a number in STR,
+ of length LEN, to binary; store it in NUMP, and return 0 if the
+ number was well-formed, 1 if not. Temporary, hopefully. */
static int
strtoul_for_line (str, len, nump)
const U_CHAR *str;
@@ -703,8 +737,8 @@ strtoul_for_line (str, len, nump)
}
/* Interpret #line command.
- Note that the filename string (if any) is treated as if it were an
- include filename. That means no escape handling. */
+ Note that the filename string (if any) is a true string constant
+ (escapes are interpreted), unlike in #line. */
static void
do_line (pfile)
cpp_reader *pfile;
@@ -712,16 +746,9 @@ do_line (pfile)
const cpp_token *token;
const char *new_file = pfile->map->to_file;
unsigned long new_lineno;
- unsigned int cap, new_sysp = pfile->map->sysp;
- enum lc_reason reason = LC_RENAME;
/* C99 raised the minimum limit on #line numbers. */
- cap = CPP_OPTION (pfile, c99) ? 2147483647 : 32767;
-
- /* Putting this in _cpp_handle_directive risks two calls to
- _cpp_backup_tokens in some circumstances, which can segfault. */
- if (pfile->state.line_extension)
- _cpp_backup_tokens (pfile, 1);
+ unsigned int cap = CPP_OPTION (pfile, c99) ? 2147483647 : 32767;
/* #line commands expand macros. */
token = cpp_get_token (pfile);
@@ -734,42 +761,85 @@ do_line (pfile)
return;
}
- if (CPP_PEDANTIC (pfile) && ! pfile->state.line_extension
- && (new_lineno == 0 || new_lineno > cap))
+ if (CPP_PEDANTIC (pfile) && (new_lineno == 0 || new_lineno > cap))
cpp_pedwarn (pfile, "line number out of range");
token = cpp_get_token (pfile);
if (token->type == CPP_STRING)
{
- new_file = (const char *) token->val.str.text;
+ new_file = (const char *) dequote_string (pfile, token->val.str.text,
+ token->val.str.len);
+ check_eol (pfile);
+ }
+ else if (token->type != CPP_EOF)
+ {
+ cpp_error (pfile, "\"%s\" is not a valid filename",
+ cpp_token_as_text (pfile, token));
+ return;
+ }
- /* Only accept flags for the # 55 form. */
- if (pfile->state.line_extension)
- {
- int flag;
+ skip_rest_of_line (pfile);
+ _cpp_do_file_change (pfile, LC_RENAME, new_file, new_lineno,
+ pfile->map->sysp);
+}
- new_sysp = 0;
- flag = read_flag (pfile, 0);
- if (flag == 1)
- {
- reason = LC_ENTER;
- /* Fake an include for cpp_included (). */
- _cpp_fake_include (pfile, new_file);
- flag = read_flag (pfile, flag);
- }
- else if (flag == 2)
- {
- reason = LC_LEAVE;
- flag = read_flag (pfile, flag);
- }
- if (flag == 3)
- {
- new_sysp = 1;
- flag = read_flag (pfile, flag);
- if (flag == 4)
- new_sysp = 2;
- }
+/* Interpret the # 44 "file" [flags] notation, which has slightly
+ different syntax and semantics from #line: Flags are allowed,
+ and we never complain about the line number being too big. */
+static void
+do_linemarker (pfile)
+ cpp_reader *pfile;
+{
+ const cpp_token *token;
+ const char *new_file = pfile->map->to_file;
+ unsigned long new_lineno;
+ unsigned int new_sysp = pfile->map->sysp;
+ enum lc_reason reason = LC_RENAME;
+ int flag;
+
+ /* Back up so we can get the number again. Putting this in
+ _cpp_handle_directive risks two calls to _cpp_backup_tokens in
+ some circumstances, which can segfault. */
+ _cpp_backup_tokens (pfile, 1);
+
+ /* #line commands expand macros. */
+ token = cpp_get_token (pfile);
+ if (token->type != CPP_NUMBER
+ || strtoul_for_line (token->val.str.text, token->val.str.len,
+ &new_lineno))
+ {
+ cpp_error (pfile, "\"%s\" after # is not a positive integer",
+ cpp_token_as_text (pfile, token));
+ return;
+ }
+
+ token = cpp_get_token (pfile);
+ if (token->type == CPP_STRING)
+ {
+ new_file = (const char *) dequote_string (pfile, token->val.str.text,
+ token->val.str.len);
+ new_sysp = 0;
+ flag = read_flag (pfile, 0);
+ if (flag == 1)
+ {
+ reason = LC_ENTER;
+ /* Fake an include for cpp_included (). */
+ _cpp_fake_include (pfile, new_file);
+ flag = read_flag (pfile, flag);
}
+ else if (flag == 2)
+ {
+ reason = LC_LEAVE;
+ flag = read_flag (pfile, flag);
+ }
+ if (flag == 3)
+ {
+ new_sysp = 1;
+ flag = read_flag (pfile, flag);
+ if (flag == 4)
+ new_sysp = 2;
+ }
+
check_eol (pfile);
}
else if (token->type != CPP_EOF)
diff --git a/contrib/gcc/cpplib.h b/contrib/gcc/cpplib.h
index eeeecc0..edd4b5a 100644
--- a/contrib/gcc/cpplib.h
+++ b/contrib/gcc/cpplib.h
@@ -240,6 +240,9 @@ struct cpp_options
/* Non-0 means -v, so print the full set of include dirs. */
unsigned char verbose;
+ /* Nonzero means chars are signed. */
+ unsigned char signed_char;
+
/* Nonzero means use extra default include directories for C++. */
unsigned char cplusplus;
@@ -589,6 +592,9 @@ extern void cpp_forall_identifiers PARAMS ((cpp_reader *,
/* In cppmacro.c */
extern void cpp_scan_nooutput PARAMS ((cpp_reader *));
extern int cpp_sys_macro_p PARAMS ((cpp_reader *));
+extern unsigned char *cpp_quote_string PARAMS ((unsigned char *,
+ const unsigned char *,
+ unsigned int));
/* In cppfiles.c */
extern int cpp_included PARAMS ((cpp_reader *, const char *));
diff --git a/contrib/gcc/cppmacro.c b/contrib/gcc/cppmacro.c
index 538c689..b351f96 100644
--- a/contrib/gcc/cppmacro.c
+++ b/contrib/gcc/cppmacro.c
@@ -64,9 +64,6 @@ static cpp_context *next_context PARAMS ((cpp_reader *));
static const cpp_token *padding_token
PARAMS ((cpp_reader *, const cpp_token *));
static void expand_arg PARAMS ((cpp_reader *, macro_arg *));
-static unsigned char *quote_string PARAMS ((unsigned char *,
- const unsigned char *,
- unsigned int));
static const cpp_token *new_string_token PARAMS ((cpp_reader *, U_CHAR *,
unsigned int));
static const cpp_token *new_number_token PARAMS ((cpp_reader *, unsigned int));
@@ -163,7 +160,7 @@ builtin_macro (pfile, node)
name = map->to_file;
len = strlen (name);
buf = _cpp_unaligned_alloc (pfile, len * 4 + 1);
- len = quote_string (buf, (const unsigned char *) name, len) - buf;
+ len = cpp_quote_string (buf, (const unsigned char *) name, len) - buf;
result = new_string_token (pfile, buf, len);
}
@@ -243,9 +240,10 @@ builtin_macro (pfile, node)
/* Copies SRC, of length LEN, to DEST, adding backslashes before all
backslashes and double quotes. Non-printable characters are
- converted to octal. DEST must be of sufficient size. */
-static U_CHAR *
-quote_string (dest, src, len)
+ converted to octal. DEST must be of sufficient size. Returns
+ a pointer to the end of the string. */
+U_CHAR *
+cpp_quote_string (dest, src, len)
U_CHAR *dest;
const U_CHAR *src;
unsigned int len;
@@ -330,7 +328,7 @@ stringify_arg (pfile, arg)
_cpp_buff *buff = _cpp_get_buff (pfile, len);
unsigned char *buf = BUFF_FRONT (buff);
len = cpp_spell_token (pfile, token, buf) - buf;
- dest = quote_string (dest, buf, len);
+ dest = cpp_quote_string (dest, buf, len);
_cpp_release_buff (pfile, buff);
}
else
@@ -648,12 +646,17 @@ funlike_invocation_p (pfile, node)
return collect_args (pfile, node);
}
- /* Back up. We may have skipped padding, in which case backing up
- more than one token when expanding macros is in general too
- difficult. We re-insert it in its own context. */
- _cpp_backup_tokens (pfile, 1);
- if (padding)
- push_token_context (pfile, NULL, padding, 1);
+ /* CPP_EOF can be the end of macro arguments, or the end of the
+ file. We mustn't back up over the latter. Ugh. */
+ if (token->type != CPP_EOF || token == &pfile->eof)
+ {
+ /* Back up. We may have skipped padding, in which case backing
+ up more than one token when expanding macros is in general
+ too difficult. We re-insert it in its own context. */
+ _cpp_backup_tokens (pfile, 1);
+ if (padding)
+ push_token_context (pfile, NULL, padding, 1);
+ }
return NULL;
}
@@ -1529,10 +1532,10 @@ cpp_macro_definition (pfile, node)
len = NODE_LEN (node) + 1; /* ' ' */
if (macro->fun_like)
{
- len += 3; /* "()" plus possible final "." of named
- varargs (we have + 2 below). */
+ len += 4; /* "()" plus possible final ".." of named
+ varargs (we have + 1 below). */
for (i = 0; i < macro->paramc; i++)
- len += NODE_LEN (macro->params[i]) + 2; /* ", " */
+ len += NODE_LEN (macro->params[i]) + 1; /* "," */
}
for (i = 0; i < macro->count; i++)
@@ -1575,17 +1578,23 @@ cpp_macro_definition (pfile, node)
}
if (i + 1 < macro->paramc)
- *buffer++ = ',', *buffer++ = ' ';
+ /* Don't emit a space after the comma here; we're trying
+ to emit a Dwarf-friendly definition, and the Dwarf spec
+ forbids spaces in the argument list. */
+ *buffer++ = ',';
else if (macro->variadic)
*buffer++ = '.', *buffer++ = '.', *buffer++ = '.';
}
*buffer++ = ')';
}
+ /* The Dwarf spec requires a space after the macro name, even if the
+ definition is the empty string. */
+ *buffer++ = ' ';
+
/* Expansion tokens. */
if (macro->count)
{
- *buffer++ = ' ';
for (i = 0; i < macro->count; i++)
{
cpp_token *token = &macro->expansion[i];
diff --git a/contrib/gcc/cppmain.c b/contrib/gcc/cppmain.c
index ee157ca..b8757c7 100644
--- a/contrib/gcc/cppmain.c
+++ b/contrib/gcc/cppmain.c
@@ -193,8 +193,13 @@ setup_callbacks ()
if (! options->no_output)
{
cb->line_change = cb_line_change;
- cb->ident = cb_ident;
- cb->def_pragma = cb_def_pragma;
+ /* Don't emit #pragma or #ident directives if we are processing
+ assembly language; the assembler may choke on them. */
+ if (options->lang != CLK_ASM)
+ {
+ cb->ident = cb_ident;
+ cb->def_pragma = cb_def_pragma;
+ }
if (! options->no_line_commands)
cb->file_change = cb_file_change;
}
@@ -316,8 +321,17 @@ print_line (map, line, special_flags)
print.line = line;
if (! options->no_line_commands)
{
+ size_t to_file_len = strlen (map->to_file);
+ unsigned char *to_file_quoted = alloca (to_file_len * 4 + 1);
+ unsigned char *p;
+
+ /* cpp_quote_string does not nul-terminate, so we have to do it
+ ourselves. */
+ p = cpp_quote_string (to_file_quoted,
+ (unsigned char *)map->to_file, to_file_len);
+ *p = '\0';
fprintf (print.outf, "# %u \"%s\"%s",
- SOURCE_LINE (map, print.line), map->to_file, special_flags);
+ SOURCE_LINE (map, print.line), to_file_quoted, special_flags);
if (map->sysp == 2)
fputs (" 3 4", print.outf);
diff --git a/contrib/gcc/crtstuff.c b/contrib/gcc/crtstuff.c
index e3b2607..d3484e3 100644
--- a/contrib/gcc/crtstuff.c
+++ b/contrib/gcc/crtstuff.c
@@ -316,7 +316,7 @@ frame_dummy (void)
if (__register_frame_info)
__register_frame_info (__EH_FRAME_BEGIN__, &object);
#endif
-#endif /* EH_FRAME_SECTION_NAME */
+#endif /* USE_EH_FRAME_REGISTRY */
#ifdef JCR_SECTION_NAME
if (__JCR_LIST__[0] && _Jv_RegisterClasses)
_Jv_RegisterClasses (__JCR_LIST__);
@@ -324,7 +324,7 @@ frame_dummy (void)
}
CRT_CALL_STATIC_FUNCTION (INIT_SECTION_ASM_OP, frame_dummy)
-#endif /* EH_FRAME_SECTION_NAME || JCR_SECTION_NAME */
+#endif /* USE_EH_FRAME_REGISTRY || JCR_SECTION_NAME */
#else /* OBJECT_FORMAT_ELF */
@@ -413,7 +413,7 @@ __do_global_ctors_1(void)
_Jv_RegisterClasses (__JCR_LIST__);
#endif
}
-#endif /* EH_FRAME_SECTION_NAME || JCR_SECTION_NAME */
+#endif /* USE_EH_FRAME_REGISTRY || JCR_SECTION_NAME */
#else /* ! INIT_SECTION_ASM_OP && ! HAS_INIT_SECTION */
#error "What are you doing with crtstuff.c, then?"
diff --git a/contrib/gcc/cse.c b/contrib/gcc/cse.c
index ac9e886..a607b0c 100644
--- a/contrib/gcc/cse.c
+++ b/contrib/gcc/cse.c
@@ -2323,6 +2323,22 @@ canon_hash (x, mode)
+ (unsigned) CONST_DOUBLE_HIGH (x));
return hash;
+ case CONST_VECTOR:
+ {
+ int units;
+ rtx elt;
+
+ units = CONST_VECTOR_NUNITS (x);
+
+ for (i = 0; i < units; ++i)
+ {
+ elt = CONST_VECTOR_ELT (x, i);
+ hash += canon_hash (elt, GET_MODE (elt));
+ }
+
+ return hash;
+ }
+
/* Assume there is only one rtx object for any given label. */
case LABEL_REF:
hash += ((unsigned) LABEL_REF << 7) + (unsigned long) XEXP (x, 0);
@@ -2776,6 +2792,7 @@ canon_reg (x, insn)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
case ADDR_VEC:
@@ -3317,6 +3334,7 @@ fold_rtx (x, insn)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
case REG:
@@ -3727,6 +3745,7 @@ fold_rtx (x, insn)
case SYMBOL_REF:
case LABEL_REF:
case CONST_DOUBLE:
+ case CONST_VECTOR:
const_arg = arg;
break;
@@ -5795,7 +5814,7 @@ cse_insn (insn, libcall_insn)
else
INSN_CODE (insn) = -1;
- never_reached_warning (insn);
+ never_reached_warning (insn, NULL);
/* Do not bother deleting any unreachable code,
let jump/flow do that. */
@@ -6425,6 +6444,7 @@ cse_process_notes (x, object)
case SYMBOL_REF:
case LABEL_REF:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case PC:
case CC0:
case LO_SUM:
@@ -7416,6 +7436,7 @@ count_reg_usage (x, counts, dest, incr)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
return;
diff --git a/contrib/gcc/cselib.c b/contrib/gcc/cselib.c
index 64eb8a5..0eb17b8 100644
--- a/contrib/gcc/cselib.c
+++ b/contrib/gcc/cselib.c
@@ -593,6 +593,22 @@ hash_rtx (x, mode, create)
+ (unsigned) CONST_DOUBLE_HIGH (x));
return hash ? hash : (unsigned int) CONST_DOUBLE;
+ case CONST_VECTOR:
+ {
+ int units;
+ rtx elt;
+
+ units = CONST_VECTOR_NUNITS (x);
+
+ for (i = 0; i < units; ++i)
+ {
+ elt = CONST_VECTOR_ELT (x, i);
+ hash += hash_rtx (elt, GET_MODE (elt), 0);
+ }
+
+ return hash;
+ }
+
/* Assume there is only one rtx object for any given label. */
case LABEL_REF:
hash
@@ -794,6 +810,7 @@ cselib_subst_to_values (x)
return e->u.val_rtx;
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CONST_INT:
return x;
@@ -1009,6 +1026,7 @@ cselib_mem_conflict_p (mem_base, val)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
return 0;
diff --git a/contrib/gcc/defaults.h b/contrib/gcc/defaults.h
index 2a7c567..8e1e1ec6 100644
--- a/contrib/gcc/defaults.h
+++ b/contrib/gcc/defaults.h
@@ -1,5 +1,5 @@
/* Definitions of various defaults for tm.h macros.
- Copyright (C) 1992, 1996, 1997, 1998, 1999, 2000, 2001
+ Copyright (C) 1992, 1996, 1997, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
Contributed by Ron Guilmette (rfg@monkeys.com)
@@ -158,7 +158,7 @@ do { ASM_OUTPUT_LABEL(FILE,LABEL_ALTERNATE_NAME (INSN)); } while (0)
/* This determines whether or not we support weak symbols. */
#ifndef SUPPORTS_WEAK
-#ifdef ASM_WEAKEN_LABEL
+#if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
#define SUPPORTS_WEAK 1
#else
#define SUPPORTS_WEAK 0
@@ -285,6 +285,11 @@ do { \
#define CHAR_TYPE_SIZE BITS_PER_UNIT
#endif
+#ifndef BOOL_TYPE_SIZE
+/* `bool' has size and alignment `1', on almost all platforms. */
+#define BOOL_TYPE_SIZE CHAR_TYPE_SIZE
+#endif
+
#ifndef SHORT_TYPE_SIZE
#define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2))
#endif
diff --git a/contrib/gcc/demangle.h b/contrib/gcc/demangle.h
index 63fe5e2..ad0569a 100644
--- a/contrib/gcc/demangle.h
+++ b/contrib/gcc/demangle.h
@@ -1,5 +1,6 @@
/* Defs for interface to demanglers.
- Copyright 1992, 1995, 1996 Free Software Foundation, Inc.
+ Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001
+ Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -24,21 +25,26 @@
/* Options passed to cplus_demangle (in 2nd parameter). */
-#define DMGL_NO_OPTS 0 /* For readability... */
-#define DMGL_PARAMS (1 << 0) /* Include function args */
-#define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */
-#define DMGL_JAVA (1 << 2) /* Demangle as Java rather than C++. */
-
-#define DMGL_AUTO (1 << 8)
-#define DMGL_GNU (1 << 9)
-#define DMGL_LUCID (1 << 10)
-#define DMGL_ARM (1 << 11)
-#define DMGL_HP (1 << 12) /* For the HP aCC compiler; same as ARM
- except for template arguments, etc. */
-#define DMGL_EDG (1 << 13)
+#define DMGL_NO_OPTS 0 /* For readability... */
+#define DMGL_PARAMS (1 << 0) /* Include function args */
+#define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */
+#define DMGL_JAVA (1 << 2) /* Demangle as Java rather than C++. */
+#define DMGL_VERBOSE (1 << 3) /* Include implementation details. */
+#define DMGL_TYPES (1 << 4) /* Also try to demangle type encodings. */
+
+#define DMGL_AUTO (1 << 8)
+#define DMGL_GNU (1 << 9)
+#define DMGL_LUCID (1 << 10)
+#define DMGL_ARM (1 << 11)
+#define DMGL_HP (1 << 12) /* For the HP aCC compiler;
+ same as ARM except for
+ template arguments, etc. */
+#define DMGL_EDG (1 << 13)
+#define DMGL_GNU_V3 (1 << 14)
+#define DMGL_GNAT (1 << 15)
/* If none of these are set, use 'current_demangling_style' as the default. */
-#define DMGL_STYLE_MASK (DMGL_AUTO|DMGL_GNU|DMGL_LUCID|DMGL_ARM|DMGL_HP|DMGL_EDG)
+#define DMGL_STYLE_MASK (DMGL_AUTO|DMGL_GNU|DMGL_LUCID|DMGL_ARM|DMGL_HP|DMGL_EDG|DMGL_GNU_V3|DMGL_JAVA|DMGL_GNAT)
/* Enumeration of possible demangling styles.
@@ -50,23 +56,31 @@
extern enum demangling_styles
{
+ no_demangling = -1,
unknown_demangling = 0,
auto_demangling = DMGL_AUTO,
gnu_demangling = DMGL_GNU,
lucid_demangling = DMGL_LUCID,
arm_demangling = DMGL_ARM,
hp_demangling = DMGL_HP,
- edg_demangling = DMGL_EDG
+ edg_demangling = DMGL_EDG,
+ gnu_v3_demangling = DMGL_GNU_V3,
+ java_demangling = DMGL_JAVA,
+ gnat_demangling = DMGL_GNAT
} current_demangling_style;
/* Define string names for the various demangling styles. */
-#define AUTO_DEMANGLING_STYLE_STRING "auto"
-#define GNU_DEMANGLING_STYLE_STRING "gnu"
-#define LUCID_DEMANGLING_STYLE_STRING "lucid"
-#define ARM_DEMANGLING_STYLE_STRING "arm"
-#define HP_DEMANGLING_STYLE_STRING "hp"
-#define EDG_DEMANGLING_STYLE_STRING "edg"
+#define NO_DEMANGLING_STYLE_STRING "none"
+#define AUTO_DEMANGLING_STYLE_STRING "auto"
+#define GNU_DEMANGLING_STYLE_STRING "gnu"
+#define LUCID_DEMANGLING_STYLE_STRING "lucid"
+#define ARM_DEMANGLING_STYLE_STRING "arm"
+#define HP_DEMANGLING_STYLE_STRING "hp"
+#define EDG_DEMANGLING_STYLE_STRING "edg"
+#define GNU_V3_DEMANGLING_STYLE_STRING "gnu-v3"
+#define JAVA_DEMANGLING_STYLE_STRING "java"
+#define GNAT_DEMANGLING_STYLE_STRING "gnat"
/* Some macros to test what demangling style is active. */
@@ -77,6 +91,19 @@ extern enum demangling_styles
#define ARM_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_ARM)
#define HP_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_HP)
#define EDG_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_EDG)
+#define GNU_V3_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNU_V3)
+#define JAVA_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_JAVA)
+#define GNAT_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNAT)
+
+/* Provide information about the available demangle styles. This code is
+ pulled from gdb into libiberty because it is useful to binutils also. */
+
+extern const struct demangler_engine
+{
+ const char *const demangling_style_name;
+ const enum demangling_styles demangling_style;
+ const char *const demangling_style_doc;
+} libiberty_demanglers[];
extern char *
cplus_demangle PARAMS ((const char *mangled, int options));
@@ -92,4 +119,45 @@ cplus_mangle_opname PARAMS ((const char *opname, int options));
extern void
set_cplus_marker_for_demangling PARAMS ((int ch));
+extern enum demangling_styles
+cplus_demangle_set_style PARAMS ((enum demangling_styles style));
+
+extern enum demangling_styles
+cplus_demangle_name_to_style PARAMS ((const char *name));
+
+/* V3 ABI demangling entry points, defined in cp-demangle.c. */
+extern char*
+cplus_demangle_v3 PARAMS ((const char* mangled, int options));
+
+extern char*
+java_demangle_v3 PARAMS ((const char* mangled));
+
+
+enum gnu_v3_ctor_kinds {
+ gnu_v3_complete_object_ctor = 1,
+ gnu_v3_base_object_ctor,
+ gnu_v3_complete_object_allocating_ctor
+};
+
+/* Return non-zero iff NAME is the mangled form of a constructor name
+ in the G++ V3 ABI demangling style. Specifically, return an `enum
+ gnu_v3_ctor_kinds' value indicating what kind of constructor
+ it is. */
+extern enum gnu_v3_ctor_kinds
+ is_gnu_v3_mangled_ctor PARAMS ((const char *name));
+
+
+enum gnu_v3_dtor_kinds {
+ gnu_v3_deleting_dtor = 1,
+ gnu_v3_complete_object_dtor,
+ gnu_v3_base_object_dtor
+};
+
+/* Return non-zero iff NAME is the mangled form of a destructor name
+ in the G++ V3 ABI demangling style. Specifically, return an `enum
+ gnu_v3_dtor_kinds' value, indicating what kind of destructor
+ it is. */
+extern enum gnu_v3_dtor_kinds
+ is_gnu_v3_mangled_dtor PARAMS ((const char *name));
+
#endif /* DEMANGLE_H */
diff --git a/contrib/gcc/df.c b/contrib/gcc/df.c
index 08483ef..ed0fd77 100644
--- a/contrib/gcc/df.c
+++ b/contrib/gcc/df.c
@@ -1032,6 +1032,7 @@ df_uses_record (df, loc, ref_type, bb, insn, flags)
case CONST_INT:
case CONST:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case PC:
case ADDR_VEC:
case ADDR_DIFF_VEC:
@@ -1235,13 +1236,13 @@ df_insn_refs_record (df, bb, insn)
note = XEXP (note, 1))
{
if (GET_CODE (XEXP (note, 0)) == USE)
- df_uses_record (df, &SET_DEST (XEXP (note, 0)), DF_REF_REG_USE,
+ df_uses_record (df, &XEXP (XEXP (note, 0), 0), DF_REF_REG_USE,
bb, insn, 0);
}
/* The stack ptr is used (honorarily) by a CALL insn. */
x = df_reg_use_gen (STACK_POINTER_REGNUM);
- df_uses_record (df, &SET_DEST (x), DF_REF_REG_USE, bb, insn, 0);
+ df_uses_record (df, &XEXP (x, 0), DF_REF_REG_USE, bb, insn, 0);
if (df->flags & DF_HARD_REGS)
{
diff --git a/contrib/gcc/doc/c-tree.texi b/contrib/gcc/doc/c-tree.texi
index cbf0196..0e821e5 100644
--- a/contrib/gcc/doc/c-tree.texi
+++ b/contrib/gcc/doc/c-tree.texi
@@ -27,7 +27,7 @@ the ability to process C or C++ code.
This chapter explains the internal representation. In particular, it
documents the internal representation for C and C++ source
constructs, and the macros, functions, and variables that can be used to
-access these constructs. The C++ representation which is largely a superset
+access these constructs. The C++ representation is largely a superset
of the representation used in the C front end. There is only one
construct used in C that does not appear in the C++ front end and that
is the GNU ``nested function'' extension. Many of the macros documented
@@ -760,8 +760,8 @@ binfo is given by @code{BINFO_TYPE}. It is always the case that
qualifiers. However, it is not always the case that @code{TYPE_BINFO
(BINFO_TYPE (y))} is always the same binfo as @code{y}. The reason is
that if @code{y} is a binfo representing a base-class @code{B} of a
-derived class @code{D}, then @code{BINFO_TYPE (y)} will be @code{B}, and
-@code{TYPE_INFO (BINFO_TYPE (y))} will be @code{B} as its own
+derived class @code{D}, then @code{BINFO_TYPE (y)} will be @code{B},
+and @code{TYPE_BINFO (BINFO_TYPE (y))} will be @code{B} as its own
base-class, rather than as a base-class of @code{D}.
The @code{BINFO_BASETYPES} is a @code{TREE_VEC} (@pxref{Containers}).
@@ -1631,7 +1631,8 @@ Used to represent a @code{switch} statement. The @code{SWITCH_COND} is
the expression on which the switch is occurring. See the documentation
for an @code{IF_STMT} for more information on the representation used
for the condition. The @code{SWITCH_BODY} is the body of the switch
-statement.
+statement. The @code{SWITCH_TYPE} is the original type of switch
+expression as given in the source, before any compiler conversions.
@item TRY_BLOCK
Used to represent a @code{try} block. The body of the try block is
@@ -1711,6 +1712,7 @@ This macro returns the attributes on the type @var{type}.
@findex tree_int_cst_equal
@tindex REAL_CST
@tindex COMPLEX_CST
+@tindex VECTOR_CST
@tindex STRING_CST
@findex TREE_STRING_LENGTH
@findex TREE_STRING_POINTER
@@ -1857,6 +1859,12 @@ These nodes are used to represent complex number constants, that is a
@code{TREE_REALPART} and @code{TREE_IMAGPART} return the real and the
imaginary parts respectively.
+@item VECTOR_CST
+These nodes are used to represent vector constants, whose parts are
+constant nodes. Each individual constant node is either an integer or a
+double constant node. The first operand is a @code{TREE_LIST} of the
+constant nodes and is accessed through @code{TREE_VECTOR_CST_ELTS}.
+
@item STRING_CST
These nodes represent string-constants. The @code{TREE_STRING_LENGTH}
returns the length of the string, as an @code{int}. The
diff --git a/contrib/gcc/doc/contrib.texi b/contrib/gcc/doc/contrib.texi
index 966d3ec..38eef90 100644
--- a/contrib/gcc/doc/contrib.texi
+++ b/contrib/gcc/doc/contrib.texi
@@ -1,4 +1,4 @@
-@c Copyright (C) 1988,1989,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001
+@c Copyright (C) 1988,1989,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002
@c Free Software Foundation, Inc.
@c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi.
@@ -25,6 +25,9 @@ Analog Devices helped implement the support for complex data types
and iterators.
@item
+John David Anglin for improvements to libstdc++-v3 and the HP-UX port.
+
+@item
James van Artsdalen wrote the code that makes efficient use of
the Intel 80387 register stack.
@@ -69,6 +72,9 @@ Joe Buck for his direction via the steering committee.
Craig Burley for leadership of the Fortran effort.
@item
+Paolo Carlini for his work on libstdc++-v3.
+
+@item
John Carr for his alias work, SPARC hacking, infrastructure improvements,
previous contributions to the steering committee, loop optimizations, etc.
@@ -77,7 +83,7 @@ Steve Chamberlain wrote the support for the Hitachi SH and H8 processors
and the PicoJava processor.
@item
-Scott Christley for his ObjC contributions.
+Scott Christley for his Objective-C contributions.
@item
Branko Cibej for more warning contributions.
@@ -182,9 +188,10 @@ fixes.
Kate Hedstrom for staking the g77 folks with an initial testsuite.
@item
-Richard Henderson for his ongoing SPARC and alpha work, loop opts, and
-generally fixing lots of old problems we've ignored for years, flow
-rewrite and lots of stuff I've forgotten.
+Richard Henderson for his ongoing SPARC, alpha, and ia32 work, loop
+opts, and generally fixing lots of old problems we've ignored for
+years, flow rewrite and lots of further stuff, including reviewing
+tons of patches.
@item
Nobuyuki Hikichi of Software Research Associates, Tokyo, contributed
@@ -207,13 +214,18 @@ Christian Iseli for various bugfixes.
Kamil Iskra for general m68k hacking.
@item
-Lee Iverson for random fixes and mips testing.
+Lee Iverson for random fixes and MIPS testing.
@item
Andreas Jaeger for various fixes to the MIPS port
@item
-Jakub Jelinek for his SPARC work and sibling call optimizations.
+Jakub Jelinek for his SPARC work and sibling call optimizations as well
+as lots of bug fixes and test cases.
+
+@item
+Janis Johnson for ia64 testing and fixes and for her quality improvement
+sidetracks.
@item
J. Kean Johnston for OpenServer support.
@@ -225,7 +237,8 @@ Klaus Kaempf for his ongoing work to make alpha-vms a viable target.
David Kashtan of SRI adapted GCC to VMS@.
@item
-Geoffrey Keating for his ongoing work to make the PPC work for Linux.
+Geoffrey Keating for his ongoing work to make the PPC work for GNU/Linux
+and his automatic regression tester.
@item
Brendan Kehoe for his ongoing work with g++.
@@ -262,7 +275,7 @@ Thomas Koenig for various bugfixes.
Bruce Korb for the new and improved fixincludes code.
@item
-Benjamin Kosnik for his g++ work.
+Benjamin Kosnik for his g++ work and for leading the libstdc++-v3 effort.
@item
Charles LaBrec contributed the support for the Integrated Solutions
@@ -289,7 +302,7 @@ Warren Levy major work on libgcj (Java Runtime Library) and random
work on the Java front end.
@item
-Alain Lichnewsky ported GCC to the Mips cpu.
+Alain Lichnewsky ported GCC to the MIPS CPU.
@item
Robert Lipe for OpenServer support, new testsuites, testing, etc.
@@ -307,7 +320,7 @@ and various C++ improvements including namespace support.
@item
H.J. Lu for his previous contributions to the steering committee, many x86
-bug reports, prototype patches, and keeping the Linux ports working.
+bug reports, prototype patches, and keeping the GNU/Linux ports working.
@item
Greg McGary for random fixes and (someday) bounded pointers.
@@ -325,8 +338,8 @@ and direction in the area of instruction scheduling.
Bob Manson for his behind the scenes work on dejagnu.
@item
-Michael Meissner for LRS framework, ia32, m32r, v850, m88k, MIPS powerpc, haifa,
-ECOFF debug support, and other assorted hacking.
+Michael Meissner for LRS framework, ia32, m32r, v850, m88k, MIPS,
+powerpc, haifa, ECOFF debug support, and other assorted hacking.
@item
Jason Merrill for his direction via the steering committee and leading
@@ -343,10 +356,10 @@ Gary Miller ported GCC to Charles River Data Systems machines.
@item
Mark Mitchell for his direction via the steering committee, mountains of
C++ work, load/store hoisting out of loops, alias analysis improvements,
-ISO C @code{restrict} support, and serving as release manager for GCC 3.0.
+ISO C @code{restrict} support, and serving as release manager for GCC 3.x.
@item
-Alan Modra for various Linux bits and testing.
+Alan Modra for various GNU/Linux bits and testing.
@item
Toon Moene for his direction via the steering committee, Fortran
@@ -359,8 +372,8 @@ services, ftp services, etc etc.
@item
Catherine Moore for fixing various ugly problems we have sent her
-way, including the haifa bug which was killing the Alpha & PowerPC Linux
-kernels.
+way, including the haifa bug which was killing the Alpha & PowerPC
+Linux kernels.
@item
David Mosberger-Tang for various Alpha improvements.
@@ -395,6 +408,11 @@ engine setup, various documentation fixes and other small fixes.
Geoff Noer for this work on getting cygwin native builds working.
@item
+David O'Brien for the FreeBSD/alpha, FreeBSD/AMD x86-64, FreeBSD/ARM,
+FreeBSD/PowerPC, and FreeBSD/SPARC64 ports and related infrastructure
+improvements.
+
+@item
Alexandre Oliva for various build infrastructure improvements, scripts and
amazing testing work.
@@ -420,15 +438,17 @@ out lots of problems we need to solve, maintenance of the web pages, and
taking care of documentation maintenance in general.
@item
-Ovidiu Predescu for his work on the ObjC front end and runtime libraries.
+Ovidiu Predescu for his work on the Objective-C front end and runtime
+libraries.
@item
-Ken Raeburn for various improvements to checker, mips ports and various
+Ken Raeburn for various improvements to checker, MIPS ports and various
cleanups in the compiler.
@item
David Reese of Sun Microsystems contributed to the Solaris on PowerPC
port.
+
@item
Gabriel Dos Reis for contributions and maintenance of libstdc++-v3,
including valarray implementation and limits support.
@@ -438,6 +458,12 @@ Joern Rennecke for maintaining the sh port, loop, regmove & reload
hacking.
@item
+Loren J. Rittle for improvements to libstdc++-v3 and the FreeBSD port.
+
+@item
+Craig Rodrigues for processing tons of bug reports.
+
+@item
Gavin Romig-Koch for lots of behind the scenes MIPS work.
@item
@@ -522,10 +548,10 @@ Ian Lance Taylor for his mips16 work, general configury hacking,
fixincludes, etc.
@item
-Holger Teutsch provided the support for the Clipper cpu.
+Holger Teutsch provided the support for the Clipper CPU.
@item
-Gary Thomas for his ongoing work to make the PPC work for Linux.
+Gary Thomas for his ongoing work to make the PPC work for GNU/Linux.
@item
Philipp Thomas for random bugfixes throughout the compiler
@@ -535,8 +561,8 @@ Kresten Krab Thorup wrote the run time support for the Objective-C
language.
@item
-Michael Tiemann for random bugfixes the first instruction scheduler,
-initial C++ support, function integration, NS32k, sparc and M88k
+Michael Tiemann for random bugfixes, the first instruction scheduler,
+initial C++ support, function integration, NS32k, SPARC and M88k
machine description work, delay slot scheduling.
@item
@@ -660,6 +686,9 @@ Dave Love
H.J. Lu
@item
+Brad Lucier
+
+@item
Mumit Khan
@item
@@ -687,6 +716,9 @@ Richard Polton
David Rees
@item
+Loren J. Rittle
+
+@item
Peter Schmid
@item
diff --git a/contrib/gcc/doc/contribute.texi b/contrib/gcc/doc/contribute.texi
index f9a5f97..0aec268 100644
--- a/contrib/gcc/doc/contribute.texi
+++ b/contrib/gcc/doc/contribute.texi
@@ -15,7 +15,7 @@ If you would like to work on improvements to GCC, please read the
advice at these URLs:
@smallexample
-@uref{http://gcc.gnu.org/contribute.html}
+@uref{http://gcc.gnu.org/contribute.html}
@uref{http://gcc.gnu.org/contributewhy.html}
@end smallexample
diff --git a/contrib/gcc/doc/cpp.texi b/contrib/gcc/doc/cpp.texi
index 3572384..808f3c4 100644
--- a/contrib/gcc/doc/cpp.texi
+++ b/contrib/gcc/doc/cpp.texi
@@ -46,6 +46,12 @@ This manual contains no Invariant Sections. The Front-Cover Texts are
@code{\body\}
@end macro
+@c Create a separate index for command line options.
+@defcodeindex op
+
+@c Used in cppopts.texi and cppenv.texi.
+@set cppmanual
+
@ifinfo
@dircategory Programming
@direntry
@@ -88,7 +94,9 @@ useful on its own.
* Traditional Mode::
* Implementation Details::
* Invocation::
+* Environment Variables::
* GNU Free Documentation License::
+* Option Index::
* Index of Directives::
* Concept Index::
@@ -3035,6 +3043,13 @@ input. Subsequent lines are counted from @var{linenum}.
effect. In addition, @var{filename} is a string constant. The
following line and all subsequent lines are reported to come from the
file it specifies, until something else happens to change that.
+@var{filename} is interpreted according to the normal rules for a string
+constant: backslash escapes are interpreted. This is different from
+@samp{#include}.
+
+Previous versions of GNU CPP did not interpret escapes in @samp{#line};
+we have changed it because the standard requires they be interpreted,
+and most other compilers do.
@item #line @var{anything else}
@var{anything else} is checked for macro calls, which are expanded.
@@ -3044,7 +3059,35 @@ The result should match one of the above two forms.
@samp{#line} directives alter the results of the @code{__FILE__} and
@code{__LINE__} predefined macros from that point on. @xref{Standard
Predefined Macros}. They do not have any effect on @samp{#include}'s
-idea of the directory containing the current file.
+idea of the directory containing the current file. This is a change
+from GCC 2.95. Previously, a file reading
+
+@smallexample
+#line 1 "../src/gram.y"
+#include "gram.h"
+@end smallexample
+
+would search for @file{gram.h} in @file{../src}, then the @option{-I}
+chain; the directory containing the physical source file would not be
+searched. In GCC 3.0 and later, the @samp{#include} is not affected by
+the presence of a @samp{#line} referring to a different directory.
+
+We made this change because the old behavior caused problems when
+generated source files were transported between machines. For instance,
+it is common practice to ship generated parsers with a source release,
+so that people building the distribution do not need to have yacc or
+Bison installed. These files frequently have @samp{#line} directives
+referring to the directory tree of the system where the distribution was
+created. If GCC tries to search for headers in those directories, the
+build is likely to fail.
+
+The new behavior can cause failures too, if the generated file is not
+in the same directory as its source and it attempts to include a header
+which would be visible searching from the directory containing the
+source file. However, this problem is easily solved with an additional
+@option{-I} switch on the command line. The failures caused by the old
+semantics could sometimes be corrected only by editing the generated
+files, which is difficult and error-prone.
@node Pragmas
@chapter Pragmas
@@ -3224,7 +3267,8 @@ of the form
These are called @dfn{linemarkers}. They are inserted as needed into
the output (but never within a string or character constant). They mean
that the following line originated in file @var{filename} at line
-@var{linenum}.
+@var{linenum}. @var{filename} will never contain any non-printing
+characters; they are replaced with octal escape sequences.
After the file name comes zero or more flags, which are @samp{1},
@samp{2}, @samp{3}, or @samp{4}. If there are multiple flags, spaces
@@ -3780,6 +3824,25 @@ were still available in traditional mode. It is now a separate program
and does not implement any of the GNU extensions, except for a partial
implementation of assertions. Even those may be removed in a future
release.
+
+@item @samp{#line} and @samp{#include}
+
+The @samp{#line} directive used to change GCC's notion of the
+``directory containing the current file,'' used by @samp{#include} with
+a double-quoted header file name. In 3.0 and later, it does not.
+@xref{Line Control}, for further explanation.
+
+@item Syntax of @samp{#line}
+
+In GCC 2.95 and previous, the string constant argument to @samp{#line}
+was treated the same way as the argument to @samp{#include}: backslash
+escapes were not honored, and the string ended at the second @samp{"}.
+This is not compliant with the C standard. In GCC 3.0, an attempt was
+made to correct the behavior, so that the string was treated as a real
+string constant, but it turned out to be buggy. In 3.1, the bugs have
+been fixed. (We are not fixing the bugs in 3.0 because they affect
+relatively few people and the fix is quite invasive.)
+
@end itemize
@node Invocation
@@ -3842,455 +3905,38 @@ options may @emph{not} be grouped: @option{-dM} is very different from
@w{@samp{-d -M}}.
@cindex options
-@table @gcctabopt
-@item -D @var{name}
-Predefine @var{name} as a macro, with definition @code{1}.
-
-@item -D @var{name}=@var{definition}
-Predefine @var{name} as a macro, with definition @var{definition}.
-There are no restrictions on the contents of @var{definition}, but if
-you are invoking the preprocessor from a shell or shell-like program you
-may need to use the shell's quoting syntax to protect characters such as
-spaces that have a meaning in the shell syntax. If you use more than
-one @option{-D} for the same @var{name}, the rightmost definition takes
-effect.
-
-If you wish to define a function-like macro on the command line, write
-its argument list with surrounding parentheses before the equals sign
-(if any). Parentheses are meaningful to most shells, so you will need
-to quote the option. With @command{sh} and @command{csh},
-@option{-D'@var{name}(@var{args@dots{}})=@var{definition}'} works.
-
-@item -U @var{name}
-Cancel any previous definition of @var{name}, either built in or
-provided with a @option{-D} option.
-
-All @option{-imacros @var{file}} and @option{-include @var{file}} options
-are processed after all @option{-D} and @option{-U} options.
-
-@item -undef
-Do not predefine any system-specific macros. The common predefined
-macros remain defined.
-
-@item -I @var{dir}
-Add the directory @var{dir} to the list of directories to be searched
-for header files. @xref{Search Path}. Directories named by @option{-I}
-are searched before the standard system include directories.
-
-It is dangerous to specify a standard system include directory in an
-@option{-I} option. This defeats the special treatment of system
-headers (@pxref{System Headers}). It can also defeat the repairs to
-buggy system headers which GCC makes when it is installed.
-
-@item -o @var{file}
-Write output to @var{file}. This is the same as specifying @var{file}
-as the second non-option argument to @command{cpp}. @command{gcc} has a
-different interpretation of a second non-option argument, so you must
-use @option{-o} to specify the output file.
-
-@item -Wall
-Turns on all optional warnings which are desirable for normal code. At
-present this is @option{-Wcomment} and @option{-Wtrigraphs}. Note that
-many of the preprocessor's warnings are on by default and have no
-options to control them.
-
-@item -Wcomment
-@itemx -Wcomments
-Warn whenever a comment-start sequence @samp{/*} appears in a @samp{/*}
-comment, or whenever a backslash-newline appears in a @samp{//} comment.
-(Both forms have the same effect.)
-
-@item -Wtrigraphs
-Warn if any trigraphs are encountered. This option used to take effect
-only if @option{-trigraphs} was also specified, but now works
-independently. Warnings are not given for trigraphs within comments, as
-they do not affect the meaning of the program.
-
-@item -Wtraditional
-Warn about certain constructs that behave differently in traditional and
-ISO C@. Also warn about ISO C constructs that have no traditional C
-equivalent, and problematic constructs which should be avoided.
-@xref{Traditional Mode}.
-
-@item -Wimport
-Warn the first time @samp{#import} is used.
-
-@item -Wundef
-Warn whenever an identifier which is not a macro is encountered in an
-@samp{#if} directive, outside of @samp{defined}. Such identifiers are
-replaced with zero.
-
-@item -Werror
-Make all warnings into hard errors. Source code which triggers warnings
-will be rejected.
-
-@item -Wsystem-headers
-Issue warnings for code in system headers. These are normally unhelpful
-in finding bugs in your own code, therefore suppressed. If you are
-responsible for the system library, you may want to see them.
-
-@item -w
-Suppress all warnings, including those which GNU CPP issues by default.
-
-@item -pedantic
-Issue all the mandatory diagnostics listed in the C standard. Some of
-them are left out by default, since they trigger frequently on harmless
-code.
-
-@item -pedantic-errors
-Issue all the mandatory diagnostics, and make all mandatory diagnostics
-into errors. This includes mandatory diagnostics that GCC issues
-without @samp{-pedantic} but treats as warnings.
-
-@item -M
-Instead of outputting the result of preprocessing, output a rule
-suitable for @command{make} describing the dependencies of the main
-source file. The preprocessor outputs one @command{make} rule containing
-the object file name for that source file, a colon, and the names of all
-the included files, including those coming from @option{-include} or
-@option{-imacros} command line options.
-
-Unless specified explicitly (with @option{-MT} or @option{-MQ}), the
-object file name consists of the basename of the source file with any
-suffix replaced with object file suffix. If there are many included
-files then the rule is split into several lines using @samp{\}-newline.
-The rule has no commands.
-
-@item -MM
-Like @option{-M}, but mention only the files included with @code{@w{#include
-"@var{file}"}} or with @option{-include} or @option{-imacros} command line
-options. System header files included with @code{@w{#include <@var{file}>}}
-are omitted.
-
-@item -MF @var{file}
-When used with @option{-M} or @option{-MM}, specifies a file to write the
-dependencies to. This allows the preprocessor to write the preprocessed
-file to stdout normally. If no @option{-MF} switch is given, CPP sends
-the rules to stdout and suppresses normal preprocessed output.
-
-@item -MG
-When used with @option{-M} or @option{-MM}, @option{-MG} says to treat missing
-header files as generated files and assume they live in the same
-directory as the source file. It suppresses preprocessed output, as a
-missing header file is ordinarily an error.
-
-This feature is used in automatic updating of makefiles.
-
-@item -MP
-This option instructs CPP to add a phony target for each dependency
-other than the main file, causing each to depend on nothing. These
-dummy rules work around errors @command{make} gives if you remove header
-files without updating the @file{Makefile} to match.
-
-This is typical output:
-
-@example
-test.o: test.c test.h
-
-test.h:
-@end example
-
-@item -MT @var{target}
-
-Change the target of the rule emitted by dependency generation. By
-default CPP takes the name of the main input file, including any path,
-deletes any file suffix such as @samp{.c}, and appends the platform's
-usual object suffix. The result is the target.
-
-An @option{-MT} option will set the target to be exactly the string you
-specify. If you want multiple targets, you can specify them as a single
-argument to @option{-MT}, or use multiple @option{-MT} options.
-
-For example, @option{@w{-MT '$(objpfx)foo.o'}} might give
-
-@example
-$(objpfx)foo.o: foo.c
-@end example
-
-@item -MQ @var{target}
-
-Same as @option{-MT}, but it quotes any characters which are special to
-Make. @option{@w{-MQ '$(objpfx)foo.o'}} gives
-
-@example
-$$(objpfx)foo.o: foo.c
-@end example
-
-The default target is automatically quoted, as if it were given with
-@option{-MQ}.
-
-@item -MD @var{file}
-@itemx -MMD @var{file}
-@option{-MD @var{file}} is equivalent to @option{-M -MF @var{file}}, and
-@option{-MMD @var{file}} is equivalent to @option{-MM -MF @var{file}}.
-
-Due to limitations in the compiler driver, you must use these switches
-when you want to generate a dependency file as a side-effect of normal
-compilation.
-
-@item -x c
-@itemx -x c++
-@itemx -x objective-c
-@itemx -x assembler-with-cpp
-Specify the source language: C, C++, Objective-C, or assembly. This has
-nothing to do with standards conformance or extensions; it merely
-selects which base syntax to expect. If you give none of these options,
-cpp will deduce the language from the extension of the source file:
-@samp{.c}, @samp{.cc}, @samp{.m}, or @samp{.S}. Some other common
-extensions for C++ and assembly are also recognized. If cpp does not
-recognize the extension, it will treat the file as C; this is the most
-generic mode.
-
-@strong{Note:} Previous versions of cpp accepted a @option{-lang} option
-which selected both the language and the standards conformance level.
-This option has been removed, because it conflicts with the @option{-l}
-option.
-
-@item -std=@var{standard}
-@itemx -ansi
-Specify the standard to which the code should conform. Currently cpp
-only knows about the standards for C; other language standards will be
-added in the future.
-
-@var{standard}
-may be one of:
-@table @code
-@item iso9899:1990
-@itemx c89
-The ISO C standard from 1990. @samp{c89} is the customary shorthand for
-this version of the standard.
-
-The @option{-ansi} option is equivalent to @option{-std=c89}.
-
-@item iso9899:199409
-The 1990 C standard, as amended in 1994.
-
-@item iso9899:1999
-@itemx c99
-@itemx iso9899:199x
-@itemx c9x
-The revised ISO C standard, published in December 1999. Before
-publication, this was known as C9X@.
-
-@item gnu89
-The 1990 C standard plus GNU extensions. This is the default.
-
-@item gnu99
-@itemx gnu9x
-The 1999 C standard plus GNU extensions.
-@end table
-
-@item -I-
-Split the include path. Any directories specified with @option{-I}
-options before @option{-I-} are searched only for headers requested with
-@code{@w{#include "@var{file}"}}; they are not searched for
-@code{@w{#include <@var{file}>}}. If additional directories are
-specified with @option{-I} options after the @option{-I-}, those
-directories are searched for all @samp{#include} directives.
-
-In addition, @option{-I-} inhibits the use of the directory of the current
-file directory as the first search directory for @code{@w{#include
-"@var{file}"}}. @xref{Search Path}.
-
-@item -nostdinc
-Do not search the standard system directories for header files.
-Only the directories you have specified with @option{-I} options
-(and the directory of the current file, if appropriate) are searched.
-
-@item -nostdinc++
-Do not search for header files in the C++-specific standard directories,
-but do still search the other standard directories. (This option is
-used when building the C++ library.)
-
-@item -include @var{file}
-
-Process @var{file} as if @code{#include "file"} appeared as the first
-line of the primary source file. However, the first directory searched
-for @var{file} is the preprocessor's working directory @emph{instead of}
-the directory containing the main source file. If not found there, it
-is searched for in the remainder of the @code{#include "@dots{}"} search
-chain as normal.
-
-If multiple @option{-include} options are given, the files are included
-in the order they appear on the command line.
-
-@item -imacros @var{file}
-
-Exactly like @option{-include}, except that any output produced by
-scanning @var{file} is thrown away. Macros it defines remain defined.
-This allows you to acquire all the macros from a header without also
-processing its declarations.
-
-All files specified by @option{-imacros} are processed before all files
-specified by @option{-include}.
-
-@item -idirafter @var{dir}
-Search @var{dir} for header files, but do it @emph{after} all
-directories specified with @option{-I} and the standard system directories
-have been exhausted. @var{dir} is treated as a system include directory.
-
-@item -iprefix @var{prefix}
-Specify @var{prefix} as the prefix for subsequent @option{-iwithprefix}
-options. If the prefix represents a directory, you should include the
-final @samp{/}.
-
-@item -iwithprefix @var{dir}
-@itemx -iwithprefixbefore @var{dir}
-
-Append @var{dir} to the prefix specified previously with
-@option{-iprefix}, and add the resulting directory to the include search
-path. @option{-iwithprefixbefore} puts it in the same place @option{-I}
-would; @option{-iwithprefix} puts it where @option{-idirafter} would.
-
-Use of these options is discouraged.
-
-@item -isystem @var{dir}
-Search @var{dir} for header files, after all directories specified by
-@option{-I} but before the standard system directories. Mark it
-as a system directory, so that it gets the same special treatment as
-is applied to the standard system directories. @xref{System Headers}.
-
-@item -fpreprocessed
-Indicate to the preprocessor that the input file has already been
-preprocessed. This suppresses things like macro expansion, trigraph
-conversion, escaped newline splicing, and processing of most directives.
-The preprocessor still recognizes and removes comments, so that you can
-pass a file preprocessed with @option{-C} to the compiler without
-problems. In this mode the integrated preprocessor is little more than
-a tokenizer for the front ends.
-
-@option{-fpreprocessed} is implicit if the input file has one of the
-extensions @samp{.i}, @samp{.ii} or @samp{.mi}. These are the
-extensions that GCC uses for preprocessed files created by
-@option{-save-temps}.
-
-@item -ftabstop=@var{width}
-Set the distance between tab stops. This helps the preprocessor report
-correct column numbers in warnings or errors, even if tabs appear on the
-line. If the value is less than 1 or greater than 100, the option is
-ignored. The default is 8.
-
-@item -fno-show-column
-Do not print column numbers in diagnostics. This may be necessary if
-diagnostics are being scanned by a program that does not understand the
-column numbers, such as @command{dejagnu}.
-
-@item -A @var{predicate}=@var{answer}
-Make an assertion with the predicate @var{predicate} and answer
-@var{answer}. This form is preferred to the older form @option{-A
-@var{predicate}(@var{answer})}, which is still supported, because
-it does not use shell special characters. @xref{Assertions}.
-
-@item -A -@var{predicate}=@var{answer}
-Cancel an assertion with the predicate @var{predicate} and answer
-@var{answer}.
-
-@item -A-
-Cancel all predefined assertions and all assertions preceding it on
-the command line. Also, undefine all predefined macros and all
-macros preceding it on the command line. (This is a historical wart and
-may change in the future.)
-
-@item -dCHARS
-@var{CHARS} is a sequence of one or more of the following characters,
-and must not be preceded by a space. Other characters are interpreted
-by the compiler proper, or reserved for future versions of GCC, and so
-are silently ignored. If you specify characters whose behavior
-conflicts, the result is undefined.
-
-@table @samp
-@item M
-Instead of the normal output, generate a list of @samp{#define}
-directives for all the macros defined during the execution of the
-preprocessor, including predefined macros. This gives you a way of
-finding out what is predefined in your version of the preprocessor.
-Assuming you have no file @file{foo.h}, the command
-
-@example
-touch foo.h; cpp -dM foo.h
-@end example
-
-@noindent
-will show all the predefined macros.
+@include cppopts.texi
+@c man end
-@item D
-Like @samp{M} except in two respects: it does @emph{not} include the
-predefined macros, and it outputs @emph{both} the @samp{#define}
-directives and the result of preprocessing. Both kinds of output go to
-the standard output file.
+@node Environment Variables
+@chapter Environment Variables
+@cindex environment variables
+@c man begin ENVIRONMENT
-@item N
-Like @samp{D}, but emit only the macro names, not their expansions.
+This section describes the environment variables that affect how CPP
+operates. You can use them to specify directories or prefixes to use
+when searching for include files, or to control dependency output.
-@item I
-Output @samp{#include} directives in addition to the result of
-preprocessing.
-@end table
+Note that you can also specify places to search using options such as
+@option{-I}, and control dependency output with options like
+@option{-M} (@pxref{Invocation}). These take precedence over
+environment variables, which in turn take precedence over the
+configuration of GCC@.
-@item -P
-Inhibit generation of linemarkers in the output from the preprocessor.
-This might be useful when running the preprocessor on something that is
-not C code, and will be sent to a program which might be confused by the
-linemarkers. @xref{Preprocessor Output}.
-
-@item -C
-Do not discard comments. All comments are passed through to the output
-file, except for comments in processed directives, which are deleted
-along with the directive.
-
-You should be prepared for side effects when using @option{-C}; it
-causes the preprocessor to treat comments as tokens in their own right.
-For example, comments appearing at the start of what would be a
-directive line have the effect of turning that line into an ordinary
-source line, since the first token on the line is no longer a @samp{#}.
-
-@item -gcc
-Define the macros @sc{__gnuc__}, @sc{__gnuc_minor__} and
-@sc{__gnuc_patchlevel__}. These are defined automatically when you use
-@command{gcc -E}; you can turn them off in that case with
-@option{-no-gcc}.
-
-@item -traditional
-Try to imitate the behavior of old-fashioned C, as opposed to ISO
-C@. @xref{Traditional Mode}.
-
-@item -trigraphs
-Process trigraph sequences. @xref{Initial processing}.
-
-@item -remap
-Enable special code to work around file systems which only permit very
-short file names, such as MS-DOS@.
-
-@item -$
-Forbid the use of @samp{$} in identifiers. The C standard allows
-implementations to define extra characters that can appear in
-identifiers. By default GNU CPP permits @samp{$}, a common extension.
-
-@item -h
-@itemx --help
-@itemx --target-help
-Print text describing all the command line options instead of
-preprocessing anything.
-
-@item -v
-Verbose mode. Print out GNU CPP's version number at the beginning of
-execution, and report the final form of the include path.
-
-@item -H
-Print the name of each header file used, in addition to other normal
-activities. Each name is indented to show how deep in the
-@samp{#include} stack it is.
-
-@item -version
-@itemx --version
-Print out GNU CPP's version number. With one dash, proceed to
-preprocess as normal. With two dashes, exit immediately.
-@end table
+@include cppenv.texi
@c man end
@include fdl.texi
@page
+@node Option Index
+@unnumbered Option Index
+
+CPP's command line options are indexed here without any initial
+@samp{-} or @samp{--}.
+
+@printindex op
+
@node Index of Directives
@unnumbered Index of Directives
@printindex fn
diff --git a/contrib/gcc/doc/cppenv.texi b/contrib/gcc/doc/cppenv.texi
new file mode 100644
index 0000000..31407bd
--- /dev/null
+++ b/contrib/gcc/doc/cppenv.texi
@@ -0,0 +1,76 @@
+@c Copyright (c) 1999, 2000, 2001, 2002
+@c Free Software Foundation, Inc.
+@c This is part of the CPP and GCC manuals.
+@c For copying conditions, see the file gcc.texi.
+
+@c ---------------------------------------------------------------------
+@c Environment variables affecting the preprocessor
+@c ---------------------------------------------------------------------
+
+@c If this file is included with the flag ``cppmanual'' set, it is
+@c formatted for inclusion in the CPP manual; otherwise the main GCC manual.
+
+@ftable @env
+@item CPATH
+@itemx C_INCLUDE_PATH
+@itemx CPLUS_INCLUDE_PATH
+@itemx OBJC_INCLUDE_PATH
+@c Commented out until ObjC++ is part of GCC:
+@c @itemx OBJCPLUS_INCLUDE_PATH
+Each variable's value is a list of directories separated by a special
+character, much like @env{PATH}, in which to look for header files.
+The special character, @code{PATH_SEPARATOR}, is target-dependent and
+determined at GCC build time. For Windows-based targets it is a
+semicolon, and for almost all other targets it is a colon.
+
+@env{CPATH} specifies a list of directories to be searched as if
+specified with @option{-I}, but after any paths given with @option{-I}
+options on the command line. The environment variable is used
+regardless of which language is being preprocessed.
+
+The remaining environment variables apply only when preprocessing the
+particular language indicated. Each specifies a list of directories
+to be searched as if specified with @option{-isystem}, but after any
+paths given with @option{-isystem} options on the command line.
+
+@ifset cppmanual
+See also @ref{Search Path}.
+@end ifset
+
+@item DEPENDENCIES_OUTPUT
+@anchor{DEPENDENCIES_OUTPUT}
+@cindex dependencies for make as output
+If this variable is set, its value specifies how to output
+dependencies for Make based on the non-system header files processed
+by the compiler. System header files are ignored in the dependency
+output.
+
+The value of @env{DEPENDENCIES_OUTPUT} can be just a file name, in
+which case the Make rules are written to that file, guessing the target
+name from the source file name. Or the value can have the form
+@samp{@var{file} @var{target}}, in which case the rules are written to
+file @var{file} using @var{target} as the target name.
+
+In other words, this environment variable is equivalent to combining
+the options @option{-MM} and @option{-MF}
+@ifset cppmanual
+(@pxref{Invocation}),
+@end ifset
+@ifclear cppmanual
+(@pxref{Preprocessor Options}),
+@end ifclear
+with an optional @option{-MT} switch too.
+
+@item SUNPRO_DEPENDENCIES
+@cindex dependencies for make as output
+This variable is the same as the environment variable
+@env{DEPENDENCIES_OUTPUT} (@pxref{DEPENDENCIES_OUTPUT}), except that
+system header files are not ignored, so it implies @option{-M} rather
+than @option{-MM}.
+@ifset cppmanual
+@xref{Invocation}.
+@end ifset
+@ifclear cppmanual
+@xref{Preprocessor Options}.
+@end ifclear
+@end ftable
diff --git a/contrib/gcc/doc/cppopts.texi b/contrib/gcc/doc/cppopts.texi
new file mode 100644
index 0000000..463403e
--- /dev/null
+++ b/contrib/gcc/doc/cppopts.texi
@@ -0,0 +1,586 @@
+@c Copyright (c) 1999, 2000, 2001, 2002
+@c Free Software Foundation, Inc.
+@c This is part of the CPP and GCC manuals.
+@c For copying conditions, see the file gcc.texi.
+
+@c ---------------------------------------------------------------------
+@c Options affecting the preprocessor
+@c ---------------------------------------------------------------------
+
+@c If this file is included with the flag ``cppmanual'' set, it is
+@c formatted for inclusion in the CPP manual; otherwise the main GCC manual.
+
+@table @gcctabopt
+@item -D @var{name}
+@opindex D
+Predefine @var{name} as a macro, with definition @code{1}.
+
+@item -D @var{name}=@var{definition}
+Predefine @var{name} as a macro, with definition @var{definition}.
+There are no restrictions on the contents of @var{definition}, but if
+you are invoking the preprocessor from a shell or shell-like program you
+may need to use the shell's quoting syntax to protect characters such as
+spaces that have a meaning in the shell syntax.
+
+If you wish to define a function-like macro on the command line, write
+its argument list with surrounding parentheses before the equals sign
+(if any). Parentheses are meaningful to most shells, so you will need
+to quote the option. With @command{sh} and @command{csh},
+@option{-D'@var{name}(@var{args@dots{}})=@var{definition}'} works.
+
+@option{-D} and @option{-U} options are processed in the order they
+are given on the command line. All @option{-imacros @var{file}} and
+@option{-include @var{file}} options are processed after all
+@option{-D} and @option{-U} options.
+
+@item -U @var{name}
+@opindex U
+Cancel any previous definition of @var{name}, either built in or
+provided with a @option{-D} option.
+
+@item -undef
+@opindex undef
+Do not predefine any system-specific macros. The common predefined
+macros remain defined.
+
+@item -I @var{dir}
+@opindex I
+Add the directory @var{dir} to the list of directories to be searched
+for header files.
+@ifset cppmanual
+@xref{Search Path}.
+@end ifset
+Directories named by @option{-I} are searched before the standard
+system include directories.
+
+It is dangerous to specify a standard system include directory in an
+@option{-I} option. This defeats the special treatment of system
+headers
+@ifset cppmanual
+(@pxref{System Headers})
+@end ifset
+. It can also defeat the repairs to buggy system headers which GCC
+makes when it is installed.
+
+@item -o @var{file}
+@opindex o
+Write output to @var{file}. This is the same as specifying @var{file}
+as the second non-option argument to @command{cpp}. @command{gcc} has a
+different interpretation of a second non-option argument, so you must
+use @option{-o} to specify the output file.
+
+@item -Wall
+@opindex Wall
+Turns on all optional warnings which are desirable for normal code. At
+present this is @option{-Wcomment} and @option{-Wtrigraphs}. Note that
+many of the preprocessor's warnings are on by default and have no
+options to control them.
+
+@item -Wcomment
+@itemx -Wcomments
+@opindex Wcomment
+@opindex Wcomments
+Warn whenever a comment-start sequence @samp{/*} appears in a @samp{/*}
+comment, or whenever a backslash-newline appears in a @samp{//} comment.
+(Both forms have the same effect.)
+
+@item -Wtrigraphs
+@opindex Wtrigraphs
+Warn if any trigraphs are encountered. This option used to take effect
+only if @option{-trigraphs} was also specified, but now works
+independently. Warnings are not given for trigraphs within comments, as
+they do not affect the meaning of the program.
+
+@item -Wtraditional
+@opindex Wtraditional
+Warn about certain constructs that behave differently in traditional and
+ISO C@. Also warn about ISO C constructs that have no traditional C
+equivalent, and problematic constructs which should be avoided.
+@ifset cppmanual
+@xref{Traditional Mode}.
+@end ifset
+
+@item -Wimport
+@opindex Wimport
+Warn the first time @samp{#import} is used.
+
+@item -Wundef
+@opindex Wundef
+Warn whenever an identifier which is not a macro is encountered in an
+@samp{#if} directive, outside of @samp{defined}. Such identifiers are
+replaced with zero.
+
+@item -Werror
+@opindex Werror
+Make all warnings into hard errors. Source code which triggers warnings
+will be rejected.
+
+@item -Wsystem-headers
+@opindex Wsystem-headers
+Issue warnings for code in system headers. These are normally unhelpful
+in finding bugs in your own code, therefore suppressed. If you are
+responsible for the system library, you may want to see them.
+
+@item -w
+@opindex w
+Suppress all warnings, including those which GNU CPP issues by default.
+
+@item -pedantic
+@opindex pedantic
+Issue all the mandatory diagnostics listed in the C standard. Some of
+them are left out by default, since they trigger frequently on harmless
+code.
+
+@item -pedantic-errors
+@opindex pedantic-errors
+Issue all the mandatory diagnostics, and make all mandatory diagnostics
+into errors. This includes mandatory diagnostics that GCC issues
+without @samp{-pedantic} but treats as warnings.
+
+@item -M
+@opindex M
+@cindex make
+@cindex dependencies, make
+Instead of outputting the result of preprocessing, output a rule
+suitable for @command{make} describing the dependencies of the main
+source file. The preprocessor outputs one @command{make} rule containing
+the object file name for that source file, a colon, and the names of all
+the included files, including those coming from @option{-include} or
+@option{-imacros} command line options.
+
+Unless specified explicitly (with @option{-MT} or @option{-MQ}), the
+object file name consists of the basename of the source file with any
+suffix replaced with object file suffix. If there are many included
+files then the rule is split into several lines using @samp{\}-newline.
+The rule has no commands.
+
+This option does not suppress the preprocessor's debug output, such as
+@option{-dM}. To avoid mixing such debug output with the dependency
+rules you should explicitly specify the dependency output file with
+@option{-MF}, or use an environment variable like
+@env{DEPENDENCIES_OUTPUT} (@pxref{DEPENDENCIES_OUTPUT}). Debug output
+will still be sent to the regular output stream as normal.
+
+Passing @option{-M} to the driver implies @option{-E}.
+
+@item -MM
+@opindex MM
+Like @option{-M} but do not mention header files that are found in
+system header directories, nor header files that are included,
+directly or indirectly, from such a header.
+
+This implies that the choice of angle brackets or double quotes in an
+@samp{#include} directive does not in itself determine whether that
+header will appear in @option{-MM} dependency output. This is a
+slight change in semantics from GCC versions 3.0 and earlier.
+
+@item -MF @var{file}
+@opindex MF
+@anchor{-MF}
+When used with @option{-M} or @option{-MM}, specifies a
+file to write the dependencies to. If no @option{-MF} switch is given
+the preprocessor sends the rules to the same place it would have sent
+preprocessed output.
+
+When used with the driver options @option{-MD} or @option{-MMD},
+@option{-MF} overrides the default dependency output file.
+
+@item -MG
+@opindex MG
+When used with @option{-M} or @option{-MM}, @option{-MG} says to treat missing
+header files as generated files and assume they live in the same
+directory as the source file. It suppresses preprocessed output, as a
+missing header file is ordinarily an error.
+
+This feature is used in automatic updating of makefiles.
+
+@item -MP
+@opindex MP
+This option instructs CPP to add a phony target for each dependency
+other than the main file, causing each to depend on nothing. These
+dummy rules work around errors @command{make} gives if you remove header
+files without updating the @file{Makefile} to match.
+
+This is typical output:
+
+@example
+test.o: test.c test.h
+
+test.h:
+@end example
+
+@item -MT @var{target}
+@opindex MT
+
+Change the target of the rule emitted by dependency generation. By
+default CPP takes the name of the main input file, including any path,
+deletes any file suffix such as @samp{.c}, and appends the platform's
+usual object suffix. The result is the target.
+
+An @option{-MT} option will set the target to be exactly the string you
+specify. If you want multiple targets, you can specify them as a single
+argument to @option{-MT}, or use multiple @option{-MT} options.
+
+For example, @option{@w{-MT '$(objpfx)foo.o'}} might give
+
+@example
+$(objpfx)foo.o: foo.c
+@end example
+
+@item -MQ @var{target}
+@opindex MQ
+
+Same as @option{-MT}, but it quotes any characters which are special to
+Make. @option{@w{-MQ '$(objpfx)foo.o'}} gives
+
+@example
+$$(objpfx)foo.o: foo.c
+@end example
+
+The default target is automatically quoted, as if it were given with
+@option{-MQ}.
+
+@item -MD
+@opindex MD
+@option{-MD} is equivalent to @option{-M -MF @var{file}}, except that
+@option{-E} is not implied. The driver determines @var{file} based on
+whether an @option{-o} option is given. If it is, the driver uses its
+argument but with a suffix of @file{.d}, otherwise it take the
+basename of the input file and applies a @file{.d} suffix.
+
+If @option{-MD} is used in conjunction with @option{-E}, any
+@option{-o} switch is understood to specify the dependency output file
+(but @pxref{-MF}), but if used without @option{-E}, each @option{-o}
+is understood to specify a target object file.
+
+Since @option{-E} is not implied, @option{-MD} can be used to generate
+a dependency output file as a side-effect of the compilation process.
+
+@item -MMD
+@opindex MMD
+Like @option{-MD} except mention only user header files, not system
+-header files.
+
+@item -x c
+@itemx -x c++
+@itemx -x objective-c
+@itemx -x assembler-with-cpp
+@opindex x
+Specify the source language: C, C++, Objective-C, or assembly. This has
+nothing to do with standards conformance or extensions; it merely
+selects which base syntax to expect. If you give none of these options,
+cpp will deduce the language from the extension of the source file:
+@samp{.c}, @samp{.cc}, @samp{.m}, or @samp{.S}. Some other common
+extensions for C++ and assembly are also recognized. If cpp does not
+recognize the extension, it will treat the file as C; this is the most
+generic mode.
+
+@strong{Note:} Previous versions of cpp accepted a @option{-lang} option
+which selected both the language and the standards conformance level.
+This option has been removed, because it conflicts with the @option{-l}
+option.
+
+@item -std=@var{standard}
+@itemx -ansi
+@opindex ansi
+@opindex std=
+Specify the standard to which the code should conform. Currently cpp
+only knows about the standards for C; other language standards will be
+added in the future.
+
+@var{standard}
+may be one of:
+@table @code
+@item iso9899:1990
+@itemx c89
+The ISO C standard from 1990. @samp{c89} is the customary shorthand for
+this version of the standard.
+
+The @option{-ansi} option is equivalent to @option{-std=c89}.
+
+@item iso9899:199409
+The 1990 C standard, as amended in 1994.
+
+@item iso9899:1999
+@itemx c99
+@itemx iso9899:199x
+@itemx c9x
+The revised ISO C standard, published in December 1999. Before
+publication, this was known as C9X@.
+
+@item gnu89
+The 1990 C standard plus GNU extensions. This is the default.
+
+@item gnu99
+@itemx gnu9x
+The 1999 C standard plus GNU extensions.
+@end table
+
+@item -I-
+@opindex I-
+Split the include path. Any directories specified with @option{-I}
+options before @option{-I-} are searched only for headers requested with
+@code{@w{#include "@var{file}"}}; they are not searched for
+@code{@w{#include <@var{file}>}}. If additional directories are
+specified with @option{-I} options after the @option{-I-}, those
+directories are searched for all @samp{#include} directives.
+
+In addition, @option{-I-} inhibits the use of the directory of the current
+file directory as the first search directory for @code{@w{#include
+"@var{file}"}}.
+@ifset cppmanual
+@xref{Search Path}.
+@end ifset
+
+@item -nostdinc
+@opindex nostdinc
+Do not search the standard system directories for header files.
+Only the directories you have specified with @option{-I} options
+(and the directory of the current file, if appropriate) are searched.
+
+@item -nostdinc++
+@opindex nostdinc++
+Do not search for header files in the C++-specific standard directories,
+but do still search the other standard directories. (This option is
+used when building the C++ library.)
+
+@item -include @var{file}
+@opindex include
+Process @var{file} as if @code{#include "file"} appeared as the first
+line of the primary source file. However, the first directory searched
+for @var{file} is the preprocessor's working directory @emph{instead of}
+the directory containing the main source file. If not found there, it
+is searched for in the remainder of the @code{#include "@dots{}"} search
+chain as normal.
+
+If multiple @option{-include} options are given, the files are included
+in the order they appear on the command line.
+
+@item -imacros @var{file}
+@opindex imacros
+Exactly like @option{-include}, except that any output produced by
+scanning @var{file} is thrown away. Macros it defines remain defined.
+This allows you to acquire all the macros from a header without also
+processing its declarations.
+
+All files specified by @option{-imacros} are processed before all files
+specified by @option{-include}.
+
+@item -idirafter @var{dir}
+@opindex idirafter
+Search @var{dir} for header files, but do it @emph{after} all
+directories specified with @option{-I} and the standard system directories
+have been exhausted. @var{dir} is treated as a system include directory.
+
+@item -iprefix @var{prefix}
+@opindex iprefix
+Specify @var{prefix} as the prefix for subsequent @option{-iwithprefix}
+options. If the prefix represents a directory, you should include the
+final @samp{/}.
+
+@item -iwithprefix @var{dir}
+@itemx -iwithprefixbefore @var{dir}
+@opindex iwithprefix
+@opindex iwithprefixbefore
+Append @var{dir} to the prefix specified previously with
+@option{-iprefix}, and add the resulting directory to the include search
+path. @option{-iwithprefixbefore} puts it in the same place @option{-I}
+would; @option{-iwithprefix} puts it where @option{-idirafter} would.
+
+Use of these options is discouraged.
+
+@item -isystem @var{dir}
+@opindex isystem
+Search @var{dir} for header files, after all directories specified by
+@option{-I} but before the standard system directories. Mark it
+as a system directory, so that it gets the same special treatment as
+is applied to the standard system directories.
+@ifset cppmanual
+@xref{System Headers}.
+@end ifset
+
+@item -fpreprocessed
+@opindex fpreprocessed
+Indicate to the preprocessor that the input file has already been
+preprocessed. This suppresses things like macro expansion, trigraph
+conversion, escaped newline splicing, and processing of most directives.
+The preprocessor still recognizes and removes comments, so that you can
+pass a file preprocessed with @option{-C} to the compiler without
+problems. In this mode the integrated preprocessor is little more than
+a tokenizer for the front ends.
+
+@option{-fpreprocessed} is implicit if the input file has one of the
+extensions @samp{.i}, @samp{.ii} or @samp{.mi}. These are the
+extensions that GCC uses for preprocessed files created by
+@option{-save-temps}.
+
+@item -ftabstop=@var{width}
+@opindex ftabstop
+Set the distance between tab stops. This helps the preprocessor report
+correct column numbers in warnings or errors, even if tabs appear on the
+line. If the value is less than 1 or greater than 100, the option is
+ignored. The default is 8.
+
+@item -fno-show-column
+@opindex fno-show-column
+Do not print column numbers in diagnostics. This may be necessary if
+diagnostics are being scanned by a program that does not understand the
+column numbers, such as @command{dejagnu}.
+
+@item -A @var{predicate}=@var{answer}
+@opindex A
+Make an assertion with the predicate @var{predicate} and answer
+@var{answer}. This form is preferred to the older form @option{-A
+@var{predicate}(@var{answer})}, which is still supported, because
+it does not use shell special characters.
+@ifset cppmanual
+@xref{Assertions}.
+@end ifset
+
+@item -A -@var{predicate}=@var{answer}
+Cancel an assertion with the predicate @var{predicate} and answer
+@var{answer}.
+
+@item -A-
+@opindex A-
+Cancel all predefined assertions and all assertions preceding it on
+the command line. Also, undefine all predefined macros and all
+macros preceding it on the command line. (This is a historical wart and
+may change in the future.)
+
+@item -dCHARS
+@var{CHARS} is a sequence of one or more of the following characters,
+and must not be preceded by a space. Other characters are interpreted
+by the compiler proper, or reserved for future versions of GCC, and so
+are silently ignored. If you specify characters whose behavior
+conflicts, the result is undefined.
+
+@table @samp
+@item M
+@opindex dM
+Instead of the normal output, generate a list of @samp{#define}
+directives for all the macros defined during the execution of the
+preprocessor, including predefined macros. This gives you a way of
+finding out what is predefined in your version of the preprocessor.
+Assuming you have no file @file{foo.h}, the command
+
+@example
+touch foo.h; cpp -dM foo.h
+@end example
+
+@noindent
+will show all the predefined macros.
+
+@item D
+@opindex dD
+Like @samp{M} except in two respects: it does @emph{not} include the
+predefined macros, and it outputs @emph{both} the @samp{#define}
+directives and the result of preprocessing. Both kinds of output go to
+the standard output file.
+
+@item N
+@opindex dN
+Like @samp{D}, but emit only the macro names, not their expansions.
+
+@item I
+@opindex dI
+Output @samp{#include} directives in addition to the result of
+preprocessing.
+@end table
+
+@item -P
+@opindex P
+Inhibit generation of linemarkers in the output from the preprocessor.
+This might be useful when running the preprocessor on something that is
+not C code, and will be sent to a program which might be confused by the
+linemarkers.
+@ifset cppmanual
+@xref{Preprocessor Output}.
+@end ifset
+
+@item -C
+@opindex C
+Do not discard comments. All comments are passed through to the output
+file, except for comments in processed directives, which are deleted
+along with the directive.
+
+You should be prepared for side effects when using @option{-C}; it
+causes the preprocessor to treat comments as tokens in their own right.
+For example, comments appearing at the start of what would be a
+directive line have the effect of turning that line into an ordinary
+source line, since the first token on the line is no longer a @samp{#}.
+
+@item -gcc
+@opindex gcc
+Define the macros @sc{__gnuc__}, @sc{__gnuc_minor__} and
+@sc{__gnuc_patchlevel__}. These are defined automatically when you use
+@command{gcc -E}; you can turn them off in that case with
+@option{-no-gcc}.
+
+@item -traditional
+@opindex traditional
+Try to imitate the behavior of old-fashioned C, as opposed to ISO
+C@.
+@ifset cppmanual
+@xref{Traditional Mode}.
+@end ifset
+
+@item -trigraphs
+@opindex trigraphs
+Process trigraph sequences.
+@ifset cppmanual
+@xref{Initial processing}.
+@end ifset
+@ifclear cppmanual
+These are three-character sequences, all starting with @samp{??}, that
+are defined by ISO C to stand for single characters. For example,
+@samp{??/} stands for @samp{\}, so @samp{'??/n'} is a character
+constant for a newline. By default, GCC ignores trigraphs, but in
+standard-conforming modes it converts them. See the @option{-std} and
+@option{-ansi} options.
+
+The nine trigraphs and their replacements are
+
+@example
+Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??-
+Replacement: [ ] @{ @} # \ ^ | ~
+@end example
+@end ifclear
+
+@item -remap
+@opindex remap
+Enable special code to work around file systems which only permit very
+short file names, such as MS-DOS@.
+
+@item -$
+@opindex $
+Forbid the use of @samp{$} in identifiers. The C standard allows
+implementations to define extra characters that can appear in
+identifiers. By default GNU CPP permits @samp{$}, a common extension.
+
+@item -h
+@itemx --help
+@itemx --target-help
+@opindex h
+@opindex help
+@opindex target-help
+Print text describing all the command line options instead of
+preprocessing anything.
+
+@item -v
+@opindex v
+Verbose mode. Print out GNU CPP's version number at the beginning of
+execution, and report the final form of the include path.
+
+@item -H
+@opindex H
+Print the name of each header file used, in addition to other normal
+activities. Each name is indented to show how deep in the
+@samp{#include} stack it is.
+
+@item -version
+@itemx --version
+@opindex version
+Print out GNU CPP's version number. With one dash, proceed to
+preprocess as normal. With two dashes, exit immediately.
+@end table
diff --git a/contrib/gcc/doc/extend.texi b/contrib/gcc/doc/extend.texi
index ad88a2a..4a33eea 100644
--- a/contrib/gcc/doc/extend.texi
+++ b/contrib/gcc/doc/extend.texi
@@ -1880,7 +1880,8 @@ The keyword @code{__attribute__} allows you to specify special
attributes when making a declaration. This keyword is followed by an
attribute specification inside double parentheses. The following
attributes are currently defined for functions on all targets:
-@code{noreturn}, @code{noinline}, @code{pure}, @code{const},
+@code{noreturn}, @code{noinline}, @code{always_inline},
+@code{pure}, @code{const},
@code{format}, @code{format_arg}, @code{no_instrument_function},
@code{section}, @code{constructor}, @code{destructor}, @code{used},
@code{unused}, @code{deprecated}, @code{weak}, @code{malloc}, and
@@ -1946,6 +1947,12 @@ volatile voidfn fatal;
This function attribute prevents a function from being considered for
inlining.
+@cindex @code{always_inline} function attribute
+@item always_inline
+Generally, functions are not inlined unless optimization is specified.
+For functions declared inline, this attribute inlines the function even
+if no optimization level was specified.
+
@cindex @code{pure} function attribute
@item pure
Many functions have no effects except the return value and their
@@ -2549,7 +2556,7 @@ An attribute specifier list may appear immediately before the comma,
than a function definition. At present, such attribute specifiers apply
to the declared object or function, but in future they may attach to the
outermost adjacent declarator. In simple cases there is no difference,
-but, for example, in
+but, for example, in
@smallexample
void (****f)(void) __attribute__((noreturn));
@@ -2608,7 +2615,7 @@ declaration @code{T D} specifies the type
@var{type-qualifier-and-attribute-specifier-list} @var{Type}'' for
@var{ident}.
-For example,
+For example,
@smallexample
void (__attribute__((noreturn)) ****f) (void);
@@ -2822,11 +2829,6 @@ struct foo @{ int x[2] __attribute__ ((aligned (8))); @};
This is an alternative to creating a union with a @code{double} member
that forces the union to be double-word aligned.
-It is not possible to specify the alignment of functions; the alignment
-of functions is determined by the machine's requirements and cannot be
-changed. You cannot specify alignment for a typedef name because such a
-name is just an alias, not a distinct type.
-
As in the preceding examples, you can explicitly specify the alignment
(in bytes) that you wish the compiler to use for a given variable or
structure field. Alternatively, you can leave out the alignment factor
@@ -3388,10 +3390,13 @@ existing semantics will remain available when @option{-std=gnu89} is
specified, but eventually the default will be @option{-std=gnu99} and
that will implement the C99 semantics, though it does not do so yet.)
-GCC does not inline any functions when not optimizing. It is not
-clear whether it is better to inline or not, in this case, but we found
-that a correct implementation when not optimizing was difficult. So we
-did the easy thing, and turned it off.
+GCC does not inline any functions when not optimizing unless you specify
+the @samp{always_inline} attribute for the function, like this:
+
+@example
+/* Prototype. */
+inline void foo (const char) __attribute__((always_inline));
+@end example
@node Extended Asm
@section Assembler Instructions with C Expression Operands
@@ -4448,18 +4453,18 @@ You would typically use this function in code whose execution varies
depending on the arguments' types. For example:
@smallexample
-#define foo(x) \
- (@{ \
- typeof (x) tmp; \
- if (__builtin_types_compatible_p (typeof (x), long double)) \
- tmp = foo_long_double (tmp); \
- else if (__builtin_types_compatible_p (typeof (x), double)) \
- tmp = foo_double (tmp); \
- else if (__builtin_types_compatible_p (typeof (x), float)) \
- tmp = foo_float (tmp); \
- else \
- abort (); \
- tmp; \
+#define foo(x) \
+ (@{ \
+ typeof (x) tmp; \
+ if (__builtin_types_compatible_p (typeof (x), long double)) \
+ tmp = foo_long_double (tmp); \
+ else if (__builtin_types_compatible_p (typeof (x), double)) \
+ tmp = foo_double (tmp); \
+ else if (__builtin_types_compatible_p (typeof (x), float)) \
+ tmp = foo_float (tmp); \
+ else \
+ abort (); \
+ tmp; \
@})
@end smallexample
@@ -4624,7 +4629,7 @@ for (i = 0; i < n; i++)
@}
@end smallexample
-Data prefetch does not generate faults if @var{addr} is invalid, but
+Data prefetch does not generate faults if @var{addr} is invalid, but
the address expression itself must be valid. For example, a prefetch
of @code{p->next} will not fault if @code{p->next} is not a valid
address, but evaluation will fault if @code{p} is not a valid address.
@@ -4889,6 +4894,11 @@ The following functions are made available by including
@option{-mabi=altivec}. The functions implement the functionality
described in Motorola's AltiVec Programming Interface Manual.
+@emph{Note:} Only the @code{<altivec.h>} interface is supported.
+Internally, GCC uses built-in functions to achieve the functionality in
+the aforementioned header file, but they are not supported and are
+subject to change without notice.
+
@smallexample
vector signed char vec_abs (vector signed char, vector signed char);
vector signed short vec_abs (vector signed short, vector signed short);
@@ -4903,11 +4913,15 @@ vector unsigned char vec_add (vector signed char, vector unsigned char);
vector unsigned char vec_add (vector unsigned char, vector signed char);
-vector unsigned char vec_add (vector unsigned char, vector unsigned char);
+vector unsigned char vec_add (vector unsigned char,
+ vector unsigned char);
vector signed short vec_add (vector signed short, vector signed short);
-vector unsigned short vec_add (vector signed short, vector unsigned short);
-vector unsigned short vec_add (vector unsigned short, vector signed short);
-vector unsigned short vec_add (vector unsigned short, vector unsigned short);
+vector unsigned short vec_add (vector signed short,
+ vector unsigned short);
+vector unsigned short vec_add (vector unsigned short,
+ vector signed short);
+vector unsigned short vec_add (vector unsigned short,
+ vector unsigned short);
vector signed int vec_add (vector signed int, vector signed int);
vector unsigned int vec_add (vector signed int, vector unsigned int);
vector unsigned int vec_add (vector unsigned int, vector signed int);
@@ -4916,13 +4930,19 @@ vector float vec_add (vector float, vector float);
vector unsigned int vec_addc (vector unsigned int, vector unsigned int);
-vector unsigned char vec_adds (vector signed char, vector unsigned char);
-vector unsigned char vec_adds (vector unsigned char, vector signed char);
-vector unsigned char vec_adds (vector unsigned char, vector unsigned char);
+vector unsigned char vec_adds (vector signed char,
+ vector unsigned char);
+vector unsigned char vec_adds (vector unsigned char,
+ vector signed char);
+vector unsigned char vec_adds (vector unsigned char,
+ vector unsigned char);
vector signed char vec_adds (vector signed char, vector signed char);
-vector unsigned short vec_adds (vector signed short, vector unsigned short);
-vector unsigned short vec_adds (vector unsigned short, vector signed short);
-vector unsigned short vec_adds (vector unsigned short, vector unsigned short);
+vector unsigned short vec_adds (vector signed short,
+ vector unsigned short);
+vector unsigned short vec_adds (vector unsigned short,
+ vector signed short);
+vector unsigned short vec_adds (vector unsigned short,
+ vector unsigned short);
vector signed short vec_adds (vector signed short, vector signed short);
vector unsigned int vec_adds (vector signed int, vector unsigned int);
@@ -4939,15 +4959,19 @@ vector unsigned int vec_and (vector signed int, vector unsigned int);
vector unsigned int vec_and (vector unsigned int, vector signed int);
vector unsigned int vec_and (vector unsigned int, vector unsigned int);
vector signed short vec_and (vector signed short, vector signed short);
-vector unsigned short vec_and (vector signed short, vector unsigned short);
-vector unsigned short vec_and (vector unsigned short, vector signed short);
-vector unsigned short vec_and (vector unsigned short, vector unsigned short);
+vector unsigned short vec_and (vector signed short,
+ vector unsigned short);
+vector unsigned short vec_and (vector unsigned short,
+ vector signed short);
+vector unsigned short vec_and (vector unsigned short,
+ vector unsigned short);
vector signed char vec_and (vector signed char, vector signed char);
vector unsigned char vec_and (vector signed char, vector unsigned char);
vector unsigned char vec_and (vector unsigned char, vector signed char);
-vector unsigned char vec_and (vector unsigned char, vector unsigned char);
+vector unsigned char vec_and (vector unsigned char,
+ vector unsigned char);
vector float vec_andc (vector float, vector float);
vector float vec_andc (vector float, vector signed int);
@@ -4959,17 +4983,25 @@ vector unsigned int vec_andc (vector unsigned int, vector unsigned int);
vector signed short vec_andc (vector signed short, vector signed short);
-vector unsigned short vec_andc (vector signed short, vector unsigned short);
-vector unsigned short vec_andc (vector unsigned short, vector signed short);
-vector unsigned short vec_andc (vector unsigned short, vector unsigned short);
+vector unsigned short vec_andc (vector signed short,
+ vector unsigned short);
+vector unsigned short vec_andc (vector unsigned short,
+ vector signed short);
+vector unsigned short vec_andc (vector unsigned short,
+ vector unsigned short);
vector signed char vec_andc (vector signed char, vector signed char);
-vector unsigned char vec_andc (vector signed char, vector unsigned char);
-vector unsigned char vec_andc (vector unsigned char, vector signed char);
-vector unsigned char vec_andc (vector unsigned char, vector unsigned char);
-
-vector unsigned char vec_avg (vector unsigned char, vector unsigned char);
+vector unsigned char vec_andc (vector signed char,
+ vector unsigned char);
+vector unsigned char vec_andc (vector unsigned char,
+ vector signed char);
+vector unsigned char vec_andc (vector unsigned char,
+ vector unsigned char);
+
+vector unsigned char vec_avg (vector unsigned char,
+ vector unsigned char);
vector signed char vec_avg (vector signed char, vector signed char);
-vector unsigned short vec_avg (vector unsigned short, vector unsigned short);
+vector unsigned short vec_avg (vector unsigned short,
+ vector unsigned short);
vector signed short vec_avg (vector signed short, vector signed short);
vector unsigned int vec_avg (vector unsigned int, vector unsigned int);
vector signed int vec_avg (vector signed int, vector signed int);
@@ -4979,29 +5011,38 @@ vector float vec_ceil (vector float);
vector signed int vec_cmpb (vector float, vector float);
vector signed char vec_cmpeq (vector signed char, vector signed char);
-vector signed char vec_cmpeq (vector unsigned char, vector unsigned char);
-vector signed short vec_cmpeq (vector signed short, vector signed short);
-vector signed short vec_cmpeq (vector unsigned short, vector unsigned short);
+vector signed char vec_cmpeq (vector unsigned char,
+ vector unsigned char);
+vector signed short vec_cmpeq (vector signed short,
+ vector signed short);
+vector signed short vec_cmpeq (vector unsigned short,
+ vector unsigned short);
vector signed int vec_cmpeq (vector signed int, vector signed int);
vector signed int vec_cmpeq (vector unsigned int, vector unsigned int);
vector signed int vec_cmpeq (vector float, vector float);
vector signed int vec_cmpge (vector float, vector float);
-vector signed char vec_cmpgt (vector unsigned char, vector unsigned char);
+vector signed char vec_cmpgt (vector unsigned char,
+ vector unsigned char);
vector signed char vec_cmpgt (vector signed char, vector signed char);
-vector signed short vec_cmpgt (vector unsigned short, vector unsigned short);
-vector signed short vec_cmpgt (vector signed short, vector signed short);
+vector signed short vec_cmpgt (vector unsigned short,
+ vector unsigned short);
+vector signed short vec_cmpgt (vector signed short,
+ vector signed short);
vector signed int vec_cmpgt (vector unsigned int, vector unsigned int);
vector signed int vec_cmpgt (vector signed int, vector signed int);
vector signed int vec_cmpgt (vector float, vector float);
vector signed int vec_cmple (vector float, vector float);
-vector signed char vec_cmplt (vector unsigned char, vector unsigned char);
+vector signed char vec_cmplt (vector unsigned char,
+ vector unsigned char);
vector signed char vec_cmplt (vector signed char, vector signed char);
-vector signed short vec_cmplt (vector unsigned short, vector unsigned short);
-vector signed short vec_cmplt (vector signed short, vector signed short);
+vector signed short vec_cmplt (vector unsigned short,
+ vector unsigned short);
+vector signed short vec_cmplt (vector signed short,
+ vector signed short);
vector signed int vec_cmplt (vector unsigned int, vector unsigned int);
vector signed int vec_cmplt (vector signed int, vector signed int);
vector signed int vec_cmplt (vector float, vector float);
@@ -5036,7 +5077,8 @@ vector signed int vec_ld (int, vector signed int *);
vector unsigned int vec_ld (int, vector unsigned int *);
vector unsigned int vec_ld (int, unsigned int *);
vector signed short vec_ld (int, short *, vector signed short *);
-vector unsigned short vec_ld (int, unsigned short *, vector unsigned short *);
+vector unsigned short vec_ld (int, unsigned short *,
+ vector unsigned short *);
vector signed char vec_ld (int, signed char *);
vector signed char vec_ld (int, vector signed char *);
vector unsigned char vec_ld (int, unsigned char *);
@@ -5073,17 +5115,22 @@ vector unsigned char vec_lvsr (int, void *, int *);
vector float vec_madd (vector float, vector float, vector float);
-vector signed short vec_madds (vector signed short, vector signed short, vector signed short);
+vector signed short vec_madds (vector signed short, vector signed short,
+ vector signed short);
vector unsigned char vec_max (vector signed char, vector unsigned char);
vector unsigned char vec_max (vector unsigned char, vector signed char);
-vector unsigned char vec_max (vector unsigned char, vector unsigned char);
+vector unsigned char vec_max (vector unsigned char,
+ vector unsigned char);
vector signed char vec_max (vector signed char, vector signed char);
-vector unsigned short vec_max (vector signed short, vector unsigned short);
-vector unsigned short vec_max (vector unsigned short, vector signed short);
-vector unsigned short vec_max (vector unsigned short, vector unsigned short);
+vector unsigned short vec_max (vector signed short,
+ vector unsigned short);
+vector unsigned short vec_max (vector unsigned short,
+ vector signed short);
+vector unsigned short vec_max (vector unsigned short,
+ vector unsigned short);
vector signed short vec_max (vector signed short, vector signed short);
vector unsigned int vec_max (vector signed int, vector unsigned int);
vector unsigned int vec_max (vector unsigned int, vector signed int);
@@ -5092,20 +5139,28 @@ vector signed int vec_max (vector signed int, vector signed int);
vector float vec_max (vector float, vector float);
vector signed char vec_mergeh (vector signed char, vector signed char);
-vector unsigned char vec_mergeh (vector unsigned char, vector unsigned char);
-vector signed short vec_mergeh (vector signed short, vector signed short);
-vector unsigned short vec_mergeh (vector unsigned short, vector unsigned short);
+vector unsigned char vec_mergeh (vector unsigned char,
+ vector unsigned char);
+vector signed short vec_mergeh (vector signed short,
+ vector signed short);
+vector unsigned short vec_mergeh (vector unsigned short,
+ vector unsigned short);
vector float vec_mergeh (vector float, vector float);
vector signed int vec_mergeh (vector signed int, vector signed int);
-vector unsigned int vec_mergeh (vector unsigned int, vector unsigned int);
+vector unsigned int vec_mergeh (vector unsigned int,
+ vector unsigned int);
vector signed char vec_mergel (vector signed char, vector signed char);
-vector unsigned char vec_mergel (vector unsigned char, vector unsigned char);
-vector signed short vec_mergel (vector signed short, vector signed short);
-vector unsigned short vec_mergel (vector unsigned short, vector unsigned short);
+vector unsigned char vec_mergel (vector unsigned char,
+ vector unsigned char);
+vector signed short vec_mergel (vector signed short,
+ vector signed short);
+vector unsigned short vec_mergel (vector unsigned short,
+ vector unsigned short);
vector float vec_mergel (vector float, vector float);
vector signed int vec_mergel (vector signed int, vector signed int);
-vector unsigned int vec_mergel (vector unsigned int, vector unsigned int);
+vector unsigned int vec_mergel (vector unsigned int,
+ vector unsigned int);
vector unsigned short vec_mfvscr (void);
@@ -5113,11 +5168,15 @@ vector unsigned char vec_min (vector signed char, vector unsigned char);
vector unsigned char vec_min (vector unsigned char, vector signed char);
-vector unsigned char vec_min (vector unsigned char, vector unsigned char);
+vector unsigned char vec_min (vector unsigned char,
+ vector unsigned char);
vector signed char vec_min (vector signed char, vector signed char);
-vector unsigned short vec_min (vector signed short, vector unsigned short);
-vector unsigned short vec_min (vector unsigned short, vector signed short);
-vector unsigned short vec_min (vector unsigned short, vector unsigned short);
+vector unsigned short vec_min (vector signed short,
+ vector unsigned short);
+vector unsigned short vec_min (vector unsigned short,
+ vector signed short);
+vector unsigned short vec_min (vector unsigned short,
+ vector unsigned short);
vector signed short vec_min (vector signed short, vector signed short);
vector unsigned int vec_min (vector signed int, vector unsigned int);
vector unsigned int vec_min (vector unsigned int, vector signed int);
@@ -5125,20 +5184,38 @@ vector unsigned int vec_min (vector unsigned int, vector unsigned int);
vector signed int vec_min (vector signed int, vector signed int);
vector float vec_min (vector float, vector float);
-vector signed short vec_mladd (vector signed short, vector signed short, vector signed short);
-vector signed short vec_mladd (vector signed short, vector unsigned short, vector unsigned short);
-vector signed short vec_mladd (vector unsigned short, vector signed short, vector signed short);
-vector unsigned short vec_mladd (vector unsigned short, vector unsigned short, vector unsigned short);
-
-vector signed short vec_mradds (vector signed short, vector signed short, vector signed short);
-
-vector unsigned int vec_msum (vector unsigned char, vector unsigned char, vector unsigned int);
-vector signed int vec_msum (vector signed char, vector unsigned char, vector signed int);
-vector unsigned int vec_msum (vector unsigned short, vector unsigned short, vector unsigned int);
-vector signed int vec_msum (vector signed short, vector signed short, vector signed int);
-
-vector unsigned int vec_msums (vector unsigned short, vector unsigned short, vector unsigned int);
-vector signed int vec_msums (vector signed short, vector signed short, vector signed int);
+vector signed short vec_mladd (vector signed short, vector signed short,
+ vector signed short);
+vector signed short vec_mladd (vector signed short,
+ vector unsigned short,
+ vector unsigned short);
+vector signed short vec_mladd (vector unsigned short,
+ vector signed short,
+ vector signed short);
+vector unsigned short vec_mladd (vector unsigned short,
+ vector unsigned short,
+ vector unsigned short);
+
+vector signed short vec_mradds (vector signed short,
+ vector signed short,
+ vector signed short);
+
+vector unsigned int vec_msum (vector unsigned char,
+ vector unsigned char,
+ vector unsigned int);
+vector signed int vec_msum (vector signed char, vector unsigned char,
+ vector signed int);
+vector unsigned int vec_msum (vector unsigned short,
+ vector unsigned short,
+ vector unsigned int);
+vector signed int vec_msum (vector signed short, vector signed short,
+ vector signed int);
+
+vector unsigned int vec_msums (vector unsigned short,
+ vector unsigned short,
+ vector unsigned int);
+vector signed int vec_msums (vector signed short, vector signed short,
+ vector signed int);
void vec_mtvscr (vector signed int);
void vec_mtvscr (vector unsigned int);
@@ -5147,14 +5224,18 @@ void vec_mtvscr (vector unsigned short);
void vec_mtvscr (vector signed char);
void vec_mtvscr (vector unsigned char);
-vector unsigned short vec_mule (vector unsigned char, vector unsigned char);
+vector unsigned short vec_mule (vector unsigned char,
+ vector unsigned char);
vector signed short vec_mule (vector signed char, vector signed char);
-vector unsigned int vec_mule (vector unsigned short, vector unsigned short);
+vector unsigned int vec_mule (vector unsigned short,
+ vector unsigned short);
vector signed int vec_mule (vector signed short, vector signed short);
-vector unsigned short vec_mulo (vector unsigned char, vector unsigned char);
+vector unsigned short vec_mulo (vector unsigned char,
+ vector unsigned char);
vector signed short vec_mulo (vector signed char, vector signed char);
-vector unsigned int vec_mulo (vector unsigned short, vector unsigned short);
+vector unsigned int vec_mulo (vector unsigned short,
+ vector unsigned short);
vector signed int vec_mulo (vector signed short, vector signed short);
vector float vec_nmsub (vector float, vector float, vector float);
@@ -5163,9 +5244,11 @@ vector float vec_nor (vector float, vector float);
vector signed int vec_nor (vector signed int, vector signed int);
vector unsigned int vec_nor (vector unsigned int, vector unsigned int);
vector signed short vec_nor (vector signed short, vector signed short);
-vector unsigned short vec_nor (vector unsigned short, vector unsigned short);
+vector unsigned short vec_nor (vector unsigned short,
+ vector unsigned short);
vector signed char vec_nor (vector signed char, vector signed char);
-vector unsigned char vec_nor (vector unsigned char, vector unsigned char);
+vector unsigned char vec_nor (vector unsigned char,
+ vector unsigned char);
vector float vec_or (vector float, vector float);
vector float vec_or (vector float, vector signed int);
@@ -5175,47 +5258,70 @@ vector unsigned int vec_or (vector signed int, vector unsigned int);
vector unsigned int vec_or (vector unsigned int, vector signed int);
vector unsigned int vec_or (vector unsigned int, vector unsigned int);
vector signed short vec_or (vector signed short, vector signed short);
-vector unsigned short vec_or (vector signed short, vector unsigned short);
-vector unsigned short vec_or (vector unsigned short, vector signed short);
-vector unsigned short vec_or (vector unsigned short, vector unsigned short);
+vector unsigned short vec_or (vector signed short,
+ vector unsigned short);
+vector unsigned short vec_or (vector unsigned short,
+ vector signed short);
+vector unsigned short vec_or (vector unsigned short,
+ vector unsigned short);
vector signed char vec_or (vector signed char, vector signed char);
vector unsigned char vec_or (vector signed char, vector unsigned char);
vector unsigned char vec_or (vector unsigned char, vector signed char);
-vector unsigned char vec_or (vector unsigned char, vector unsigned char);
+vector unsigned char vec_or (vector unsigned char,
+ vector unsigned char);
vector signed char vec_pack (vector signed short, vector signed short);
-vector unsigned char vec_pack (vector unsigned short, vector unsigned short);
+vector unsigned char vec_pack (vector unsigned short,
+ vector unsigned short);
vector signed short vec_pack (vector signed int, vector signed int);
-vector unsigned short vec_pack (vector unsigned int, vector unsigned int);
+vector unsigned short vec_pack (vector unsigned int,
+ vector unsigned int);
-vector signed short vec_packpx (vector unsigned int, vector unsigned int);
+vector signed short vec_packpx (vector unsigned int,
+ vector unsigned int);
-vector unsigned char vec_packs (vector unsigned short, vector unsigned short);
+vector unsigned char vec_packs (vector unsigned short,
+ vector unsigned short);
vector signed char vec_packs (vector signed short, vector signed short);
-vector unsigned short vec_packs (vector unsigned int, vector unsigned int);
+vector unsigned short vec_packs (vector unsigned int,
+ vector unsigned int);
vector signed short vec_packs (vector signed int, vector signed int);
-vector unsigned char vec_packsu (vector unsigned short, vector unsigned short);
-vector unsigned char vec_packsu (vector signed short, vector signed short);
-vector unsigned short vec_packsu (vector unsigned int, vector unsigned int);
+vector unsigned char vec_packsu (vector unsigned short,
+ vector unsigned short);
+vector unsigned char vec_packsu (vector signed short,
+ vector signed short);
+vector unsigned short vec_packsu (vector unsigned int,
+ vector unsigned int);
vector unsigned short vec_packsu (vector signed int, vector signed int);
-vector float vec_perm (vector float, vector float, vector unsigned char);
-vector signed int vec_perm (vector signed int, vector signed int, vector unsigned char);
-vector unsigned int vec_perm (vector unsigned int, vector unsigned int, vector unsigned char);
-vector signed short vec_perm (vector signed short, vector signed short, vector unsigned char);
-vector unsigned short vec_perm (vector unsigned short, vector unsigned short, vector unsigned char);
-vector signed char vec_perm (vector signed char, vector signed char, vector unsigned char);
-vector unsigned char vec_perm (vector unsigned char, vector unsigned char, vector unsigned char);
+vector float vec_perm (vector float, vector float,
+ vector unsigned char);
+vector signed int vec_perm (vector signed int, vector signed int,
+ vector unsigned char);
+vector unsigned int vec_perm (vector unsigned int, vector unsigned int,
+ vector unsigned char);
+vector signed short vec_perm (vector signed short, vector signed short,
+ vector unsigned char);
+vector unsigned short vec_perm (vector unsigned short,
+ vector unsigned short,
+ vector unsigned char);
+vector signed char vec_perm (vector signed char, vector signed char,
+ vector unsigned char);
+vector unsigned char vec_perm (vector unsigned char,
+ vector unsigned char,
+ vector unsigned char);
vector float vec_re (vector float);
vector signed char vec_rl (vector signed char, vector unsigned char);
-vector unsigned char vec_rl (vector unsigned char, vector unsigned char);
+vector unsigned char vec_rl (vector unsigned char,
+ vector unsigned char);
vector signed short vec_rl (vector signed short, vector unsigned short);
-vector unsigned short vec_rl (vector unsigned short, vector unsigned short);
+vector unsigned short vec_rl (vector unsigned short,
+ vector unsigned short);
vector signed int vec_rl (vector signed int, vector unsigned int);
vector unsigned int vec_rl (vector unsigned int, vector unsigned int);
@@ -5225,55 +5331,88 @@ vector float vec_rsqrte (vector float);
vector float vec_sel (vector float, vector float, vector signed int);
vector float vec_sel (vector float, vector float, vector unsigned int);
-vector signed int vec_sel (vector signed int, vector signed int, vector signed int);
-vector signed int vec_sel (vector signed int, vector signed int, vector unsigned int);
-vector unsigned int vec_sel (vector unsigned int, vector unsigned int, vector signed int);
-vector unsigned int vec_sel (vector unsigned int, vector unsigned int, vector unsigned int);
-vector signed short vec_sel (vector signed short, vector signed short, vector signed short);
-vector signed short vec_sel (vector signed short, vector signed short, vector unsigned short);
-vector unsigned short vec_sel (vector unsigned short, vector unsigned short, vector signed short);
-vector unsigned short vec_sel (vector unsigned short, vector unsigned short, vector unsigned short);
-vector signed char vec_sel (vector signed char, vector signed char, vector signed char);
-vector signed char vec_sel (vector signed char, vector signed char, vector unsigned char);
-vector unsigned char vec_sel (vector unsigned char, vector unsigned char, vector signed char);
-vector unsigned char vec_sel (vector unsigned char, vector unsigned char, vector unsigned char);
+vector signed int vec_sel (vector signed int, vector signed int,
+ vector signed int);
+vector signed int vec_sel (vector signed int, vector signed int,
+ vector unsigned int);
+vector unsigned int vec_sel (vector unsigned int, vector unsigned int,
+ vector signed int);
+vector unsigned int vec_sel (vector unsigned int, vector unsigned int,
+ vector unsigned int);
+vector signed short vec_sel (vector signed short, vector signed short,
+ vector signed short);
+vector signed short vec_sel (vector signed short, vector signed short,
+ vector unsigned short);
+vector unsigned short vec_sel (vector unsigned short,
+ vector unsigned short,
+ vector signed short);
+vector unsigned short vec_sel (vector unsigned short,
+ vector unsigned short,
+ vector unsigned short);
+vector signed char vec_sel (vector signed char, vector signed char,
+ vector signed char);
+vector signed char vec_sel (vector signed char, vector signed char,
+ vector unsigned char);
+vector unsigned char vec_sel (vector unsigned char,
+ vector unsigned char,
+ vector signed char);
+vector unsigned char vec_sel (vector unsigned char,
+ vector unsigned char,
+ vector unsigned char);
vector signed char vec_sl (vector signed char, vector unsigned char);
-vector unsigned char vec_sl (vector unsigned char, vector unsigned char);
+vector unsigned char vec_sl (vector unsigned char,
+ vector unsigned char);
vector signed short vec_sl (vector signed short, vector unsigned short);
-vector unsigned short vec_sl (vector unsigned short, vector unsigned short);
+vector unsigned short vec_sl (vector unsigned short,
+ vector unsigned short);
vector signed int vec_sl (vector signed int, vector unsigned int);
vector unsigned int vec_sl (vector unsigned int, vector unsigned int);
vector float vec_sld (vector float, vector float, const char);
-vector signed int vec_sld (vector signed int, vector signed int, const char);
-vector unsigned int vec_sld (vector unsigned int, vector unsigned int, const char);
-vector signed short vec_sld (vector signed short, vector signed short, const char);
-vector unsigned short vec_sld (vector unsigned short, vector unsigned short, const char);
-vector signed char vec_sld (vector signed char, vector signed char, const char);
-vector unsigned char vec_sld (vector unsigned char, vector unsigned char, const char);
+vector signed int vec_sld (vector signed int, vector signed int,
+ const char);
+vector unsigned int vec_sld (vector unsigned int, vector unsigned int,
+ const char);
+vector signed short vec_sld (vector signed short, vector signed short,
+ const char);
+vector unsigned short vec_sld (vector unsigned short,
+ vector unsigned short, const char);
+vector signed char vec_sld (vector signed char, vector signed char,
+ const char);
+vector unsigned char vec_sld (vector unsigned char,
+ vector unsigned char,
+ const char);
vector signed int vec_sll (vector signed int, vector unsigned int);
vector signed int vec_sll (vector signed int, vector unsigned short);
vector signed int vec_sll (vector signed int, vector unsigned char);
vector unsigned int vec_sll (vector unsigned int, vector unsigned int);
-vector unsigned int vec_sll (vector unsigned int, vector unsigned short);
+vector unsigned int vec_sll (vector unsigned int,
+ vector unsigned short);
vector unsigned int vec_sll (vector unsigned int, vector unsigned char);
vector signed short vec_sll (vector signed short, vector unsigned int);
-vector signed short vec_sll (vector signed short, vector unsigned short);
+vector signed short vec_sll (vector signed short,
+ vector unsigned short);
vector signed short vec_sll (vector signed short, vector unsigned char);
-vector unsigned short vec_sll (vector unsigned short, vector unsigned int);
-vector unsigned short vec_sll (vector unsigned short, vector unsigned short);
-vector unsigned short vec_sll (vector unsigned short, vector unsigned char);
+vector unsigned short vec_sll (vector unsigned short,
+ vector unsigned int);
+vector unsigned short vec_sll (vector unsigned short,
+ vector unsigned short);
+vector unsigned short vec_sll (vector unsigned short,
+ vector unsigned char);
vector signed char vec_sll (vector signed char, vector unsigned int);
vector signed char vec_sll (vector signed char, vector unsigned short);
vector signed char vec_sll (vector signed char, vector unsigned char);
-vector unsigned char vec_sll (vector unsigned char, vector unsigned int);
-vector unsigned char vec_sll (vector unsigned char, vector unsigned short);
-vector unsigned char vec_sll (vector unsigned char, vector unsigned char);
+vector unsigned char vec_sll (vector unsigned char,
+ vector unsigned int);
+vector unsigned char vec_sll (vector unsigned char,
+ vector unsigned short);
+vector unsigned char vec_sll (vector unsigned char,
+ vector unsigned char);
vector float vec_slo (vector float, vector signed char);
vector float vec_slo (vector float, vector unsigned char);
@@ -5285,13 +5424,16 @@ vector unsigned int vec_slo (vector unsigned int, vector unsigned char);
vector signed short vec_slo (vector signed short, vector signed char);
vector signed short vec_slo (vector signed short, vector unsigned char);
-vector unsigned short vec_slo (vector unsigned short, vector signed char);
-vector unsigned short vec_slo (vector unsigned short, vector unsigned char);
+vector unsigned short vec_slo (vector unsigned short,
+ vector signed char);
+vector unsigned short vec_slo (vector unsigned short,
+ vector unsigned char);
vector signed char vec_slo (vector signed char, vector signed char);
vector signed char vec_slo (vector signed char, vector unsigned char);
vector unsigned char vec_slo (vector unsigned char, vector signed char);
-vector unsigned char vec_slo (vector unsigned char, vector unsigned char);
+vector unsigned char vec_slo (vector unsigned char,
+ vector unsigned char);
vector signed char vec_splat (vector signed char, const char);
vector unsigned char vec_splat (vector unsigned char, const char);
@@ -5314,17 +5456,22 @@ vector unsigned short vec_splat_u16 (const char);
vector unsigned int vec_splat_u32 (const char);
vector signed char vec_sr (vector signed char, vector unsigned char);
-vector unsigned char vec_sr (vector unsigned char, vector unsigned char);
+vector unsigned char vec_sr (vector unsigned char,
+ vector unsigned char);
vector signed short vec_sr (vector signed short, vector unsigned short);
-vector unsigned short vec_sr (vector unsigned short, vector unsigned short);
+vector unsigned short vec_sr (vector unsigned short,
+ vector unsigned short);
vector signed int vec_sr (vector signed int, vector unsigned int);
vector unsigned int vec_sr (vector unsigned int, vector unsigned int);
vector signed char vec_sra (vector signed char, vector unsigned char);
-vector unsigned char vec_sra (vector unsigned char, vector unsigned char);
-vector signed short vec_sra (vector signed short, vector unsigned short);
-vector unsigned short vec_sra (vector unsigned short, vector unsigned short);
+vector unsigned char vec_sra (vector unsigned char,
+ vector unsigned char);
+vector signed short vec_sra (vector signed short,
+ vector unsigned short);
+vector unsigned short vec_sra (vector unsigned short,
+ vector unsigned short);
vector signed int vec_sra (vector signed int, vector unsigned int);
vector unsigned int vec_sra (vector unsigned int, vector unsigned int);
@@ -5332,22 +5479,30 @@ vector signed int vec_srl (vector signed int, vector unsigned int);
vector signed int vec_srl (vector signed int, vector unsigned short);
vector signed int vec_srl (vector signed int, vector unsigned char);
vector unsigned int vec_srl (vector unsigned int, vector unsigned int);
-vector unsigned int vec_srl (vector unsigned int, vector unsigned short);
+vector unsigned int vec_srl (vector unsigned int,
+ vector unsigned short);
vector unsigned int vec_srl (vector unsigned int, vector unsigned char);
vector signed short vec_srl (vector signed short, vector unsigned int);
-vector signed short vec_srl (vector signed short, vector unsigned short);
+vector signed short vec_srl (vector signed short,
+ vector unsigned short);
vector signed short vec_srl (vector signed short, vector unsigned char);
-vector unsigned short vec_srl (vector unsigned short, vector unsigned int);
-vector unsigned short vec_srl (vector unsigned short, vector unsigned short);
-vector unsigned short vec_srl (vector unsigned short, vector unsigned char);
+vector unsigned short vec_srl (vector unsigned short,
+ vector unsigned int);
+vector unsigned short vec_srl (vector unsigned short,
+ vector unsigned short);
+vector unsigned short vec_srl (vector unsigned short,
+ vector unsigned char);
vector signed char vec_srl (vector signed char, vector unsigned int);
vector signed char vec_srl (vector signed char, vector unsigned short);
vector signed char vec_srl (vector signed char, vector unsigned char);
-vector unsigned char vec_srl (vector unsigned char, vector unsigned int);
-vector unsigned char vec_srl (vector unsigned char, vector unsigned short);
-vector unsigned char vec_srl (vector unsigned char, vector unsigned char);
+vector unsigned char vec_srl (vector unsigned char,
+ vector unsigned int);
+vector unsigned char vec_srl (vector unsigned char,
+ vector unsigned short);
+vector unsigned char vec_srl (vector unsigned char,
+ vector unsigned char);
vector float vec_sro (vector float, vector signed char);
vector float vec_sro (vector float, vector unsigned char);
@@ -5359,13 +5514,16 @@ vector unsigned int vec_sro (vector unsigned int, vector unsigned char);
vector signed short vec_sro (vector signed short, vector signed char);
vector signed short vec_sro (vector signed short, vector unsigned char);
-vector unsigned short vec_sro (vector unsigned short, vector signed char);
-vector unsigned short vec_sro (vector unsigned short, vector unsigned char);
+vector unsigned short vec_sro (vector unsigned short,
+ vector signed char);
+vector unsigned short vec_sro (vector unsigned short,
+ vector unsigned char);
vector signed char vec_sro (vector signed char, vector signed char);
vector signed char vec_sro (vector signed char, vector unsigned char);
vector unsigned char vec_sro (vector unsigned char, vector signed char);
-vector unsigned char vec_sro (vector unsigned char, vector unsigned char);
+vector unsigned char vec_sro (vector unsigned char,
+ vector unsigned char);
void vec_st (vector float, int, float *);
void vec_st (vector float, int, vector float *);
@@ -5418,11 +5576,15 @@ vector unsigned char vec_sub (vector signed char, vector unsigned char);
vector unsigned char vec_sub (vector unsigned char, vector signed char);
-vector unsigned char vec_sub (vector unsigned char, vector unsigned char);
+vector unsigned char vec_sub (vector unsigned char,
+ vector unsigned char);
vector signed short vec_sub (vector signed short, vector signed short);
-vector unsigned short vec_sub (vector signed short, vector unsigned short);
-vector unsigned short vec_sub (vector unsigned short, vector signed short);
-vector unsigned short vec_sub (vector unsigned short, vector unsigned short);
+vector unsigned short vec_sub (vector signed short,
+ vector unsigned short);
+vector unsigned short vec_sub (vector unsigned short,
+ vector signed short);
+vector unsigned short vec_sub (vector unsigned short,
+ vector unsigned short);
vector signed int vec_sub (vector signed int, vector signed int);
vector unsigned int vec_sub (vector signed int, vector unsigned int);
vector unsigned int vec_sub (vector unsigned int, vector signed int);
@@ -5431,13 +5593,19 @@ vector float vec_sub (vector float, vector float);
vector unsigned int vec_subc (vector unsigned int, vector unsigned int);
-vector unsigned char vec_subs (vector signed char, vector unsigned char);
-vector unsigned char vec_subs (vector unsigned char, vector signed char);
-vector unsigned char vec_subs (vector unsigned char, vector unsigned char);
+vector unsigned char vec_subs (vector signed char,
+ vector unsigned char);
+vector unsigned char vec_subs (vector unsigned char,
+ vector signed char);
+vector unsigned char vec_subs (vector unsigned char,
+ vector unsigned char);
vector signed char vec_subs (vector signed char, vector signed char);
-vector unsigned short vec_subs (vector signed short, vector unsigned short);
-vector unsigned short vec_subs (vector unsigned short, vector signed short);
-vector unsigned short vec_subs (vector unsigned short, vector unsigned short);
+vector unsigned short vec_subs (vector signed short,
+ vector unsigned short);
+vector unsigned short vec_subs (vector unsigned short,
+ vector signed short);
+vector unsigned short vec_subs (vector unsigned short,
+ vector unsigned short);
vector signed short vec_subs (vector signed short, vector signed short);
vector unsigned int vec_subs (vector signed int, vector unsigned int);
@@ -5446,7 +5614,8 @@ vector unsigned int vec_subs (vector unsigned int, vector unsigned int);
vector signed int vec_subs (vector signed int, vector signed int);
-vector unsigned int vec_sum4s (vector unsigned char, vector unsigned int);
+vector unsigned int vec_sum4s (vector unsigned char,
+ vector unsigned int);
vector signed int vec_sum4s (vector signed char, vector signed int);
vector signed int vec_sum4s (vector signed short, vector signed int);
@@ -5472,27 +5641,35 @@ vector unsigned int vec_xor (vector signed int, vector unsigned int);
vector unsigned int vec_xor (vector unsigned int, vector signed int);
vector unsigned int vec_xor (vector unsigned int, vector unsigned int);
vector signed short vec_xor (vector signed short, vector signed short);
-vector unsigned short vec_xor (vector signed short, vector unsigned short);
-vector unsigned short vec_xor (vector unsigned short, vector signed short);
-vector unsigned short vec_xor (vector unsigned short, vector unsigned short);
+vector unsigned short vec_xor (vector signed short,
+ vector unsigned short);
+vector unsigned short vec_xor (vector unsigned short,
+ vector signed short);
+vector unsigned short vec_xor (vector unsigned short,
+ vector unsigned short);
vector signed char vec_xor (vector signed char, vector signed char);
vector unsigned char vec_xor (vector signed char, vector unsigned char);
vector unsigned char vec_xor (vector unsigned char, vector signed char);
-vector unsigned char vec_xor (vector unsigned char, vector unsigned char);
+vector unsigned char vec_xor (vector unsigned char,
+ vector unsigned char);
vector signed int vec_all_eq (vector signed char, vector unsigned char);
vector signed int vec_all_eq (vector signed char, vector signed char);
vector signed int vec_all_eq (vector unsigned char, vector signed char);
-vector signed int vec_all_eq (vector unsigned char, vector unsigned char);
-vector signed int vec_all_eq (vector signed short, vector unsigned short);
+vector signed int vec_all_eq (vector unsigned char,
+ vector unsigned char);
+vector signed int vec_all_eq (vector signed short,
+ vector unsigned short);
vector signed int vec_all_eq (vector signed short, vector signed short);
-vector signed int vec_all_eq (vector unsigned short, vector signed short);
-vector signed int vec_all_eq (vector unsigned short, vector unsigned short);
+vector signed int vec_all_eq (vector unsigned short,
+ vector signed short);
+vector signed int vec_all_eq (vector unsigned short,
+ vector unsigned short);
vector signed int vec_all_eq (vector signed int, vector unsigned int);
vector signed int vec_all_eq (vector signed int, vector signed int);
vector signed int vec_all_eq (vector unsigned int, vector signed int);
@@ -5504,11 +5681,15 @@ vector signed int vec_all_ge (vector signed char, vector unsigned char);
vector signed int vec_all_ge (vector unsigned char, vector signed char);
-vector signed int vec_all_ge (vector unsigned char, vector unsigned char);
+vector signed int vec_all_ge (vector unsigned char,
+ vector unsigned char);
vector signed int vec_all_ge (vector signed char, vector signed char);
-vector signed int vec_all_ge (vector signed short, vector unsigned short);
-vector signed int vec_all_ge (vector unsigned short, vector signed short);
-vector signed int vec_all_ge (vector unsigned short, vector unsigned short);
+vector signed int vec_all_ge (vector signed short,
+ vector unsigned short);
+vector signed int vec_all_ge (vector unsigned short,
+ vector signed short);
+vector signed int vec_all_ge (vector unsigned short,
+ vector unsigned short);
vector signed int vec_all_ge (vector signed short, vector signed short);
vector signed int vec_all_ge (vector signed int, vector unsigned int);
@@ -5522,11 +5703,15 @@ vector signed int vec_all_gt (vector signed char, vector unsigned char);
vector signed int vec_all_gt (vector unsigned char, vector signed char);
-vector signed int vec_all_gt (vector unsigned char, vector unsigned char);
+vector signed int vec_all_gt (vector unsigned char,
+ vector unsigned char);
vector signed int vec_all_gt (vector signed char, vector signed char);
-vector signed int vec_all_gt (vector signed short, vector unsigned short);
-vector signed int vec_all_gt (vector unsigned short, vector signed short);
-vector signed int vec_all_gt (vector unsigned short, vector unsigned short);
+vector signed int vec_all_gt (vector signed short,
+ vector unsigned short);
+vector signed int vec_all_gt (vector unsigned short,
+ vector signed short);
+vector signed int vec_all_gt (vector unsigned short,
+ vector unsigned short);
vector signed int vec_all_gt (vector signed short, vector signed short);
vector signed int vec_all_gt (vector signed int, vector unsigned int);
@@ -5542,11 +5727,15 @@ vector signed int vec_all_le (vector signed char, vector unsigned char);
vector signed int vec_all_le (vector unsigned char, vector signed char);
-vector signed int vec_all_le (vector unsigned char, vector unsigned char);
+vector signed int vec_all_le (vector unsigned char,
+ vector unsigned char);
vector signed int vec_all_le (vector signed char, vector signed char);
-vector signed int vec_all_le (vector signed short, vector unsigned short);
-vector signed int vec_all_le (vector unsigned short, vector signed short);
-vector signed int vec_all_le (vector unsigned short, vector unsigned short);
+vector signed int vec_all_le (vector signed short,
+ vector unsigned short);
+vector signed int vec_all_le (vector unsigned short,
+ vector signed short);
+vector signed int vec_all_le (vector unsigned short,
+ vector unsigned short);
vector signed int vec_all_le (vector signed short, vector signed short);
vector signed int vec_all_le (vector signed int, vector unsigned int);
@@ -5560,11 +5749,15 @@ vector signed int vec_all_lt (vector signed char, vector unsigned char);
vector signed int vec_all_lt (vector unsigned char, vector signed char);
-vector signed int vec_all_lt (vector unsigned char, vector unsigned char);
+vector signed int vec_all_lt (vector unsigned char,
+ vector unsigned char);
vector signed int vec_all_lt (vector signed char, vector signed char);
-vector signed int vec_all_lt (vector signed short, vector unsigned short);
-vector signed int vec_all_lt (vector unsigned short, vector signed short);
-vector signed int vec_all_lt (vector unsigned short, vector unsigned short);
+vector signed int vec_all_lt (vector signed short,
+ vector unsigned short);
+vector signed int vec_all_lt (vector unsigned short,
+ vector signed short);
+vector signed int vec_all_lt (vector unsigned short,
+ vector unsigned short);
vector signed int vec_all_lt (vector signed short, vector signed short);
vector signed int vec_all_lt (vector signed int, vector unsigned int);
@@ -5581,12 +5774,16 @@ vector signed int vec_all_ne (vector signed char, vector unsigned char);
vector signed int vec_all_ne (vector signed char, vector signed char);
vector signed int vec_all_ne (vector unsigned char, vector signed char);
-vector signed int vec_all_ne (vector unsigned char, vector unsigned char);
-vector signed int vec_all_ne (vector signed short, vector unsigned short);
+vector signed int vec_all_ne (vector unsigned char,
+ vector unsigned char);
+vector signed int vec_all_ne (vector signed short,
+ vector unsigned short);
vector signed int vec_all_ne (vector signed short, vector signed short);
-vector signed int vec_all_ne (vector unsigned short, vector signed short);
-vector signed int vec_all_ne (vector unsigned short, vector unsigned short);
+vector signed int vec_all_ne (vector unsigned short,
+ vector signed short);
+vector signed int vec_all_ne (vector unsigned short,
+ vector unsigned short);
vector signed int vec_all_ne (vector signed int, vector unsigned int);
vector signed int vec_all_ne (vector signed int, vector signed int);
vector signed int vec_all_ne (vector unsigned int, vector signed int);
@@ -5609,12 +5806,16 @@ vector signed int vec_any_eq (vector signed char, vector unsigned char);
vector signed int vec_any_eq (vector signed char, vector signed char);
vector signed int vec_any_eq (vector unsigned char, vector signed char);
-vector signed int vec_any_eq (vector unsigned char, vector unsigned char);
-vector signed int vec_any_eq (vector signed short, vector unsigned short);
+vector signed int vec_any_eq (vector unsigned char,
+ vector unsigned char);
+vector signed int vec_any_eq (vector signed short,
+ vector unsigned short);
vector signed int vec_any_eq (vector signed short, vector signed short);
-vector signed int vec_any_eq (vector unsigned short, vector signed short);
-vector signed int vec_any_eq (vector unsigned short, vector unsigned short);
+vector signed int vec_any_eq (vector unsigned short,
+ vector signed short);
+vector signed int vec_any_eq (vector unsigned short,
+ vector unsigned short);
vector signed int vec_any_eq (vector signed int, vector unsigned int);
vector signed int vec_any_eq (vector signed int, vector signed int);
vector signed int vec_any_eq (vector unsigned int, vector signed int);
@@ -5626,11 +5827,15 @@ vector signed int vec_any_ge (vector signed char, vector unsigned char);
vector signed int vec_any_ge (vector unsigned char, vector signed char);
-vector signed int vec_any_ge (vector unsigned char, vector unsigned char);
+vector signed int vec_any_ge (vector unsigned char,
+ vector unsigned char);
vector signed int vec_any_ge (vector signed char, vector signed char);
-vector signed int vec_any_ge (vector signed short, vector unsigned short);
-vector signed int vec_any_ge (vector unsigned short, vector signed short);
-vector signed int vec_any_ge (vector unsigned short, vector unsigned short);
+vector signed int vec_any_ge (vector signed short,
+ vector unsigned short);
+vector signed int vec_any_ge (vector unsigned short,
+ vector signed short);
+vector signed int vec_any_ge (vector unsigned short,
+ vector unsigned short);
vector signed int vec_any_ge (vector signed short, vector signed short);
vector signed int vec_any_ge (vector signed int, vector unsigned int);
@@ -5644,11 +5849,15 @@ vector signed int vec_any_gt (vector signed char, vector unsigned char);
vector signed int vec_any_gt (vector unsigned char, vector signed char);
-vector signed int vec_any_gt (vector unsigned char, vector unsigned char);
+vector signed int vec_any_gt (vector unsigned char,
+ vector unsigned char);
vector signed int vec_any_gt (vector signed char, vector signed char);
-vector signed int vec_any_gt (vector signed short, vector unsigned short);
-vector signed int vec_any_gt (vector unsigned short, vector signed short);
-vector signed int vec_any_gt (vector unsigned short, vector unsigned short);
+vector signed int vec_any_gt (vector signed short,
+ vector unsigned short);
+vector signed int vec_any_gt (vector unsigned short,
+ vector signed short);
+vector signed int vec_any_gt (vector unsigned short,
+ vector unsigned short);
vector signed int vec_any_gt (vector signed short, vector signed short);
vector signed int vec_any_gt (vector signed int, vector unsigned int);
@@ -5662,11 +5871,15 @@ vector signed int vec_any_le (vector signed char, vector unsigned char);
vector signed int vec_any_le (vector unsigned char, vector signed char);
-vector signed int vec_any_le (vector unsigned char, vector unsigned char);
+vector signed int vec_any_le (vector unsigned char,
+ vector unsigned char);
vector signed int vec_any_le (vector signed char, vector signed char);
-vector signed int vec_any_le (vector signed short, vector unsigned short);
-vector signed int vec_any_le (vector unsigned short, vector signed short);
-vector signed int vec_any_le (vector unsigned short, vector unsigned short);
+vector signed int vec_any_le (vector signed short,
+ vector unsigned short);
+vector signed int vec_any_le (vector unsigned short,
+ vector signed short);
+vector signed int vec_any_le (vector unsigned short,
+ vector unsigned short);
vector signed int vec_any_le (vector signed short, vector signed short);
vector signed int vec_any_le (vector signed int, vector unsigned int);
@@ -5680,11 +5893,15 @@ vector signed int vec_any_lt (vector signed char, vector unsigned char);
vector signed int vec_any_lt (vector unsigned char, vector signed char);
-vector signed int vec_any_lt (vector unsigned char, vector unsigned char);
+vector signed int vec_any_lt (vector unsigned char,
+ vector unsigned char);
vector signed int vec_any_lt (vector signed char, vector signed char);
-vector signed int vec_any_lt (vector signed short, vector unsigned short);
-vector signed int vec_any_lt (vector unsigned short, vector signed short);
-vector signed int vec_any_lt (vector unsigned short, vector unsigned short);
+vector signed int vec_any_lt (vector signed short,
+ vector unsigned short);
+vector signed int vec_any_lt (vector unsigned short,
+ vector signed short);
+vector signed int vec_any_lt (vector unsigned short,
+ vector unsigned short);
vector signed int vec_any_lt (vector signed short, vector signed short);
vector signed int vec_any_lt (vector signed int, vector unsigned int);
@@ -5701,12 +5918,16 @@ vector signed int vec_any_ne (vector signed char, vector unsigned char);
vector signed int vec_any_ne (vector signed char, vector signed char);
vector signed int vec_any_ne (vector unsigned char, vector signed char);
-vector signed int vec_any_ne (vector unsigned char, vector unsigned char);
-vector signed int vec_any_ne (vector signed short, vector unsigned short);
+vector signed int vec_any_ne (vector unsigned char,
+ vector unsigned char);
+vector signed int vec_any_ne (vector signed short,
+ vector unsigned short);
vector signed int vec_any_ne (vector signed short, vector signed short);
-vector signed int vec_any_ne (vector unsigned short, vector signed short);
-vector signed int vec_any_ne (vector unsigned short, vector unsigned short);
+vector signed int vec_any_ne (vector unsigned short,
+ vector signed short);
+vector signed int vec_any_ne (vector unsigned short,
+ vector unsigned short);
vector signed int vec_any_ne (vector signed int, vector unsigned int);
vector signed int vec_any_ne (vector signed int, vector signed int);
vector signed int vec_any_ne (vector unsigned int, vector signed int);
@@ -5740,6 +5961,8 @@ for further explanation.
@menu
* ARM Pragmas::
* Darwin Pragmas::
+* Solaris Pragmas::
+* Tru64 Pragmas::
@end menu
@node ARM Pragmas
@@ -5804,6 +6027,44 @@ that of the @code{unused} attribute, except that this pragma may appear
anywhere within the variables' scopes.
@end table
+@node Solaris Pragmas
+@subsection Solaris Pragmas
+
+For compatibility with the SunPRO compiler, the following pragma
+is supported.
+
+@table @code
+@item redefine_extname @var{oldname} @var{newname}
+@cindex pragma, redefine_extname
+
+This pragma gives the C function @var{oldname} the assembler label
+@var{newname}. The pragma must appear before the function declaration.
+This pragma is equivalent to the asm labels extension (@pxref{Asm
+Labels}). The preprocessor defines @code{__PRAGMA_REDEFINE_EXTNAME}
+if the pragma is available.
+@end table
+
+@node Tru64 Pragmas
+@subsection Tru64 Pragmas
+
+For compatibility with the Compaq C compiler, the following pragma
+is supported.
+
+@table @code
+@item extern_prefix @var{string}
+@cindex pragma, extern_prefix
+
+This pragma renames all subsequent function and variable declarations
+such that @var{string} is prepended to the name. This effect may be
+terminated by using another @code{extern_prefix} pragma with the
+empty string.
+
+This pragma is similar in intent to to the asm labels extension
+(@pxref{Asm Labels}) in that the system programmer wants to change
+the assembly-level ABI without changing the source-level API. The
+preprocessor defines @code{__EXTERN_PREFIX} if the pragma is available.
+@end table
+
@node Unnamed Fields
@section Unnamed struct/union fields within structs/unions.
@cindex struct
diff --git a/contrib/gcc/doc/frontends.texi b/contrib/gcc/doc/frontends.texi
index ffaa9aa..a5efb63 100644
--- a/contrib/gcc/doc/frontends.texi
+++ b/contrib/gcc/doc/frontends.texi
@@ -4,17 +4,16 @@
@c For copying conditions, see the file gcc.texi.
@node G++ and GCC
-@chapter Compile C, C++, Objective-C, Ada, CHILL, Fortran, or Java
+@chapter Compile C, C++, Objective-C, Ada, Fortran, or Java
@cindex Objective-C
@cindex Fortran
@cindex Java
-@cindex CHILL
@cindex Ada
-Several versions of the compiler (C, C++, Objective-C, Ada, CHILL,
+Several versions of the compiler (C, C++, Objective-C, Ada,
Fortran, and Java) are integrated; this is why we use the name
``GNU Compiler Collection''. GCC can compile programs written in any of these
-languages. The Ada, CHILL, Fortran, and Java compilers are described in
+languages. The Ada, Fortran, and Java compilers are described in
separate manuals.
@cindex GCC
diff --git a/contrib/gcc/doc/gcc.texi b/contrib/gcc/doc/gcc.texi
index d8579e7..4af8694 100644
--- a/contrib/gcc/doc/gcc.texi
+++ b/contrib/gcc/doc/gcc.texi
@@ -102,7 +102,7 @@ included in the section entitled ``GNU Free Documentation License''.
@sp 2
@center Richard M. Stallman
@sp 3
-@center Last updated 7 January 2002
+@center Last updated 20 April 2002
@sp 1
@center for GCC @value{version-GCC}
diff --git a/contrib/gcc/doc/include/texinfo.tex b/contrib/gcc/doc/include/texinfo.tex
new file mode 100644
index 0000000..99113dd
--- /dev/null
+++ b/contrib/gcc/doc/include/texinfo.tex
@@ -0,0 +1,6325 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2002-03-01.06}
+%
+% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
+% 2000, 01, 02 Free Software Foundation, Inc.
+%
+% This texinfo.tex file 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 texinfo.tex file 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 texinfo.tex file; see the file COPYING. If not, write
+% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+% Boston, MA 02111-1307, USA.
+%
+% In other words, you are welcome to use, share and improve this program.
+% You are forbidden to forbid anyone else to use, share and improve
+% what you give them. Help stamp out software-hoarding!
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% ftp://ftp.gnu.org/gnu/texinfo.tex
+% (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
+% ftp://texinfo.org/texinfo/texinfo.tex
+% ftp://tug.org/tex/texinfo.tex
+% (and all CTAN mirrors, see http://www.ctan.org),
+% and /home/gd/gnu/doc/texinfo.tex on the GNU machines.
+%
+% The texinfo.tex in any given Texinfo distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Texinfo has a small home page at http://texinfo.org/ and also
+% http://www.gnu.org/software/texinfo.
+%
+% Send bug reports to bug-texinfo@gnu.org. Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem. Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution. For a simple
+% manual foo.texi, however, you can get away with this:
+% tex foo.texi
+% texindex foo.??
+% tex foo.texi
+% tex foo.texi
+% dvips foo.dvi -o # or whatever, to process the dvi file; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages. You can get
+% the existing language-specific files from the full Texinfo distribution.
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+% Save some parts of plain tex whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexi=\i
+\let\ptexlbrace=\{
+\let\ptexrbrace=\}
+\let\ptexstar=\*
+\let\ptext=\t
+
+% We never want plain's outer \+ definition in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+\message{Basics,}
+\chardef\other=12
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
+\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
+\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+\hyphenation{ap-pen-dix}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{eshell}
+\hyphenation{white-space}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen \bindingoffset
+\newdimen \normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\ifx\eTeXversion\undefined
+\def\loggingall{\tracingcommands2 \tracingstats2
+ \tracingpages1 \tracingoutput1 \tracinglostchars1
+ \tracingmacros2 \tracingparagraphs1 \tracingrestores1
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen
+}%
+\else
+\def\loggingall{\tracingcommands3 \tracingstats2
+ \tracingpages1 \tracingoutput1 \tracinglostchars1
+ \tracingmacros2 \tracingparagraphs1 \tracingrestores1
+ \tracingscantokens1 \tracingassigns1 \tracingifs1
+ \tracinggroups1 \tracingnesting2
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen
+}%
+\fi
+
+% add check for \lastpenalty to plain's definitions. If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+ \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Do this outside of the \shipout so @code etc. will be expanded in
+ % the headline as they should be, not taken literally (outputting ''code).
+ \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+ \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+ %
+ {%
+ % Have to do this stuff outside the \shipout because we want it to
+ % take effect in \write's, yet the group defined by the \vbox ends
+ % before the \shipout runs.
+ %
+ \escapechar = `\\ % use backslash in output files.
+ \indexdummies % don't expand commands in the output.
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi
+ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+ \vskip-\topandbottommargin
+ \vtop to0pt{%
+ \line{\ewtop\hfil\ewtop}%
+ \nointerlineskip
+ \line{%
+ \vbox{\moveleft\cornerthick\nstop}%
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}%
+ }%
+ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+ \ifodd\pageno\hskip\bindingoffset\fi
+ \vbox\bgroup
+ \fi
+ %
+ \unvbox\headlinebox
+ \pagebody{#1}%
+ \ifdim\ht\footlinebox > 0pt
+ % Only leave this space if the footline is nonempty.
+ % (We lessened \vsize for it in \oddfootingxxx.)
+ % The \baselineskip=24pt in plain's \makefootline has no effect.
+ \vskip 2\baselineskip
+ \unvbox\footlinebox
+ \fi
+ %
+ \ifcropmarks
+ \egroup % end of \vbox\bgroup
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+ \vbox to0pt{\vss
+ \line{%
+ \vbox{\moveleft\cornerthick\nsbot}%
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}%
+ }%
+ \nointerlineskip
+ \line{\ewbot\hfil\ewbot}%
+ }%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+ }% end of group with \turnoffactive
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1. The argument is the rest of
+% the input line (except we remove a trailing comment). #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg#1{%
+ \let\next = #1%
+ \begingroup
+ \obeylines
+ \futurelet\temp\parseargx
+}
+
+% If the next token is an obeyed space (from an @example environment or
+% the like), remove it and recurse. Otherwise, we're done.
+\def\parseargx{%
+ % \obeyedspace is defined far below, after the definition of \sepspaces.
+ \ifx\obeyedspace\temp
+ \expandafter\parseargdiscardspace
+ \else
+ \expandafter\parseargline
+ \fi
+}
+
+% Remove a single space (as the delimiter token to the macro call).
+{\obeyspaces %
+ \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
+
+{\obeylines %
+ \gdef\parseargline#1^^M{%
+ \endgroup % End of the group started in \parsearg.
+ %
+ % First remove any @c comment, then any @comment.
+ % Result of each macro is put in \toks0.
+ \argremovec #1\c\relax %
+ \expandafter\argremovecomment \the\toks0 \comment\relax %
+ %
+ % Call the caller's macro, saved as \next in \parsearg.
+ \expandafter\next\expandafter{\the\toks0}%
+ }%
+}
+
+% Since all \c{,omment} does is throw away the argument, we can let TeX
+% do that for us. The \relax here is matched by the \relax in the call
+% in \parseargline; it could be more or less anything, its purpose is
+% just to delimit the argument to the \c.
+\def\argremovec#1\c#2\relax{\toks0 = {#1}}
+\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
+
+% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
+% @end itemize @c foo
+% will have two active spaces as part of the argument with the
+% `itemize'. Here we remove all active spaces from #1, and assign the
+% result to \toks0.
+%
+% This loses if there are any *other* active characters besides spaces
+% in the argument -- _ ^ +, for example -- since they get expanded.
+% Fortunately, Texinfo does not define any such commands. (If it ever
+% does, the catcode of the characters in questionwill have to be changed
+% here.) But this means we cannot call \removeactivespaces as part of
+% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
+% that \parsearg gets might well have any character at all in it.
+%
+\def\removeactivespaces#1{%
+ \begingroup
+ \ignoreactivespaces
+ \edef\temp{#1}%
+ \global\toks0 = \expandafter{\temp}%
+ \endgroup
+}
+
+% Change the active space to expand to nothing.
+%
+\begingroup
+ \obeyspaces
+ \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
+\endgroup
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+%% These are used to keep @begin/@end levels from running away
+%% Call \inENV within environments (after a \begingroup)
+\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
+\def\ENVcheck{%
+\ifENV\errmessage{Still within an environment; press RETURN to continue}
+\endgroup\fi} % This is not perfect, but it should reduce lossage
+
+% @begin foo is the same as @foo, for now.
+\newhelp\EMsimple{Press RETURN to continue.}
+
+\outer\def\begin{\parsearg\beginxxx}
+
+\def\beginxxx #1{%
+\expandafter\ifx\csname #1\endcsname\relax
+{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
+\csname #1\endcsname\fi}
+
+% @end foo executes the definition of \Efoo.
+%
+\def\end{\parsearg\endxxx}
+\def\endxxx #1{%
+ \removeactivespaces{#1}%
+ \edef\endthing{\the\toks0}%
+ %
+ \expandafter\ifx\csname E\endthing\endcsname\relax
+ \expandafter\ifx\csname \endthing\endcsname\relax
+ % There's no \foo, i.e., no ``environment'' foo.
+ \errhelp = \EMsimple
+ \errmessage{Undefined command `@end \endthing'}%
+ \else
+ \unmatchedenderror\endthing
+ \fi
+ \else
+ % Everything's ok; the right environment has been started.
+ \csname E\endthing\endcsname
+ \fi
+}
+
+% There is an environment #1, but it hasn't been started. Give an error.
+%
+\def\unmatchedenderror#1{%
+ \errhelp = \EMsimple
+ \errmessage{This `@end #1' doesn't have a matching `@#1'}%
+}
+
+% Define the control sequence \E#1 to give an unmatched @end error.
+%
+\def\defineunmatchedend#1{%
+ \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
+}
+
+
+% Single-spacing is done by various environments (specifically, in
+% \nonfillstart and \quotations).
+\newskip\singlespaceskip \singlespaceskip = 12.5pt
+\def\singlespace{%
+ % Why was this kern here? It messes up equalizing space above and below
+ % environments. --karl, 6may93
+ %{\advance \baselineskip by -\singlespaceskip
+ %\kern \baselineskip}%
+ \setleading\singlespaceskip
+}
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+ % Definitions to produce actual \{ & \} command in an index.
+ \catcode`\{ = 12 \catcode`\} = 12
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\@ = 0 \catcode`\\ = 12
+ @gdef@lbracecmd[\{]%
+ @gdef@rbracecmd[\}]%
+@endgroup
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown
+% Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+ \def\temp{#1}%
+ \ifx\temp\imacro \ptexi
+ \else\ifx\temp\jmacro \j
+ \else \errmessage{@dotless can be used only with i or j}%
+ \fi\fi
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=3000 }
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=3000 }
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+\def\group{\begingroup
+ \ifnum\catcode13=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ %
+ % The \vtop we start below produces a box with normal height and large
+ % depth; thus, TeX puts \baselineskip glue before it, and (when the
+ % next line of text is done) \lineskip glue after it. (See p.82 of
+ % the TeXbook.) Thus, space below is not quite equal to space
+ % above. But it's pretty close.
+ \def\Egroup{%
+ \egroup % End the \vtop.
+ \endgroup % End the \group.
+ }%
+ %
+ \vtop\bgroup
+ % We have to put a strut on the last line in case the @group is in
+ % the midst of an example, rather than completely enclosing it.
+ % Otherwise, the interline space between the last line of the group
+ % and the first line afterwards is too small. But we can't put the
+ % strut in \Egroup, since there it would be on a line by itself.
+ % Hence this just inserts a strut at the beginning of each line.
+ \everypar = {\strut}%
+ %
+ % Since we have a strut on every line, we don't need any of TeX's
+ % normal interline spacing.
+ \offinterlineskip
+ %
+ % OK, but now we have to do something about blank
+ % lines in the input in @example-like environments, which normally
+ % just turn into \lisppar, which will insert no space now that we've
+ % turned off the interline space. Simplest is to make them be an
+ % empty paragraph.
+ \ifx\par\lisppar
+ \edef\par{\leavevmode \par}%
+ %
+ % Reset ^^M's definition to new definition of \par.
+ \obeylines
+ \fi
+ %
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
+ % end-of-line in the output. We don't want the end-of-line after
+ % the `@group' to put extra space in the output. Since @group
+ % should appear on a line by itself (according to the Texinfo
+ % manual), we don't worry about eating any user text.
+ \comment
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+\def\need{\parsearg\needx}
+
+% Old definition--didn't work.
+%\def\needx #1{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\def\needx#1{%
+ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % If the @need value is less than one line space, it's useless.
+ \dimen0 = #1\mil
+ \dimen2 = \ht\strutbox
+ \advance\dimen2 by \dp\strutbox
+ \ifdim\dimen0 > \dimen2
+ %
+ % Do a \strut just to make the height of this box be normal, so the
+ % normal leading is inserted relative to the preceding line.
+ % And a page break here is fine.
+ \vtop to #1\mil{\strut\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+ \fi
+}
+
+% @br forces paragraph break
+
+\let\br = \par
+
+% @dots{} output an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+ \leavevmode
+ \hbox to 1.5em{%
+ \hskip 0pt plus 0.25fil minus 0.25fil
+ .\hss.\hss.%
+ \hskip 0pt plus 0.5fil minus 0.5fil
+ }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+ \leavevmode
+ \hbox to 2em{%
+ \hskip 0pt plus 0.25fil minus 0.25fil
+ .\hss.\hss.\hss.%
+ \hskip 0pt plus 0.5fil minus 0.5fil
+ }%
+ \spacefactor=3000
+}
+
+
+% @page forces the start of a new page
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\def\exdent{\parsearg\exdentyyy}
+\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
+
+% This defn is used inside nofill environments such as @example.
+\def\nofillexdent{\parsearg\nofillexdentyyy}
+\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
+\leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph. For more general purposes, use the \margin insertion
+% class. WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+ \nobreak
+ \kern-\strutdepth
+ \vtop to \strutdepth{%
+ \baselineskip=\strutdepth
+ \vss
+ % if you have multiple lines of stuff to put here, you'll need to
+ % make the vbox yourself of the appropriate size.
+ \ifx#1l%
+ \llap{\ignorespaces #2\hskip\inmarginspacing}%
+ \else
+ \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+ \fi
+ \null
+ }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \def\lefttext{#1}% have both texts
+ \def\righttext{#2}%
+ \else
+ \def\lefttext{#1}% have only one text
+ \def\righttext{#1}%
+ \fi
+ %
+ \ifodd\pageno
+ \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+ \else
+ \def\temp{\inleftmargin\lefttext}%
+ \fi
+ \temp
+}
+
+% @include file insert text of that file as input.
+% Allow normal characters that we make active in the argument (a file name).
+\def\include{\begingroup
+ \catcode`\\=12
+ \catcode`~=12
+ \catcode`^=12
+ \catcode`_=12
+ \catcode`|=12
+ \catcode`<=12
+ \catcode`>=12
+ \catcode`+=12
+ \parsearg\includezzz}
+% Restore active chars for included file.
+\def\includezzz#1{\endgroup\begingroup
+ % Read the included file in a group so nested @include's work.
+ \def\thisfile{#1}%
+ \input\thisfile
+\endgroup}
+
+\def\thisfile{}
+
+% @center line outputs that line, centered
+
+\def\center{\parsearg\centerzzz}
+\def\centerzzz #1{{\advance\hsize by -\leftskip
+\advance\hsize by -\rightskip
+\centerline{#1}}}
+
+% @sp n outputs n lines of vertical space
+
+\def\sp{\parsearg\spxxx}
+\def\spxxx #1{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% We cannot implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\def\paragraphindent{\parsearg\doparagraphindent}
+\def\doparagraphindent#1{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \defaultparindent = 0pt
+ \else
+ \defaultparindent = #1em
+ \fi
+ \fi
+ \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\def\exampleindent{\parsearg\doexampleindent}
+\def\doexampleindent#1{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \lispnarrowing = 0pt
+ \else
+ \lispnarrowing = #1em
+ \fi
+ \fi
+}
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+% We don't use $'s directly in the definition of \math because we need
+% to set catcodes according to plain TeX first, to allow for subscripts,
+% superscripts, special math chars, etc.
+%
+% @math does not do math typesetting in section titles, index
+% entries, and other such contexts where the catcodes are set before
+% @math gets a chance to work. This could perhaps be fixed, but for now
+% at least we can have real math in the main text, where it's needed most.
+%
+%
+\let\implicitmath = $%$ font-lock fix
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}. So make
+% _ within @math be active (mathcode "8000), and distinguish by seeing
+% if the current family is \slfam, which is what @var uses.
+%
+{\catcode95 = \active % 95 = _
+\gdef\mathunderscore{%
+ \catcode95=\active
+ \def_{\ifnum\fam=\slfam\_\else\sb\fi}%
+}}
+%
+\def\math{\tex\mathcode`\_="8000\mathunderscore \implicitmath\finishmath}
+\def\finishmath#1{#1\implicitmath\Etex}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{\implicitmath\ptexbullet\implicitmath}
+\def\minus{\implicitmath-\implicitmath}
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \iflinks
+ \readauxfile
+ \fi % \openindices needs to do some work in any case.
+ \openindices
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc.
+ % Just to be on the safe side, close the input stream before the \input.
+ \openin 1 texinfo.cnf
+ \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
+ \closein1
+ \temp
+ %
+ \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+\ifx\pdfoutput\undefined
+ \pdffalse
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\linkcolor = \relax
+ \let\pdfmakeoutlines = \relax
+\else
+ \pdftrue
+ \pdfoutput = 1
+ \input pdfcolor
+ \def\dopdfimage#1#2#3{%
+ \def\imagewidth{#2}%
+ \def\imageheight{#3}%
+ % without \immediate, pdftex seg faults when the same image is
+ % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
+ \ifnum\pdftexversion < 14
+ \immediate\pdfimage
+ \else
+ \immediate\pdfximage
+ \fi
+ \ifx\empty\imagewidth\else width \imagewidth \fi
+ \ifx\empty\imageheight\else height \imageheight \fi
+ \ifnum\pdftexversion<13
+ #1.pdf%
+ \else
+ {#1.pdf}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}}
+ \def\pdfmkpgn#1{#1}
+ \let\linkcolor = \Blue % was Cyan, but that seems light?
+ \def\endlink{\Black\pdfendlink}
+ % Adding outlines to PDF; macros for calculating structure of outlines
+ % come from Petr Olsak
+ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+ \else \csname#1\endcsname \fi}
+ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+ \advance\tempnum by1
+ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+ \def\pdfmakeoutlines{{%
+ \openin 1 \jobname.toc
+ \ifeof 1\else\begingroup
+ \closein 1
+ \indexnofonts
+ \def\tt{}
+ \let\_ = \normalunderscore
+ % Thanh's hack / proper braces in bookmarks
+ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+ %
+ \def\chapentry ##1##2##3{}
+ \let\appendixentry = \chapentry
+ \def\unnumbchapentry ##1##2{}
+ \def\secentry ##1##2##3##4{\advancenumber{chap##2}}
+ \def\unnumbsecentry ##1##2{}
+ \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}}
+ \def\unnumbsubsecentry ##1##2{}
+ \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}}
+ \def\unnumbsubsubsecentry ##1##2{}
+ \input \jobname.toc
+ \def\chapentry ##1##2##3{%
+ \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}}
+ \let\appendixentry = \chapentry
+ \def\unnumbchapentry ##1##2{%
+ \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
+ \def\secentry ##1##2##3##4{%
+ \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}}
+ \def\unnumbsecentry ##1##2{%
+ \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
+ \def\subsecentry ##1##2##3##4##5{%
+ \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}}
+ \def\unnumbsubsecentry ##1##2{%
+ \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
+ \def\subsubsecentry ##1##2##3##4##5##6{%
+ \pdfoutline goto name{\pdfmkpgn{##6}}{##1}}
+ \def\unnumbsubsubsecentry ##1##2{%
+ \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
+ \input \jobname.toc
+ \endgroup\fi
+ }}
+ \def\makelinks #1,{%
+ \def\params{#1}\def\E{END}%
+ \ifx\params\E
+ \let\nextmakelinks=\relax
+ \else
+ \let\nextmakelinks=\makelinks
+ \ifnum\lnkcount>0,\fi
+ \picknum{#1}%
+ \startlink attr{/Border [0 0 0]}
+ goto name{\pdfmkpgn{\the\pgn}}%
+ \linkcolor #1%
+ \advance\lnkcount by 1%
+ \endlink
+ \fi
+ \nextmakelinks
+ }
+ \def\picknum#1{\expandafter\pn#1}
+ \def\pn#1{%
+ \def\p{#1}%
+ \ifx\p\lbrace
+ \let\nextpn=\ppn
+ \else
+ \let\nextpn=\ppnn
+ \def\first{#1}
+ \fi
+ \nextpn
+ }
+ \def\ppn#1{\pgn=#1\gobble}
+ \def\ppnn{\pgn=\first}
+ \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \ifx\p\space\else\addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \fi
+ \nextsp}
+ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+ \ifnum\pdftexversion < 14
+ \let \startlink \pdfannotlink
+ \else
+ \let \startlink \pdfstartlink
+ \fi
+ \def\pdfurl#1{%
+ \begingroup
+ \normalturnoffactive\def\@{@}%
+ \let\value=\expandablevalue
+ \leavevmode\Red
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ % #1
+ \endgroup}
+ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+ \def\maketoks{%
+ \expandafter\poptoks\the\toksA|ENDTOKS|
+ \ifx\first0\adn0
+ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+ \else
+ \ifnum0=\countA\else\makelink\fi
+ \ifx\first.\let\next=\done\else
+ \let\next=\maketoks
+ \addtokens{\toksB}{\the\toksD}
+ \ifx\first,\addtokens{\toksB}{\space}\fi
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \next}
+ \def\makelink{\addtokens{\toksB}%
+ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+ \def\pdflink#1{%
+ \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+ \linkcolor #1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+% Font-change commands.
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf analogous to plain's \rm, etc.
+\newfam\sffam
+\def\sf{\fam=\sffam \tensf}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this one.
+\def\ttsl{\tenttsl}
+
+% Default leading.
+\newdimen\textleading \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly. There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+ \normalbaselineskip = #1\relax
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor
+\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx} %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+\newcount\mainmagstep
+\ifx\bigger\relax
+ % not really supported.
+ \let\mainmagstep=\magstep1
+ \setfont\textrm\rmshape{12}{1000}
+ \setfont\texttt\ttshape{12}{1000}
+\else
+ \mainmagstep=\magstephalf
+ \setfont\textrm\rmshape{10}{\mainmagstep}
+ \setfont\texttt\ttshape{10}{\mainmagstep}
+\fi
+% Instead of cmb10, you many want to use cmbx10.
+% cmbx10 is a prettier font on its own, but cmb10
+% looks better when embedded in a line with cmr10.
+\setfont\textbf\bfshape{10}{\mainmagstep}
+\setfont\textit\itshape{10}{\mainmagstep}
+\setfont\textsl\slshape{10}{\mainmagstep}
+\setfont\textsf\sfshape{10}{\mainmagstep}
+\setfont\textsc\scshape{10}{\mainmagstep}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun, etc.
+\setfont\defbf\bxshape{10}{\magstep1} %was 1314
+\setfont\deftt\ttshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\setfont\smallrm\rmshape{9}{1000}
+\setfont\smalltt\ttshape{9}{1000}
+\setfont\smallbf\bfshape{10}{900}
+\setfont\smallit\itshape{9}{1000}
+\setfont\smallsl\slshape{9}{1000}
+\setfont\smallsf\sfshape{9}{1000}
+\setfont\smallsc\scshape{10}{900}
+\setfont\smallttsl\ttslshape{10}{900}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\setfont\smallerrm\rmshape{8}{1000}
+\setfont\smallertt\ttshape{8}{1000}
+\setfont\smallerbf\bfshape{10}{800}
+\setfont\smallerit\itshape{8}{1000}
+\setfont\smallersl\slshape{8}{1000}
+\setfont\smallersf\sfshape{8}{1000}
+\setfont\smallersc\scshape{10}{800}
+\setfont\smallerttsl\ttslshape{10}{800}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page:
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\setfont\titleit\itbshape{10}{\magstep4}
+\setfont\titlesl\slbshape{10}{\magstep4}
+\setfont\titlett\ttbshape{12}{\magstep3}
+\setfont\titlettsl\ttslshape{10}{\magstep4}
+\setfont\titlesf\sfbshape{17}{\magstep1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\setfont\chaprm\rmbshape{12}{\magstep2}
+\setfont\chapit\itbshape{10}{\magstep3}
+\setfont\chapsl\slbshape{10}{\magstep3}
+\setfont\chaptt\ttbshape{12}{\magstep2}
+\setfont\chapttsl\ttslshape{10}{\magstep3}
+\setfont\chapsf\sfbshape{17}{1000}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\setfont\secrm\rmbshape{12}{\magstep1}
+\setfont\secit\itbshape{10}{\magstep2}
+\setfont\secsl\slbshape{10}{\magstep2}
+\setfont\sectt\ttbshape{12}{\magstep1}
+\setfont\secttsl\ttslshape{10}{\magstep2}
+\setfont\secsf\sfbshape{12}{\magstep1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\setfont\ssecrm\rmbshape{12}{\magstephalf}
+\setfont\ssecit\itbshape{10}{1315}
+\setfont\ssecsl\slbshape{10}{1315}
+\setfont\ssectt\ttbshape{12}{\magstephalf}
+\setfont\ssecttsl\ttslshape{10}{1315}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{\magstep1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
+% but that is not a standard magnification.
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+ \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+ \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this so that font changes will continue to work
+% in math mode, where it is the current \fam that is relevant in most
+% cases, not the current font. Plain TeX does \def\bf{\fam=\bffam
+% \tenbf}, for example. By redefining \tenbf, we obviate the need to
+% redefine \bf itself.
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
+ \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+ \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+ \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
+ \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
+ \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
+ \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
+\def\smallfonts{%
+ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+ \let\tenttsl=\smallttsl
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+ \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+ \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+ \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+ \let\tenttsl=\smallerttsl
+ \resetmathfonts \setleading{9.5pt}}
+\let\smallexamplefonts = \smallerfonts
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}
+\setfont\shortcontbf\bxshape{12}{1000}
+\setfont\shortcontsl\slshape{12}{1000}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
+\def\smartslanted#1{{\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\it #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+\let\cite=\smartslanted
+
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph. Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+\def\t#1{%
+ {\tt \rawbackslash \frenchspacing #1}%
+ \null
+}
+\let\ttfont=\t
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+ \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+ \vbox{\hrule\kern-0.4pt
+ \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+ \kern-0.4pt\hrule}%
+ \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+ {%
+ % Change normal interword space to be same as for the current font.
+ \spaceskip = \fontdimen2\font
+ %
+ % Switch to typewriter.
+ \tt
+ %
+ % But `\ ' produces the large typewriter interword space.
+ \def\ {{\spaceskip = 0pt{} }}%
+ %
+ % Turn off hyphenation.
+ \nohyphenation
+ %
+ \rawbackslash
+ \frenchspacing
+ #1%
+ }%
+ \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in \code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+% -- rms.
+{
+ \catcode`\-=\active
+ \catcode`\_=\active
+ %
+ \global\def\code{\begingroup
+ \catcode`\-=\active \let-\codedash
+ \catcode`\_=\active \let_\codeunder
+ \codex
+ }
+ %
+ % If we end up with any active - characters when handling the index,
+ % just treat them as a normal -.
+ \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}}
+\def\codex #1{\tclose{#1}\endgroup}
+
+%\let\exp=\tclose %Was temporary
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+% `example' (@kbd uses ttsl only inside of @example and friends),
+% or `code' (@kbd uses normal tty font always).
+\def\kbdinputstyle{\parsearg\kbdinputstylexxx}
+\def\kbdinputstylexxx#1{%
+ \def\arg{#1}%
+ \ifx\arg\worddistinct
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+ \else\ifx\arg\wordexample
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+ \else\ifx\arg\wordcode
+ \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is kbdinputdistinct. (Too much of a hassle to call the macro,
+% the catcodes are wrong for parsearg to work.)
+\gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @url, @env, @command quotes seem unnecessary, so use \code.
+\let\url=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself. First (mandatory) arg is the url. Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ \unhbox0 % PDF: 2nd arg given, show only it
+ \else
+ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+ \fi
+ \else
+ \code{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+ \def\email#1{\doemail#1,,\finish}
+ \def\doemail#1,#2,#3\finish{\begingroup
+ \unsepspaces
+ \pdfurl{mailto:#1}%
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+ \endlink
+ \endgroup}
+\else
+ \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find. We need it for
+% Polish suppressed-l. --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}} % roman font
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+% @acronym downcases the argument and prints in smallcaps.
+\def\acronym#1{{\smallcaps \lowercase{#1}}}
+
+% @pounds{} is a sterling sign.
+\def\pounds{{\it\$}}
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\def\shorttitlepage{\parsearg\shorttitlepagezzz}
+\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+\def\titlepage{\begingroup \parindent=0pt \textfonts
+ \let\subtitlerm=\tenrm
+ \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+ %
+ \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
+ %
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ %
+ % Now you can print the title using @title.
+ \def\title{\parsearg\titlezzz}%
+ \def\titlezzz##1{\leftline{\titlefonts\rm ##1}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Now you can put text using @subtitle.
+ \def\subtitle{\parsearg\subtitlezzz}%
+ \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
+ %
+ % @author should come last, but may come many times.
+ \def\author{\parsearg\authorzzz}%
+ \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
+ {\authorfont \leftline{##1}}}%
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \oldpage
+ \let\page = \oldpage
+ \hbox{}}%
+% \def\page{\oldpage \hbox{}}
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ %
+ % Need this before the \...aftertitlepage checks so that if they are
+ % in effect the toc pages will come out with page numbers.
+ \HEADINGSon
+ %
+ % If they want short, they certainly want long too.
+ \ifsetshortcontentsaftertitlepage
+ \shortcontents
+ \contents
+ \global\let\shortcontents = \relax
+ \global\let\contents = \relax
+ \fi
+ %
+ \ifsetcontentsaftertitlepage
+ \contents
+ \global\let\contents = \relax
+ \global\let\shortcontents = \relax
+ \fi
+ %
+ \ifpdf \pdfmakepagedesttrue \fi
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline % headline on even pages
+\newtoks\oddheadline % headline on odd pages
+\newtoks\evenfootline % footline on even pages
+\newtoks\oddfootline % footline on odd pages
+
+% Now make Tex use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\everyheading{\parsearg\everyheadingxxx}
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\everyfooting{\parsearg\everyfootingxxx}
+
+{\catcode`\@=0 %
+
+\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
+\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
+\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
+\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
+\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+ \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+ %
+ % Leave some space for the footline. Hopefully ok to assume
+ % @evenfooting will not be used by itself.
+ \global\advance\pageheight by -\baselineskip
+ \global\advance\vsize by -\baselineskip
+}
+
+\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+%
+}% unbind the catcode of @.
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
+\fi
+
+% @settitle line... specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg\settitlezzz}
+\def\settitlezzz #1{\gdef\thistitle{#1}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
+
+\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
+\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
+
+\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
+ \itemzzz {#1}}
+
+\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
+ \itemzzz {#1}}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemfont{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil
+ \leavevmode\unhbox0\par
+ \endgroup
+ %
+ % We're going to be starting a paragraph, but we don't want the
+ % \parskip glue -- logically it's part of the @item we just started.
+ \nobreak \vskip-\parskip
+ %
+ % Stop a page break at the \parskip glue coming up. Unfortunately
+ % we can't prevent a possible page break at the following
+ % \baselineskip glue.
+ \nobreak
+ \endgroup
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line.
+ \noindent
+ % Do this with kerns and \unhbox so that if there is a footnote in
+ % the item text, it can migrate to the main vertical list and
+ % eventually be printed.
+ \nobreak\kern-\tableindent
+ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+ \unhbox0
+ \nobreak\kern\dimen0
+ \endgroup
+ \itemxneedsnegativevskiptrue
+ \fi
+}
+
+\def\item{\errmessage{@item while not in a table}}
+\def\itemx{\errmessage{@itemx while not in a table}}
+\def\kitem{\errmessage{@kitem while not in a table}}
+\def\kitemx{\errmessage{@kitemx while not in a table}}
+\def\xitem{\errmessage{@xitem while not in a table}}
+\def\xitemx{\errmessage{@xitemx while not in a table}}
+
+% Contains a kludge to get @end[description] to work.
+\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
+% @table, @ftable, @vtable.
+\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+{\obeylines\obeyspaces%
+\gdef\tablex #1^^M{%
+\tabley\dontindex#1 \endtabley}}
+
+\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
+{\obeylines\obeyspaces%
+\gdef\ftablex #1^^M{%
+\tabley\fnitemindex#1 \endtabley
+\def\Eftable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
+{\obeylines\obeyspaces%
+\gdef\vtablex #1^^M{%
+\tabley\vritemindex#1 \endtabley
+\def\Evtable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\dontindex #1{}
+\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
+\def\vritemindex #1{\doind {vr}{\code{#1}}}%
+
+{\obeyspaces %
+\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
+\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\tablez #1#2#3#4#5#6{%
+\aboveenvbreak %
+\begingroup %
+\def\Edescription{\Etable}% Necessary kludge.
+\let\itemindex=#1%
+\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
+\ifnum 0#4>0 \tableindent=#4\mil \fi %
+\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
+\def\itemfont{#2}%
+\itemmax=\tableindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \tableindent %
+\exdentamount=\tableindent
+\parindent = 0pt
+\parskip = \smallskipamount
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def\Etable{\endgraf\afterenvbreak\endgroup}%
+\let\item = \internalBitem %
+\let\itemx = \internalBitemx %
+\let\kitem = \internalBkitem %
+\let\kitemx = \internalBkitemx %
+\let\xitem = \internalBxitem %
+\let\xitemx = \internalBxitemx %
+}
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\def\itemize{\parsearg\itemizezzz}
+
+\def\itemizezzz #1{%
+ \begingroup % ended by the @end itemize
+ \itemizey {#1}{\Eitemize}
+}
+
+\def\itemizey #1#2{%
+\aboveenvbreak %
+\itemmax=\itemindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \itemindent %
+\exdentamount=\itemindent
+\parindent = 0pt %
+\parskip = \smallskipamount %
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def#2{\endgraf\afterenvbreak\endgroup}%
+\def\itemcontents{#1}%
+\let\item=\itemizeitem}
+
+% Set sfcode to normal for the chars that usually have another value.
+% These are `.?!:;,'
+\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000
+ \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\def\enumerate{\parsearg\enumeratezzz}
+\def\enumeratezzz #1{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ \begingroup % ended by the @end enumerate
+ %
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call itemizey, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \itemizey{#1.}\Eenumerate\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+% Definition of @item while inside @itemize.
+
+\def\itemizeitem{%
+\advance\itemno by 1
+{\let\par=\endgraf \smallbreak}%
+\ifhmode \errmessage{In hmode at itemizeitem}\fi
+{\parskip=0in \hskip 0pt
+\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
+\vadjust{\penalty 1200}}%
+\flushcr}
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @columnfractions .25 .3 .45
+% @item ...
+%
+% Numbers following @columnfractions are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+%
+% For those who want to use more than one line's worth of words in
+% the preamble, break the line within one argument and it
+% will parse correctly, i.e.,
+%
+% @multitable {Column 1 template} {Column 2 template} {Column 3
+% template}
+% Not:
+% @multitable {Column 1 template} {Column 2 template}
+% {Column 3 template}
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab, @multitable or @end multitable do not need to be on their
+% own lines, but it will not hurt if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+% to baseline.
+% 0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the part of the @columnfraction before the decimal point, which
+% is presumably either 0 or the empty string (but we don't check, we
+% just throw it away). #2 is the decimal part, which we use as the
+% percent of \hsize for this column.
+\def\pickupwholefraction#1.#2 {%
+ \global\advance\colcount by 1
+ \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
+ \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+ \def\firstarg{#1}%
+ \ifx\firstarg\xendsetuptable
+ \let\go = \relax
+ \else
+ \ifx\firstarg\xcolumnfractions
+ \global\setpercenttrue
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction
+ \else
+ \global\advance\colcount by 1
+ \setbox0=\hbox{#1\unskip }% Add a normal word space as a separator;
+ % typically that is always in the input, anyway.
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi
+ \fi
+ \ifx\go\pickupwholefraction
+ % Put the argument back for the \pickupwholefraction call, so
+ % we'll always have a period there to be parsed.
+ \def\go{\pickupwholefraction#1}%
+ \else
+ \let\go = \setuptable
+ \fi%
+ \fi
+ \go
+}
+
+% This used to have \hskip1sp. But then the space in a template line is
+% not enough. That is bad. So let's go back to just & until we
+% encounter the problem it was intended to solve again.
+% --karl, nathan@acm.org, 20apr99.
+\def\tab{&}
+
+% @multitable ... @end multitable definitions:
+%
+\def\multitable{\parsearg\dotable}
+\def\dotable#1{\bgroup
+ \vskip\parskip
+ \let\item\crcr
+ \tolerance=9500
+ \hbadness=9500
+ \setmultitablespacing
+ \parskip=\multitableparskip
+ \parindent=\multitableparindent
+ \overfullrule=0pt
+ \global\colcount=0
+ \def\Emultitable{\global\setpercentfalse\cr\egroup\egroup}%
+ %
+ % To parse everything between @multitable and @item:
+ \setuptable#1 \endsetuptable
+ %
+ % \everycr will reset column counter, \colcount, at the end of
+ % each line. Every column entry will cause \colcount to advance by one.
+ % The table preamble
+ % looks at the current \colcount to find the correct column width.
+ \everycr{\noalign{%
+ %
+ % \filbreak%% keeps underfull box messages off when table breaks over pages.
+ % Maybe so, but it also creates really weird page breaks when the table
+ % breaks over pages. Wouldn't \vfil be better? Wait until the problem
+ % manifests itself, so it can be fixed for real --karl.
+ \global\colcount=0\relax}}%
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+ \halign\bgroup&\global\advance\colcount by 1\relax
+ \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
+ %
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \multitablecolspace to all columns after
+ % the first one.
+ %
+ % If a template has been used, we will add \multitablecolspace
+ % to the width of each template entry.
+ %
+ % If the user has set preamble in terms of percent of \hsize we will
+ % use that dimension as the width of the column, and the \leftskip
+ % will keep entries from bumping into each other. Table will start at
+ % left margin and final column will justify at right margin.
+ %
+ % Make sure we don't inherit \rightskip from the outer environment.
+ \rightskip=0pt
+ \ifnum\colcount=1
+ % The first column will be indented with the surrounding text.
+ \advance\hsize by\leftskip
+ \else
+ \ifsetpercent \else
+ % If user has not set preamble in terms of percent of \hsize
+ % we will advance \hsize by \multitablecolspace.
+ \advance\hsize by \multitablecolspace
+ \fi
+ % In either case we will make \leftskip=\multitablecolspace:
+ \leftskip=\multitablecolspace
+ \fi
+ % Ignoring space at the beginning and end avoids an occasional spurious
+ % blank line, when TeX decides to break the line at the space before the
+ % box from the multistrut, so the strut ends up on a line by itself.
+ % For example:
+ % @multitable @columnfractions .11 .89
+ % @item @code{#}
+ % @tab Legal holiday which is valid in major parts of the whole country.
+ % Is automatically provided with highlighting sequences respectively marking
+ % characters.
+ \noindent\ignorespaces##\unskip\multistrut}\cr
+}
+
+\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
+% If so, do nothing. If not, give it an appropriate dimension based on
+% current baselineskip.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+%% strut to put in table in case some entry doesn't have descenders,
+%% to keep lines equally spaced
+\let\multistrut = \strut
+\else
+%% FIXME: what is \box0 supposed to be?
+\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
+width0pt\relax} \fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%% If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+% Prevent errors for section commands.
+% Used in @ignore and in failing conditionals.
+\def\ignoresections{%
+ \let\chapter=\relax
+ \let\unnumbered=\relax
+ \let\top=\relax
+ \let\unnumberedsec=\relax
+ \let\unnumberedsection=\relax
+ \let\unnumberedsubsec=\relax
+ \let\unnumberedsubsection=\relax
+ \let\unnumberedsubsubsec=\relax
+ \let\unnumberedsubsubsection=\relax
+ \let\section=\relax
+ \let\subsec=\relax
+ \let\subsubsec=\relax
+ \let\subsection=\relax
+ \let\subsubsection=\relax
+ \let\appendix=\relax
+ \let\appendixsec=\relax
+ \let\appendixsection=\relax
+ \let\appendixsubsec=\relax
+ \let\appendixsubsection=\relax
+ \let\appendixsubsubsec=\relax
+ \let\appendixsubsubsection=\relax
+ \let\contents=\relax
+ \let\smallbook=\relax
+ \let\titlepage=\relax
+}
+
+% Used in nested conditionals, where we have to parse the Texinfo source
+% and so want to turn off most commands, in case they are used
+% incorrectly.
+%
+\def\ignoremorecommands{%
+ \let\defcodeindex = \relax
+ \let\defcv = \relax
+ \let\deffn = \relax
+ \let\deffnx = \relax
+ \let\defindex = \relax
+ \let\defivar = \relax
+ \let\defmac = \relax
+ \let\defmethod = \relax
+ \let\defop = \relax
+ \let\defopt = \relax
+ \let\defspec = \relax
+ \let\deftp = \relax
+ \let\deftypefn = \relax
+ \let\deftypefun = \relax
+ \let\deftypeivar = \relax
+ \let\deftypeop = \relax
+ \let\deftypevar = \relax
+ \let\deftypevr = \relax
+ \let\defun = \relax
+ \let\defvar = \relax
+ \let\defvr = \relax
+ \let\ref = \relax
+ \let\xref = \relax
+ \let\printindex = \relax
+ \let\pxref = \relax
+ \let\settitle = \relax
+ \let\setchapternewpage = \relax
+ \let\setchapterstyle = \relax
+ \let\everyheading = \relax
+ \let\evenheading = \relax
+ \let\oddheading = \relax
+ \let\everyfooting = \relax
+ \let\evenfooting = \relax
+ \let\oddfooting = \relax
+ \let\headings = \relax
+ \let\include = \relax
+ \let\lowersections = \relax
+ \let\down = \relax
+ \let\raisesections = \relax
+ \let\up = \relax
+ \let\set = \relax
+ \let\clear = \relax
+ \let\item = \relax
+}
+
+% Ignore @ignore ... @end ignore.
+%
+\def\ignore{\doignore{ignore}}
+
+% Also ignore @ifinfo, @ifhtml, @ifnottex, @html, @menu,
+% @documentdescription, and @direntry text.
+%
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\html{\doignore{html}}
+\def\menu{\doignore{menu}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\direntry{\doignore{direntry}}
+
+% @dircategory CATEGORY -- specify a category of the dir file
+% which this file should belong to. Ignore this in TeX.
+\let\dircategory = \comment
+
+% Ignore text until a line `@end #1'.
+%
+\def\doignore#1{\begingroup
+ % Don't complain about control sequences we have declared \outer.
+ \ignoresections
+ %
+ % Define a command to swallow text until we reach `@end #1'.
+ % This @ is a catcode 12 token (that is the normal catcode of @ in
+ % this texinfo.tex file). We change the catcode of @ below to match.
+ \long\def\doignoretext##1@end #1{\enddoignore}%
+ %
+ % Make sure that spaces turn into tokens that match what \doignoretext wants.
+ \catcode32 = 10
+ %
+ % Ignore braces, too, so mismatched braces don't cause trouble.
+ \catcode`\{ = 9
+ \catcode`\} = 9
+ %
+ % We must not have @c interpreted as a control sequence.
+ \catcode`\@ = 12
+ %
+ % Make the letter c a comment character so that the rest of the line
+ % will be ignored. This way, the document can have (for example)
+ % @c @end ifinfo
+ % and the @end ifinfo will be properly ignored.
+ % (We've just changed @ to catcode 12.)
+ \catcode`\c = 14
+ %
+ % And now expand that command.
+ \doignoretext
+}
+
+% What we do to finish off ignored text.
+%
+\def\enddoignore{\endgroup\ignorespaces}%
+
+\newif\ifwarnedobs\warnedobsfalse
+\def\obstexwarn{%
+ \ifwarnedobs\relax\else
+ % We need to warn folks that they may have trouble with TeX 3.0.
+ % This uses \immediate\write16 rather than \message to get newlines.
+ \immediate\write16{}
+ \immediate\write16{WARNING: for users of Unix TeX 3.0!}
+ \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
+ \immediate\write16{If you are running another version of TeX, relax.}
+ \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
+ \immediate\write16{ Then upgrade your TeX installation if you can.}
+ \immediate\write16{ (See ftp://ftp.gnu.org/pub/gnu/TeX.README.)}
+ \immediate\write16{If you are stuck with version 3.0, run the}
+ \immediate\write16{ script ``tex3patch'' from the Texinfo distribution}
+ \immediate\write16{ to use a workaround.}
+ \immediate\write16{}
+ \global\warnedobstrue
+ \fi
+}
+
+% **In TeX 3.0, setting text in \nullfont hangs tex. For a
+% workaround (which requires the file ``dummy.tfm'' to be installed),
+% uncomment the following line:
+%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
+
+% Ignore text, except that we keep track of conditional commands for
+% purposes of nesting, up to an `@end #1' command.
+%
+\def\nestedignore#1{%
+ \obstexwarn
+ % We must actually expand the ignored text to look for the @end
+ % command, so that nested ignore constructs work. Thus, we put the
+ % text into a \vbox and then do nothing with the result. To minimize
+ % the change of memory overflow, we follow the approach outlined on
+ % page 401 of the TeXbook: make the current font be a dummy font.
+ %
+ \setbox0 = \vbox\bgroup
+ % Don't complain about control sequences we have declared \outer.
+ \ignoresections
+ %
+ % Define `@end #1' to end the box, which will in turn undefine the
+ % @end command again.
+ \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
+ %
+ % We are going to be parsing Texinfo commands. Most cause no
+ % trouble when they are used incorrectly, but some commands do
+ % complicated argument parsing or otherwise get confused, so we
+ % undefine them.
+ %
+ % We can't do anything about stray @-signs, unfortunately;
+ % they'll produce `undefined control sequence' errors.
+ \ignoremorecommands
+ %
+ % Set the current font to be \nullfont, a TeX primitive, and define
+ % all the font commands to also use \nullfont. We don't use
+ % dummy.tfm, as suggested in the TeXbook, because not all sites
+ % might have that installed. Therefore, math mode will still
+ % produce output, but that should be an extremely small amount of
+ % stuff compared to the main input.
+ %
+ \nullfont
+ \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont
+ \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont
+ \let\tensf=\nullfont
+ % Similarly for index fonts.
+ \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont
+ \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont
+ \let\smallsf=\nullfont
+ % Similarly for smallexample fonts.
+ \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont
+ \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont
+ \let\smallersf=\nullfont
+ %
+ % Don't complain when characters are missing from the fonts.
+ \tracinglostchars = 0
+ %
+ % Don't bother to do space factor calculations.
+ \frenchspacing
+ %
+ % Don't report underfull hboxes.
+ \hbadness = 10000
+ %
+ % Do minimal line-breaking.
+ \pretolerance = 10000
+ %
+ % Do not execute instructions in @tex
+ \def\tex{\doignore{tex}}%
+ % Do not execute macro definitions.
+ % `c' is a comment character, so the word `macro' will get cut off.
+ \def\macro{\doignore{ma}}%
+}
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it. Make sure the catcode of space is correct to avoid
+% losing inside @example, for instance.
+%
+\def\set{\begingroup\catcode` =10
+ \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
+ \parsearg\setxxx}
+\def\setxxx#1{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+ \def\temp{#2}%
+ \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
+ \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
+ \fi
+ \endgroup
+}
+% Can't use \xdef to pre-expand #2 and save some time, since \temp or
+% \next or other control sequences that we've defined might get us into
+% an infinite loop. Consider `@set foo @cite{bar}'.
+\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\def\clear{\parsearg\clearxxx}
+\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
+
+% @value{foo} gets the text saved in variable foo.
+{
+ \catcode`\_ = \active
+ %
+ % We might end up with active _ or - characters in the argument if
+ % we're called from @code, as @code{@value{foo-bar_}}. So \let any
+ % such active characters to their normal equivalents.
+ \gdef\value{\begingroup
+ \catcode`\-=12 \catcode`\_=12
+ \indexbreaks \let_\normalunderscore
+ \valuexxx}
+}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we \let\value to this in \indexdummies). Ones
+% whose names contain - or _ still won't work, but we can't do anything
+% about that. The command has to be fully expandable, since the result
+% winds up in the index file. This means that if the variable's value
+% contains other Texinfo commands, it's almost certain it will fail
+% (although perhaps we could fix that with sufficient work to do a
+% one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ {[No value for ``#1'']}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+\def\ifset{\parsearg\ifsetxxx}
+\def\ifsetxxx #1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ \expandafter\ifsetfail
+ \else
+ \expandafter\ifsetsucceed
+ \fi
+}
+\def\ifsetsucceed{\conditionalsucceed{ifset}}
+\def\ifsetfail{\nestedignore{ifset}}
+\defineunmatchedend{ifset}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+\def\ifclear{\parsearg\ifclearxxx}
+\def\ifclearxxx #1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ \expandafter\ifclearsucceed
+ \else
+ \expandafter\ifclearfail
+ \fi
+}
+\def\ifclearsucceed{\conditionalsucceed{ifclear}}
+\def\ifclearfail{\nestedignore{ifclear}}
+\defineunmatchedend{ifclear}
+
+% @iftex, @ifnothtml, @ifnotinfo always succeed; we read the text
+% following, through the first @end iftex (etc.). Make `@end iftex'
+% (etc.) valid only after an @iftex.
+%
+\def\iftex{\conditionalsucceed{iftex}}
+\def\ifnothtml{\conditionalsucceed{ifnothtml}}
+\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
+\defineunmatchedend{iftex}
+\defineunmatchedend{ifnothtml}
+\defineunmatchedend{ifnotinfo}
+
+% We can't just want to start a group at @iftex (for example) and end it
+% at @end iftex, since then @set commands inside the conditional have no
+% effect (they'd get reverted at the end of the group). So we must
+% define \Eiftex to redefine itself to be its previous value. (We can't
+% just define it to fail again with an ``unmatched end'' error, since
+% the @ifset might be nested.)
+%
+\def\conditionalsucceed#1{%
+ \edef\temp{%
+ % Remember the current value of \E#1.
+ \let\nece{prevE#1} = \nece{E#1}%
+ %
+ % At the `@end #1', redefine \E#1 to be its previous value.
+ \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}%
+ }%
+ \temp
+}
+
+% We need to expand lots of \csname's, but we don't want to expand the
+% control sequences after we've constructed them.
+%
+\def\nece#1{\expandafter\noexpand\csname#1\endcsname}
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within \newindex.
+{\catcode`\@=11
+\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
+ \noexpand\doindex{#1}}
+}
+
+% @defindex foo == \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+ % Only do \closeout if we haven't already done it, else we'll end up
+ % closing the target index.
+ \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+ % The \closeout helps reduce unnecessary open files; the limit on the
+ % Acorn RISC OS is a mere 16 files.
+ \expandafter\closeout\csname#2indfile\endcsname
+ \expandafter\let\csname\donesynindex#2\endcsname = 1
+ \fi
+ % redefine \fooindfile:
+ \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+ \expandafter\let\csname#2indfile\endcsname=\temp
+ % redefine \fooindex:
+ \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of texinfo commands likely to appear in an index entry.
+% (Must be a way to avoid doing expansion at all, and thus not have to
+% laboriously list every single command here.)
+%
+\def\indexdummies{%
+\def\ { }%
+\def\@{@}% change to @@ when we switch to @ as escape char in aux files.
+% Need these in case \tex is in effect and \{ is a \delimiter again.
+% But can't use \lbracecmd and \rbracecmd because texindex assumes
+% braces and backslashes are used only as delimiters.
+\let\{ = \mylbrace
+\let\} = \myrbrace
+\def\_{{\realbackslash _}}%
+\normalturnoffactive
+%
+% Take care of the plain tex accent commands.
+\def\,##1{\realbackslash ,{##1}}%
+\def\"{\realbackslash "}%
+\def\`{\realbackslash `}%
+\def\'{\realbackslash '}%
+\def\^{\realbackslash ^}%
+\def\~{\realbackslash ~}%
+\def\={\realbackslash =}%
+\def\b{\realbackslash b}%
+\def\c{\realbackslash c}%
+\def\d{\realbackslash d}%
+\def\u{\realbackslash u}%
+\def\v{\realbackslash v}%
+\def\H{\realbackslash H}%
+\def\dotless##1{\realbackslash dotless {##1}}%
+% Take care of the plain tex special European modified letters.
+\def\AA{\realbackslash AA}%
+\def\AE{\realbackslash AE}%
+\def\L{\realbackslash L}%
+\def\OE{\realbackslash OE}%
+\def\O{\realbackslash O}%
+\def\aa{\realbackslash aa}%
+\def\ae{\realbackslash ae}%
+\def\l{\realbackslash l}%
+\def\oe{\realbackslash oe}%
+\def\o{\realbackslash o}%
+\def\ss{\realbackslash ss}%
+%
+% Although these internals commands shouldn't show up, sometimes they do.
+\def\bf{\realbackslash bf }%
+\def\gtr{\realbackslash gtr}%
+\def\hat{\realbackslash hat}%
+\def\less{\realbackslash less}%
+%\def\rm{\realbackslash rm }%
+\def\sf{\realbackslash sf}%
+\def\sl{\realbackslash sl }%
+\def\tclose##1{\realbackslash tclose {##1}}%
+\def\tt{\realbackslash tt}%
+%
+\def\b##1{\realbackslash b {##1}}%
+\def\i##1{\realbackslash i {##1}}%
+\def\sc##1{\realbackslash sc {##1}}%
+\def\t##1{\realbackslash t {##1}}%
+\def\r##1{\realbackslash r {##1}}%
+%
+\def\TeX{\realbackslash TeX}%
+\def\acronym##1{\realbackslash acronym {##1}}%
+\def\cite##1{\realbackslash cite {##1}}%
+\def\code##1{\realbackslash code {##1}}%
+\def\command##1{\realbackslash command {##1}}%
+\def\dfn##1{\realbackslash dfn {##1}}%
+\def\dots{\realbackslash dots }%
+\def\emph##1{\realbackslash emph {##1}}%
+\def\env##1{\realbackslash env {##1}}%
+\def\file##1{\realbackslash file {##1}}%
+\def\kbd##1{\realbackslash kbd {##1}}%
+\def\key##1{\realbackslash key {##1}}%
+\def\math##1{\realbackslash math {##1}}%
+\def\option##1{\realbackslash option {##1}}%
+\def\samp##1{\realbackslash samp {##1}}%
+\def\strong##1{\realbackslash strong {##1}}%
+\def\uref##1{\realbackslash uref {##1}}%
+\def\url##1{\realbackslash url {##1}}%
+\def\var##1{\realbackslash var {##1}}%
+\def\w{\realbackslash w }%
+%
+% These math commands don't seem likely to be used in index entries.
+\def\copyright{\realbackslash copyright}%
+\def\equiv{\realbackslash equiv}%
+\def\error{\realbackslash error}%
+\def\expansion{\realbackslash expansion}%
+\def\point{\realbackslash point}%
+\def\print{\realbackslash print}%
+\def\result{\realbackslash result}%
+%
+% Handle some cases of @value -- where the variable name does not
+% contain - or _, and the value does not contain any
+% (non-fully-expandable) commands.
+\let\value = \expandablevalue
+%
+\unsepspaces
+% Turn off macro expansion
+\turnoffmacros
+}
+
+% If an index command is used in an @example environment, any spaces
+% therein should become regular spaces in the raw index file, not the
+% expansion of \tie (\\leavevmode \penalty \@M \ ).
+{\obeyspaces
+ \gdef\unsepspaces{\obeyspaces\let =\space}}
+
+% \indexnofonts no-ops all font-change commands.
+% This is used when outputting the strings to sort the index by.
+\def\indexdummyfont#1{#1}
+\def\indexdummytex{TeX}
+\def\indexdummydots{...}
+
+\def\indexnofonts{%
+\def\@{@}%
+% how to handle braces?
+\def\_{\normalunderscore}%
+%
+\let\,=\indexdummyfont
+\let\"=\indexdummyfont
+\let\`=\indexdummyfont
+\let\'=\indexdummyfont
+\let\^=\indexdummyfont
+\let\~=\indexdummyfont
+\let\==\indexdummyfont
+\let\b=\indexdummyfont
+\let\c=\indexdummyfont
+\let\d=\indexdummyfont
+\let\u=\indexdummyfont
+\let\v=\indexdummyfont
+\let\H=\indexdummyfont
+\let\dotless=\indexdummyfont
+% Take care of the plain tex special European modified letters.
+\def\AA{AA}%
+\def\AE{AE}%
+\def\L{L}%
+\def\OE{OE}%
+\def\O{O}%
+\def\aa{aa}%
+\def\ae{ae}%
+\def\l{l}%
+\def\oe{oe}%
+\def\o{o}%
+\def\ss{ss}%
+%
+% Don't no-op \tt, since it isn't a user-level command
+% and is used in the definitions of the active chars like <, >, |, etc.
+% Likewise with the other plain tex font commands.
+%\let\tt=\indexdummyfont
+%
+\let\b=\indexdummyfont
+\let\i=\indexdummyfont
+\let\r=\indexdummyfont
+\let\sc=\indexdummyfont
+\let\t=\indexdummyfont
+%
+\let\TeX=\indexdummytex
+\let\acronym=\indexdummyfont
+\let\cite=\indexdummyfont
+\let\code=\indexdummyfont
+\let\command=\indexdummyfont
+\let\dfn=\indexdummyfont
+\let\dots=\indexdummydots
+\let\emph=\indexdummyfont
+\let\env=\indexdummyfont
+\let\file=\indexdummyfont
+\let\kbd=\indexdummyfont
+\let\key=\indexdummyfont
+\let\math=\indexdummyfont
+\let\option=\indexdummyfont
+\let\samp=\indexdummyfont
+\let\strong=\indexdummyfont
+\let\uref=\indexdummyfont
+\let\url=\indexdummyfont
+\let\var=\indexdummyfont
+\let\w=\indexdummyfont
+}
+
+% To define \realbackslash, we must make \ not be an escape.
+% We must first make another character (@) an escape
+% so we do not become unable to do a definition.
+
+{\catcode`\@=0 \catcode`\\=\other
+ @gdef@realbackslash{\}}
+
+\let\indexbackslash=0 %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% For \ifx comparisons.
+\def\emptymacro{\empty}
+
+% Most index entries go through here, but \dosubind is the general case.
+%
+\def\doind#1#2{\dosubind{#1}{#2}\empty}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% \empty if called from \doind, as we usually are. The main exception
+% is with defuns, which call us directly.
+%
+\def\dosubind#1#2#3{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+ \fi
+ {%
+ \count255=\lastpenalty
+ {%
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \escapechar=`\\
+ {%
+ \let\folio = 0% We will expand all macros now EXCEPT \folio.
+ \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+ % so it will be output as is; and it will print as backslash.
+ %
+ \def\thirdarg{#3}%
+ %
+ % If third arg is present, precede it with space in sort key.
+ \ifx\thirdarg\emptymacro
+ \let\subentry = \empty
+ \else
+ \def\subentry{ #3}%
+ \fi
+ %
+ % First process the index entry with all font commands turned
+ % off to get the string to sort by.
+ {\indexnofonts \xdef\indexsorttmp{#2\subentry}}%
+ %
+ % Now the real index entry with the fonts.
+ \toks0 = {#2}%
+ %
+ % If the third (subentry) arg is present, add it to the index
+ % line to write.
+ \ifx\thirdarg\emptymacro \else
+ \toks0 = \expandafter{\the\toks0{#3}}%
+ \fi
+ %
+ % Set up the complete index entry, with both the sort key and
+ % the original text, including any font commands. We write
+ % three arguments to \entry to the .?? file (four in the
+ % subentry case), texindex reduces to two when writing the .??s
+ % sorted result.
+ \edef\temp{%
+ \write\csname#1indfile\endcsname{%
+ \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
+ }%
+ %
+ % If a skip is the last thing on the list now, preserve it
+ % by backing up by \lastskip, doing the \write, then inserting
+ % the skip again. Otherwise, the whatsit generated by the
+ % \write will make \lastskip zero. The result is that sequences
+ % like this:
+ % @end defun
+ % @tindex whatever
+ % @defun ...
+ % will have extra space inserted, because the \medbreak in the
+ % start of the @defun won't see the skip inserted by the @end of
+ % the previous defun.
+ %
+ % But don't do any of this if we're not in vertical mode. We
+ % don't want to do a \vskip and prematurely end a paragraph.
+ %
+ % Avoid page breaks due to these extra skips, too.
+ %
+ \iflinks
+ \ifvmode
+ \skip0 = \lastskip
+ \ifdim\lastskip = 0pt \else \nobreak\vskip-\lastskip \fi
+ \fi
+ %
+ \temp % do the write
+ %
+ %
+ \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi
+ \fi
+ }%
+ }%
+ \penalty\count255
+ }%
+}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\def\printindex{\parsearg\doprintindex}
+\def\doprintindex#1{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \smallfonts \rm
+ \tolerance = 9500
+ \indexbreaks
+ %
+ % See if the index file exists and is nonempty.
+ % Change catcode of @ here so that if the index file contains
+ % \initial {@}
+ % as its first line, TeX doesn't complain about mismatched braces
+ % (because it thinks @} is a control sequence).
+ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\rawbackslashxx}%
+ \catcode`\\ = 0
+ \escapechar = `\\
+ \begindoublecolumns
+ \input \jobname.#1s
+ \enddoublecolumns
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+ % Some minor font changes for the special characters.
+ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+ %
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ \penalty -300
+ %
+ % Typeset the initial. Making this add up to a whole number of
+ % baselineskips increases the chance of the dots lining up from column
+ % to column. It still won't often be perfect, because of the stretch
+ % we need before each entry, but it's better.
+ %
+ % No shrink because it confuses \balancecolumns.
+ \vskip 1.67\baselineskip plus .5\baselineskip
+ \leftline{\secbf #1}%
+ \vskip .33\baselineskip plus .1\baselineskip
+ %
+ % Do our best not to break after the initial.
+ \nobreak
+}}
+
+% This typesets a paragraph consisting of #1, dot leaders, and then #2
+% flush to the right margin. It is used for index and table of contents
+% entries. The paragraph is indented by \leftskip.
+%
+\def\entry#1#2{\begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % Do not fill out the last line with white space.
+ \parfillskip = 0in
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % \hangindent is only relevant when the entry text and page number
+ % don't both fit on one line. In that case, bob suggests starting the
+ % dots pretty far over on the line. Unfortunately, a large
+ % indentation looks wrong when the entry text itself is broken across
+ % lines. So we use a small indentation and put up with long leaders.
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
+ % A bit of stretch before each entry for the benefit of balancing columns.
+ \vskip 0pt plus1pt
+ %
+ % Start a ``paragraph'' for the index entry so the line breaking
+ % parameters we've set above will have an effect.
+ \noindent
+ %
+ % Insert the text of the index entry. TeX will do line-breaking on it.
+ #1%
+ % The following is kludged to not output a line of dots in the index if
+ % there are no page numbers. The next person who breaks this will be
+ % cursed by a Unix daemon.
+ \def\tempa{{\rm }}%
+ \def\tempb{#2}%
+ \edef\tempc{\tempa}%
+ \edef\tempd{\tempb}%
+ \ifx\tempc\tempd\ \else%
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ \ #2% The page number ends the paragraph.
+ \fi
+ \fi%
+ \par
+\endgroup}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+ \parfillskip=0in
+ \parskip=0in
+ \hangindent=1in
+ \hangafter=1
+ \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ #2
+ \fi
+ \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+ \output = {%
+ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+ % that case we just ship out what is in \partialpage with the normal
+ % output routine. Generally, \partialpage will be empty when this
+ % runs and this will be a no-op. See the indexspread.tex test case.
+ \ifvoid\partialpage \else
+ \onepageout{\pagecontents\partialpage}%
+ \fi
+ %
+ \global\setbox\partialpage = \vbox{%
+ % Unvbox the main output page.
+ \unvbox\PAGE
+ \kern-\topskip \kern\baselineskip
+ }%
+ }%
+ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+ %
+ % Change the page size parameters. We could do this once outside this
+ % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+ % format, but then we repeat the same computation. Repeating a couple
+ % of assignments once per index is clearly meaningless for the
+ % execution time, so we may as well do it in one place.
+ %
+ % First we halve the line length, less a little for the gutter between
+ % the columns. We compute the gutter based on the line length, so it
+ % changes automatically with the paper format. The magic constant
+ % below is chosen so that the gutter has the same value (well, +-<1pt)
+ % as it did when we hard-coded it.
+ %
+ % We put the result in a separate register, \doublecolumhsize, so we
+ % can restore it in \pagesofar, after \hsize itself has (potentially)
+ % been clobbered.
+ %
+ \doublecolumnhsize = \hsize
+ \advance\doublecolumnhsize by -.04154\hsize
+ \divide\doublecolumnhsize by 2
+ \hsize = \doublecolumnhsize
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
+ \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ \advance\dimen@ by -\ht\partialpage
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255
+ \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+ \unvbox\partialpage
+ %
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize
+ \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+ \output = {%
+ % Split the last of the double-column material. Leave it on the
+ % current page, no automatic page break.
+ \balancecolumns
+ %
+ % If we end up splitting too much material for the current page,
+ % though, there will be another page break right after this \output
+ % invocation ends. Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away. (We hope \balancecolumns will never be
+ % called on to balance too much material, but if it is, this makes
+ % the output somewhat more palatable.)
+ \global\output = {\onepageout{\pagecontents\PAGE}}%
+ }%
+ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+ % \pagegoal was set to the doubled \vsize above, since we restarted
+ % the current page. We're now back to normal single-column
+ % typesetting, so reset \pagegoal to the normal \vsize (after the
+ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2 % target to split to
+ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \splittopskip = \topskip
+ % Loop until we get a decent breakpoint.
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ \ifdim\ht3>\dimen@
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ %
+ \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+\newcount\chapno
+\newcount\secno \secno=0
+\newcount\subsecno \subsecno=0
+\newcount\subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno \appendixno = `\@
+% \def\appendixletter{\char\the\appendixno}
+% We do the following for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+\def\appendixletter{%
+ \ifnum\appendixno=`A A%
+ \else\ifnum\appendixno=`B B%
+ \else\ifnum\appendixno=`C C%
+ \else\ifnum\appendixno=`D D%
+ \else\ifnum\appendixno=`E E%
+ \else\ifnum\appendixno=`F F%
+ \else\ifnum\appendixno=`G G%
+ \else\ifnum\appendixno=`H H%
+ \else\ifnum\appendixno=`I I%
+ \else\ifnum\appendixno=`J J%
+ \else\ifnum\appendixno=`K K%
+ \else\ifnum\appendixno=`L L%
+ \else\ifnum\appendixno=`M M%
+ \else\ifnum\appendixno=`N N%
+ \else\ifnum\appendixno=`O O%
+ \else\ifnum\appendixno=`P P%
+ \else\ifnum\appendixno=`Q Q%
+ \else\ifnum\appendixno=`R R%
+ \else\ifnum\appendixno=`S S%
+ \else\ifnum\appendixno=`T T%
+ \else\ifnum\appendixno=`U U%
+ \else\ifnum\appendixno=`V V%
+ \else\ifnum\appendixno=`W W%
+ \else\ifnum\appendixno=`X X%
+ \else\ifnum\appendixno=`Y Y%
+ \else\ifnum\appendixno=`Z Z%
+ % The \the is necessary, despite appearances, because \appendixletter is
+ % expanded while writing the .toc file. \char\appendixno is not
+ % expandable, thus it is written literally, thus all appendixes come out
+ % with the same letter (or @) in the toc without it.
+ \else\char\the\appendixno
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raise/lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% Choose a numbered-heading macro
+% #1 is heading level if unmodified by @raisesections or @lowersections
+% #2 is text for heading
+\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+ \chapterzzz{#2}
+\or
+ \seczzz{#2}
+\or
+ \numberedsubseczzz{#2}
+\or
+ \numberedsubsubseczzz{#2}
+\else
+ \ifnum \absseclevel<0
+ \chapterzzz{#2}
+ \else
+ \numberedsubsubseczzz{#2}
+ \fi
+\fi
+}
+
+% like \numhead, but chooses appendix heading levels
+\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+ \appendixzzz{#2}
+\or
+ \appendixsectionzzz{#2}
+\or
+ \appendixsubseczzz{#2}
+\or
+ \appendixsubsubseczzz{#2}
+\else
+ \ifnum \absseclevel<0
+ \appendixzzz{#2}
+ \else
+ \appendixsubsubseczzz{#2}
+ \fi
+\fi
+}
+
+% like \numhead, but chooses numberless heading levels
+\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+ \unnumberedzzz{#2}
+\or
+ \unnumberedseczzz{#2}
+\or
+ \unnumberedsubseczzz{#2}
+\or
+ \unnumberedsubsubseczzz{#2}
+\else
+ \ifnum \absseclevel<0
+ \unnumberedzzz{#2}
+ \else
+ \unnumberedsubsubseczzz{#2}
+ \fi
+\fi
+}
+
+% @chapter, @appendix, @unnumbered.
+\def\thischaptername{No Chapter Title}
+\outer\def\chapter{\parsearg\chapteryyy}
+\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz #1{%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}%
+\chapmacro {#1}{\the\chapno}%
+\gdef\thissection{#1}%
+\gdef\thischaptername{#1}%
+% We don't substitute the actual chapter name into \thischapter
+% because we don't want its macros evaluated now.
+\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
+\toks0 = {#1}%
+\edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}%
+ {\the\chapno}}}%
+\temp
+\donoderef
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\def\appendix{\parsearg\appendixyyy}
+\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz #1{%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \appendixno by 1
+\message{\putwordAppendix\space \appendixletter}%
+\chapmacro {#1}{\putwordAppendix{} \appendixletter}%
+\gdef\thissection{#1}%
+\gdef\thischaptername{#1}%
+\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
+\toks0 = {#1}%
+\edef\temp{\noexpand\writetocentry{\realbackslash appendixentry{\the\toks0}%
+ {\appendixletter}}}%
+\temp
+\appendixnoderef
+\global\let\section = \appendixsec
+\global\let\subsection = \appendixsubsec
+\global\let\subsubsection = \appendixsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\def\centerchap{\parsearg\centerchapyyy}
+\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
+
+% @top is like @unnumbered.
+\outer\def\top{\parsearg\unnumberedyyy}
+
+\outer\def\unnumbered{\parsearg\unnumberedyyy}
+\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz #1{%
+\secno=0 \subsecno=0 \subsubsecno=0
+%
+% This used to be simply \message{#1}, but TeX fully expands the
+% argument to \message. Therefore, if #1 contained @-commands, TeX
+% expanded them. For example, in `@unnumbered The @cite{Book}', TeX
+% expanded @cite (which turns out to cause errors because \cite is meant
+% to be executed, not expanded).
+%
+% Anyway, we don't want the fully-expanded definition of @cite to appear
+% as a result of the \message, we just want `@cite' itself. We use
+% \the<toks register> to achieve this: TeX expands \the<toks> only once,
+% simply yielding the contents of <toks register>. (We also do this for
+% the toc entries.)
+\toks0 = {#1}\message{(\the\toks0)}%
+%
+\unnumbchapmacro {#1}%
+\gdef\thischapter{#1}\gdef\thissection{#1}%
+\toks0 = {#1}%
+\edef\temp{\noexpand\writetocentry{\realbackslash unnumbchapentry{\the\toks0}}}%
+\temp
+\unnumbnoderef
+\global\let\section = \unnumberedsec
+\global\let\subsection = \unnumberedsubsec
+\global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% Sections.
+\outer\def\numberedsec{\parsearg\secyyy}
+\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
+\def\seczzz #1{%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
+\toks0 = {#1}%
+\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}%
+ {\the\chapno}{\the\secno}}}%
+\temp
+\donoderef
+\nobreak
+}
+
+\outer\def\appendixsection{\parsearg\appendixsecyyy}
+\outer\def\appendixsec{\parsearg\appendixsecyyy}
+\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz #1{%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
+\toks0 = {#1}%
+\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}%
+ {\appendixletter}{\the\secno}}}%
+\temp
+\appendixnoderef
+\nobreak
+}
+
+\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
+\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz #1{%
+\plainsecheading {#1}\gdef\thissection{#1}%
+\toks0 = {#1}%
+\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsecentry{\the\toks0}}}%
+\temp
+\unnumbnoderef
+\nobreak
+}
+
+% Subsections.
+\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
+\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz #1{%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
+\toks0 = {#1}%
+\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}%
+ {\the\chapno}{\the\secno}{\the\subsecno}}}%
+\temp
+\donoderef
+\nobreak
+}
+
+\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
+\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz #1{%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
+\toks0 = {#1}%
+\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}%
+ {\appendixletter}{\the\secno}{\the\subsecno}}}%
+\temp
+\appendixnoderef
+\nobreak
+}
+
+\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
+\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz #1{%
+\plainsubsecheading {#1}\gdef\thissection{#1}%
+\toks0 = {#1}%
+\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsecentry%
+ {\the\toks0}}}%
+\temp
+\unnumbnoderef
+\nobreak
+}
+
+% Subsubsections.
+\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
+\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz #1{%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+\toks0 = {#1}%
+\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}%
+ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}%
+\temp
+\donoderef
+\nobreak
+}
+
+\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
+\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz #1{%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+ {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+\toks0 = {#1}%
+\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}%
+ {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}%
+\temp
+\appendixnoderef
+\nobreak
+}
+
+\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
+\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz #1{%
+\plainsubsubsecheading {#1}\gdef\thissection{#1}%
+\toks0 = {#1}%
+\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsubsecentry%
+ {\the\toks0}}}%
+\temp
+\unnumbnoderef
+\nobreak
+}
+
+% These are variants which are not "outer", so they can appear in @ifinfo.
+% Actually, they should now be obsolete; ordinary section commands should work.
+\def\infotop{\parsearg\unnumberedzzz}
+\def\infounnumbered{\parsearg\unnumberedzzz}
+\def\infounnumberedsec{\parsearg\unnumberedseczzz}
+\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+
+\def\infoappendix{\parsearg\appendixzzz}
+\def\infoappendixsec{\parsearg\appendixseczzz}
+\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
+\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
+
+\def\infochapter{\parsearg\chapterzzz}
+\def\infosection{\parsearg\sectionzzz}
+\def\infosubsection{\parsearg\subsectionzzz}
+\def\infosubsubsection{\parsearg\subsubsectionzzz}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{\parsearg\majorheadingzzz}
+\def\majorheadingzzz #1{%
+{\advance\chapheadingskip by 10pt \chapbreak }%
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\chapheading{\parsearg\chapheadingzzz}
+\def\chapheadingzzz #1{\chapbreak %
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 200}
+
+% @heading, @subheading, @subsubheading.
+\def\heading{\parsearg\plainsecheading}
+\def\subheading{\parsearg\plainsubsecheading}
+\def\subsubheading{\parsearg\plainsubsubsecheading}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+\def\CHAPFplain{
+\global\let\chapmacro=\chfplain
+\global\let\unnumbchapmacro=\unnchfplain
+\global\let\centerchapmacro=\centerchfplain}
+
+% Plain chapter opening.
+% #1 is the text, #2 the chapter number or empty if unnumbered.
+\def\chfplain#1#2{%
+ \pchapsepmacro
+ {%
+ \chapfonts \rm
+ \def\chapnum{#2}%
+ \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent = \wd0 \centerparametersmaybe
+ \unhbox0 #1\par}%
+ }%
+ \nobreak\bigskip % no page break after a chapter title
+ \nobreak
+}
+
+% Plain opening for unnumbered.
+\def\unnchfplain#1{\chfplain{#1}{}}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerchfplain#1{{%
+ \def\centerparametersmaybe{%
+ \advance\rightskip by 3\rightskip
+ \leftskip = \rightskip
+ \parfillskip = 0pt
+ }%
+ \chfplain{#1}{}%
+}}
+
+\CHAPFplain % The default
+
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\nobreak
+}
+
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+ \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+
+\def\CHAPFopen{
+\global\let\chapmacro=\chfopen
+\global\let\unnumbchapmacro=\unnchfopen
+\global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles.
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
+\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
+
+% Subsection titles.
+\newskip \subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
+\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
+\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
+
+% Subsubsection titles.
+\let\subsubsecheadingskip = \subsecheadingskip
+\let\subsubsecheadingbreak = \subsecheadingbreak
+\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
+\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
+
+
+% Print any size section title.
+%
+% #1 is the section type (sec/subsec/subsubsec), #2 is the section
+% number (maybe empty), #3 the text.
+\def\sectionheading#1#2#3{%
+ {%
+ \expandafter\advance\csname #1headingskip\endcsname by \parskip
+ \csname #1headingbreak\endcsname
+ }%
+ {%
+ % Switch to the right set of fonts.
+ \csname #1fonts\endcsname \rm
+ %
+ % Only insert the separating space if we have a section number.
+ \def\secnum{#2}%
+ \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
+ %
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent = \wd0 % zero if no section number
+ \unhbox0 #3}%
+ }%
+ \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc. We supply {\folio} at the end of the
+% argument, which will end up as the last argument to the \...entry macro.
+%
+% We open the .toc file here instead of at @setfilename or any other
+% given time so that @contents can be put in the document anywhere.
+%
+\newif\iftocfileopened
+\def\writetocentry#1{%
+ \iftocfileopened\else
+ \immediate\openout\tocfile = \jobname.toc
+ \global\tocfileopenedtrue
+ \fi
+ \iflinks \write\tocfile{#1{\folio}}\fi
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Finish up the main text and prepare to read what we've written
+% to \tocfile.
+%
+\def\startcontents#1{%
+ % If @setchapternewpage on, and @headings double, the contents should
+ % start on an odd page, unlike chapters. Thus, we maintain
+ % \contentsalignmacro in parallel with \pagealignmacro.
+ % From: Torbjorn Granlund <tege@matematik.su.se>
+ \contentsalignmacro
+ \immediate\closeout\tocfile
+ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \unnumbchapmacro{#1}\def\thischapter{}%
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
+ % We can't do this, because then an actual ^ in a section
+ % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97.
+ %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \pageno = \lastnegativepageno \fi
+}
+
+
+% Normal (long) toc.
+\def\contents{%
+ \startcontents{\putwordTOC}%
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \closein 1
+ \input \jobname.toc
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \pdfmakeoutlines
+ \endgroup
+ \lastnegativepageno = \pageno
+ \pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+ \startcontents{\putwordShortTOC}%
+ %
+ \let\chapentry = \shortchapentry
+ \let\appendixentry = \shortappendixentry
+ \let\unnumbchapentry = \shortunnumberedentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl
+ \rm
+ \hyphenpenalty = 10000
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\secentry ##1##2##3##4{}
+ \def\unnumbsecentry ##1##2{}
+ \def\subsecentry ##1##2##3##4##5{}
+ \def\unnumbsubsecentry ##1##2{}
+ \def\subsubsecentry ##1##2##3##4##5##6{}
+ \def\unnumbsubsubsecentry ##1##2{}
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \closein 1
+ \input \jobname.toc
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+ \lastnegativepageno = \pageno
+ \pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+\ifpdf
+ \pdfcatalog{/PageMode /UseOutlines}%
+\fi
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}%
+}
+
+% Appendices, in the main contents.
+\def\appendixentry#1#2#3{\dochapentry{\putwordAppendix{} #2\labelspace#1}{#3}}
+%
+% Appendices, in the short toc.
+\let\shortappendixentry = \shortchapentry
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter.
+% We could simplify the code here by writing out an \appendixentry
+% command in the toc file for appendices, instead of using \chapentry
+% for both, but it doesn't seem worth it.
+%
+\newdimen\shortappendixwidth
+%
+\def\shortchaplabel#1{%
+ % This space should be enough, since a single number is .5em, and the
+ % widest letter (M) is 1em, at least in the Computer Modern fonts.
+ % But use \hss just in case.
+ % (This space doesn't include the extra space that gets added after
+ % the label; that gets put in by \shortchapentry above.)
+ \dimen0 = 1em
+ \hbox to \dimen0{#1\hss}%
+}
+
+% Unnumbered chapters.
+\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
+\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno\bgroup#2\egroup}}
+
+% Sections.
+\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}}
+
+% Subsections.
+\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
+\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}}
+
+% And subsubsections.
+\def\subsubsecentry#1#2#3#4#5#6{%
+ \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
+\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}
+
+% This parameter controls the indentation of the various levels.
+\newdimen\tocindent \tocindent = 3pc
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% Final typesetting of a toc entry; we use the same \entry macro as for
+% the index entries, but we want to suppress hyphenation here. (We
+% can't do that in the \entry macro, since index entries might consist
+% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
+\def\tocentry#1#2{\begingroup
+ \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
+ % Do not use \turnoffactive in these arguments. Since the toc is
+ % typeset in cmr, characters such as _ would come out wrong; we
+ % have to do the usual translation tricks.
+ \entry{#1}{#2}%
+\endgroup}
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\let\subsecentryfonts = \textfonts
+\let\subsubsecentryfonts = \textfonts
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+% Furthermore, these definitions must come after we define our fonts.
+\newbox\dblarrowbox \newbox\longdblarrowbox
+\newbox\pushcharbox \newbox\bullbox
+\newbox\equivbox \newbox\errorbox
+
+%{\tentt
+%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil}
+%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil}
+%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil}
+%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil}
+% Adapted from the manmac format (p.420 of TeXbook)
+%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex
+% depth .1ex\hfil}
+%}
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% Adapted from the TeXbook's \boxit.
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+
+\global\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+
+% The @error{} command.
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\def\tex{\begingroup
+ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+ \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
+ \catcode `\%=14
+ \catcode 43=12 % plus
+ \catcode`\"=12
+ \catcode`\==12
+ \catcode`\|=12
+ \catcode`\<=12
+ \catcode`\>=12
+ \escapechar=`\\
+ %
+ \let\b=\ptexb
+ \let\bullet=\ptexbullet
+ \let\c=\ptexc
+ \let\,=\ptexcomma
+ \let\.=\ptexdot
+ \let\dots=\ptexdots
+ \let\equiv=\ptexequiv
+ \let\!=\ptexexclam
+ \let\i=\ptexi
+ \let\{=\ptexlbrace
+ \let\+=\tabalign
+ \let\}=\ptexrbrace
+ \let\*=\ptexstar
+ \let\t=\ptext
+ %
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+ \def\@{@}%
+\let\Etex=\endgroup}
+
+% Define @lisp ... @endlisp.
+% @lisp does a \begingroup so it can rebind things,
+% including the definition of @endlisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments. \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% Make each space character in the input produce a normal interword
+% space in the output. Don't allow a line break at this space, as this
+% is used only in environments like @example, where each line of input
+% should produce a line of output anyway.
+%
+{\obeyspaces %
+\gdef\sepspaces{\obeyspaces\let =\tie}}
+
+% Define \obeyedspace to be our active space, whatever it is. This is
+% for use in \parsearg.
+{\sepspaces%
+\global\let\obeyedspace= }
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical. We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip
+%
+\def\aboveenvbreak{{%
+ \ifnum\lastpenalty < 10000
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ \penalty-50
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\long\def\cartouche{%
+\begingroup
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt %we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+% side, and for 6pt waste from
+% each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing=\comment
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \hsize=\cartinner
+ \kern3pt
+ \begingroup
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+\def\Ecartouche{%
+ \endgroup
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+\endgroup
+}}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+ \aboveenvbreak
+ \inENV % This group ends at the end of the body
+ \hfuzz = 12pt % Don't be fussy
+ \sepspaces % Make spaces be word-separators rather than space tokens.
+ \singlespace
+ \let\par = \lisppar % don't ignore blank lines
+ \obeylines % each line of input is a line of output
+ \parskip = 0pt
+ \parindent = 0pt
+ \emergencystretch = 0pt % don't try to avoid overfull boxes
+ % @cartouche defines \nonarrowing to inhibit narrowing
+ % at next level down.
+ \ifx\nonarrowing\relax
+ \advance \leftskip by \lispnarrowing
+ \exdentamount=\lispnarrowing
+ \let\exdent=\nofillexdent
+ \let\nonarrowing=\relax
+ \fi
+}
+
+% Define the \E... control sequence only if we are inside the particular
+% environment, so the error checking in \end will work.
+%
+% To end an @example-like environment, we first end the paragraph (via
+% \afterenvbreak's vertical glue), and then the group. That way we keep
+% the zero \parskip that the environments set -- \parskip glue will be
+% inserted at the beginning of the next paragraph in the document, after
+% the environment.
+%
+\def\nonfillfinish{\afterenvbreak\endgroup}
+
+% @lisp: indented, narrowed, typewriter font.
+\def\lisp{\begingroup
+ \nonfillstart
+ \let\Elisp = \nonfillfinish
+ \tt
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+
+% @example: Same as @lisp.
+\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
+
+% @small... is usually equivalent to the non-small (@smallbook
+% redefines). We must call \example (or whatever) last in the
+% definition, since it reads the return following the @example (or
+% whatever) command.
+%
+% This actually allows (for example) @end display inside an
+% @smalldisplay. Too bad, but makeinfo will catch the error anyway.
+%
+\def\smalldisplay{\begingroup\def\Esmalldisplay{\nonfillfinish\endgroup}\display}
+\def\smallexample{\begingroup\def\Esmallexample{\nonfillfinish\endgroup}\lisp}
+\def\smallformat{\begingroup\def\Esmallformat{\nonfillfinish\endgroup}\format}
+\def\smalllisp{\begingroup\def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
+
+% Real @smallexample and @smalllisp (when @smallbook): use smaller fonts.
+% Originally contributed by Pavel@xerox.
+\def\smalllispx{\begingroup
+ \def\Esmalllisp{\nonfillfinish\endgroup}%
+ \def\Esmallexample{\nonfillfinish\endgroup}%
+ \smallexamplefonts
+ \lisp
+}
+
+% @display: same as @lisp except keep current font.
+%
+\def\display{\begingroup
+ \nonfillstart
+ \let\Edisplay = \nonfillfinish
+ \gobble
+}
+%
+% @smalldisplay (when @smallbook): @display plus smaller fonts.
+%
+\def\smalldisplayx{\begingroup
+ \def\Esmalldisplay{\nonfillfinish\endgroup}%
+ \smallexamplefonts \rm
+ \display
+}
+
+% @format: same as @display except don't narrow margins.
+%
+\def\format{\begingroup
+ \let\nonarrowing = t
+ \nonfillstart
+ \let\Eformat = \nonfillfinish
+ \gobble
+}
+%
+% @smallformat (when @smallbook): @format plus smaller fonts.
+%
+\def\smallformatx{\begingroup
+ \def\Esmallformat{\nonfillfinish\endgroup}%
+ \smallexamplefonts \rm
+ \format
+}
+
+% @flushleft (same as @format).
+%
+\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
+
+% @flushright.
+%
+\def\flushright{\begingroup
+ \let\nonarrowing = t
+ \nonfillstart
+ \let\Eflushright = \nonfillfinish
+ \advance\leftskip by 0pt plus 1fill
+ \gobble
+}
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.
+%
+\def\quotation{%
+ \begingroup\inENV %This group ends at the end of the @quotation body
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \singlespace
+ \parindent=0pt
+ % We have retained a nonzero parskip for the environment, since we're
+ % doing normal filling. So to avoid extra space below the environment...
+ \def\Equotation{\parskip = 0pt \nonfillfinish}%
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \advance\rightskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \let\nonarrowing = \relax
+ \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
+%
+% [Knuth] p. 344; only we need to do '@' too
+\def\dospecials{%
+ \do\ \do\\\do\@\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=12}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+ \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+ \tt % easiest (and conventionally used) font for verbatim
+ \def\par{\leavevmode\endgraf}%
+ \catcode`\`=\active
+ \tabeightspaces
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen0=\wd0 % the width so far, or since the previous tab
+ \divide\dimen0 by\tabw
+ \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+ \advance\dimen0 by\tabw % advance to next multiple of \tabw
+ \wd0=\dimen0 \box0 \starttabbox
+ }%
+ }
+\endgroup
+\def\setupverbatim{%
+ % Easiest (and conventionally used) font for verbatim
+ \tt
+ \def\par{\leavevmode\egroup\box0\endgraf}%
+ \catcode`\`=\active
+ \tabexpand
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+ \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters. Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+% \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+ \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12
+ \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+% \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%% Include LaTeX hack for completeness -- never know
+%% \begingroup
+%% \catcode`|=0 \catcode`[=1
+%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active
+%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[
+%% #1|endgroup|def|Everbatim[]|end[verbatim]]
+%% |endgroup
+\begingroup
+ \catcode`\ =\active
+ \gdef\doverbatim#1@end verbatim{#1\end{verbatim}}
+\endgroup
+%
+\def\verbatim{%
+ \def\Everbatim{\nonfillfinish\endgroup}%
+ \begingroup
+ \nonfillstart
+ \advance\leftskip by -\defbodyindent
+ \begingroup\setupverbatim\doverbatim
+}
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+% Allow normal characters that we make active in the argument (a file name).
+\def\verbatiminclude{%
+ \begingroup
+ \catcode`\\=12
+ \catcode`~=12
+ \catcode`^=12
+ \catcode`_=12
+ \catcode`|=12
+ \catcode`<=12
+ \catcode`>=12
+ \catcode`+=12
+ \parsearg\doverbatiminclude
+}
+\def\setupverbatiminclude{%
+ \begingroup
+ \nonfillstart
+ \advance\leftskip by -\defbodyindent
+ \begingroup\setupverbatim
+}
+%
+\def\doverbatiminclude#1{%
+ % Restore active chars for included file.
+ \endgroup
+ \begingroup
+ \def\thisfile{#1}%
+ \expandafter\expandafter\setupverbatiminclude\input\thisfile
+ \endgroup\nonfillfinish\endgroup
+}
+
+
+\message{defuns,}
+% @defun etc.
+
+% Allow user to change definition object font (\df) internally
+\def\setdeffont #1 {\csname DEF#1\endcsname}
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deftypemargin \deftypemargin=12pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+\newcount\parencount
+% define \functionparens, which makes ( and ) and & do special things.
+% \functionparens affects the group it is contained in.
+\def\activeparens{%
+\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active
+\catcode`\[=\active \catcode`\]=\active}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
+
+% Be sure that we always have a definition for `(', etc. For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+\global\let(=\lparen \global\let)=\rparen
+\global\let[=\lbrack \global\let]=\rbrack
+
+\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
+\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+% This is used to turn on special parens
+% but make & act ordinary (given that it's active).
+\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
+
+% Definitions of (, ) and & used in args for functions.
+% This is the definition of ( outside of all parentheses.
+\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested
+ \global\advance\parencount by 1
+}
+%
+% This is the definition of ( when already inside a level of parens.
+\gdef\opnested{\char`\(\global\advance\parencount by 1 }
+%
+\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
+ % also in that case restore the outer-level definition of (.
+ \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
+ \global\advance \parencount by -1 }
+% If we encounter &foo, then turn on ()-hacking afterwards
+\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
+%
+\gdef\normalparens{\boldbrax\let&=\ampnr}
+} % End of definition inside \activeparens
+%% These parens (in \boldbrax) actually are a little bolder than the
+%% contained text. This is especially needed for [ and ]
+\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
+\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
+\let\ampnr = \&
+\def\lbrb{{\bf\char`\[}}
+\def\rbrb{{\bf\char`\]}}
+
+% Active &'s sneak into the index arguments, so make sure it's defined.
+{
+ \catcode`& = 13
+ \global\let& = \ampnr
+}
+
+% First, defname, which formats the header line itself.
+% #1 should be the function name.
+% #2 should be the type of definition, such as "Function".
+
+\def\defname #1#2{%
+% Get the values of \leftskip and \rightskip as they were
+% outside the @def...
+\dimen2=\leftskip
+\advance\dimen2 by -\defbodyindent
+\noindent
+\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
+\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
+\parshape 2 0in \dimen0 \defargsindent \dimen1
+% Now output arg 2 ("Function" or some such)
+% ending at \deftypemargin from the right margin,
+% but stuck inside a box of width 0 so it does not interfere with linebreaking
+{% Adjust \hsize to exclude the ambient margins,
+% so that \rightline will obey them.
+\advance \hsize by -\dimen2
+\rlap{\rightline{{\rm #2}\hskip -1.25pc }}}%
+% Make all lines underfull and no complaints:
+\tolerance=10000 \hbadness=10000
+\advance\leftskip by -\defbodyindent
+\exdentamount=\defbodyindent
+{\df #1}\enskip % Generate function name
+}
+
+% Actually process the body of a definition
+% #1 should be the terminating control sequence, such as \Edefun.
+% #2 should be the "another name" control sequence, such as \defunx.
+% #3 should be the control sequence that actually processes the header,
+% such as \defunheader.
+
+\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup %
+\catcode 61=\active % 61 is `='
+\obeylines\activeparens\spacesplit#3}
+
+% #1 is the \E... control sequence to end the definition (which we define).
+% #2 is the \...x control sequence for consecutive fns (which we define).
+% #3 is the control sequence to call to resume processing.
+% #4, delimited by the space, is the class name.
+%
+\def\defmethparsebody#1#2#3#4 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
+
+% Used for @deftypemethod and @deftypeivar.
+% #1 is the \E... control sequence to end the definition (which we define).
+% #2 is the \...x control sequence for consecutive fns (which we define).
+% #3 is the control sequence to call to resume processing.
+% #4, delimited by a space, is the class name.
+% #5 is the method's return type.
+%
+\def\deftypemethparsebody#1#2#3#4 #5 {\begingroup\inENV
+ \medbreak
+ \def#1{\endgraf\endgroup\medbreak}%
+ \def#2##1 ##2 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}{##2}}}%
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup\obeylines\activeparens\spacesplit{#3{#4}{#5}}}
+
+% Used for @deftypeop. The change from \deftypemethparsebody is an
+% extra argument at the beginning which is the `category', instead of it
+% being the hardwired string `Method' or `Instance Variable'. We have
+% to account for this both in the \...x definition and in parsing the
+% input at hand. Thus also need a control sequence (passed as #5) for
+% the \E... definition to assign the category name to.
+%
+\def\deftypeopparsebody#1#2#3#4#5 #6 {\begingroup\inENV
+ \medbreak
+ \def#1{\endgraf\endgroup\medbreak}%
+ \def#2##1 ##2 ##3 {%
+ \def#4{##1}%
+ \begingroup\obeylines\activeparens\spacesplit{#3{##2}{##3}}}%
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup\obeylines\activeparens\spacesplit{#3{#5}{#6}}}
+
+\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\activeparens\spacesplit{#3{#5}}}
+
+% These parsing functions are similar to the preceding ones
+% except that they do not make parens into active characters.
+% These are used for "variables" since they have no arguments.
+
+\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup %
+\catcode 61=\active %
+\obeylines\spacesplit#3}
+
+% This is used for \def{tp,vr}parsebody. It could probably be used for
+% some of the others, too, with some judicious conditionals.
+%
+\def\parsebodycommon#1#2#3{%
+ \begingroup\inENV %
+ \medbreak %
+ % Define the end token that this defining construct specifies
+ % so that it will exit this group.
+ \def#1{\endgraf\endgroup\medbreak}%
+ \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup\obeylines
+}
+
+\def\defvrparsebody#1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \spacesplit{#3{#4}}%
+}
+
+% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
+% type is just `struct', because we lose the braces in `{struct
+% termios}' when \spacesplit reads its undelimited argument. Sigh.
+% \let\deftpparsebody=\defvrparsebody
+%
+% So, to get around this, we put \empty in with the type name. That
+% way, TeX won't find exactly `{...}' as an undelimited argument, and
+% won't strip off the braces.
+%
+\def\deftpparsebody #1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \spacesplit{\parsetpheaderline{#3{#4}}}\empty
+}
+
+% Fine, but then we have to eventually remove the \empty *and* the
+% braces (if any). That's what this does.
+%
+\def\removeemptybraces\empty#1\relax{#1}
+
+% After \spacesplit has done its work, this is called -- #1 is the final
+% thing to call, #2 the type name (which starts with \empty), and #3
+% (which might be empty) the arguments.
+%
+\def\parsetpheaderline#1#2#3{%
+ #1{\removeemptybraces#2\relax}{#3}%
+}%
+
+\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\spacesplit{#3{#5}}}
+
+% Split up #2 at the first space token.
+% call #1 with two arguments:
+% the first is all of #2 before the space token,
+% the second is all of #2 after that space token.
+% If #2 contains no space token, all of it is passed as the first arg
+% and the second is passed as empty.
+
+{\obeylines
+\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%
+\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%
+\ifx\relax #3%
+#1{#2}{}\else #1{#2}{#3#4}\fi}}
+
+% So much for the things common to all kinds of definitions.
+
+% Define @defun.
+
+% First, define the processing that is wanted for arguments of \defun
+% Use this to expand the args and terminate the paragraph they make up
+
+\def\defunargs#1{\functionparens \sl
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Set the font temporarily and use \font in case \setfont made \tensl a macro.
+{\tensl\hyphenchar\font=0}%
+#1%
+{\tensl\hyphenchar\font=45}%
+\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\nobreak\vskip -\parskip\nobreak
+}
+
+\def\deftypefunargs #1{%
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Use \boldbraxnoamp, not \functionparens, so that & is not special.
+\boldbraxnoamp
+\tclose{#1}% avoid \code because of side effects on active chars
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\nobreak\vskip -\parskip\nobreak
+}
+
+% Do complete processing of one @defun or @defunx line already parsed.
+
+% @deffn Command forward-char nchars
+
+\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
+
+\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defun == @deffn Function
+
+\def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDeffunc}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefun int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
+
+% #1 is the data type. #2 is the name and args.
+\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
+% #1 is the data type, #2 the name, #3 the args.
+\def\deftypefunheaderx #1#2 #3\relax{%
+\doind {fn}{\code{#2}}% Make entry in function index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}%
+\deftypefunargs {#3}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+
+% \defheaderxcond#1\relax$.$
+% puts #1 in @code, followed by a space, but does nothing if #1 is null.
+\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi}
+
+% #1 is the classification. #2 is the data type. #3 is the name and args.
+\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
+% #1 is the classification, #2 the data type, #3 the name, #4 the args.
+\def\deftypefnheaderx #1#2#3 #4\relax{%
+\doind {fn}{\code{#3}}% Make entry in function index
+\begingroup
+\normalparens % notably, turn off `&' magic, which prevents
+% at least some C++ text from working
+\defname {\defheaderxcond#2\relax$.$#3}{#1}%
+\deftypefunargs {#4}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defmac == @deffn Macro
+
+\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefmac}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defspec == @deffn Special Form
+
+\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefspec}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defop CATEGORY CLASS OPERATION ARG...
+%
+\def\defop #1 {\def\defoptype{#1}%
+\defopparsebody\Edefop\defopx\defopheader\defoptype}
+%
+\def\defopheader#1#2#3{%
+\dosubind {fn}{\code{#2}}{\putwordon\ #1}% Make entry in function index
+\begingroup\defname {#2}{\defoptype\ \putwordon\ #1}%
+\defunargs {#3}\endgroup %
+}
+
+% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
+%
+\def\deftypeop #1 {\def\deftypeopcategory{#1}%
+ \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
+ \deftypeopcategory}
+%
+% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
+\def\deftypeopheader#1#2#3#4{%
+ \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+ \begingroup
+ \defname{\defheaderxcond#2\relax$.$#3}
+ {\deftypeopcategory\ \putwordon\ \code{#1}}%
+ \deftypefunargs{#4}%
+ \endgroup
+}
+
+% @deftypemethod CLASS TYPE METHOD ARG...
+%
+\def\deftypemethod{%
+ \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
+%
+% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
+\def\deftypemethodheader#1#2#3#4{%
+ \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+ \begingroup
+ \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}%
+ \deftypefunargs{#4}%
+ \endgroup
+}
+
+% @deftypeivar CLASS TYPE VARNAME
+%
+\def\deftypeivar{%
+ \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
+%
+% #1 is the class name, #2 the data type, #3 the variable name.
+\def\deftypeivarheader#1#2#3{%
+ \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
+ \begingroup
+ \defname{\defheaderxcond#2\relax$.$#3}
+ {\putwordInstanceVariableof\ \code{#1}}%
+ \defvarargs{#3}%
+ \endgroup
+}
+
+% @defmethod == @defop Method
+%
+\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+%
+% #1 is the class name, #2 the method name, #3 the args.
+\def\defmethodheader#1#2#3{%
+ \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
+ \begingroup
+ \defname{#2}{\putwordMethodon\ \code{#1}}%
+ \defunargs{#3}%
+ \endgroup
+}
+
+% @defcv {Class Option} foo-class foo-flag
+
+\def\defcv #1 {\def\defcvtype{#1}%
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+
+\def\defcvarheader #1#2#3{%
+\dosubind {vr}{\code{#2}}{\putwordof\ #1}% Make entry in var index
+\begingroup\defname {#2}{\defcvtype\ \putwordof\ #1}%
+\defvarargs {#3}\endgroup %
+}
+
+% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
+%
+\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+%
+\def\defivarheader#1#2#3{%
+ \dosubind {vr}{\code{#2}}{\putwordof\ #1}% entry in var index
+ \begingroup
+ \defname{#2}{\putwordInstanceVariableof\ #1}%
+ \defvarargs{#3}%
+ \endgroup
+}
+
+% @defvar
+% First, define the processing that is wanted for arguments of @defvar.
+% This is actually simple: just print them in roman.
+% This must expand the args and terminate the paragraph they make up
+\def\defvarargs #1{\normalparens #1%
+\interlinepenalty=10000
+\endgraf\nobreak\vskip -\parskip\nobreak}
+
+% @defvr Counter foo-count
+
+\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
+
+\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
+
+% @defvar == @defvr Variable
+
+\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefvar}%
+\defvarargs {#2}\endgroup %
+}
+
+% @defopt == @defvr {User Option}
+
+\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefopt}%
+\defvarargs {#2}\endgroup %
+}
+
+% @deftypevar int foobar
+
+\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+
+% #1 is the data type. #2 is the name, perhaps followed by text that
+% is actually part of the data type, which should not be put into the index.
+\def\deftypevarheader #1#2{%
+\dovarind#2 \relax% Make entry in variables index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}%
+\interlinepenalty=10000
+\endgraf\nobreak\vskip -\parskip\nobreak
+\endgroup}
+\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
+
+% @deftypevr {Global Flag} int enable
+
+\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+
+\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
+\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1}
+\interlinepenalty=10000
+\endgraf\nobreak\vskip -\parskip\nobreak
+\endgroup}
+
+% Now define @deftp
+% Args are printed in bold, a slight difference from @defvar.
+
+\def\deftpargs #1{\bf \defvarargs{#1}}
+
+% @deftp Class window height width ...
+
+\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
+
+\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+
+% These definitions are used if you use @defunx (etc.)
+% anywhere other than immediately after a @defun or @defunx.
+%
+\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
+\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
+\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
+\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
+\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
+\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
+\def\defopx#1 {\errmessage{@defopx in invalid context}}
+\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
+\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
+\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
+\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
+\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
+\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
+\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
+\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
+\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
+\def\defunx#1 {\errmessage{@defunx in invalid context}}
+\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
+\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scanmacro#1{%
+ \begingroup \newlinechar`\^^M
+ % Undo catcode changes of \startcontents and \doprintindex
+ \catcode`\@=0 \catcode`\\=12 \escapechar=`\@
+ % Append \endinput to make sure that TeX does not see the ending newline.
+ \toks0={#1\endinput}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \let\xeatspaces\eatspaces
+ \input \jobname.tmp
+ \endgroup
+}
+\else
+\def\scanmacro#1{%
+\begingroup \newlinechar`\^^M
+% Undo catcode changes of \startcontents and \doprintindex
+\catcode`\@=0 \catcode`\\=12 \escapechar=`\@
+\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
+\fi
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+\def\macrolist{} % List of all defined macros in the form
+ % \do\macro1\do\macro2...
+
+% Utility routines.
+% Thisdoes \let #1 = #2, except with \csnames.
+\def\cslet#1#2{%
+\expandafter\expandafter
+\expandafter\let
+\expandafter\expandafter
+\csname#1\endcsname
+\csname#2\endcsname}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=12\catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\macrobodyctxt{%
+ \catcode`\~=12
+ \catcode`\^=12
+ \catcode`\_=12
+ \catcode`\|=12
+ \catcode`\<=12
+ \catcode`\>=12
+ \catcode`\+=12
+ \catcode`\{=12
+ \catcode`\}=12
+ \catcode`\@=12
+ \catcode`\^^M=12
+ \usembodybackslash}
+
+\def\macroargctxt{%
+ \catcode`\~=12
+ \catcode`\^=12
+ \catcode`\_=12
+ \catcode`\|=12
+ \catcode`\<=12
+ \catcode`\>=12
+ \catcode`\+=12
+ \catcode`\@=12
+ \catcode`\\=12}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
+ \paramno=0%
+ \else
+ \expandafter\parsemargdef \argl;%
+ \fi
+ \if1\csname ismacro.\the\macname\endcsname
+ \message{Warning: redefining \the\macname}%
+ \else
+ \expandafter\ifx\csname \the\macname\endcsname \relax
+ \else \errmessage{The name \the\macname\space is reserved}\fi
+ \global\cslet{macsave.\the\macname}{\the\macname}%
+ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+ % Add the macroname to \macrolist
+ \toks0 = \expandafter{\macrolist\do}%
+ \xdef\macrolist{\the\toks0
+ \expandafter\noexpand\csname\the\macname\endcsname}%
+ \fi
+ \begingroup \macrobodyctxt
+ \ifrecursive \expandafter\parsermacbody
+ \else \expandafter\parsemacbody
+ \fi}
+
+\def\unmacro{\parsearg\unmacroxxx}
+\def\unmacroxxx#1{%
+ \if1\csname ismacro.#1\endcsname
+ \global\cslet{#1}{macsave.#1}%
+ \global\expandafter\let \csname ismacro.#1\endcsname=0%
+ % Remove the macro name from \macrolist
+ \begingroup
+ \edef\tempa{\expandafter\noexpand\csname#1\endcsname}%
+ \def\do##1{%
+ \def\tempb{##1}%
+ \ifx\tempa\tempb
+ % remove this
+ \else
+ \toks0 = \expandafter{\newmacrolist\do}%
+ \edef\newmacrolist{\the\toks0\expandafter\noexpand\tempa}%
+ \fi}%
+ \def\newmacrolist{}%
+ % Execute macro list to define \newmacrolist
+ \macrolist
+ \global\let\macrolist\newmacrolist
+ \endgroup
+ \else
+ \errmessage{Macro #1 not defined}%
+ \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list. Set up \paramno and \paramlist
+% so \defmacro knows what to do. Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX: let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+ \if#1;\let\next=\relax
+ \else \let\next=\parsemargdefxxx
+ \advance\paramno by 1%
+ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+ {\xeatspaces{\hash\the\paramno}}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
+ \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
+ \ifrecursive
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\temp}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup\noexpand\scanmacro{\temp}}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+ \fi
+ \else
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \expandafter\noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \fi
+ \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {. If so it reads up to the closing }, if not, it reads the whole
+% line. Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup\else
+ \expandafter\parsearg
+ \fi \next}
+
+% We mant to disable all macros during \shipout so that they are not
+% expanded by \write.
+\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
+ \edef\next{\macrolist}\expandafter\endgroup\next}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. Just make them active and then expand them all to nothing.
+\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{\ignoreactivespaces
+\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
+ \expandafter\noexpand\csname#2\endcsname}%
+\expandafter\endgroup\next}
+
+
+\message{cross references,}
+% @xref etc.
+
+\newwrite\auxfile
+
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% @node's job is to define \lastnode.
+\def\node{\ENVcheck\parsearg\nodezzz}
+\def\nodezzz#1{\nodexxx [#1,]}
+\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+\let\nwnode=\node
+\let\lastnode=\relax
+
+% The sectioning commands (@chapter, etc.) call these.
+\def\donoderef{%
+ \ifx\lastnode\relax\else
+ \expandafter\expandafter\expandafter\setref{\lastnode}%
+ {Ysectionnumberandtype}%
+ \global\let\lastnode=\relax
+ \fi
+}
+\def\unnumbnoderef{%
+ \ifx\lastnode\relax\else
+ \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}%
+ \global\let\lastnode=\relax
+ \fi
+}
+\def\appendixnoderef{%
+ \ifx\lastnode\relax\else
+ \expandafter\expandafter\expandafter\setref{\lastnode}%
+ {Yappendixletterandtype}%
+ \global\let\lastnode=\relax
+ \fi
+}
+
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME, namely
+% NAME-title, NAME-pg, and NAME-SNT. Called from \foonoderef. We have
+% to set \indexdummies so commands such as @code in a section title
+% aren't expanded. It would be nicer not to expand the titles in the
+% first place, but there's so many layers that that is hard to do.
+%
+\def\setref#1#2{{%
+ \indexdummies
+ \pdfmkdest{#1}%
+ \dosetq{#1-title}{Ytitle}%
+ \dosetq{#1-pg}{Ypagenumber}%
+ \dosetq{#1-snt}{#2}%
+}}
+
+% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual. All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printednodename{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual}%
+ \setbox0=\hbox{\printednodename}%
+ \ifdim \wd0 = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+ % Use the node name inside the square brackets.
+ \def\printednodename{\ignorespaces #1}%
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printednodename{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We know the real title if we have the xref values.
+ \def\printednodename{\refx{#1-title}{}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printednodename{\ignorespaces #1}%
+ \fi%
+ \fi
+ \fi
+ \fi
+ %
+ % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+ % insert empty discretionaries after hyphens, which means that it will
+ % not find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
+ \ifpdf
+ \leavevmode
+ \getfilename{#4}%
+ {\normalturnoffactive
+ \ifnum\filenamelength>0
+ \startlink attr{/Border [0 0 0]}%
+ goto file{\the\filename.pdf} name{#1}%
+ \else
+ \startlink attr{/Border [0 0 0]}%
+ goto name{#1}%
+ \fi
+ }%
+ \linkcolor
+ \fi
+ %
+ \ifdim \wd1 > 0pt
+ \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\normalturnoffactive
+ % Only output a following space if the -snt ref is nonempty; for
+ % @unnumbered and @anchor, it won't be.
+ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+ }%
+ % [mynode],
+ [\printednodename],\space
+ % page 3
+ \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+ \fi
+ \endlink
+\endgroup}
+
+% \dosetq is the interface for calls from other macros
+
+% Use \normalturnoffactive so that punctuation chars such as underscore
+% and backslash work in node names. (\turnoffactive doesn't do \.)
+\def\dosetq#1#2{%
+ {\let\folio=0%
+ \normalturnoffactive
+ \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
+ \iflinks
+ \next
+ \fi
+ }%
+}
+
+% \internalsetq {foo}{page} expands into
+% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
+% When the aux file is read, ' is the escape character
+
+\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}}
+
+% Things to be expanded by \internalsetq
+
+\def\Ypagenumber{\folio}
+
+\def\Ytitle{\thissection}
+
+\def\Ynothing{}
+
+\def\Ysectionnumberandtype{%
+\ifnum\secno=0 \putwordChapter\xreftie\the\chapno %
+\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno %
+\else %
+\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\def\Yappendixletterandtype{%
+\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}%
+\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
+\else %
+\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\gdef\xreftie{'tie}
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Non-3.0.
+\else
+ \def\linenumber{\the\inputlineno:\space}
+\fi
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+
+\def\refx#1#2{%
+ \expandafter\ifx\csname X#1\endcsname\relax
+ % If not defined, say something at least.
+ \angleleft un\-de\-fined\angleright
+ \iflinks
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \csname X#1\endcsname
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.
+%
+\def\xrdef#1{\begingroup
+ % Reenable \ as an escape while reading the second argument.
+ \catcode`\\ = 0
+ \afterassignment\endgroup
+ \expandafter\gdef\csname X#1\endcsname
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+\def\readauxfile{\begingroup
+ \catcode`\^^@=\other
+ \catcode`\^^A=\other
+ \catcode`\^^B=\other
+ \catcode`\^^C=\other
+ \catcode`\^^D=\other
+ \catcode`\^^E=\other
+ \catcode`\^^F=\other
+ \catcode`\^^G=\other
+ \catcode`\^^H=\other
+ \catcode`\^^K=\other
+ \catcode`\^^L=\other
+ \catcode`\^^N=\other
+ \catcode`\^^P=\other
+ \catcode`\^^Q=\other
+ \catcode`\^^R=\other
+ \catcode`\^^S=\other
+ \catcode`\^^T=\other
+ \catcode`\^^U=\other
+ \catcode`\^^V=\other
+ \catcode`\^^W=\other
+ \catcode`\^^X=\other
+ \catcode`\^^Z=\other
+ \catcode`\^^[=\other
+ \catcode`\^^\=\other
+ \catcode`\^^]=\other
+ \catcode`\^^^=\other
+ \catcode`\^^_=\other
+ \catcode`\@=\other
+ \catcode`\^=\other
+ % It was suggested to define this as 7, which would allow ^^e4 etc.
+ % in xref tags, i.e., node names. But since ^^e4 notation isn't
+ % supported in the main text, it doesn't seem desirable. Furthermore,
+ % that is not enough: for node names that actually contain a ^
+ % character, we would end up writing a line like this: 'xrdef {'hat
+ % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+ % argument, and \hat is not an expandable control sequence. It could
+ % all be worked out, but why? Either we support ^^ or we don't.
+ %
+ % The other change necessary for this was to define \auxhat:
+ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+ % and then to call \auxhat in \setq.
+ %
+ \catcode`\~=\other
+ \catcode`\[=\other
+ \catcode`\]=\other
+ \catcode`\"=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ % Make the characters 128-255 be printing characters
+ {%
+ \count 1=128
+ \def\loop{%
+ \catcode\count 1=\other
+ \advance\count 1 by 1
+ \ifnum \count 1<256 \loop \fi
+ }%
+ }%
+ % The aux file uses ' as the escape (for now).
+ % Turn off \ as an escape so we do not lose on
+ % entries which were dumped with control sequences in their names.
+ % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^
+ % Reference to such entries still does not work the way one would wish,
+ % but at least they do not bomb out when the aux file is read in.
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\%=\other
+ \catcode`\'=0
+ \catcode`\\=\other
+ %
+ \openin 1 \jobname.aux
+ \ifeof 1 \else
+ \closein 1
+ \input \jobname.aux
+ \global\havexrefstrue
+ \global\warnedobstrue
+ \fi
+ % Open the new aux file. TeX will close it automatically at exit.
+ \openout\auxfile=\jobname.aux
+\endgroup}
+
+
+% Footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+\let\ptexfootnote=\footnote
+
+{\catcode `\@=11
+%
+% Auto-number footnotes. Otherwise like plain.
+\gdef\footnote{%
+ \global\advance\footnoteno by \@ne
+ \edef\thisfootno{$^{\the\footnoteno}$}%
+ %
+ % In case the footnote comes at the end of a sentence, preserve the
+ % extra spacing after we do the footnote number.
+ \let\@sf\empty
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+ %
+ % Remove inadvertent blank space before typesetting the footnote number.
+ \unskip
+ \thisfootno\@sf
+ \footnotezzz
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter. Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset and anything else that uses
+% \parseargline fail inside footnotes because the tokens are fixed when
+% the footnote is read. --karl, 16nov96.
+%
+\long\gdef\footnotezzz{\insert\footins\bgroup
+ % We want to typeset this text as a normal paragraph, even if the
+ % footnote reference occurs in (for example) a display environment.
+ % So reset some parameters.
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip
+ \rightskip\z@skip
+ \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
+ \smallfonts \rm
+ %
+ % Because we use hanging indentation in footnotes, a @noindent appears
+ % to exdent this text, so make it be a no-op. makeinfo does not use
+ % hanging indentation so @noindent can still be needed within footnote
+ % text after an @example or the like (not that this is good style).
+ \let\noindent = \relax
+ %
+ % Hang the footnote text off the number. Use \everypar in case the
+ % footnote extends for more than one paragraph.
+ \everypar = {\hang}%
+ \textindent{\thisfootno}%
+ %
+ % Don't crash into the line above the footnote text. Since this
+ % expands into a box, it must come within the paragraph, lest it
+ % provide a place where TeX can split the footnote.
+ \footstrut
+ \futurelet\next\fo@t
+}
+\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t
+ \else\let\next\f@t\fi \next}
+\def\f@@t{\bgroup\aftergroup\@foot\let\next}
+\def\f@t#1{#1\@foot}
+\def\@foot{\strut\par\egroup}
+
+}%end \catcode `\@=11
+
+% @| inserts a changebar to the left of the current line. It should
+% surround any changed text. This approach does *not* work if the
+% change spans more than two lines of output. To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+ % \vadjust can only be used in horizontal mode.
+ \leavevmode
+ %
+ % Append this vertical mode material after the current line in the output.
+ \vadjust{%
+ % We want to insert a rule with the height and depth of the current
+ % leading; that is exactly what \strutbox is supposed to record.
+ \vskip-\baselineskip
+ %
+ % \vadjust-items are inserted at the left edge of the type. So
+ % the \llap here moves out into the left-hand margin.
+ \llap{%
+ %
+ % For a thicker or thinner bar, change the `1pt'.
+ \vrule height\baselineskip width1pt
+ %
+ % This is the space between the bar and the text.
+ \hskip 12pt
+ }%
+ }%
+}
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @image. We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front. If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+ \closein 1
+ % Do not bother showing banner with post-v2.7 epsf.tex (available in
+ % doc/epsf.tex until it shows up on ctan).
+ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+\fi
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+ it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+ \errhelp = \noepsfhelp
+ \errmessage{epsf.tex not found, images will be ignored}%
+ \global\warnednoepsftrue
+ \fi
+ \else
+ \imagexxx #1,,,,,\finish
+ \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+ \catcode`\^^M = 5 % in case we're inside an example
+ \normalturnoffactive % allow _ et al. in names
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \nobreak\bigskip
+ % Usually we'll have text after the image which will insert
+ % \parskip glue, so insert it here too to equalize the space
+ % above and below.
+ \nobreak\vskip\parskip
+ \nobreak
+ \line\bgroup\hss
+ \fi
+ %
+ % Output the image.
+ \ifpdf
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ % \epsfbox itself resets \epsf?size at each figure.
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+ \epsfbox{#1.eps}%
+ \fi
+ %
+ \ifimagevmode \hss \egroup \bigbreak \fi % space after the image
+\endgroup}
+
+
+\message{localization,}
+% and i18n.
+
+% @documentlanguage is usually given very early, just after
+% @setfilename. If done too late, it may not override everything
+% properly. Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\def\documentlanguage{\parsearg\dodocumentlanguage}
+\def\dodocumentlanguage#1{%
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file if it exists.
+ \openin 1 txi-#1.tex
+ \ifeof1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \let\temp = \relax
+ \else
+ \def\temp{\input txi-#1.tex }%
+ \fi
+ \temp
+ \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? In the current directory
+should work if nowhere else does.}
+
+
+% @documentencoding should change something in TeX eventually, most
+% likely, but for now just recognize it.
+\let\documentencoding = \comment
+
+
+% Page size parameters.
+%
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+ \ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+ \else
+ \emergencystretch = .15\hsize
+ \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
+% 4) hoffset; 5) binding offset; 6) topskip. We also call
+% \setleading{\textleading}, so the caller should define \textleading.
+% The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6{%
+ \voffset = #3\relax
+ \topskip = #6\relax
+ \splittopskip = \topskip
+ %
+ \vsize = #1\relax
+ \advance\vsize by \topskip
+ \outervsize = \vsize
+ \advance\outervsize by 2\topandbottommargin
+ \pageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \pagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \setleading{\textleading}
+ %
+ \parindent = \defaultparindent
+ \setemergencystretch
+}
+
+% Use `small' versions.
+%
+\def\smallenvironments{%
+ \let\smalldisplay = \smalldisplayx
+ \let\smallexample = \smalllispx
+ \let\smallformat = \smallformatx
+ \let\smalllisp = \smalllispx
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % If page is nothing but text, make it come out even.
+ \internalpagesizes{46\baselineskip}{6in}{\voffset}{.25in}{\bindingoffset}{36pt}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+\def\smallbook{{\globaldefs = 1
+ \parskip = 2pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.5in}{5.in}{\voffset}{.25in}{\bindingoffset}{16pt}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \deftypemargin = 0pt
+ \defbodyindent = .5cm
+ \smallenvironments
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{53\baselineskip}{160mm}{\voffset}{4mm}{\bindingoffset}{44pt}%
+ %
+ \tolerance = 700
+ \hfuzz = 1pt
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+ \parskip = 2pt plus 1pt minus 0.1pt
+ \textleading = 12.5pt
+ %
+ \internalpagesizes{166mm}{120mm}{\voffset}{-8mm}{\bindingoffset}{8pt}%
+ %
+ \lispnarrowing = 0.2in
+ \tolerance = 800
+ \hfuzz = 1.2pt
+ \contentsrightmargin = 0mm
+ \deftypemargin = 0pt
+ \defbodyindent = 2mm
+ \tableindent = 12mm
+ %
+ \smallenvironments
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper. Top margin
+% 29mm, hence bottom margin 28mm, nominal side margin 3cm.
+\def\afourlatex{{\globaldefs = 1
+ \textleading = 13.6pt
+ %
+ \afourpaper
+ \internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}%
+ %
+ % Must explicitly reset to 0 because we call \afourpaper, apparently,
+ % although this does not entirely make sense.
+ \globaldefs = 0
+}}
+
+% Use @afourwide to print on European A4 paper in wide format.
+\def\afourwide{%
+ \afourpaper
+ \internalpagesizes{6.5in}{9.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}%
+}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\def\pagesizes{\parsearg\pagesizesxxx}
+\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+ \globaldefs = 1
+ %
+ \parskip = 3pt plus 2pt minus 1pt
+ \setleading{\textleading}%
+ %
+ \internalpagesizes{#1}{\hsize}{\voffset}{\normaloffset}{\bindingoffset}{44pt}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in ttfont
+% where it can probably just be output, and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font. Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts. But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}}
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+%\catcode 27=\active
+%\def^^[{$\diamondsuit$}
+
+% Set up an active definition for =, but don't enable it most of the time.
+{\catcode`\==\active
+\global\def={{\tt \char 61}}}
+
+\catcode`+=\active
+\catcode`\_=\active
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+\catcode`\@=0
+
+% \rawbackslashxx output one backslash character in current font
+\global\chardef\rawbackslashxx=`\\
+%{\catcode`\\=\other
+%@gdef@rawbackslashxx{\}}
+
+% \rawbackslash redefines \ as input to do \rawbackslashxx.
+{\catcode`\\=\active
+@gdef@rawbackslash{@let\=@rawbackslashxx }}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\rawbackslashxx}}
+
+% \catcode 17=0 % Define control-q
+\catcode`\\=\active
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{@let"=@normaldoublequote
+@let\=@realbackslash
+@let~=@normaltilde
+@let^=@normalcaret
+@let_=@normalunderscore
+@let|=@normalverticalbar
+@let<=@normalless
+@let>=@normalgreater
+@let+=@normalplus
+@let$=@normaldollar}%$ font-lock fix
+
+@def@normalturnoffactive{@let"=@normaldoublequote
+@let\=@normalbackslash
+@let~=@normaltilde
+@let^=@normalcaret
+@let_=@normalunderscore
+@let|=@normalverticalbar
+@let<=@normalless
+@let>=@normalgreater
+@let+=@normalplus
+@let$=@normaldollar}%$ font-lock fix
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also back turn on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @normalbackslash @fi
+ @catcode`+=@active
+ @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+@c Set initial fonts.
+@textfonts
+@rm
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
diff --git a/contrib/gcc/doc/install.texi b/contrib/gcc/doc/install.texi
index 6913d03..e9f8bee 100644
--- a/contrib/gcc/doc/install.texi
+++ b/contrib/gcc/doc/install.texi
@@ -152,6 +152,7 @@ you proceed.
Lists of successful builds for released versions of GCC are
available at our web pages for
+@uref{http://gcc.gnu.org/gcc-3.1/buildstat.html,,3.1},
@uref{http://gcc.gnu.org/gcc-3.0/buildstat.html,,3.0}
and
@uref{http://gcc.gnu.org/gcc-2.95/buildstat.html,,2.95}.
@@ -231,10 +232,10 @@ Please refer to our @uref{http://gcc.gnu.org/releases.html,,releases web page}
for information on how to obtain GCC@.
The full distribution includes the C, C++, Objective-C, Fortran, Java,
-and CHILL compilers. The full distribution also includes runtime libraries
-for C++, Objective-C, Fortran, Java and CHILL. (GCC 3.0 does not
-include CHILL.) In GCC 3.0 and later versions, GNU compiler testsuites
-are also included in the full distribution.
+and Ada (in case of GCC 3.1 and later) compilers. The full distribution
+also includes runtime libraries for C++, Objective-C, Fortran, and Java.
+In GCC 3.0 and later versions, GNU compiler testsuites are also included
+in the full distribution.
If you choose to download specific components, you must download the core
GCC distribution plus any language specific distributions you wish to
@@ -446,7 +447,7 @@ before the target alias is prepended to the name - so, specifying
resulting binary would be installed as
@file{/usr/local/bin/i686-pc-linux-gnu-foo-gcc-3.1}.
-As a last shortcoming, none of the installed CHILL and Ada programs are
+As a last shortcoming, none of the installed Ada programs are
transformed yet, which will be fixed in some time.
@item --with-local-prefix=@var{dirname}
@@ -615,7 +616,7 @@ single-float, biendian, softfloat.
@item powerpc*-*-*, rs6000*-*-*
aix64, pthread, softfloat, powercpu, powerpccpu, powerpcos, biendian,
-sysv, aix.
+sysv, aix.
@end table
@@ -727,9 +728,7 @@ grep language= */config-lang.in
@end example
Currently, you can use any of the following:
@code{ada}, @code{c}, @code{c++}, @code{f77}, @code{java}, @code{objc}.
-@code{CHILL} is not currently maintained, and will almost
-certainly fail to compile. Building the Ada compiler has special
-requirements, see below.@*
+Building the Ada compiler has special requirements, see below.@*
If you do not pass this flag, all languages available in the @file{gcc}
sub-tree will be configured. Re-defining @code{LANGUAGES} when calling
@samp{make bootstrap} @strong{does not} work anymore, as those
@@ -806,9 +805,23 @@ ignores @code{catgets} and instead uses GCC's copy of the GNU
@code{gettext} library. The @option{--with-catgets} option causes the
build procedure to use the host's @code{catgets} in this situation.
+@item --with-libiconv-prefix=@var{dir}
+Search for libiconv header files in @file{@var{dir}/include} and
+libiconv library files in @file{@var{dir}/lib}.
+
@item --with-system-zlib
Use installed zlib rather than that included with GCC@. This option
only applies if the Java front end is being built.
+
+@item --enable-obsolete
+Enable configuration for an obsoleted system. If you attempt to
+configure GCC for a system (build, host, or target) which has been
+obsoleted, and you do not specify this flag, configure will halt with an
+error message.
+
+All support for systems which have been obsoleted in one release of GCC
+is removed entirely in the next major release, unless someone steps
+forward to maintain the port.
@end table
Some options which only apply to building cross compilers:
@@ -863,8 +876,9 @@ Now that GCC is configured, you are ready to build the compiler and
runtime libraries.
We @strong{highly} recommend that GCC be built using GNU make;
-other versions may work, then again they might not.
-GNU make is required for compiling GNAT, the Ada compiler.
+other versions may work, then again they might not.
+GNU make is required for compiling GNAT (the Ada compiler) and the Java
+runtime library.
(For example, many broken versions of make will fail if you use the
recommended setup where @var{objdir} is different from @var{srcdir}.
@@ -904,7 +918,7 @@ parser sources, releases contain the Bison-generated files and you do
not need Bison installed to build them.
When building from CVS or snapshots, or if you modify Texinfo
-documentation, you need version 4.0 or later of Texinfo installed if you
+documentation, you need version 4.1 or later of Texinfo installed if you
want Info documentation to be regenerated. Releases contain Info
documentation pre-built for the unmodified documentation in the release.
@@ -921,7 +935,7 @@ gperf.
@item
Build target tools for use by the compiler such as binutils (bfd,
binutils, gas, gprof, ld, and opcodes)
-if they have been individually linked
+if they have been individually linked
or moved into the top level GCC source tree before configuring.
@item
@@ -1025,7 +1039,8 @@ the number of processors in your machine.
@section Building the Ada compiler
In order to build GNAT, the Ada compiler, you need a working GNAT
-compiler, since the Ada front end is written in Ada (with some
+compiler (GNAT version 3.13 or later, or GCC version 3.1 or later),
+since the Ada front end is written in Ada (with some
GNAT-specific extensions), and GNU make.
However, you do not need a full installation of GNAT, just the GNAT
@@ -1036,6 +1051,10 @@ environment variable at the configure step. @command{configure} can
detect the driver automatically if it has got a common name such as
@command{gcc} or @command{gnatgcc}. Of course, you still need a working
C compiler (the compiler driver can be different or not).
+@command{configure} does not test whether the GNAT installation works
+and has a sufficiently recent version; if too old a GNAT version is
+installed, the build will fail unless @option{--enable-languages} is
+used to disable building the Ada front end.
Additional build tools (such as @command{gnatmake}) or a working GNAT
run-time library installation are usually @emph{not} required. However,
@@ -1050,7 +1069,7 @@ source distribution):
@end example
At the moment, the GNAT library and several tools for GNAT are not built
-by @samp{make bootstrap}. You have to invoke
+by @samp{make bootstrap}. You have to invoke
@samp{make gnatlib_and_tools} in the @file{@var{objdir}/gcc}
subdirectory before proceeding with the next steps.
@@ -1059,10 +1078,10 @@ following commands (assuming @command{make} is GNU make):
@example
cd @var{objdir}
- @var{srcdir}/configure --enable-languages=c,ada
+ @var{srcdir}/configure --enable-languages=c,ada
cd @var{srcdir}/gcc/ada
touch treeprs.ads [es]info.h nmake.ad[bs]
- cd @var{objdir}
+ cd @var{objdir}
make bootstrap
cd gcc
make gnatlib_and_tools
@@ -1097,15 +1116,23 @@ build feature described in the previous section.
@cindex Installing GCC: Testing
@cindex Testsuite
-Before you install GCC, you might wish to run the testsuite. This
-step is optional and may require you to download additional software.
+Before you install GCC, we encourage you to run the testsuites and to
+compare your results with results from a similar configuration that have
+been submitted to the
+@uref{http://gcc.gnu.org/ml/gcc-testresults/,,gcc-testresults mailing list}.
+This step is optional and may require you to download additional software,
+but it can give you confidence in your new GCC installation or point out
+problems before you install and start using your new GCC.
First, you must have @uref{download.html,,downloaded the testsuites}.
-The full distribution contains testsuites; only if you downloaded the
-``core'' compiler plus any front ends, you do not have the testsuites.
+These are part of the full distribution, but if you downloaded the
+``core'' compiler plus any front ends, you must download the testsuites
+separately.
-Second, you must have a @uref{http://www.gnu.org/software/dejagnu/,,current version of DejaGnu} installed;
+Second, you must have the testing tools installed. This includes
+a @uref{http://www.gnu.org/software/dejagnu/,,current version of DejaGnu};
dejagnu 1.3 is not sufficient.
+It also includes Tcl and Expect; the DejaGnu site has links to these.
Now you may need specific preparations:
@@ -1258,9 +1285,10 @@ in @file{@var{libdir}} (normally @file{@var{prefix}/lib}); internal
parts of the compiler in @file{@var{libdir}/gcc-lib}; documentation in
info format in @file{@var{infodir}} (normally @file{@var{prefix}/info}).
-If you built a released version of GCC then if you don't mind, please
+If you built a released version of GCC using @samp{make bootstrap} then please
quickly review the build status page for
-@uref{http://gcc.gnu.org/gcc-3.0/buildstat.html,,3.0} or
+@uref{http://gcc.gnu.org/gcc-3.1/buildstat.html,,3.1},
+@uref{http://gcc.gnu.org/gcc-3.0/buildstat.html,,3.0}, or
@uref{http://gcc.gnu.org/gcc-2.95/buildstat.html,,2.95}.
If your system is not listed for the version of GCC that you built,
send a note to
@@ -1279,6 +1307,13 @@ This tells us which version of GCC you built and the options you passed to
configure.
@item
+Whether you enabled all languages or a subset of them. If you used a
+full distribution then this information is part of the configure
+options in the output of @samp{gcc -v}, but if you downloaded the
+``core'' compiler plus additional front ends then it isn't apparent
+which ones you built unless you tell us about it.
+
+@item
If the build was for GNU/Linux, also include:
@itemize @bullet
@item
@@ -1318,7 +1353,7 @@ If you find a bug, please report it following our
@uref{../bugs.html,,bug reporting guidelines}.
If you want to print the GCC manuals, do @samp{cd @var{objdir}; make
-dvi}. You will need to have @command{texi2dvi} (version at least 4.0)
+dvi}. You will need to have @command{texi2dvi} (version at least 4.1)
and @TeX{} installed. This creates a number of @file{.dvi} files in
subdirectories of @file{@var{objdir}}; these may be converted for
printing with programs such as @command{dvips}. You can also
@@ -1453,13 +1488,6 @@ works.
Please read this document carefully @emph{before} installing the
GNU Compiler Collection on your machine.
-Lists of successful builds for released versions of GCC are
-available at our web pages for
-@uref{http://gcc.gnu.org/gcc-3.0/buildstat.html,,3.0}
-and
-@uref{http://gcc.gnu.org/gcc-2.95/buildstat.html,,2.95}.
-These lists are updated as new information becomes available.
-
@ifhtml
@itemize
@item
@@ -1533,9 +1561,7 @@ These lists are updated as new information becomes available.
@item
@uref{#ix86-sequent-bsd,,i?86-sequent-bsd}
@item
-@uref{#ix86-sequent-ptx1*,,i?86-sequent-ptx1*, i?86-sequent-ptx2*}
-@item
-@uref{#ix86-*-sysv3*,,i?86-*-sysv3*}
+@uref{#ix86-sequent-ptx1*,,i?86-sequent-ptx1*, i?86-sequent-ptx2*, i?86-sequent-sysv3*}
@item
@uref{#i860-intel-osf*,,i860-intel-osf*}
@item
@@ -1561,7 +1587,7 @@ These lists are updated as new information becomes available.
@item
@uref{#m68k-bull-sysv,,m68k-bull-sysv}
@item
-@uref{#m68k-crds-unox,,m68k-crds-unox}
+@uref{#m68k-crds-unos,,m68k-crds-unos}
@item
@uref{#m68k-hp-hpux,,m68k-hp-hpux}
@item
@@ -1639,8 +1665,6 @@ These lists are updated as new information becomes available.
@item
@uref{#sparc-sun-solaris2.7,,sparc-sun-solaris2.7}
@item
-@uref{#*-*-solaris2.8,,*-*-solaris2.8}
-@item
@uref{#sparc-sun-sunos4*,,sparc-sun-sunos4*}
@item
@uref{#sparc-unknown-linux-gnulibc1,,sparc-unknown-linux-gnulibc1}
@@ -1680,7 +1704,7 @@ These lists are updated as new information becomes available.
<hr>
@end html
@heading @anchor{1750a-*-*}1750a-*-*
-MIL-STD-1750A processors.
+MIL-STD-1750A processors. This target is obsoleted in GCC 3.1.
The MIL-STD-1750A cross configuration produces output for
@code{as1750}, an assembler/linker available under the GNU General Public
@@ -1723,10 +1747,11 @@ GCC@.
@end html
@heading @anchor{a29k}a29k
AMD Am29k-family processors. These are normally used in embedded
-applications. There are no standard Unix configurations.
-This configuration
-corresponds to AMD's standard calling sequence and binary interface
-and is compatible with other 29k tools.
+applications. This configuration corresponds to AMD's standard calling
+sequence and binary interface and is compatible with other 29k tools.
+
+AMD has abandoned this processor. All existing a29k targets are obsoleted
+in GCC 3.1.
You may need to make a variant of the file @file{a29k.h} for your
particular configuration.
@@ -1763,6 +1788,9 @@ Systems using processors that implement the DEC Alpha architecture and
are running the DEC/Compaq Unix (DEC OSF/1, Digital UNIX, or Compaq
Tru64 UNIX) operating system, for example the DEC Alpha AXP systems.
+Support for versions before @code{alpha*-dec-osf4} is obsoleted in GCC
+3.1. (These are the versions which identify themselves as DEC OSF/1.)
+
In Tru64 UNIX V5.1, Compaq introduced a new assembler that does not
currently (2001-06-13) work with @command{mips-tfile}. As a workaround,
we need to use the old assembler, invoked via the barely documented
@@ -1784,9 +1812,7 @@ are supported on Tru64 UNIX, so you must not configure GCC with
@option{--with-gnu-as} or @option{--with-gnu-ld}.
The @option{--enable-threads} options isn't supported yet. A patch is
-in preparation for a future release. The Java runtime library has been
-reported to work on Tru64 UNIX V4.0F, V5.0, and V5.1, so you may try
-@option{--enable-libgcj} and report your results.
+in preparation for a future release.
GCC writes a @samp{.verstamp} directive to the assembler output file
unless it is built as a cross-compiler. It gets the version to use from
@@ -1898,6 +1924,8 @@ We require GNU binutils 2.10 or newer.
@end html
@heading @anchor{arm-*-riscix}arm-*-riscix
The ARM2 or ARM3 processor running RISC iX, Acorn's port of BSD Unix.
+This configuration is obsoleted in GCC 3.1.
+
If you are running a version of RISC iX prior to 1.2 then you must
specify the version number during configuration. Note that the
assembler shipped with RISC iX does not support stabs debugging
@@ -1934,7 +1962,7 @@ can also be obtained from:
@item
@uref{http://home.overta.ru/users/denisc,,http://home.overta.ru/users/denisc}
@item
-@uref{http://www.itnet.pl/amelektr/avr,,http://www.itnet.pl/amelektr/avr}
+@uref{http://www.amelek.gda.pl/avr,,http://www.amelek.gda.pl/avr}
@end itemize
We @emph{strongly} recommend using binutils 2.11 or newer.
@@ -2044,7 +2072,7 @@ A port to the AT&T DSP1610 family of processors.
The version of binutils installed in @file{/usr/bin} is known to work unless
otherwise specified in any per-architecture notes. However, binutils
-2.11 is known to improve overall testsuite results.
+2.12.1 or greater is known to improve overall testsuite results.
For FreeBSD 1, FreeBSD 2 or any mutant a.out versions of FreeBSD 3: All
configuration support and files as shipped with GCC 2.95 are still in
@@ -2052,6 +2080,8 @@ place. FreeBSD 2.2.7 has been known to bootstrap completely; however,
it is unknown which version of binutils was used (it is assumed that it
was the system copy in @file{/usr/bin}) and C++ EH failures were noted.
+Support for FreeBSD 1 is obsoleted in GCC 3.1.
+
For FreeBSD using the ELF file format: DWARF 2 debugging is now the
default for all CPU architectures. It had been the default on
FreeBSD/alpha since its inception. You may use @option{-gstabs} instead
@@ -2062,10 +2092,24 @@ of the configuration used in the stock FreeBSD configuration of GCC. In
particular, @option{--enable-threads} is now configured by default.
However, as a general user, do not attempt to replace the system
compiler with this release. Known to bootstrap and check with good
-results on FreeBSD 3.0, 3.4, 4.0, 4.2, 4.3 and 5-CURRENT@.
+results on FreeBSD 3.0, 3.4, 4.0, 4.2, 4.3, 4.4, 4.5-STABLE and 5-CURRENT@.
-At this time, @option{--enable-threads} is not compatible with
-@option{--enable-libgcj} on FreeBSD@.
+In principle, @option{--enable-threads} is now compatible with
+@option{--enable-libgcj} on FreeBSD@. However, it has only been built
+and tested on i386-*-freebsd4.5 and alpha-*-freebsd5.0. The static
+library may be incorrectly built (symbols are missing at link time).
+There is a rare timing-based startup hang (probably involves an
+assupmtion about the thread library). Multi-threaded boehm-gc (required for
+libjava) exposes severe threaded signal-handling bugs on FreeBSD before
+4.5-RELEASE. The alpha port may not fully bootstrap without some manual
+intervention: gcjh will crash with a floating-point exception while
+generating @file{java/lang/Double.h} (just copy the version built on
+i386-*-freebsd* and rerun the top-level gmake with no arguments and it
+should properly complete the bootstrap). Other CPU architectures
+supported by FreeBSD will require additional configuration tuning in, at
+the very least, both boehm-gc and libffi.
+
+Shared @file{libgcc_s.so} is now built and installed by default.
@html
</p>
@@ -2075,6 +2119,8 @@ At this time, @option{--enable-threads} is not compatible with
The Elxsi's C compiler has known limitations that prevent it from
compiling GCC@. Please contact @email{mrs@@wrs.com} for more details.
+Support for this processor is obsoleted in GCC 3.1.
+
@html
</p>
<hr>
@@ -2166,14 +2212,14 @@ bootstrap}.
@end html
@heading @anchor{hppa*-hp-hpux11}hppa*-hp-hpux11
-GCC 3.0 supports HP-UX 11. You must use GNU binutils 2.11 or above on
-this platform. Thread support is not currently implemented for this
+GCC 3.0 and up support HP-UX 11. You must use GNU binutils 2.11 or above on
+this platform. Thread support is not currently implemented for this
platform, so @option{--enable-threads} does not work.
See @uref{http://gcc.gnu.org/ml/gcc-prs/2002-01/msg00551.html}
and @uref{http://gcc.gnu.org/ml/gcc-bugs/2002-01/msg00663.html}.
GCC 2.95.x is not supported under HP-UX 11 and cannot be used to
-compile GCC 3.0. Refer to @uref{binaries.html,,binaries} for information
-about obtaining precompiled GCC binaries for HP-UX.
+compile GCC 3.0 and up. Refer to @uref{binaries.html,,binaries} for
+information about obtaining precompiled GCC binaries for HP-UX.
@html
</p>
@@ -2218,7 +2264,9 @@ glibc 2.2.4 whether patches for GCC 3.0 are needed. You can use glibc
@heading @anchor{ix86-*-linux*oldld}i?86-*-linux*oldld
Use this configuration to generate @file{a.out} binaries on Linux-based
GNU systems if you do not have gas/binutils version 2.5.2 or later
-installed. This is an obsolete configuration.
+installed.
+
+This configuration is obsoleted in GCC 3.1.
@html
</p>
@@ -2372,6 +2420,8 @@ have installed.
<hr>
@end html
@heading @anchor{ix86-*-isc}i?86-*-isc
+This configuration is obsoleted in GCC 3.1.
+
It may be a good idea to link with GNU malloc instead of the malloc that
comes with the system.
@@ -2382,15 +2432,9 @@ In ISC version 4.1, @command{sed} core dumps when building
</p>
<hr>
@end html
-@heading @anchor{ix86-*-esix}i?86-*-esix
-It may be good idea to link with GNU malloc instead of the malloc that
-comes with the system.
-
-@html
-</p>
-<hr>
-@end html
@heading @anchor{ix86-ibm-aix}i?86-ibm-aix
+This configuration is obsoleted in GCC 3.1.
+
You need to use GAS version 2.1 or later, and LD from
GNU binutils version 2.2 or later.
@@ -2399,30 +2443,30 @@ GNU binutils version 2.2 or later.
<hr>
@end html
@heading @anchor{ix86-sequent-bsd}i?86-sequent-bsd
+This configuration is obsoleted in GCC 3.1.
+
Go to the Berkeley universe before compiling.
@html
</p>
<hr>
@end html
-@heading @anchor{ix86-sequent-ptx1*}i?86-sequent-ptx1*, i?86-sequent-ptx2*
+@heading @anchor{ix86-sequent-ptx1*}i?86-sequent-ptx1*, i?86-sequent-ptx2*, i?86-sequent-sysv3*
+This configuration is obsoleted in GCC 3.1.
+
You must install GNU @command{sed} before running @command{configure}.
-@html
-</p>
-<hr>
-@end html
-@heading @anchor{#ix86-*-sysv3*}i?86-*-sysv3*
The @code{fixproto} shell script may trigger a bug in the system shell.
If you encounter this problem, upgrade your operating system or
use @command{bash} (the GNU shell) to run @code{fixproto}.
-
@html
</p>
<hr>
@end html
@heading @anchor{i860-intel-osf*}i860-intel-osf*
+All support for the i860 processor is obsoleted in GCC 3.1.
+
On the Intel Paragon (an i860 machine), if you are using operating
system version 1.0, you will get warnings or errors about redefinition
of @code{va_arg} when you build GCC@.
@@ -2617,7 +2661,9 @@ applications. There are no standard Unix configurations.
<hr>
@end html
@heading @anchor{m68k-altos}m68k-altos
-Altos 3068. You must use the GNU assembler, linker and debugger.
+Altos 3068. This configuration is obsoleted in GCC 3.1.
+
+You must use the GNU assembler, linker and debugger.
Also, you must fix a kernel bug.
@html
@@ -2626,6 +2672,8 @@ Also, you must fix a kernel bug.
@end html
@heading @anchor{m68k-apple-aux}m68k-apple-aux
Apple Macintosh running A/UX@.
+This configuration is obsoleted in GCC 3.1.
+
You may configure GCC to use either the system assembler and
linker or the GNU assembler and linker. You should use the GNU configuration
if you can, especially if you also want to use G++. You enable
@@ -2654,7 +2702,10 @@ bootstrap. Binaries are available from the OSU-CIS archive, at
<hr>
@end html
@heading @anchor{m68k-bull-sysv}m68k-bull-sysv
-Bull DPX/2 series 200 and 300 with BOS-2.00.45 up to BOS-2.01. GCC works
+Bull DPX/2 series 200 and 300 with BOS-2.00.45 up to BOS-2.01.
+This configuration is obsoleted in GCC 3.1.
+
+GCC works
either with native assembler or GNU assembler. You can use
GNU assembler with native COFF generation by providing @option{--with-gnu-as} to
the configure script or use GNU assembler with stabs-in-COFF encapsulation
@@ -2666,7 +2717,7 @@ assembler or for availability of the DPX/2 port of GAS, contact
</p>
<hr>
@end html
-@heading @anchor{m68k-crds-unox}m68k-crds-unox
+@heading @anchor{m68k-crds-unos}m68k-crds-unos
Use @samp{configure unos} for building on Unos.
The Unos assembler is named @code{casm} instead of @code{as}. For some
@@ -2766,6 +2817,7 @@ to look like:
<hr>
@end html
@heading @anchor{m68k-*-nextstep*}m68k-*-nextstep*
+These configurations are obsoleted in GCC 3.1.
Current GCC versions probably do not work on version 2 of the NeXT
operating system.
@@ -2777,7 +2829,7 @@ does not happen on 3.1.
You absolutely @strong{must} use GNU sed and GNU make on this platform.
-On NeXTSTEP 3.x where x < 3 the build of GCC will abort during
+On NeXTSTEP 3.x where x < 3 the build of GCC will abort during
stage1 with an error message like this:
@example
@@ -2852,6 +2904,8 @@ It is reported that you may need the GNU assembler on this platform.
@end html
@heading @anchor{m88k-*-svr3}m88k-*-svr3
Motorola m88k running the AT&T/Unisoft/Motorola V.3 reference port.
+These configurations are obsoleted in GCC 3.1.
+
These systems tend to use the Green Hills C, revision 1.8.5, as the
standard C compiler. There are apparently bugs in this compiler that
result in object files differences between stage 2 and stage 3. If this
@@ -2868,7 +2922,10 @@ if you have one.
<hr>
@end html
@heading @anchor{m88k-*-dgux}m88k-*-dgux
-Motorola m88k running DG/UX@. To build 88open BCS native or cross
+Motorola m88k running DG/UX@.
+These configurations are obsoleted in GCC 3.1.
+
+To build 88open BCS native or cross
compilers on DG/UX, specify the configuration name as
@samp{m88k-*-dguxbcs} and build in the 88open BCS software development
environment. To build ELF native or cross compilers on DG/UX, specify
@@ -2885,7 +2942,10 @@ configuration based on the current software development environment.
<hr>
@end html
@heading @anchor{m88k-tektronix-sysv3}m88k-tektronix-sysv3
-Tektronix XD88 running UTekV 3.2e. Do not turn on
+Tektronix XD88 running UTekV 3.2e.
+These configurations are obsoleted in GCC 3.1.
+
+Do not turn on
optimization while building stage1 if you bootstrap with
the buggy Green Hills compiler. Also, the bundled LAI
System V NFS is buggy so if you build in an NFS mounted
@@ -2930,8 +2990,10 @@ linker unless you pass an explicit @option{-shared} or
@option{-call_shared} switch.
@heading @anchor{mips-mips-bsd}mips-mips-bsd
-MIPS machines running the MIPS operating system in BSD mode. It's
-possible that some old versions of the system lack the functions
+MIPS machines running the MIPS operating system in BSD mode.
+These configurations are obsoleted in GCC 3.1.
+
+It's possible that some old versions of the system lack the functions
@code{memcpy}, @code{memmove}, @code{memcmp}, and @code{memset}. If your
system lacks these, you must remove or undo the definition of
@code{TARGET_MEM_FUNCTIONS} in @file{mips-bsd.h}.
@@ -2950,6 +3012,8 @@ compilers, you may need to add @option{-Wf,-XNg1500 -Olimit 3000}.
<hr>
@end html
@heading @anchor{mips-dec-*}mips-dec-*
+These configurations are obsoleted in GCC 3.1.
+
MIPS-based DECstations can support three different personalities:
Ultrix, DEC OSF/1, and OSF/rose. (Alpha-based DECstation products have
a configuration name beginning with @samp{alpha*-dec}.) To configure GCC
@@ -2982,6 +3046,8 @@ compilers, you may need to add @option{-Wf,-XNg1500 -Olimit 3000}.
<hr>
@end html
@heading @anchor{mips-mips-riscos*}mips-mips-riscos*
+These configurations are obsoleted in GCC 3.1.
+
If you use the MIPS C compiler to bootstrap, it may be necessary
to increase its table size for switch statements with the
@option{-Wf,-XNg1500} option. If you use the @option{-O2}
@@ -3024,6 +3090,7 @@ avoiding a linker bug.
<hr>
@end html
@heading @anchor{mips-sgi-irix4}mips-sgi-irix4
+This configuration is obsoleted in GCC 3.1.
In order to compile GCC on an SGI running IRIX 4, the ``c.hdr.lib''
option must be installed from the CD-ROM supplied from Silicon Graphics.
@@ -3082,10 +3149,10 @@ to increase its table size for switch statements with the
optimization option, you also need to use @option{-Olimit 3000}.
To enable debugging under IRIX 5, you must use GNU @command{as} 2.11.2
-or later,
+or later,
and use the @option{--with-gnu-as} configure option when configuring GCC.
GNU @command{as} is distributed as part of the binutils package.
-When using release 2.11.2, you need to apply a patch
+When using release 2.11.2, you need to apply a patch
@uref{http://sources.redhat.com/ml/binutils/2001-07/msg00352.html,,http://sources.redhat.com/ml/binutils/2001-07/msg00352.html}
which will be included in the next release of binutils.
@@ -3181,17 +3248,19 @@ information about using GCC on IRIX platforms.
<hr>
@end html
@heading @anchor{mips-sony-sysv}mips-sony-sysv
-Sony MIPS NEWS@. This works in NEWSOS 5.0.1, but not in 5.0.2 (which
-uses ELF instead of COFF)@. Support for 5.0.2 will probably be provided
-soon by volunteers. In particular, the linker does not like the
-code generated by GCC when shared libraries are linked in.
+Sony MIPS NEWS@. This configuration is obsoleted in GCC 3.1.
+This works in NEWSOS 5.0.1, but not in 5.0.2 (which uses ELF instead of
+COFF)@. In particular, the linker does not like the code generated by
+GCC when shared libraries are linked in.
@html
</p>
<hr>
@end html
@heading @anchor{ns32k-encore}ns32k-encore
+This configuration is obsoleted in GCC 3.1.
+
Encore ns32000 system. Encore systems are supported only under BSD@.
@html
@@ -3199,15 +3268,19 @@ Encore ns32000 system. Encore systems are supported only under BSD@.
<hr>
@end html
@heading @anchor{ns32k-*-genix}ns32k-*-genix
-National Semiconductor ns32000 system. Genix has bugs in @code{alloca}
-and @code{malloc}; you must get the compiled versions of these from GNU
-Emacs.
+National Semiconductor ns32000 system. This configuration is obsoleted
+in GCC 3.1.
+
+Genix has bugs in @code{alloca} and @code{malloc}; you must get the
+compiled versions of these from GNU Emacs.
@html
</p>
<hr>
@end html
@heading @anchor{ns32k-sequent}ns32k-sequent
+This configuration is obsoleted in GCC 3.1.
+
Go to the Berkeley universe before compiling.
@html
@@ -3215,9 +3288,11 @@ Go to the Berkeley universe before compiling.
<hr>
@end html
@heading @anchor{ns32k-utek}ns32k-utek
-UTEK ns32000 system (``merlin''). The C compiler that comes with this
-system cannot compile GCC; contact @samp{tektronix!reed!mason} to get
-binaries of GCC for bootstrapping.
+UTEK ns32000 system (``merlin''). This configuration is obsoleted in
+GCC 3.1.
+
+The C compiler that comes with this system cannot compile GCC; contact
+@samp{tektronix!reed!mason} to get binaries of GCC for bootstrapping.
@html
@@ -3277,9 +3352,8 @@ PowerPC system in big endian mode, running System V.4.
@heading @anchor{powerpc-*-linux-gnu*}powerpc-*-linux-gnu*
You will need
-@uref{ftp://ftp.varesearch.com/pub/support/hjl/binutils,,binutils 2.9.4.0.8}
-or newer for a working GCC@. It is strongly recommended to recompile binutils
-if you initially built it with gcc-2.7.2.x.
+@uref{ftp://ftp.kernel.org/pub/linux/devel/binutils,,binutils 2.12.90.0.7}
+or newer for a working GCC@.
@html
</p>
@@ -3287,7 +3361,7 @@ if you initially built it with gcc-2.7.2.x.
@end html
@heading @anchor{powerpc-*-netbsd*}powerpc-*-netbsd*
PowerPC system in big endian mode running NetBSD@. To build the
-documentation you will need Texinfo version 4.0 (NetBSD 1.5.1 included
+documentation you will need Texinfo version 4.1 (NetBSD 1.5.1 included
Texinfo version 3.12).
@html
@@ -3347,27 +3421,28 @@ PowerPC system in little endian mode running Windows NT@.
<hr>
@end html
@heading @anchor{romp-*-aos}romp-*-aos, romp-*-mach
-The only operating systems supported for the IBM RT PC are AOS and
-MACH@. GCC does not support AIX running on the RT@. We recommend you
-compile GCC with an earlier version of itself; if you compile GCC
-with @command{hc}, the Metaware compiler, it will work, but you will get
-mismatches between the stage 2 and stage 3 compilers in various files.
-These errors are minor differences in some floating-point constants and
-can be safely ignored; the stage 3 compiler is correct.
+These configurations are obsoleted in GCC 3.1.
+
+We recommend you compile GCC with an earlier version of itself; if you
+compile GCC with @command{hc}, the Metaware compiler, it will work, but
+you will get mismatches between the stage 2 and stage 3 compilers in
+various files. These errors are minor differences in some
+floating-point constants and can be safely ignored; the stage 3 compiler
+is correct.
@html
</p>
<hr>
@end html
@heading @anchor{s390-*-linux*}s390-*-linux*
-S/390 system running Linux for S/390@.
+S/390 system running Linux for S/390@.
@html
</p>
<hr>
@end html
@heading @anchor{s390x-*-linux*}s390x-*-linux*
-zSeries system (64 Bit) running Linux for zSeries@.
+zSeries system (64 Bit) running Linux for zSeries@.
@html
</p>
@@ -3431,6 +3506,11 @@ There are patches for Solaris 2.6 (105633-56 or newer for SPARC,
@end html
@heading @anchor{sparc-sun-solaris2*}sparc-sun-solaris2*
+When GCC is configured to use binutils 2.11.2 or later the binaries
+produced are smaller than the ones produced using Sun's native tools;
+this difference is quite significant for binaries containing debugging
+information.
+
Sun @command{as} 4.x is broken in that it cannot cope with long symbol names.
A typical error message might look similar to the following:
@@ -3442,14 +3522,18 @@ This is Sun bug 4237974. This is fixed with patch 108908-02 for Solaris
starting with Solaris 7.
Starting with Solaris 7, the operating system is capable of executing
-64-bit SPARC V9 binaries. GCC 3.1 and later should properly support
-this. GCC 3.0 lacks the infrastructure necessary to support this
-configuration properly. However, if all you want is code tuned for
-the UltraSPARC CPU, you should try the @option{-mtune=ultrasparc}
-option instead, which should be safe from those bugs and produce code
-that, unlike full 64-bit code, can still run on non-UltraSPARC
+64-bit SPARC V9 binaries. GCC 3.1 and later properly supports
+this; the @option{-m64} option enables 64-bit code generation.
+However, if all you want is code tuned for the UltraSPARC CPU, you
+should try the @option{-mtune=ultrasparc} option instead, which produces
+code that, unlike full 64-bit code, can still run on non-UltraSPARC
machines.
+When configuring on a Solaris 7 or later system that is running a kernel
+that supports only 32-bit binaries, one must configure with
+@option{--disable-multilib}, since we will not be able to build the
+64-bit target libraries.
+
@html
</p>
<hr>
@@ -3474,7 +3558,7 @@ back it out.
@item
Copy the original, unpatched Solaris 7
@command{/usr/ccs/bin/as} into
-@command{/usr/local/lib/gcc-lib/sparc-sun-solaris2.7/3.0/as},
+@command{/usr/local/lib/gcc-lib/sparc-sun-solaris2.7/3.1/as},
adjusting the latter name to fit your local conventions and software
version numbers.
@@ -3488,7 +3572,7 @@ the hosts that run GCC itself. Second, Sun says that 106950-03 is
only a partial fix for bug 4210064, but Sun doesn't know whether the
partial fix is adequate for GCC@. Revision -08 or later should fix
the bug. The current (as of 2001-09-24) revision is -14, and is included in
-the Solaris 7 Recommended Patch Cluster.
+the Solaris 7 Recommended Patch Cluster.
@end itemize
@@ -3496,19 +3580,6 @@ the Solaris 7 Recommended Patch Cluster.
<p>
<hr>
@end html
-@heading @anchor{*-*-solaris2.8}*-*-solaris2.8
-
-The Solaris 8 linker fails to link some @samp{libjava} programs if
-previously-installed GCC java libraries already exist in the configured
-prefix. For this reason, @samp{libgcj} is disabled by default on Solaris 8.
-If you use GNU @command{ld}, or if you don't have a previously-installed @samp{libgcj} in
-the same prefix, use @option{--enable-libgcj} to build and install the
-Java libraries.
-
-@html
-<p>
-<hr>
-@end html
@heading @anchor{sparc-sun-sunos4*}sparc-sun-sunos4*
A bug in the SunOS 4 linker will cause it to crash when linking
@@ -3625,6 +3696,7 @@ in some cases (for example, when @code{alloca} is used).
@heading @anchor{we32k-*-*}we32k-*-*
These computers are also known as the 3b2, 3b5, 3b20 and other similar
names. (However, the 3b1 is actually a 68000.)
+These configurations are obsoleted in GCC 3.1.
Don't use @option{-g} when compiling with the system's compiler. The
system's linker seems to be unable to handle such a large program with
@@ -3685,7 +3757,7 @@ This target is for Xtensa systems running GNU/Linux. It supports ELF
shared objects and the GNU C library (glibc). It also generates
position-independent code (PIC) regardless of whether the
@option{-fpic} or @option{-fPIC} options are used. In other
-respects, this target is the same as the
+respects, this target is the same as the
@uref{#xtensa-*-elf,,@samp{xtensa-*-elf}} target.
@html
@@ -3728,6 +3800,13 @@ has been removed from GCC 3: fx80, ns32-ns-genix, pyramid, tahoe,
gmicro, spur; most of these targets had not been updated since GCC
version 1.
+We are planning to remove support for more older systems, starting in
+GCC 3.1. Each release will have a list of ``obsoleted'' systems.
+Support for these systems is still present in that release, but
+@command{configure} will fail unless the @option{--enable-obsolete}
+option is given. Unless a maintainer steps forward, support for
+these systems will be removed from the next release of GCC@.
+
Support for older systems as targets for cross-compilation is less
problematic than support for them as hosts for GCC; if an enthusiast
wishes to make such a target work again (including resurrecting any
diff --git a/contrib/gcc/doc/invoke.texi b/contrib/gcc/doc/invoke.texi
index 51db49a..bfab05b 100644
--- a/contrib/gcc/doc/invoke.texi
+++ b/contrib/gcc/doc/invoke.texi
@@ -157,7 +157,7 @@ in the following sections.
@xref{Overall Options,,Options Controlling the Kind of Output}.
@gccoptlist{
-c -S -E -o @var{file} -pipe -pass-exit-codes -x @var{language} @gol
--v --target-help --help}
+-v -### --target-help --help}
@item C Language Options
@xref{C Dialect Options,,Options Controlling C Dialect}.
@@ -165,7 +165,7 @@ in the following sections.
-ansi -std=@var{standard} -aux-info @var{filename} @gol
-fno-asm -fno-builtin -fno-builtin-@var{function} @gol
-fhosted -ffreestanding @gol
--trigraphs -traditional -traditional-cpp @gol
+-trigraphs -no-integrated-cpp -traditional -traditional-cpp @gol
-fallow-single-precision -fcond-mismatch @gol
-fsigned-bitfields -fsigned-char @gol
-funsigned-bitfields -funsigned-char @gol
@@ -348,10 +348,10 @@ in the following sections.
-mcmodel=@var{code-model} @gol
-m32 -m64 @gol
-mapp-regs -mbroken-saverestore -mcypress @gol
--mepilogue -mfaster-structs -mflat @gol
+-mfaster-structs -mflat @gol
-mfpu -mhard-float -mhard-quad-float @gol
-mimpure-text -mlive-g0 -mno-app-regs @gol
--mno-epilogue -mno-faster-structs -mno-flat -mno-fpu @gol
+-mno-faster-structs -mno-flat -mno-fpu @gol
-mno-impure-text -mno-stack-bias -mno-unaligned-doubles @gol
-msoft-float -msoft-quad-float -msparclite -mstack-bias @gol
-msupersparc -munaligned-doubles -mv8}
@@ -435,7 +435,7 @@ in the following sections.
-mpowerpc-gpopt -mno-powerpc-gpopt @gol
-mpowerpc-gfxopt -mno-powerpc-gfxopt @gol
-mnew-mnemonics -mold-mnemonics @gol
--mfull-toc -mminimal-toc -mno-fop-in-toc -mno-sum-in-toc @gol
+-mfull-toc -mminimal-toc -mno-fp-in-toc -mno-sum-in-toc @gol
-m64 -m32 -mxl-call -mno-xl-call -mpe @gol
-msoft-float -mhard-float -mmultiple -mno-multiple @gol
-mstring -mno-string -mupdate -mno-update @gol
@@ -445,7 +445,7 @@ in the following sections.
-mtoc -mno-toc -mlittle -mlittle-endian -mbig -mbig-endian @gol
-mcall-aix -mcall-sysv -mcall-netbsd @gol
-maix-struct-return -msvr4-struct-return
--mabi=altivec @gol
+-mabi=altivec -mabi=no-altivec @gol
-mprototype -mno-prototype @gol
-msim -mmvme -mads -myellowknife -memb -msdata @gol
-msdata=@var{opt} -mvxworks -G @var{num} -pthread}
@@ -540,6 +540,9 @@ in the following sections.
@gccoptlist{
-m1 -m2 -m3 -m3e @gol
-m4-nofpu -m4-single-only -m4-single -m4 @gol
+-m5-64media -m5-64media-nofpu @gol
+-m5-32media -m5-32media-nofpu @gol
+-m5-compact -m5-compact-nofpu @gol
-mb -ml -mdalign -mrelax @gol
-mbigtable -mfmovd -mhitachi -mnomacsave @gol
-mieee -misize -mpadstruct -mspace @gol
@@ -593,7 +596,8 @@ in the following sections.
@gccoptlist{
-mlibfuncs -mno-libfuncs -mepsilon -mno-epsilon -mabi=gnu @gol
-mabi=mmixware -mzero-extend -mknuthdiv -mtoplevel-symbols @gol
--melf -mbranch-predict -mno-branch-predict}
+-melf -mbranch-predict -mno-branch-predict -mbase-addresses @gol
+-mno-base-addresses}
@emph{IA-64 Options}
@gccoptlist{
@@ -779,10 +783,6 @@ package body). Such files are also called @dfn{bodies}.
@c @var{file}.p
@c @var{file}.pas
-@item @var{file}.ch
-@itemx @var{file}.chi
-CHILL source code (preprocessed with the traditional preprocessor).
-
@item @var{file}.s
Assembler code.
@@ -809,7 +809,6 @@ c++ c++-cpp-output
objective-c objc-cpp-output
assembler assembler-with-cpp
ada
-chill
f77 f77-cpp-input ratfor
java
@end example
@@ -888,6 +887,12 @@ Print (on standard error output) the commands executed to run the stages
of compilation. Also print the version number of the compiler driver
program and of the preprocessor and the compiler proper.
+@item -###
+@opindex ###
+Like @option{-v} except the commands are not executed and all command
+arguments are quoted. This is useful for shell scripts to capture the
+driver-generated command lines.
+
@item -pipe
@opindex pipe
Use pipes rather than temporary files for communication between the
@@ -1013,7 +1018,7 @@ ISO C89 as modified in amendment 1.
@itemx iso9899:1999
@itemx iso9899:199x
ISO C99. Note that this standard is not yet fully supported; see
-@w{@uref{http://gcc.gnu.org/c99status.html}} for more information. The
+@w{@uref{http://gcc.gnu.org/gcc-3.1/c99status.html}} for more information. The
names @samp{c9x} and @samp{iso9899:199x} are deprecated.
@item gnu89
@@ -1137,6 +1142,16 @@ freestanding and hosted environments.
Support ISO C trigraphs. The @option{-ansi} option (and @option{-std}
options for strict ISO C conformance) implies @option{-trigraphs}.
+@item -no-integrated-cpp
+@opindex no-integrated-cpp
+Invoke the external cpp during compilation. The default is to use the
+integrated cpp (internal cpp). This option also allows a
+user-supplied cpp via the @option{-B} option. This flag is applicable
+in both C and C++ modes.
+
+We do not guarantee to retain this option in future, and we may change
+its semantics.
+
@cindex traditional C language
@cindex C language, traditional
@item -traditional
@@ -1571,10 +1586,44 @@ The following @option{-W@dots{}} options are not affected by @option{-Wall}.
@table @gcctabopt
@item -Weffc++ @r{(C++ only)}
@opindex Weffc++
-Warn about violations of various style guidelines from Scott Meyers'
-@cite{Effective C++} books. If you use this option, you should be aware
-that the standard library headers do not obey all of these guidelines;
-you can use @samp{grep -v} to filter out those warnings.
+Warn about violations of the following style guidelines from Scott Meyers'
+@cite{Effective C++} book:
+
+@itemize @bullet
+@item
+Item 11: Define a copy constructor and an assignment operator for classes
+with dynamically allocated memory.
+
+@item
+Item 12: Prefer initialization to assignment in constructors.
+
+@item
+Item 14: Make destructors virtual in base classes.
+
+@item
+Item 15: Have @code{operator=} return a reference to @code{*this}.
+
+@item
+Item 23: Don't try to return a reference when you must return an object.
+
+@end itemize
+
+and about violations of the following style guidelines from Scott Meyers'
+@cite{More Effective C++} book:
+
+@itemize @bullet
+@item
+Item 6: Distinguish between prefix and postfix forms of increment and
+decrement operators.
+
+@item
+Item 7: Never overload @code{&&}, @code{||}, or @code{,}.
+
+@end itemize
+
+If you use this option, you should be aware that the standard library
+headers do not obey all of these guidelines; you can use @samp{grep -v}
+to filter out those warnings.
@item -Wno-deprecated @r{(C++ only)}
@opindex Wno-deprecated
@@ -1783,7 +1832,9 @@ negative form beginning @samp{-Wno-} to turn off warnings;
for example, @option{-Wno-implicit}. This manual lists only one of the
two forms, whichever is not the default.
-These options control the amount and kinds of warnings produced by GCC:
+The following options control the amount and kinds of warnings produced
+by GCC; for further, language-specific options also refer to
+@ref{C++ Dialect Options} and @ref{Objective-C Dialect Options}.
@table @gcctabopt
@cindex syntax checking
@@ -2548,7 +2599,7 @@ appropriate may not be detected. This option has no effect unless
@item -Wno-deprecated-declarations
@opindex Wno-deprecated-declarations
Do not warn about uses of functions, variables, and types marked as
-deprecated by using the @code{deprecated} attribute.
+deprecated by using the @code{deprecated} attribute.
(@pxref{Function Attributes}, @pxref{Variable Attributes},
@pxref{Type Attributes}.)
@@ -2745,8 +2796,6 @@ supported). This is the format used by DEBUG on VMS systems.
@itemx -gstabs@var{level}
@itemx -gcoff@var{level}
@itemx -gxcoff@var{level}
-@itemx -gdwarf@var{level}
-@itemx -gdwarf-2@var{level}
@itemx -gvms@var{level}
Request debugging information and also use @var{level} to specify how
much information. The default level is 2.
@@ -2760,6 +2809,11 @@ Level 3 includes extra information, such as all the macro definitions
present in the program. Some debuggers support macro expansion when
you use @option{-g3}.
+Note that in order to avoid confusion between DWARF1 debug level 2,
+and DWARF2, neither @option{-gdwarf} nor @option{-gdwarf-2} accept
+a concatenated debug level. Instead use an additional @option{-g@var{level}}
+option to change the debug level for DWARF1 or DWARF2.
+
@cindex @code{prof}
@item -p
@opindex p
@@ -3895,320 +3949,18 @@ Some of these options make sense only together with @option{-E} because
they cause the preprocessor output to be unsuitable for actual
compilation.
-@table @gcctabopt
-@item -include @var{file}
-@opindex include
-Process @var{file} as input before processing the regular input file.
-In effect, the contents of @var{file} are compiled first. Any @option{-D}
-and @option{-U} options on the command line are always processed before
-@option{-include @var{file}}, regardless of the order in which they are
-written. All the @option{-include} and @option{-imacros} options are
-processed in the order in which they are written.
-
-@item -imacros @var{file}
-@opindex imacros
-Process @var{file} as input, discarding the resulting output, before
-processing the regular input file. Because the output generated from
-@var{file} is discarded, the only effect of @option{-imacros @var{file}}
-is to make the macros defined in @var{file} available for use in the
-main input. All the @option{-include} and @option{-imacros} options are
-processed in the order in which they are written.
-
-@item -idirafter @var{dir}
-@opindex idirafter
-@cindex second include path
-Add the directory @var{dir} to the second include path. The directories
-on the second include path are searched when a header file is not found
-in any of the directories in the main include path (the one that
-@option{-I} adds to).
-
-@item -iprefix @var{prefix}
-@opindex iprefix
-Specify @var{prefix} as the prefix for subsequent @option{-iwithprefix}
-options.
-
-@item -iwithprefix @var{dir}
-@opindex iwithprefix
-Add a directory to the second include path. The directory's name is
-made by concatenating @var{prefix} and @var{dir}, where @var{prefix} was
-specified previously with @option{-iprefix}. If you have not specified a
-prefix yet, the directory containing the installed passes of the
-compiler is used as the default.
-
-@item -iwithprefixbefore @var{dir}
-@opindex iwithprefixbefore
-Add a directory to the main include path. The directory's name is made
-by concatenating @var{prefix} and @var{dir}, as in the case of
-@option{-iwithprefix}.
-
-@item -isystem @var{dir}
-@opindex isystem
-Add a directory to the beginning of the second include path, marking it
-as a system directory, so that it gets the same special treatment as
-is applied to the standard system directories.
-
-@item -nostdinc
-@opindex nostdinc
-Do not search the standard system directories for header files. Only
-the directories you have specified with @option{-I} options (and the
-current directory, if appropriate) are searched. @xref{Directory
-Options}, for information on @option{-I}.
-
-By using both @option{-nostdinc} and @option{-I-}, you can limit the include-file
-search path to only those directories you specify explicitly.
-
-@item -remap
-@opindex remap
-When searching for a header file in a directory, remap file names if a
-file named @file{header.gcc} exists in that directory. This can be used
-to work around limitations of file systems with file name restrictions.
-The @file{header.gcc} file should contain a series of lines with two
-tokens on each line: the first token is the name to map, and the second
-token is the actual name to use.
-
-@item -undef
-@opindex undef
-Do not predefine any nonstandard macros. (Including architecture flags).
-
-@item -E
-@opindex E
-Run only the C preprocessor. Preprocess all the C source files
-specified and output the results to standard output or to the
-specified output file.
-
-@item -C
-@opindex C
-Tell the preprocessor not to discard comments. Used with the
-@option{-E} option.
-
-@item -P
-@opindex P
-Tell the preprocessor not to generate @samp{#line} directives.
-Used with the @option{-E} option.
-
-@cindex make
-@cindex dependencies, make
-@item -M
-@opindex M
-Instead of outputting the result of preprocessing, output a rule
-suitable for @code{make} describing the dependencies of the main source
-file. The preprocessor outputs one @code{make} rule containing the
-object file name for that source file, a colon, and the names of all the
-included files. Unless overridden explicitly, the object file name
-consists of the basename of the source file with any suffix replaced with
-object file suffix. If there are many included files then the
-rule is split into several lines using @samp{\}-newline.
-
-@option{-M} implies @option{-E}.
-
-@item -MM
-@opindex MM
-Like @option{-M}, but mention only the files included with @samp{#include
-"@var{file}"}. System header files included with @samp{#include
-<@var{file}>} are omitted.
-
-@item -MD
-@opindex MD
-Like @option{-M} but the dependency information is written to a file
-rather than stdout. @code{gcc} will use the same file name and
-directory as the object file, but with the suffix @file{.d} instead.
-
-This is in addition to compiling the main file as specified---@option{-MD}
-does not inhibit ordinary compilation the way @option{-M} does,
-unless you also specify @option{-MG}.
-
-With Mach, you can use the utility @code{md} to merge multiple
-dependency files into a single dependency file suitable for using with
-the @samp{make} command.
-
-@item -MMD
-@opindex MMD
-Like @option{-MD} except mention only user header files, not system
--header files.
-
-@item -MF @var{file}
-@opindex MF
-When used with @option{-M} or @option{-MM}, specifies a file to write the
-dependencies to. This allows the preprocessor to write the preprocessed
-file to stdout normally. If no @option{-MF} switch is given, CPP sends
-the rules to stdout and suppresses normal preprocessed output.
-
-Another way to specify output of a @code{make} rule is by setting
-the environment variable @env{DEPENDENCIES_OUTPUT} (@pxref{Environment
-Variables}).
-
-@item -MG
-@opindex MG
-When used with @option{-M} or @option{-MM}, @option{-MG} says to treat missing
-header files as generated files and assume they live in the same
-directory as the source file. It suppresses preprocessed output, as a
-missing header file is ordinarily an error.
-
-This feature is used in automatic updating of makefiles.
-
-@item -MP
-@opindex MP
-This option instructs CPP to add a phony target for each dependency
-other than the main file, causing each to depend on nothing. These
-dummy rules work around errors @code{make} gives if you remove header
-files without updating the @code{Makefile} to match.
-
-This is typical output:-
-
-@smallexample
-/tmp/test.o: /tmp/test.c /tmp/test.h
-
-/tmp/test.h:
-@end smallexample
-
-@item -MQ @var{target}
-@item -MT @var{target}
-@opindex MQ
-@opindex MT
-By default CPP uses the main file name, including any path, and appends
-the object suffix, normally ``.o'', to it to obtain the name of the
-target for dependency generation. With @option{-MT} you can specify a
-target yourself, overriding the default one.
-
-If you want multiple targets, you can specify them as a single argument
-to @option{-MT}, or use multiple @option{-MT} options.
-
-The targets you specify are output in the order they appear on the
-command line. @option{-MQ} is identical to @option{-MT}, except that the
-target name is quoted for Make, but with @option{-MT} it isn't. For
-example, @option{-MT '$(objpfx)foo.o'} gives
-
-@smallexample
-$(objpfx)foo.o: /tmp/foo.c
-@end smallexample
-
-but @option{-MQ '$(objpfx)foo.o'} gives
-
-@smallexample
-$$(objpfx)foo.o: /tmp/foo.c
-@end smallexample
-
-The default target is automatically quoted, as if it were given with
-@option{-MQ}.
-
-@item -H
-@opindex H
-Print the name of each header file used, in addition to other normal
-activities.
-
-@item -A@var{question}(@var{answer})
-@opindex A
-Assert the answer @var{answer} for @var{question}, in case it is tested
-with a preprocessing conditional such as @samp{#if
-#@var{question}(@var{answer})}. @option{-A-} disables the standard
-assertions that normally describe the target machine.
-
-@item -D@var{macro}
-@opindex D
-Define macro @var{macro} with the string @samp{1} as its definition.
-
-@item -D@var{macro}=@var{defn}
-Define macro @var{macro} as @var{defn}. All instances of @option{-D} on
-the command line are processed before any @option{-U} options.
-
-Any @option{-D} and @option{-U} options on the command line are processed in
-order, and always before @option{-imacros @var{file}}, regardless of the
-order in which they are written.
-
-@item -U@var{macro}
-@opindex U
-Undefine macro @var{macro}. @option{-U} options are evaluated after all
-@option{-D} options, but before any @option{-include} and @option{-imacros}
-options.
-
-Any @option{-D} and @option{-U} options on the command line are processed in
-order, and always before @option{-imacros @var{file}}, regardless of the
-order in which they are written.
-
-@item -dM
-@opindex dM
-Tell the preprocessor to output only a list of the macro definitions
-that are in effect at the end of preprocessing. Used with the @option{-E}
-option.
-
-@item -dD
-@opindex dD
-Tell the preprocessing to pass all macro definitions into the output, in
-their proper sequence in the rest of the output.
-
-@item -dN
-@opindex dN
-Like @option{-dD} except that the macro arguments and contents are omitted.
-Only @samp{#define @var{name}} is included in the output.
-
-@item -dI
-@opindex dI
-Output @samp{#include} directives in addition to the result of
-preprocessing.
-
-@item -fpreprocessed
-@opindex fpreprocessed
-Indicate to the preprocessor that the input file has already been
-preprocessed. This suppresses things like macro expansion, trigraph
-conversion, escaped newline splicing, and processing of most directives.
-The preprocessor still recognizes and removes comments, so that you can
-pass a file preprocessed with @option{-C} to the compiler without
-problems. In this mode the integrated preprocessor is little more than
-a tokenizer for the front ends.
-
-@option{-fpreprocessed} is implicit if the input file has one of the
-extensions @samp{i}, @samp{ii} or @samp{mi}. These are the extensions
-that GCC uses for preprocessed files created by @option{-save-temps}.
-
-@item -trigraphs
-@opindex trigraphs
-Process ISO standard trigraph sequences. These are three-character
-sequences, all starting with @samp{??}, that are defined by ISO C to
-stand for single characters. For example, @samp{??/} stands for
-@samp{\}, so @samp{'??/n'} is a character constant for a newline. By
-default, GCC ignores trigraphs, but in standard-conforming modes it
-converts them. See the @option{-std} and @option{-ansi} options.
-
-The nine trigraph sequences are
-@table @samp
-@item ??(
-@expansion{} @samp{[}
-
-@item ??)
-@expansion{} @samp{]}
-
-@item ??<
-@expansion{} @samp{@{}
-
-@item ??>
-@expansion{} @samp{@}}
-
-@item ??=
-@expansion{} @samp{#}
-
-@item ??/
-@expansion{} @samp{\}
-
-@item ??'
-@expansion{} @samp{^}
-
-@item ??!
-@expansion{} @samp{|}
-
-@item ??-
-@expansion{} @samp{~}
-
-@end table
-
-Trigraph support is not popular, so many compilers do not implement it
-properly. Portable code should not rely on trigraphs being either
-converted or ignored.
-
-@item -Wp,@var{option}
@opindex Wp
-Pass @var{option} as an option to the preprocessor. If @var{option}
-contains commas, it is split into multiple options at the commas.
-@end table
+You can use @option{-Wp,@var{option}} to bypass the compiler driver
+and pass @var{option} directly through to the preprocessor. If
+@var{option} contains commas, it is split into multiple options at the
+commas. However, many options are modified, translated or interpreted
+by the compiler driver before being passed to the preprocessor, and
+@option{-Wp} forcibly bypasses this phase. The preprocessor's direct
+interface is undocumented and subject to change, so whenever possible
+you should avoid using @option{-Wp} and let the driver handle the
+options instead.
+
+@include cppopts.texi
@node Assembler Options
@section Passing Options to the Assembler
@@ -4371,15 +4123,26 @@ of these is when the application wishes to throw and catch exceptions
across different shared libraries. In that case, each of the libraries
as well as the application itself should use the shared @file{libgcc}.
-Therefore, whenever you specify the @option{-shared} option, the GCC
-driver automatically adds @option{-shared-libgcc}, unless you explicitly
-specify @option{-static-libgcc}. The G++ driver automatically adds
-@option{-shared-libgcc} when you build a main executable as well because
-for C++ programs that is typically the right thing to do.
-(Exception-handling will not work reliably otherwise.)
-
-However, when linking a main executable written in C, you must
-explicitly say @option{-shared-libgcc} if you want to use the shared
+Therefore, the G++ and GCJ drivers automatically add
+@option{-shared-libgcc} whenever you build a shared library or a main
+executable, because C++ and Java programs typically use exceptions, so
+this is the right thing to do.
+
+If, instead, you use the GCC driver to create shared libraries, you may
+find that they will not always be linked with the shared @file{libgcc}.
+If GCC finds, at its configuration time, that you have a GNU linker that
+does not support option @option{--eh-frame-hdr}, it will link the shared
+version of @file{libgcc} into shared libraries by default. Otherwise,
+it will take advantage of the linker and optimize away the linking with
+the shared version of @file{libgcc}, linking with the static version of
+libgcc by default. This allows exceptions to propagate through such
+shared libraries, without incurring relocation costs at library load
+time.
+
+However, if a library or main executable is supposed to throw or catch
+exceptions, you must link it using the G++ or GCJ driver, as appropriate
+for the languages used in the program, or using the option
+@option{-shared-libgcc}, such that it is linked with the shared
@file{libgcc}.
@item -symbolic
@@ -5445,18 +5208,6 @@ emulates the effect of the instruction. Because of the trap handler overhead,
this is much slower than calling the ABI library routines. Thus the
@option{-msoft-quad-float} option is the default.
-@item -mno-epilogue
-@itemx -mepilogue
-@opindex mno-epilogue
-@opindex mepilogue
-With @option{-mepilogue} (the default), the compiler always emits code for
-function exit at the end of each function. Any function exit in
-the middle of the function (such as a return statement in C) will
-generate a jump to the exit code at the end of the function.
-
-With @option{-mno-epilogue}, the compiler tries to emit exit code inline
-at every function exit.
-
@item -mno-flat
@itemx -mflat
@opindex mno-flat
@@ -6964,6 +6715,10 @@ Extend the current ABI with AltiVec ABI extensions. This does not
change the default ABI, instead it adds the AltiVec ABI extensions to
the current ABI@.
+@item -mabi=no-altivec
+@opindex mabi=no-altivec
+Disable AltiVec ABI extensions for the current ABI.
+
@item -mprototype
@itemx -mno-prototype
@opindex mprototype
@@ -7643,9 +7398,12 @@ in ordinary CPU registers instead.
@opindex mno-fancy-math-387
Some 387 emulators do not support the @code{sin}, @code{cos} and
@code{sqrt} instructions for the 387. Specify this option to avoid
-generating those instructions. This option is the default on FreeBSD@.
-As of revision 2.6.1, these instructions are not generated unless you
-also use the @option{-funsafe-math-optimizations} switch.
+generating those instructions. This option is the default on FreeBSD,
+OpenBSD and NetBSD@. This option is overridden when @option{-march}
+indicates that the target cpu will always have an FPU and so the
+instruction will not need emulation. As of revision 2.6.1, these
+instructions are not generated unless you also use the
+@option{-funsafe-math-optimizations} switch.
@item -malign-double
@itemx -mno-align-double
@@ -8267,7 +8025,7 @@ arithmetic instead of IEEE single and double precision.
@opindex mexplicit-relocs
@opindex mno-explicit-relocs
Older Alpha assemblers provided no way to generate symbol relocations
-except via assembler macros. Use of these macros does not allow
+except via assembler macros. Use of these macros does not allow
optimial instruction scheduling. GNU binutils as of version 2.12
supports a new syntax that allows the compiler to explicitly mark
which relocations should apply to which instructions. This option
@@ -8278,7 +8036,7 @@ the assembler when it is built and sets the default accordingly.
@itemx -mlarge-data
@opindex msmall-data
@opindex mlarge-data
-When @option{-mexplicit-relocs} is in effect, static data is
+When @option{-mexplicit-relocs} is in effect, static data is
accessed via @dfn{gp-relative} relocations. When @option{-msmall-data}
is used, objects 8 bytes long or smaller are placed in a @dfn{small data area}
(the @code{.sdata} and @code{.sbss} sections) and are accessed via
@@ -8616,8 +8374,8 @@ count register BK@.
Enable (disable) generation of code using decrement and branch,
DBcond(D), instructions. This is enabled by default for the C4x. To be
on the safe side, this is disabled for the C3x, since the maximum
-iteration count on the C3x is @math{2^23 + 1} (but who iterates loops more than
-@math{2^23} times on the C3x?). Note that GCC will try to reverse a loop so
+iteration count on the C3x is @math{2^{23} + 1} (but who iterates loops more than
+@math{2^{23}} times on the C3x?). Note that GCC will try to reverse a loop so
that it can utilise the decrement and branch instruction, but will give
up if there is more than one memory reference in the loop. Thus a loop
where the loop counter is decremented can generate slightly more
@@ -8685,9 +8443,9 @@ instruction, it is disabled by default.
@opindex mloop-unsigned
@opindex mno-loop-unsigned
The maximum iteration count when using RPTS and RPTB (and DB on the C40)
-is @math{2^31 + 1} since these instructions test if the iteration count is
+is @math{2^{31} + 1} since these instructions test if the iteration count is
negative to terminate the loop. If the iteration count is unsigned
-there is a possibility than the @math{2^31 + 1} maximum iteration count may be
+there is a possibility than the @math{2^{31} + 1} maximum iteration count may be
exceeded. This switch allows an unsigned iteration count.
@item -mti
@@ -9269,7 +9027,7 @@ generates IEEE floating-point instructions. This is the default.
@itemx -mno-backchain
@opindex mbackchain
@opindex mno-backchain
-Generate (or do not generate) code which maintains an explicit
+Generate (or do not generate) code which maintains an explicit
backchain within the stack frame that points to the caller's frame.
This is currently needed to allow debugging. The default is to
generate the backchain.
@@ -9278,8 +9036,8 @@ generate the backchain.
@itemx -mno-small-exec
@opindex msmall-exec
@opindex mno-small-exec
-Generate (or do not generate) code using the @code{bras} instruction
-to do subroutine calls.
+Generate (or do not generate) code using the @code{bras} instruction
+to do subroutine calls.
This only works reliably if the total executable size does not
exceed 64k. The default is to use the @code{basr} instruction instead,
which does not have this limitation.
@@ -9292,14 +9050,14 @@ When @option{-m31} is specified, generate code compliant to the
Linux for S/390 ABI@. When @option{-m64} is specified, generate
code compliant to the Linux for zSeries ABI@. This allows GCC in
particular to generate 64-bit instructions. For the @samp{s390}
-targets, the default is @option{-m31}, while the @samp{s390x}
+targets, the default is @option{-m31}, while the @samp{s390x}
targets default to @option{-m64}.
@item -mmvcle
@itemx -mno-mvcle
@opindex mmvcle
@opindex mno-mvcle
-Generate (or do not generate) code using the @code{mvcle} instruction
+Generate (or do not generate) code using the @code{mvcle} instruction
to perform block moves. When @option{-mno-mvcle} is specifed,
use a @code{mvc} loop instead. This is the default.
@@ -9513,6 +9271,19 @@ Generate an executable in the ELF format, rather than the default
@opindex mno-branch-predict
Use (do not use) the probable-branch instructions, when static branch
prediction indicates a probable branch.
+
+@item -mbase-addresses
+@itemx -mno-base-addresses
+@opindex mbase-addresses
+@opindex mno-base-addresses
+Generate (do not generate) code that uses @emph{base addresses}. Using a
+base address automatically generates a request (handled by the assembler
+and the linker) for a constant to be set up in a global register. The
+register is used for one or more base address requests within the range 0
+to 255 from the value held in the register. The generally leads to short
+and fast code, but the number of different data items that can be
+addressed is limited. This means that a program that uses lots of static
+data may require @option{-mno-base-addresses}.
@end table
@node PDP-11 Options
@@ -10255,35 +10026,6 @@ using GCC also uses these directories when searching for ordinary
libraries for the @option{-l} option (but directories specified with
@option{-L} come first).
-@item C_INCLUDE_PATH
-@itemx CPLUS_INCLUDE_PATH
-@itemx OBJC_INCLUDE_PATH
-@findex C_INCLUDE_PATH
-@findex CPLUS_INCLUDE_PATH
-@findex OBJC_INCLUDE_PATH
-@c @itemx OBJCPLUS_INCLUDE_PATH
-These environment variables pertain to particular languages. Each
-variable's value is a colon-separated list of directories, much like
-@env{PATH}. When GCC searches for header files, it tries the
-directories listed in the variable for the language you are using, after
-the directories specified with @option{-I} but before the standard header
-file directories.
-
-@item DEPENDENCIES_OUTPUT
-@findex DEPENDENCIES_OUTPUT
-@cindex dependencies for make as output
-If this variable is set, its value specifies how to output dependencies
-for Make based on the header files processed by the compiler. This
-output looks much like the output from the @option{-M} option
-(@pxref{Preprocessor Options}), but it goes to a separate file, and is
-in addition to the usual results of compilation.
-
-The value of @env{DEPENDENCIES_OUTPUT} can be just a file name, in
-which case the Make rules are written to that file, guessing the target
-name from the source file name. Or the value can have the form
-@samp{@var{file} @var{target}}, in which case the rules are written to
-file @var{file} using @var{target} as the target name.
-
@item LANG
@findex LANG
@cindex locale definition
@@ -10307,6 +10049,12 @@ compiler will use mblen and mbtowc as defined by the default locale to
recognize and translate multibyte characters.
@end table
+@noindent
+Some additional environments variables affect the behavior of the
+preprocessor.
+
+@include cppenv.texi
+
@c man end
@node Running Protoize
diff --git a/contrib/gcc/doc/md.texi b/contrib/gcc/doc/md.texi
index ca59a6c..c5bfd62 100644
--- a/contrib/gcc/doc/md.texi
+++ b/contrib/gcc/doc/md.texi
@@ -185,10 +185,10 @@ Here is an actual example of an instruction pattern, for the 68000/68020.
(match_operand:SI 0 "general_operand" "rm"))]
""
"*
-@{
+@{
if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
return \"tstl %0\";
- return \"cmpl #0,%0\";
+ return \"cmpl #0,%0\";
@}")
@end example
@@ -200,10 +200,10 @@ This can also be written using braced strings:
[(set (cc0)
(match_operand:SI 0 "general_operand" "rm"))]
""
-@{
+@{
if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
return "tstl %0";
- return "cmpl #0,%0";
+ return "cmpl #0,%0";
@})
@end example
@@ -1859,6 +1859,17 @@ Zero
32-bit constant with the low 12 bits clear (a constant that can be
loaded with the @code{sethi} instruction)
+@item L
+A constant in the range supported by @code{movcc} instructions
+
+@item M
+A constant in the range supported by @code{movrcc} instructions
+
+@item N
+Same as @samp{K}, except that it verifies that bits that are not in the
+lower 32-bits range are all zero. Must be used instead of @samp{K} for
+modes wider than @code{SImode}
+
@item G
Floating-point zero
@@ -1886,6 +1897,9 @@ Memory address aligned to an 8-byte boundary
@item U
Even register
+@item W
+Memory address for @samp{e} constraint registers.
+
@end table
@item TMS320C3x/C4x---@file{c4x.h}
@@ -2208,7 +2222,7 @@ register. See the discussion of the @code{SECONDARY_RELOAD_CLASS}
macro in @pxref{Register Classes}.
There are special restrictions on the form of the @code{match_operand}s
-used in these patterns. First, only the predicate for the reload
+used in these patterns. First, only the predicate for the reload
operand is examined, i.e., @code{reload_in} examines operand 1, but not
the predicates for operand 0 or 2. Second, there may be only one
alternative in the constraints. Third, only a single register class
@@ -3955,7 +3969,7 @@ are not valid.
The splitter is allowed to split jump instructions into sequence of
jumps or create new jumps in while splitting non-jump instructions. As
the central flowgraph and branch prediction information needs to be updated,
-several restriction apply.
+several restriction apply.
Splitting of jump instruction into sequence that over by another jump
instruction is always valid, as compiler expect identical behavior of new
@@ -4004,7 +4018,7 @@ from i386.md:
"TARGET_ZERO_EXTEND_WITH_AND && !optimize_size"
"#"
"&& reload_completed"
- [(parallel [(set (match_dup 0)
+ [(parallel [(set (match_dup 0)
(and:SI (match_dup 0) (const_int 65535)))
(clobber (reg:CC 17))])]
""
@@ -4041,7 +4055,7 @@ For example:
@smallexample
-(include "filestuff")
+(include "filestuff")
@end smallexample
@@ -4050,14 +4064,14 @@ specifies the include file to be in @file{gcc/config/target/filestuff}. The
directory @file{gcc/config/target} is regarded as the default directory.
-Machine descriptions may be split up into smaller more manageable subsections
-and placed into subdirectories.
+Machine descriptions may be split up into smaller more manageable subsections
+and placed into subdirectories.
By specifying:
@smallexample
-(include "BOGUS/filestuff")
+(include "BOGUS/filestuff")
@end smallexample
@@ -4066,10 +4080,10 @@ the include file is specified to be in @file{gcc/config/@var{target}/BOGUS/files
Specifying an absolute path for the include file such as;
@smallexample
-(include "/u2/BOGUS/filestuff")
+(include "/u2/BOGUS/filestuff")
@end smallexample
-is permitted but is not encouraged.
+is permitted but is not encouraged.
@subsection RTL Generation Tool Options for Directory Search
@cindex directory options .md
diff --git a/contrib/gcc/doc/passes.texi b/contrib/gcc/doc/passes.texi
index f248056..6ca5b85 100644
--- a/contrib/gcc/doc/passes.texi
+++ b/contrib/gcc/doc/passes.texi
@@ -130,7 +130,7 @@ representation, before converting into RTL code.
@cindex inline on trees, automatic
Currently, the main optimization performed here is tree-based
inlining.
-This is implemented in @file{tree-inline.c} and used by both C and C++.
+This is implemented in @file{tree-inline.c} and used by both C and C++.
Note that tree based inlining turns off rtx based inlining (since it's more
powerful, it would be a waste of time to do rtx based inlining in
addition).
diff --git a/contrib/gcc/doc/rtl.texi b/contrib/gcc/doc/rtl.texi
index 5b61409..2151047 100644
--- a/contrib/gcc/doc/rtl.texi
+++ b/contrib/gcc/doc/rtl.texi
@@ -501,9 +501,9 @@ Stored in the @code{jump} field and printed as @samp{/j}.
In @code{mem} expressions, nonzero for reference to a scalar known not
to be a member of a structure, union, or array. Zero for such
references and for indirections through pointers, even pointers pointing
-to scalar types. If both this flag and @code{MEM_STRUCT_P} are clear, then we
-don't know whether this @code{mem} is in a structure or not. Both flags should
-never be simultaneously set.
+to scalar types. If both this flag and @code{MEM_IN_STRUCT_P} are clear,
+then we don't know whether this @code{mem} is in a structure or not.
+Both flags should never be simultaneously set.
Stored in the @code{frame_related} field and printed as @samp{/f}.
@findex MEM_VOLATILE_P
@@ -1156,6 +1156,20 @@ bits but small enough to fit within twice that number of bits (GCC
does not provide a mechanism to represent even larger constants). In
the latter case, @var{m} will be @code{VOIDmode}.
+@findex const_vector
+@item (const_vector:@var{m} [@var{x0} @var{x1} @dots{}])
+Represents a vector constant. The square brackets stand for the vector
+containing the constant elements. @var{x0}, @var{x1} and so on are
+the @code{const_int} or @code{const_double} elements.
+
+The number of units in a @code{const_vector} is obtained with the macro
+@code{CONST_VECTOR_NUNITS} as in @code{CONST_VECTOR_NUNITS (@var{v})}.
+
+Individual elements in a vector constant are accessed with the macro
+@code{CONST_VECTOR_ELT} as in @code{CONST_VECTOR_ELT (@var{v}, @var{n})}
+where @var{v} is the vector constant and @var{n} is the element
+desired.
+
@findex CONST_DOUBLE_MEM
@findex CONST_DOUBLE_CHAIN
@var{addr} is used to contain the @code{mem} expression that corresponds
@@ -1185,10 +1199,14 @@ the precise bit pattern used by the target machine, use the macro
@findex CONST2_RTX
The macro @code{CONST0_RTX (@var{mode})} refers to an expression with
value 0 in mode @var{mode}. If mode @var{mode} is of mode class
-@code{MODE_INT}, it returns @code{const0_rtx}. Otherwise, it returns a
-@code{CONST_DOUBLE} expression in mode @var{mode}. Similarly, the macro
+@code{MODE_INT}, it returns @code{const0_rtx}. If mode @var{mode} is of
+mode class @code{MODE_FLOAT}, it returns a @code{CONST_DOUBLE}
+expression in mode @var{mode}. Otherwise, it returns a
+@code{CONST_VECTOR} expression in mode @var{mode}. Similarly, the macro
@code{CONST1_RTX (@var{mode})} refers to an expression with value 1 in
-mode @var{mode} and similarly for @code{CONST2_RTX}.
+mode @var{mode} and similarly for @code{CONST2_RTX}. The
+@code{CONST1_RTX} and @code{CONST2_RTX} macros are undefined
+for vector modes.
@findex const_string
@item (const_string @var{str})
@@ -2299,7 +2317,7 @@ either wrap around or use saturating addition depending on the value
of a special control register:
@example
-(parallel [(set (reg:SI 2) (unspec:SI [(reg:SI 3)
+(parallel [(set (reg:SI 2) (unspec:SI [(reg:SI 3)
(reg:SI 4)] 0))
(use (reg:SI 1))])
@end example
@@ -3331,6 +3349,11 @@ There is only one @code{cc0} expression.
There is only one @code{const_double} expression with value 0 for
each floating point mode. Likewise for values 1 and 2.
+@cindex @code{const_vector}, RTL sharing
+@item
+There is only one @code{const_vector} expression with value 0 for
+each vector mode, be it an integer or a double constant vector.
+
@cindex @code{label_ref}, RTL sharing
@cindex @code{scratch}, RTL sharing
@item
diff --git a/contrib/gcc/doc/sourcebuild.texi b/contrib/gcc/doc/sourcebuild.texi
index 670d501..9a14e44 100644
--- a/contrib/gcc/doc/sourcebuild.texi
+++ b/contrib/gcc/doc/sourcebuild.texi
@@ -50,9 +50,6 @@ language front ends, and test suites. @xref{gcc Directory, , The
@item include
Headers for the @code{libiberty} library.
-@item libchill
-The CHILL runtime library.
-
@item libf2c
The Fortran runtime library.
@@ -60,7 +57,7 @@ The Fortran runtime library.
The @code{libffi} library, used as part of the Java runtime library.
@item libiberty
-The @code{libibery} library, used for portability and for some
+The @code{libiberty} library, used for portability and for some
generally useful data structures and algorithms. @xref{Top, ,
Introduction, libiberty, @sc{gnu} libiberty}, for more information
about this library.
diff --git a/contrib/gcc/doc/standards.texi b/contrib/gcc/doc/standards.texi
index 5d5ed0c..25fbb45 100644
--- a/contrib/gcc/doc/standards.texi
+++ b/contrib/gcc/doc/standards.texi
@@ -1,4 +1,4 @@
-@c Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+@c Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
@c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi.
@@ -80,7 +80,7 @@ as @dfn{AMD1}; the amended standard is sometimes known as @dfn{C94} or
A new edition of the ISO C standard was published in 1999 as ISO/IEC
9899:1999, and is commonly known as @dfn{C99}. GCC has incomplete
support for this standard version; see
-@uref{http://gcc.gnu.org/c99status.html} for details. To select this
+@uref{http://gcc.gnu.org/gcc-3.1/c99status.html} for details. To select this
standard, use @option{-std=c99} or @option{-std=iso9899:1999}. (While in
development, drafts of this standard version were referred to as
@dfn{C9X}.)
@@ -139,10 +139,10 @@ the semantics defined in the standard. To make it act as a conforming
freestanding implementation for a freestanding environment, use the
option @option{-ffreestanding}; it will then define
@code{__STDC_HOSTED__} to @code{0} and not make assumptions about the
-meanings of function names from the standard library. To build an OS
-kernel, you may well still need to make your own arrangements for
-linking and startup. @xref{C Dialect Options,,Options Controlling C
-Dialect}.
+meanings of function names from the standard library, with exceptions
+noted below. To build an OS kernel, you may well still need to make
+your own arrangements for linking and startup.
+@xref{C Dialect Options,,Options Controlling C Dialect}.
GCC does not provide the library facilities required only of hosted
implementations, nor yet all the facilities required by C99 of
@@ -150,6 +150,16 @@ freestanding implementations; to use the facilities of a hosted
environment, you will need to find them elsewhere (for example, in the
GNU C library). @xref{Standard Libraries,,Standard Libraries}.
+Most of the compiler support routines used by GCC are present in
+@file{libgcc}, but there are a few exceptions. GCC requires the
+freestanding environment provide @code{memcpy}, @code{memmove},
+@code{memset} and @code{memcmp}. Some older ports of GCC are
+configured to use the BSD @code{bcopy}, @code{bzero} and @code{bcmp}
+functions instead, but this is deprecated for new ports.
+Finally, if @code{__builtin_trap} is used, and the target does
+not implement the @code{trap} pattern, then GCC will emit a call
+to @code{abort}.
+
For references to Technical Corrigenda, Rationale documents and
information concerning the history of C that is available online, see
@uref{http://gcc.gnu.org/readings.html}
@@ -164,13 +174,10 @@ recent version, while @uref{http://www.toodarkpark.org/computers/objc/}
is an older example. @uref{http://www.gnustep.org} includes useful
information as well.
-@xref{Top, GNAT Reference Manual, About This Guide, gnat_rm,
+@xref{Top, GNAT Reference Manual, About This Guide, gnat_rm,
GNAT Reference Manual}, for information on standard
conformance and compatibility of the Ada compiler.
-@xref{References,,Language Definition References, chill, GNU Chill},
-for details of the CHILL standard.
-
@xref{Language,,The GNU Fortran Language, g77, Using and Porting GNU
Fortran}, for details of the Fortran language supported by GCC@.
diff --git a/contrib/gcc/doc/tm.texi b/contrib/gcc/doc/tm.texi
index e9797bf..3d9e453 100644
--- a/contrib/gcc/doc/tm.texi
+++ b/contrib/gcc/doc/tm.texi
@@ -216,16 +216,6 @@ This should be defined if @code{WINT_TYPE} depends on target dependent flags
which are not accessible to the preprocessor. Otherwise, it should not
be defined.
-@findex SIGNED_CHAR_SPEC
-@item SIGNED_CHAR_SPEC
-A C string constant that tells the GCC driver program options to
-pass to CPP@. By default, this macro is defined to pass the option
-@option{-D__CHAR_UNSIGNED__} to CPP if @code{char} will be treated as
-@code{unsigned char} by @code{cc1}.
-
-Do not define this macro unless you need to override the default
-definition.
-
@findex CC1_SPEC
@item CC1_SPEC
A C string constant that tells the GCC driver program options to
@@ -387,6 +377,11 @@ the argument @option{-lgcc} to tell the linker to do the search.
This macro is similar to @code{LINK_LIBGCC_SPECIAL}, except that it does
not affect @option{-L} options.
+@findex LINK_GCC_C_SEQUENCE_SPEC
+@item LINK_GCC_C_SEQUENCE_SPEC
+The sequence in which libgcc and libc are specified to the linker.
+By default this is @code{%G %L %G}.
+
@findex LINK_COMMAND_SPEC
@item LINK_COMMAND_SPEC
A C string constant giving the complete command line need to execute the
@@ -394,7 +389,8 @@ linker. When you do this, you will need to update your port each time a
change is made to the link command line within @file{gcc.c}. Therefore,
define this macro only if you need to completely redefine the command
line for invoking the linker and there is no other way to accomplish
-the effect you need.
+the effect you need. Overriding this macro may be avoidable by overriding
+@code{LINK_GCC_C_SEQUENCE_SPEC} instead.
@findex LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
@item LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
@@ -697,7 +693,11 @@ string is present but empty, then no help information will be displayed
for that option, but it will not count as an undocumented option. The
actual option name is made by appending @samp{-m} to the specified name.
Non-empty description strings should be marked with @code{N_(@dots{})} for
-@command{xgettext}. In addition to the description for @option{--help},
+@command{xgettext}. Please do not mark empty strings because the empty
+string is reserved by GNU gettext. @code{gettext("")} returns the header entry
+of the message catalog with meta information, not the empty string.
+
+In addition to the description for @option{--help},
more detailed documentation for each option should be added to
@file{invoke.texi}.
@@ -723,8 +723,12 @@ options that have values. Its definition is an initializer with a
subgrouping for each command option.
Each subgrouping contains a string constant, that defines the fixed part
-of the option name, the address of a variable, and a description string
-(which should again be marked with @code{N_(@dots{})}).
+of the option name, the address of a variable, and a description string.
+Non-empty description strings should be marked with @code{N_(@dots{})} for
+@command{xgettext}. Please do not mark empty strings because the empty
+string is reserved by GNU gettext. @code{gettext("")} returns the header entry
+of the message catalog with meta information, not the empty string.
+
The variable, type @code{char *}, is set to the variable part of the
given option if the fixed part matches. The actual option name is made
by appending @samp{-m} to the specified name. Again, each option should
@@ -1209,8 +1213,8 @@ get from @code{PCC_BITFIELD_TYPE_MATTERS}.
@findex BITFIELD_NBYTES_LIMITED
@item BITFIELD_NBYTES_LIMITED
-Like PCC_BITFIELD_TYPE_MATTERS except that its effect is limited to
-aligning a bit-field within the structure.
+Like @code{PCC_BITFIELD_TYPE_MATTERS} except that its effect is limited
+to aligning a bit-field within the structure.
@findex MEMBER_TYPE_FORCES_BLK
@item MEMBER_TYPE_FORCES_BLK (@var{field})
@@ -1339,6 +1343,20 @@ memory is controlled by @code{FLOAT_WORDS_BIG_ENDIAN}.
@end table
+@deftypefn {Target Hook} bool TARGET_MS_BITFIELD_LAYOUT_P (tree @var{record_type})
+This target hook returns @code{true} if bit-fields in the given
+@var{record_type} are to be laid out following the rules of Microsoft
+Visual C/C++, namely: (i) a bit-field won't share the same storage
+unit with the previous bit-field if their underlying types have
+different sizes, and the bit-field will be aligned to the highest
+alignment of the underlying types of itself and of the previous
+bit-field; (ii) a zero-sized bit-field will affect the alignment of
+the whole enclosing structure, even if it is unnamed; except that
+(iii) a zero-sized bit-field will be disregarded unless it follows
+another bit-field of non-zero size. If this hook returns @code{true},
+other macros that control bit-field layout are ignored.
+@end deftypefn
+
@node Type Layout
@section Layout of Source Language Data Types
@@ -1404,9 +1422,9 @@ used in @code{cpp}.
@findex BOOL_TYPE_SIZE
@item BOOL_TYPE_SIZE
-A C expression for the size in bits of the C++ type @code{bool} on the
-target machine. If you don't define this, the default is
-@code{CHAR_TYPE_SIZE}.
+A C expression for the size in bits of the C++ type @code{bool} and
+C99 type @code{_Bool} on the target machine. If you don't define
+this, and you probably shouldn't, the default is @code{CHAR_TYPE_SIZE}.
@findex FLOAT_TYPE_SIZE
@item FLOAT_TYPE_SIZE
@@ -1592,10 +1610,10 @@ in which function addresses are always even, according to
@findex TARGET_VTABLE_USES_DESCRIPTORS
@item TARGET_VTABLE_USES_DESCRIPTORS
Normally, the C++ compiler uses function pointers in vtables. This
-macro allows the target to change to use ``function descriptors''
+macro allows the target to change to use ``function descriptors''
instead. Function descriptors are found on targets for whom a
function pointer is actually a small data structure. Normally the
-data structure consists of the actual code address plus a data
+data structure consists of the actual code address plus a data
pointer to which the function's data is relative.
If vtables are used, the value of this macro should be the number
@@ -1717,10 +1735,10 @@ exit, if the register is used within the function.
@cindex call-used register
@cindex call-clobbered register
@cindex call-saved register
-Like @code{CALL_USED_REGISTERS} except this macro doesn't require
-that the entire set of @code{FIXED_REGISTERS} be included.
+Like @code{CALL_USED_REGISTERS} except this macro doesn't require
+that the entire set of @code{FIXED_REGISTERS} be included.
(@code{CALL_USED_REGISTERS} must be a superset of @code{FIXED_REGISTERS}).
-This macro is optional. If not specified, it defaults to the value
+This macro is optional. If not specified, it defaults to the value
of @code{CALL_USED_REGISTERS}.
@findex HARD_REGNO_CALL_PART_CLOBBERED
@@ -2793,7 +2811,7 @@ and @file{unwind-ia64.c}. @var{context} is an @code{_Unwind_Context};
for the address of the code being executed and @code{context->cfa} for
the stack pointer value. If the frame can be decoded, the register save
addresses should be updated in @var{fs} and the macro should branch to
-@var{success}. If the frame cannot be decoded, the macro should do
+@var{success}. If the frame cannot be decoded, the macro should do
nothing.
@end table
@@ -3262,6 +3280,22 @@ arguments pop them but other functions (such as @code{printf}) pop
nothing (the caller pops all). When this convention is in use,
@var{funtype} is examined to determine whether a function takes a fixed
number of arguments.
+
+@findex CALL_POPS_ARGS
+@item CALL_POPS_ARGS (@var{cum})
+A C expression that should indicate the number of bytes a call sequence
+pops off the stack. It is added to the value of @code{RETURN_POPS_ARGS}
+when compiling a function call.
+
+@var{cum} is the variable in which all arguments to the called function
+have been accumulated.
+
+On certain architectures, such as the SH5, a call trampoline is used
+that pops certain registers off the stack, depending on the arguments
+that have been passed to the function. Since this is a property of the
+call site, not of the called function, @code{RETURN_POPS_ARGS} is not
+appropriate.
+
@end table
@node Register Arguments
@@ -3928,6 +3962,12 @@ Define this macro as a C expression that is nonzero for registers that are
used by the epilogue or the @samp{return} pattern. The stack and frame
pointer registers are already be assumed to be used as needed.
+@findex EH_USES
+@item EH_USES (@var{regno})
+Define this macro as a C expression that is nonzero for registers that are
+used by the exception handling mechanism, and so should be considered live
+on entry to an exception edge.
+
@findex DELAY_SLOTS_FOR_EPILOGUE
@item DELAY_SLOTS_FOR_EPILOGUE
Define this macro if the function epilogue contains delay slots to which
@@ -5742,7 +5782,7 @@ Output assembly directives to switch to section @var{name}. The section
should have attributes as specified by @var{flags}, which is a bit mask
of the @code{SECTION_*} flags defined in @file{output.h}. If @var{align}
is nonzero, it contains an alignment in bytes to be used for the section,
-otherwise some target default should be used. Only targets that must
+otherwise some target default should be used. Only targets that must
specify an alignment within the section directive need pay attention to
@var{align} -- we will still use @code{ASM_OUTPUT_ALIGN}.
@end deftypefn
@@ -6146,7 +6186,7 @@ itself; before and after that, output the additional assembler syntax
for making that name global, and a newline.
@findex ASM_WEAKEN_LABEL
-@item ASM_WEAKEN_LABEL
+@item ASM_WEAKEN_LABEL (@var{stream}, @var{name})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} some commands that will make the label @var{name} weak;
that is, available for reference from other files but only used if
@@ -6155,18 +6195,29 @@ no other definition is available. Use the expression
itself; before and after that, output the additional assembler syntax
for making that name weak, and a newline.
-If you don't define this macro, GCC will not support weak
-symbols and you should not define the @code{SUPPORTS_WEAK} macro.
+If you don't define this macro or @code{ASM_WEAKEN_DECL}, GCC will not
+support weak symbols and you should not define the @code{SUPPORTS_WEAK}
+macro.
+
+@findex ASM_WEAKEN_DECL
+@item ASM_WEAKEN_DECL (@var{stream}, @var{decl}, @var{name}, @var{value})
+Combines (and replaces) the function of @code{ASM_WEAKEN_LABEL} and
+@code{ASM_OUTPUT_WEAK_ALIAS}, allowing access to the associated function
+or variable decl. If @var{value} is not @code{NULL}, this C statement
+should output to the stdio stream @var{stream} assembler code which
+defines (equates) the weak symbol @var{name} to have the value
+@var{value}. If @var{value} is @code{NULL}, it should output commands
+to make @var{name} weak.
@findex SUPPORTS_WEAK
@item SUPPORTS_WEAK
A C expression which evaluates to true if the target supports weak symbols.
If you don't define this macro, @file{defaults.h} provides a default
-definition. If @code{ASM_WEAKEN_LABEL} is defined, the default
-definition is @samp{1}; otherwise, it is @samp{0}. Define this macro if
-you want to control weak symbol support with a compiler flag such as
-@option{-melf}.
+definition. If either @code{ASM_WEAKEN_LABEL} or @code{ASM_WEAKEN_DECL}
+is defined, the default definition is @samp{1}; otherwise, it is
+@samp{0}. Define this macro if you want to control weak symbol support
+with a compiler flag such as @option{-melf}.
@findex MAKE_DECL_ONE_ONLY (@var{decl})
@item MAKE_DECL_ONE_ONLY
@@ -6453,7 +6504,7 @@ Termination functions are handled similarly.
This method will be chosen as the default by @file{target-def.h} if
@code{TARGET_ASM_NAMED_SECTION} is defined. A target that does not
-support arbitrary sections, but does support special designated
+support arbitrary sections, but does support special designated
constructor and destructor sections may define @code{CTORS_SECTION_ASM_OP}
and @code{DTORS_SECTION_ASM_OP} to achieve the same effect.
@@ -6563,7 +6614,7 @@ the object format requires an explicit initialization function, then a
function called @code{_GLOBAL__DI} will be generated.
This function and the following one are used by collect2 when linking a
-shared library that needs constructors or destructors, or has DWARF2
+shared library that needs constructors or destructors, or has DWARF2
exception tables embedded in the code.
@item COLLECT_SHARED_FINI_FUNC (@var{stream}, @var{func})
@@ -6844,7 +6895,7 @@ first variant.
If this macro is defined, you may use constructs of the form
@smallexample
-@samp{@{option0|option1|option2@dots{}@}}
+@samp{@{option0|option1|option2@dots{}@}}
@end smallexample
@noindent
in the output templates of patterns (@pxref{Output Template}) or in the
@@ -8612,3 +8663,18 @@ object files that are not referenced from @code{main} and uses export
lists.
@end table
+
+@deftypefn {Target Hook} bool TARGET_CANNOT_MODIFY_JUMPS_P (void)
+This target hook returns @code{true} past the point in which new jump
+instructions could be created. On machines that require a register for
+every jump such as the SHmedia ISA of SH5, this point would typically be
+reload, so this target hook should be defined to a function such as:
+
+@smallexample
+static bool
+cannot_modify_jumps_past_reload_p ()
+@{
+ return (reload_completed || reload_in_progress);
+@}
+@end smallexample
+@end deftypefn
diff --git a/contrib/gcc/dwarf2.h b/contrib/gcc/dwarf2.h
index 0d433c3..a84eb2c 100644
--- a/contrib/gcc/dwarf2.h
+++ b/contrib/gcc/dwarf2.h
@@ -239,6 +239,7 @@ enum dwarf_attribute
DW_AT_src_coords = 0x2104,
DW_AT_body_begin = 0x2105,
DW_AT_body_end = 0x2106,
+ DW_AT_GNU_vector = 0x2107,
/* VMS Extensions. */
DW_AT_VMS_rtnbeg_pd_address = 0x2201
};
diff --git a/contrib/gcc/dwarf2out.c b/contrib/gcc/dwarf2out.c
index 526766b..afd9737 100644
--- a/contrib/gcc/dwarf2out.c
+++ b/contrib/gcc/dwarf2out.c
@@ -3265,16 +3265,6 @@ extern int flag_traditional;
#endif
#endif
-/* Define the architecture-dependent minimum instruction length (in bytes).
- In this implementation of DWARF, this field is used for information
- purposes only. Since GCC generates assembly language, we have
- no a priori knowledge of how many instruction bytes are generated
- for each source line, and therefore can use only the DW_LNE_set_address
- and DW_LNS_fixed_advance_pc line information commands. */
-#ifndef DWARF_LINE_MIN_INSTR_LENGTH
-#define DWARF_LINE_MIN_INSTR_LENGTH 4
-#endif
-
/* Minimum line offset in a special line info. opcode.
This value was chosen to give a reasonable range of values. */
#define DWARF_LINE_BASE -10
@@ -3602,7 +3592,7 @@ static dw_loc_descr_ref loc_descriptor_from_tree PARAMS ((tree, int));
static HOST_WIDE_INT ceiling PARAMS ((HOST_WIDE_INT, unsigned int));
static tree field_type PARAMS ((tree));
static unsigned int simple_type_align_in_bits PARAMS ((tree));
-static unsigned int simple_decl_align_in_bits PARAMS ((tree));
+static unsigned int simple_field_decl_align_in_bits PARAMS ((tree));
static unsigned HOST_WIDE_INT simple_type_size_in_bits PARAMS ((tree));
static HOST_WIDE_INT field_byte_offset PARAMS ((tree));
static void add_AT_location_description PARAMS ((dw_die_ref,
@@ -4164,6 +4154,9 @@ dwarf_attr_name (attr)
return "DW_AT_body_begin";
case DW_AT_body_end:
return "DW_AT_body_end";
+ case DW_AT_GNU_vector:
+ return "DW_AT_GNU_vector";
+
case DW_AT_VMS_rtnbeg_pd_address:
return "DW_AT_VMS_rtnbeg_pd_address";
@@ -5104,9 +5097,6 @@ static inline dw_die_ref
lookup_type_die (type)
tree type;
{
- if (TREE_CODE (type) == VECTOR_TYPE)
- type = TYPE_DEBUG_REPRESENTATION_TYPE (type);
-
return (dw_die_ref) TYPE_SYMTAB_POINTER (type);
}
@@ -7031,8 +7021,17 @@ output_line_info ()
dw2_asm_output_delta (DWARF_OFFSET_SIZE, p2, p1, "Prolog Length");
ASM_OUTPUT_LABEL (asm_out_file, p1);
- dw2_asm_output_data (1, DWARF_LINE_MIN_INSTR_LENGTH,
+ /* Define the architecture-dependent minimum instruction length (in
+ bytes). In this implementation of DWARF, this field is used for
+ information purposes only. Since GCC generates assembly language,
+ we have no a priori knowledge of how many instruction bytes are
+ generated for each source line, and therefore can use only the
+ DW_LNE_set_address and DW_LNS_fixed_advance_pc line information
+ commands. Accordingly, we fix this as `1', which is "correct
+ enough" for all architectures, and don't let the target override. */
+ dw2_asm_output_data (1, 1,
"Minimum Instruction Length");
+
dw2_asm_output_data (1, DWARF_LINE_DEFAULT_IS_STMT_START,
"Default is_stmt_start flag");
dw2_asm_output_data (1, DWARF_LINE_BASE,
@@ -7801,10 +7800,24 @@ mem_loc_descriptor (rtl, mode)
by a different symbol. */
if (GET_CODE (rtl) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (rtl))
{
- rtx tmp = get_pool_constant (rtl);
+ bool marked;
+ rtx tmp = get_pool_constant_mark (rtl, &marked);
if (GET_CODE (tmp) == SYMBOL_REF)
- rtl = tmp;
+ {
+ rtl = tmp;
+ if (CONSTANT_POOL_ADDRESS_P (tmp))
+ get_pool_constant_mark (tmp, &marked);
+ else
+ marked = true;
+ }
+
+ /* If all references to this pool constant were optimized away,
+ it was not output and thus we can't represent it.
+ FIXME: might try to use DW_OP_const_value here, though
+ DW_OP_piece complicates it. */
+ if (!marked)
+ return 0;
}
mem_loc_result = new_loc_descr (DW_OP_addr, 0, 0);
@@ -8342,10 +8355,28 @@ simple_type_align_in_bits (type)
}
static inline unsigned
-simple_decl_align_in_bits (decl)
- tree decl;
+simple_field_decl_align_in_bits (field)
+ tree field;
{
- return (TREE_CODE (decl) != ERROR_MARK) ? DECL_ALIGN (decl) : BITS_PER_WORD;
+ unsigned align;
+
+ if (TREE_CODE (field) == ERROR_MARK)
+ return BITS_PER_WORD;
+
+ align = DECL_ALIGN (field);
+
+#ifdef BIGGEST_FIELD_ALIGNMENT
+ /* Some targets (i.e. i386) limit union field alignment
+ to a lower boundary than alignment of variables unless
+ it was overridden by attribute aligned. */
+ if (! DECL_USER_ALIGN (field))
+ align = MIN (align, (unsigned) BIGGEST_FIELD_ALIGNMENT);
+#endif
+
+#ifdef ADJUST_FIELD_ALIGN
+ align = ADJUST_FIELD_ALIGN (field, align);
+#endif
+ return align;
}
/* Given a pointer to a tree node, assumed to be some kind of a ..._TYPE
@@ -8419,7 +8450,7 @@ field_byte_offset (decl)
type_size_in_bits = simple_type_size_in_bits (type);
type_align_in_bits = simple_type_align_in_bits (type);
- decl_align_in_bits = simple_decl_align_in_bits (decl);
+ decl_align_in_bits = simple_field_decl_align_in_bits (decl);
/* The GCC front-end doesn't make any attempt to keep track of the starting
bit offset (relative to the start of the containing structure type) of the
@@ -8815,7 +8846,12 @@ rtl_for_decl_location (decl)
&& (CONSTANT_P (rtl)
|| (GET_CODE (rtl) == MEM
&& CONSTANT_P (XEXP (rtl, 0)))))
- return rtl;
+ {
+#ifdef ASM_SIMPLIFY_DWARF_ADDR
+ rtl = ASM_SIMPLIFY_DWARF_ADDR (rtl);
+#endif
+ return rtl;
+ }
rtl = NULL_RTX;
}
else if (TREE_CODE (decl) == PARM_DECL)
@@ -8884,9 +8920,48 @@ rtl_for_decl_location (decl)
and will have been substituted directly into all expressions that use it.
C does not have such a concept, but C++ and other languages do. */
else if (TREE_CODE (decl) == VAR_DECL && DECL_INITIAL (decl))
- rtl = expand_expr (DECL_INITIAL (decl), NULL_RTX, VOIDmode,
- EXPAND_INITIALIZER);
+ {
+ /* If a variable is initialized with a string constant without embedded
+ zeros, build CONST_STRING. */
+ if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST
+ && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
+ {
+ tree arrtype = TREE_TYPE (decl);
+ tree enttype = TREE_TYPE (arrtype);
+ tree domain = TYPE_DOMAIN (arrtype);
+ tree init = DECL_INITIAL (decl);
+ enum machine_mode mode = TYPE_MODE (enttype);
+
+ if (GET_MODE_CLASS (mode) == MODE_INT && GET_MODE_SIZE (mode) == 1
+ && domain
+ && integer_zerop (TYPE_MIN_VALUE (domain))
+ && compare_tree_int (TYPE_MAX_VALUE (domain),
+ TREE_STRING_LENGTH (init) - 1) == 0
+ && ((size_t) TREE_STRING_LENGTH (init)
+ == strlen (TREE_STRING_POINTER (init)) + 1))
+ rtl = gen_rtx_CONST_STRING (VOIDmode, TREE_STRING_POINTER (init));
+ }
+
+#if 0
+ /* We mustn't actually emit anything here, as we might not get a
+ chance to emit any symbols we refer to. For the release, don't
+ try to get this right. */
+ if (rtl == NULL)
+ {
+ rtl = expand_expr (DECL_INITIAL (decl), NULL_RTX, VOIDmode,
+ EXPAND_INITIALIZER);
+ /* If expand_expr returned a MEM, we cannot use it, since
+ it won't be output, leading to unresolved symbol. */
+ if (rtl && GET_CODE (rtl) == MEM)
+ rtl = NULL;
+ }
+#endif
+ }
+#ifdef ASM_SIMPLIFY_DWARF_ADDR
+ if (rtl)
+ rtl = ASM_SIMPLIFY_DWARF_ADDR (rtl);
+#endif
return rtl;
}
@@ -9693,6 +9768,16 @@ gen_array_type_die (type, context_die)
#endif
array_die = new_die (DW_TAG_array_type, scope_die, type);
+ add_name_attribute (array_die, type_tag (type));
+ equate_type_number_to_die (type, array_die);
+
+ if (TREE_CODE (type) == VECTOR_TYPE)
+ {
+ /* The frontend feeds us a representation for the vector as a struct
+ containing an array. Pull out the array type. */
+ type = TREE_TYPE (TYPE_FIELDS (TYPE_DEBUG_REPRESENTATION_TYPE (type)));
+ add_AT_flag (array_die, DW_AT_GNU_vector, 1);
+ }
#if 0
/* We default the array ordering. SDB will probably do
@@ -9714,9 +9799,6 @@ gen_array_type_die (type, context_die)
#endif
add_subscript_info (array_die, type);
- add_name_attribute (array_die, type_tag (type));
- equate_type_number_to_die (type, array_die);
-
/* Add representation of the type of the elements of this array type. */
element_type = TREE_TYPE (type);
@@ -10561,6 +10643,20 @@ gen_inlined_subroutine_die (stmt, context_die, depth)
decls_for_scope (stmt, subr_die, depth);
current_function_has_inlines = 1;
}
+ else
+ /* We may get here if we're the outer block of function A that was
+ inlined into function B that was inlined into function C. When
+ generating debugging info for C, dwarf2out_abstract_function(B)
+ would mark all inlined blocks as abstract, including this one.
+ So, we wouldn't (and shouldn't) expect labels to be generated
+ for this one. Instead, just emit debugging info for
+ declarations within the block. This is particularly important
+ in the case of initializers of arguments passed from B to us:
+ if they're statement expressions containing declarations, we
+ wouldn't generate dies for their abstract variables, and then,
+ when generating dies for the real variables, we'd die (pun
+ intended :-) */
+ gen_lexical_block_die (stmt, context_die, depth);
}
/* Generate a DIE for a field in a record, or structure. */
@@ -11044,7 +11140,7 @@ gen_type_die (type, context_die)
break;
case VECTOR_TYPE:
- gen_type_die (TYPE_DEBUG_REPRESENTATION_TYPE (type), context_die);
+ gen_array_type_die (type, context_die);
break;
case ENUMERAL_TYPE:
@@ -11867,13 +11963,6 @@ dwarf2out_define (lineno, buffer)
unsigned lineno ATTRIBUTE_UNUSED;
const char *buffer ATTRIBUTE_UNUSED;
{
- static int initialized = 0;
- if (!initialized)
- {
- dwarf2out_start_source_file (0, primary_filename);
- initialized = 1;
- }
-
if (debug_info_level >= DINFO_LEVEL_VERBOSE)
{
named_section_flags (DEBUG_MACINFO_SECTION, SECTION_DEBUG);
diff --git a/contrib/gcc/dyn-string.c b/contrib/gcc/dyn-string.c
index c9edfcb..1da76c2 100644
--- a/contrib/gcc/dyn-string.c
+++ b/contrib/gcc/dyn-string.c
@@ -1,48 +1,116 @@
/* An abstract string datatype.
- Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
Contributed by Mark Mitchell (mark@markmitchell.com).
This file is part of GNU CC.
-GNU CC is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by
+GNU CC 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.
-GNU CC 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.
+In addition to the permissions in the GNU General Public License, the
+Free Software Foundation gives you unlimited permission to link the
+compiled version of this file into combinations with other programs,
+and to distribute those combinations without any restriction coming
+from the use of this file. (The General Public License restrictions
+do apply in other respects; for example, they cover modification of
+the file, and distribution when not linked into a combined
+executable.)
+
+GNU CC 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 GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#ifdef HAVE_CONFIG_H
#include "config.h"
-#include "system.h"
+#endif
+
+#include <stdio.h>
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#include "libiberty.h"
#include "dyn-string.h"
-/* Create a new dynamic string capable of holding at least SPACE
- characters, including the terminating NUL. If SPACE is 0, it
- will be silently increased to 1. */
+/* If this file is being compiled for inclusion in the C++ runtime
+ library, as part of the demangler implementation, we don't want to
+ abort if an allocation fails. Instead, percolate an error code up
+ through the call chain. */
-dyn_string_t
-dyn_string_new (space)
+#if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
+#define RETURN_ON_ALLOCATION_FAILURE
+#endif
+
+/* Performs in-place initialization of a dyn_string struct. This
+ function can be used with a dyn_string struct on the stack or
+ embedded in another object. The contents of of the string itself
+ are still dynamically allocated. The string initially is capable
+ of holding at least SPACE characeters, including the terminating
+ NUL. If SPACE is 0, it will silently be increated to 1.
+
+ If RETURN_ON_ALLOCATION_FAILURE is defined and memory allocation
+ fails, returns 0. Otherwise returns 1. */
+
+int
+dyn_string_init (ds_struct_ptr, space)
+ struct dyn_string *ds_struct_ptr;
int space;
{
- dyn_string_t result = (dyn_string_t) xmalloc (sizeof (struct dyn_string));
-
+ /* We need at least one byte in which to store the terminating NUL. */
if (space == 0)
- /* We need at least one byte in which to store the terminating
- NUL. */
space = 1;
- result->allocated = space;
- result->s = (char*) xmalloc (space);
- result->length = 0;
- result->s[0] = '\0';
+#ifdef RETURN_ON_ALLOCATION_FAILURE
+ ds_struct_ptr->s = (char *) malloc (space);
+ if (ds_struct_ptr->s == NULL)
+ return 0;
+#else
+ ds_struct_ptr->s = (char *) xmalloc (space);
+#endif
+ ds_struct_ptr->allocated = space;
+ ds_struct_ptr->length = 0;
+ ds_struct_ptr->s[0] = '\0';
+
+ return 1;
+}
+
+/* Create a new dynamic string capable of holding at least SPACE
+ characters, including the terminating NUL. If SPACE is 0, it will
+ be silently increased to 1. If RETURN_ON_ALLOCATION_FAILURE is
+ defined and memory allocation fails, returns NULL. Otherwise
+ returns the newly allocated string. */
+dyn_string_t
+dyn_string_new (space)
+ int space;
+{
+ dyn_string_t result;
+#ifdef RETURN_ON_ALLOCATION_FAILURE
+ result = (dyn_string_t) malloc (sizeof (struct dyn_string));
+ if (result == NULL)
+ return NULL;
+ if (!dyn_string_init (result, space))
+ {
+ free (result);
+ return NULL;
+ }
+#else
+ result = (dyn_string_t) xmalloc (sizeof (struct dyn_string));
+ dyn_string_init (result, space);
+#endif
return result;
}
@@ -56,25 +124,30 @@ dyn_string_delete (ds)
free (ds);
}
-/* Append the NUL-terminated string S to DS, resizing DS if
- necessary. */
+/* Returns the contents of DS in a buffer allocated with malloc. It
+ is the caller's responsibility to deallocate the buffer using free.
+ DS is then set to the empty string. Deletes DS itself. */
-dyn_string_t
-dyn_string_append (ds, s)
+char*
+dyn_string_release (ds)
dyn_string_t ds;
- const char *s;
{
- int len = strlen (s);
- dyn_string_resize (ds, ds->length + len + 1 /* '\0' */);
- strcpy (ds->s + ds->length, s);
- ds->length += len;
-
- return ds;
+ /* Store the old buffer. */
+ char* result = ds->s;
+ /* The buffer is no longer owned by DS. */
+ ds->s = NULL;
+ /* Delete DS. */
+ free (ds);
+ /* Return the old buffer. */
+ return result;
}
-/* Increase the capacity of DS so that it can hold at least SPACE
- characters, including the terminating NUL. This function will not
- (at present) reduce the capacity of DS. */
+/* Increase the capacity of DS so it can hold at least SPACE
+ characters, plus the terminating NUL. This function will not (at
+ present) reduce the capacity of DS. Returns DS on success.
+
+ If RETURN_ON_ALLOCATION_FAILURE is defined and a memory allocation
+ operation fails, deletes DS and returns NULL. */
dyn_string_t
dyn_string_resize (ds, space)
@@ -83,15 +156,287 @@ dyn_string_resize (ds, space)
{
int new_allocated = ds->allocated;
+ /* Increase SPACE to hold the NUL termination. */
+ ++space;
+
+ /* Increase allocation by factors of two. */
while (space > new_allocated)
new_allocated *= 2;
if (new_allocated != ds->allocated)
{
- /* We actually need more space. */
ds->allocated = new_allocated;
- ds->s = (char*) xrealloc (ds->s, ds->allocated);
+ /* We actually need more space. */
+#ifdef RETURN_ON_ALLOCATION_FAILURE
+ ds->s = (char *) realloc (ds->s, ds->allocated);
+ if (ds->s == NULL)
+ {
+ free (ds);
+ return NULL;
+ }
+#else
+ ds->s = (char *) xrealloc (ds->s, ds->allocated);
+#endif
}
return ds;
}
+
+/* Sets the contents of DS to the empty string. */
+
+void
+dyn_string_clear (ds)
+ dyn_string_t ds;
+{
+ /* A dyn_string always has room for at least the NUL terminator. */
+ ds->s[0] = '\0';
+ ds->length = 0;
+}
+
+/* Makes the contents of DEST the same as the contents of SRC. DEST
+ and SRC must be distinct. Returns 1 on success. On failure, if
+ RETURN_ON_ALLOCATION_FAILURE, deletes DEST and returns 0. */
+
+int
+dyn_string_copy (dest, src)
+ dyn_string_t dest;
+ dyn_string_t src;
+{
+ if (dest == src)
+ abort ();
+
+ /* Make room in DEST. */
+ if (dyn_string_resize (dest, src->length) == NULL)
+ return 0;
+ /* Copy DEST into SRC. */
+ strcpy (dest->s, src->s);
+ /* Update the size of DEST. */
+ dest->length = src->length;
+ return 1;
+}
+
+/* Copies SRC, a NUL-terminated string, into DEST. Returns 1 on
+ success. On failure, if RETURN_ON_ALLOCATION_FAILURE, deletes DEST
+ and returns 0. */
+
+int
+dyn_string_copy_cstr (dest, src)
+ dyn_string_t dest;
+ const char *src;
+{
+ int length = strlen (src);
+ /* Make room in DEST. */
+ if (dyn_string_resize (dest, length) == NULL)
+ return 0;
+ /* Copy DEST into SRC. */
+ strcpy (dest->s, src);
+ /* Update the size of DEST. */
+ dest->length = length;
+ return 1;
+}
+
+/* Inserts SRC at the beginning of DEST. DEST is expanded as
+ necessary. SRC and DEST must be distinct. Returns 1 on success.
+ On failure, if RETURN_ON_ALLOCATION_FAILURE, deletes DEST and
+ returns 0. */
+
+int
+dyn_string_prepend (dest, src)
+ dyn_string_t dest;
+ dyn_string_t src;
+{
+ return dyn_string_insert (dest, 0, src);
+}
+
+/* Inserts SRC, a NUL-terminated string, at the beginning of DEST.
+ DEST is expanded as necessary. Returns 1 on success. On failure,
+ if RETURN_ON_ALLOCATION_FAILURE, deletes DEST and returns 0. */
+
+int
+dyn_string_prepend_cstr (dest, src)
+ dyn_string_t dest;
+ const char *src;
+{
+ return dyn_string_insert_cstr (dest, 0, src);
+}
+
+/* Inserts SRC into DEST starting at position POS. DEST is expanded
+ as necessary. SRC and DEST must be distinct. Returns 1 on
+ success. On failure, if RETURN_ON_ALLOCATION_FAILURE, deletes DEST
+ and returns 0. */
+
+int
+dyn_string_insert (dest, pos, src)
+ dyn_string_t dest;
+ int pos;
+ dyn_string_t src;
+{
+ int i;
+
+ if (src == dest)
+ abort ();
+
+ if (dyn_string_resize (dest, dest->length + src->length) == NULL)
+ return 0;
+ /* Make room for the insertion. Be sure to copy the NUL. */
+ for (i = dest->length; i >= pos; --i)
+ dest->s[i + src->length] = dest->s[i];
+ /* Splice in the new stuff. */
+ strncpy (dest->s + pos, src->s, src->length);
+ /* Compute the new length. */
+ dest->length += src->length;
+ return 1;
+}
+
+/* Inserts SRC, a NUL-terminated string, into DEST starting at
+ position POS. DEST is expanded as necessary. Returns 1 on
+ success. On failure, RETURN_ON_ALLOCATION_FAILURE, deletes DEST
+ and returns 0. */
+
+int
+dyn_string_insert_cstr (dest, pos, src)
+ dyn_string_t dest;
+ int pos;
+ const char *src;
+{
+ int i;
+ int length = strlen (src);
+
+ if (dyn_string_resize (dest, dest->length + length) == NULL)
+ return 0;
+ /* Make room for the insertion. Be sure to copy the NUL. */
+ for (i = dest->length; i >= pos; --i)
+ dest->s[i + length] = dest->s[i];
+ /* Splice in the new stuff. */
+ strncpy (dest->s + pos, src, length);
+ /* Compute the new length. */
+ dest->length += length;
+ return 1;
+}
+
+/* Inserts character C into DEST starting at position POS. DEST is
+ expanded as necessary. Returns 1 on success. On failure,
+ RETURN_ON_ALLOCATION_FAILURE, deletes DEST and returns 0. */
+
+int
+dyn_string_insert_char (dest, pos, c)
+ dyn_string_t dest;
+ int pos;
+ int c;
+{
+ int i;
+
+ if (dyn_string_resize (dest, dest->length + 1) == NULL)
+ return 0;
+ /* Make room for the insertion. Be sure to copy the NUL. */
+ for (i = dest->length; i >= pos; --i)
+ dest->s[i + 1] = dest->s[i];
+ /* Add the new character. */
+ dest->s[pos] = c;
+ /* Compute the new length. */
+ ++dest->length;
+ return 1;
+}
+
+/* Append S to DS, resizing DS if necessary. Returns 1 on success.
+ On failure, if RETURN_ON_ALLOCATION_FAILURE, deletes DEST and
+ returns 0. */
+
+int
+dyn_string_append (dest, s)
+ dyn_string_t dest;
+ dyn_string_t s;
+{
+ if (dyn_string_resize (dest, dest->length + s->length) == 0)
+ return 0;
+ strcpy (dest->s + dest->length, s->s);
+ dest->length += s->length;
+ return 1;
+}
+
+/* Append the NUL-terminated string S to DS, resizing DS if necessary.
+ Returns 1 on success. On failure, if RETURN_ON_ALLOCATION_FAILURE,
+ deletes DEST and returns 0. */
+
+int
+dyn_string_append_cstr (dest, s)
+ dyn_string_t dest;
+ const char *s;
+{
+ int len = strlen (s);
+
+ /* The new length is the old length plus the size of our string, plus
+ one for the null at the end. */
+ if (dyn_string_resize (dest, dest->length + len) == NULL)
+ return 0;
+ strcpy (dest->s + dest->length, s);
+ dest->length += len;
+ return 1;
+}
+
+/* Appends C to the end of DEST. Returns 1 on success. On failiure,
+ if RETURN_ON_ALLOCATION_FAILURE, deletes DEST and returns 0. */
+
+int
+dyn_string_append_char (dest, c)
+ dyn_string_t dest;
+ int c;
+{
+ /* Make room for the extra character. */
+ if (dyn_string_resize (dest, dest->length + 1) == NULL)
+ return 0;
+ /* Append the character; it will overwrite the old NUL. */
+ dest->s[dest->length] = c;
+ /* Add a new NUL at the end. */
+ dest->s[dest->length + 1] = '\0';
+ /* Update the length. */
+ ++(dest->length);
+ return 1;
+}
+
+/* Sets the contents of DEST to the substring of SRC starting at START
+ and ending before END. START must be less than or equal to END,
+ and both must be between zero and the length of SRC, inclusive.
+ Returns 1 on success. On failure, if RETURN_ON_ALLOCATION_FAILURE,
+ deletes DEST and returns 0. */
+
+int
+dyn_string_substring (dest, src, start, end)
+ dyn_string_t dest;
+ dyn_string_t src;
+ int start;
+ int end;
+{
+ int i;
+ int length = end - start;
+
+ if (start > end || start > src->length || end > src->length)
+ abort ();
+
+ /* Make room for the substring. */
+ if (dyn_string_resize (dest, length) == NULL)
+ return 0;
+ /* Copy the characters in the substring, */
+ for (i = length; --i >= 0; )
+ dest->s[i] = src->s[start + i];
+ /* NUL-terimate the result. */
+ dest->s[length] = '\0';
+ /* Record the length of the substring. */
+ dest->length = length;
+
+ return 1;
+}
+
+/* Returns non-zero if DS1 and DS2 have the same contents. */
+
+int
+dyn_string_eq (ds1, ds2)
+ dyn_string_t ds1;
+ dyn_string_t ds2;
+{
+ /* If DS1 and DS2 have different lengths, they must not be the same. */
+ if (ds1->length != ds2->length)
+ return 0;
+ else
+ return !strcmp (ds1->s, ds2->s);
+}
diff --git a/contrib/gcc/dyn-string.h b/contrib/gcc/dyn-string.h
index 9f93308..2a771c7 100644
--- a/contrib/gcc/dyn-string.h
+++ b/contrib/gcc/dyn-string.h
@@ -1,32 +1,92 @@
/* An abstract string datatype.
- Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
Contributed by Mark Mitchell (mark@markmitchell.com).
-This file is part of GNU CC.
+This file is part of GCC.
-GNU CC is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
-GNU CC 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.
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
+along with GCC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+
typedef struct dyn_string
{
- int allocated; /* The amount of space allocated for the string. */
- int length; /* The actual length of the string. */
- char *s; /* The string itself, NUL-terminated. */
+ int allocated; /* The amount of space allocated for the string. */
+ int length; /* The actual length of the string. */
+ char *s; /* The string itself, NUL-terminated. */
}* dyn_string_t;
-extern dyn_string_t dyn_string_new PROTO((int));
-extern void dyn_string_delete PROTO((dyn_string_t));
-extern dyn_string_t dyn_string_append PROTO((dyn_string_t, const char*));
-extern dyn_string_t dyn_string_resize PROTO((dyn_string_t, int));
+/* The length STR, in bytes, not including the terminating NUL. */
+#define dyn_string_length(STR) \
+ ((STR)->length)
+
+/* The NTBS in which the contents of STR are stored. */
+#define dyn_string_buf(STR) \
+ ((STR)->s)
+
+/* Compare DS1 to DS2 with strcmp. */
+#define dyn_string_compare(DS1, DS2) \
+ (strcmp ((DS1)->s, (DS2)->s))
+
+
+/* dyn_string functions are used in the demangling implementation
+ included in the G++ runtime library. To prevent collisions with
+ names in user programs, the functions that are used in the
+ demangler are given implementation-reserved names. */
+
+#if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3)
+
+#define dyn_string_init __cxa_dyn_string_init
+#define dyn_string_new __cxa_dyn_string_new
+#define dyn_string_delete __cxa_dyn_string_delete
+#define dyn_string_release __cxa_dyn_string_release
+#define dyn_string_resize __cxa_dyn_string_resize
+#define dyn_string_clear __cxa_dyn_string_clear
+#define dyn_string_copy __cxa_dyn_string_copy
+#define dyn_string_copy_cstr __cxa_dyn_string_copy_cstr
+#define dyn_string_prepend __cxa_dyn_string_prepend
+#define dyn_string_prepend_cstr __cxa_dyn_string_prepend_cstr
+#define dyn_string_insert __cxa_dyn_string_insert
+#define dyn_string_insert_cstr __cxa_dyn_string_insert_cstr
+#define dyn_string_insert_char __cxa_dyn_string_insert_char
+#define dyn_string_append __cxa_dyn_string_append
+#define dyn_string_append_cstr __cxa_dyn_string_append_cstr
+#define dyn_string_append_char __cxa_dyn_string_append_char
+#define dyn_string_substring __cxa_dyn_string_substring
+#define dyn_string_eq __cxa_dyn_string_eq
+
+#endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */
+
+
+extern int dyn_string_init PARAMS ((struct dyn_string *, int));
+extern dyn_string_t dyn_string_new PARAMS ((int));
+extern void dyn_string_delete PARAMS ((dyn_string_t));
+extern char *dyn_string_release PARAMS ((dyn_string_t));
+extern dyn_string_t dyn_string_resize PARAMS ((dyn_string_t, int));
+extern void dyn_string_clear PARAMS ((dyn_string_t));
+extern int dyn_string_copy PARAMS ((dyn_string_t, dyn_string_t));
+extern int dyn_string_copy_cstr PARAMS ((dyn_string_t, const char *));
+extern int dyn_string_prepend PARAMS ((dyn_string_t, dyn_string_t));
+extern int dyn_string_prepend_cstr PARAMS ((dyn_string_t, const char *));
+extern int dyn_string_insert PARAMS ((dyn_string_t, int,
+ dyn_string_t));
+extern int dyn_string_insert_cstr PARAMS ((dyn_string_t, int,
+ const char *));
+extern int dyn_string_insert_char PARAMS ((dyn_string_t, int, int));
+extern int dyn_string_append PARAMS ((dyn_string_t, dyn_string_t));
+extern int dyn_string_append_cstr PARAMS ((dyn_string_t, const char *));
+extern int dyn_string_append_char PARAMS ((dyn_string_t, int));
+extern int dyn_string_substring PARAMS ((dyn_string_t,
+ dyn_string_t, int, int));
+extern int dyn_string_eq PARAMS ((dyn_string_t, dyn_string_t));
diff --git a/contrib/gcc/emit-rtl.c b/contrib/gcc/emit-rtl.c
index 4ea852b..f6c6761 100644
--- a/contrib/gcc/emit-rtl.c
+++ b/contrib/gcc/emit-rtl.c
@@ -196,6 +196,7 @@ static mem_attrs *get_mem_attrs PARAMS ((HOST_WIDE_INT, tree, rtx,
rtx, unsigned int,
enum machine_mode));
static tree component_ref_for_mem_expr PARAMS ((tree));
+static rtx gen_const_vector_0 PARAMS ((enum machine_mode));
/* Probability of the conditional branch currently proceeded by try_split.
Set to -1 otherwise. */
@@ -2002,8 +2003,9 @@ adjust_address_1 (memref, mode, offset, validate, adjust)
lowest-order set bit in OFFSET, but don't change the alignment if OFFSET
if zero. */
if (offset != 0)
- memalign = MIN (memalign,
- (unsigned int) (offset & -offset) * BITS_PER_UNIT);
+ memalign
+ = MIN (memalign,
+ (unsigned HOST_WIDE_INT) (offset & -offset) * BITS_PER_UNIT);
/* We can compute the size in a number of ways. */
if (GET_MODE (new) != BLKmode)
@@ -2046,16 +2048,34 @@ offset_address (memref, offset, pow2)
rtx offset;
HOST_WIDE_INT pow2;
{
- rtx new = change_address_1 (memref, VOIDmode,
- gen_rtx_PLUS (Pmode, XEXP (memref, 0),
- force_reg (Pmode, offset)), 1);
+ rtx new, addr = XEXP (memref, 0);
+
+ new = simplify_gen_binary (PLUS, Pmode, addr, offset);
+
+ /* At this point we don't know _why_ the address is invalid. It
+ could have secondary memory refereces, multiplies or anything.
+
+ However, if we did go and rearrange things, we can wind up not
+ being able to recognize the magic around pic_offset_table_rtx.
+ This stuff is fragile, and is yet another example of why it is
+ bad to expose PIC machinery too early. */
+ if (! memory_address_p (GET_MODE (memref), new)
+ && GET_CODE (addr) == PLUS
+ && XEXP (addr, 0) == pic_offset_table_rtx)
+ {
+ addr = force_reg (GET_MODE (addr), addr);
+ new = simplify_gen_binary (PLUS, Pmode, addr, offset);
+ }
+
+ update_temp_slot_address (XEXP (memref, 0), new);
+ new = change_address_1 (memref, VOIDmode, new, 1);
/* Update the alignment to reflect the offset. Reset the offset, which
we don't know. */
MEM_ATTRS (new)
= get_mem_attrs (MEM_ALIAS_SET (memref), MEM_EXPR (memref), 0, 0,
MIN (MEM_ALIGN (memref),
- (unsigned int) pow2 * BITS_PER_UNIT),
+ (unsigned HOST_WIDE_INT) pow2 * BITS_PER_UNIT),
GET_MODE (new));
return new;
}
@@ -2104,7 +2124,7 @@ widen_memory_access (memref, mode, offset)
/* If we don't know what offset we were at within the expression, then
we can't know if we've overstepped the bounds. */
- if (! memoffset && offset != 0)
+ if (! memoffset)
expr = NULL_TREE;
while (expr)
@@ -2364,6 +2384,109 @@ reset_used_decls (blk)
reset_used_decls (t);
}
+/* Similar to `copy_rtx' except that if MAY_SHARE is present, it is
+ placed in the result directly, rather than being copied. MAY_SHARE is
+ either a MEM of an EXPR_LIST of MEMs. */
+
+rtx
+copy_most_rtx (orig, may_share)
+ rtx orig;
+ rtx may_share;
+{
+ rtx copy;
+ int i, j;
+ RTX_CODE code;
+ const char *format_ptr;
+
+ if (orig == may_share
+ || (GET_CODE (may_share) == EXPR_LIST
+ && in_expr_list_p (may_share, orig)))
+ return orig;
+
+ code = GET_CODE (orig);
+
+ switch (code)
+ {
+ case REG:
+ case QUEUED:
+ case CONST_INT:
+ case CONST_DOUBLE:
+ case CONST_VECTOR:
+ case SYMBOL_REF:
+ case CODE_LABEL:
+ case PC:
+ case CC0:
+ return orig;
+ default:
+ break;
+ }
+
+ copy = rtx_alloc (code);
+ PUT_MODE (copy, GET_MODE (orig));
+ copy->in_struct = orig->in_struct;
+ copy->volatil = orig->volatil;
+ copy->unchanging = orig->unchanging;
+ copy->integrated = orig->integrated;
+ copy->frame_related = orig->frame_related;
+
+ format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
+
+ for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
+ {
+ switch (*format_ptr++)
+ {
+ case 'e':
+ XEXP (copy, i) = XEXP (orig, i);
+ if (XEXP (orig, i) != NULL && XEXP (orig, i) != may_share)
+ XEXP (copy, i) = copy_most_rtx (XEXP (orig, i), may_share);
+ break;
+
+ case 'u':
+ XEXP (copy, i) = XEXP (orig, i);
+ break;
+
+ case 'E':
+ case 'V':
+ XVEC (copy, i) = XVEC (orig, i);
+ if (XVEC (orig, i) != NULL)
+ {
+ XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
+ for (j = 0; j < XVECLEN (copy, i); j++)
+ XVECEXP (copy, i, j)
+ = copy_most_rtx (XVECEXP (orig, i, j), may_share);
+ }
+ break;
+
+ case 'w':
+ XWINT (copy, i) = XWINT (orig, i);
+ break;
+
+ case 'n':
+ case 'i':
+ XINT (copy, i) = XINT (orig, i);
+ break;
+
+ case 't':
+ XTREE (copy, i) = XTREE (orig, i);
+ break;
+
+ case 's':
+ case 'S':
+ XSTR (copy, i) = XSTR (orig, i);
+ break;
+
+ case '0':
+ /* Copy this through the wide int field; that's safest. */
+ X0WINT (copy, i) = X0WINT (orig, i);
+ break;
+
+ default:
+ abort ();
+ }
+ }
+ return copy;
+}
+
/* Mark ORIG as in use, and return a copy of it if it was already in use.
Recursively does the same for subexpressions. */
@@ -2390,6 +2513,7 @@ copy_rtx_if_shared (orig)
case QUEUED:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case CODE_LABEL:
case PC:
@@ -2506,6 +2630,7 @@ reset_used_flags (x)
case QUEUED:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case CODE_LABEL:
case PC:
@@ -3252,7 +3377,7 @@ add_insn_after (insn, after)
}
if (basic_block_for_insn
- && (unsigned int)INSN_UID (after) < basic_block_for_insn->num_elements
+ && (unsigned int) INSN_UID (after) < basic_block_for_insn->num_elements
&& (bb = BLOCK_FOR_INSN (after)))
{
set_block_for_insn (insn, bb);
@@ -3319,7 +3444,7 @@ add_insn_before (insn, before)
}
if (basic_block_for_insn
- && (unsigned int)INSN_UID (before) < basic_block_for_insn->num_elements
+ && (unsigned int) INSN_UID (before) < basic_block_for_insn->num_elements
&& (bb = BLOCK_FOR_INSN (before)))
{
set_block_for_insn (insn, bb);
@@ -3397,13 +3522,13 @@ remove_insn (insn)
abort ();
}
if (basic_block_for_insn
- && (unsigned int)INSN_UID (insn) < basic_block_for_insn->num_elements
+ && (unsigned int) INSN_UID (insn) < basic_block_for_insn->num_elements
&& (bb = BLOCK_FOR_INSN (insn)))
{
if (bb->head == insn)
{
- /* Never ever delete the basic block note without deleting whole basic
- block. */
+ /* Never ever delete the basic block note without deleting whole
+ basic block. */
if (GET_CODE (insn) == NOTE)
abort ();
bb->head = next;
@@ -3473,13 +3598,14 @@ reorder_insns (from, to, after)
reorder_insns_nobb (from, to, after);
if (basic_block_for_insn
- && (unsigned int)INSN_UID (after) < basic_block_for_insn->num_elements
+ && (unsigned int) INSN_UID (after) < basic_block_for_insn->num_elements
&& (bb = BLOCK_FOR_INSN (after)))
{
rtx x;
if (basic_block_for_insn
- && (unsigned int)INSN_UID (from) < basic_block_for_insn->num_elements
+ && ((unsigned int) INSN_UID (from)
+ < basic_block_for_insn->num_elements)
&& (bb2 = BLOCK_FOR_INSN (from)))
{
if (bb2->end == to)
@@ -4005,7 +4131,7 @@ emit_insns_after (first, after)
return after;
if (basic_block_for_insn
- && (unsigned int)INSN_UID (after) < basic_block_for_insn->num_elements
+ && (unsigned int) INSN_UID (after) < basic_block_for_insn->num_elements
&& (bb = BLOCK_FOR_INSN (after)))
{
for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
@@ -4541,6 +4667,7 @@ copy_insn_1 (orig)
case QUEUED:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case CODE_LABEL:
case PC:
@@ -4779,6 +4906,33 @@ mark_emit_status (es)
ggc_mark_rtx (es->x_first_insn);
}
+/* Generate the constant 0. */
+
+static rtx
+gen_const_vector_0 (mode)
+ enum machine_mode mode;
+{
+ rtx tem;
+ rtvec v;
+ int units, i;
+ enum machine_mode inner;
+
+ units = GET_MODE_NUNITS (mode);
+ inner = GET_MODE_INNER (mode);
+
+ v = rtvec_alloc (units);
+
+ /* We need to call this function after we to set CONST0_RTX first. */
+ if (!CONST0_RTX (inner))
+ abort ();
+
+ for (i = 0; i < units; ++i)
+ RTVEC_ELT (v, i) = CONST0_RTX (inner);
+
+ tem = gen_rtx_CONST_VECTOR (mode, v);
+ return tem;
+}
+
/* Create some permanent unique rtl objects shared between all functions.
LINE_NUMBERS is nonzero if line numbers are to be generated. */
@@ -4920,6 +5074,16 @@ init_emit_once (line_numbers)
const_tiny_rtx[i][(int) mode] = GEN_INT (i);
}
+ for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_INT);
+ mode != VOIDmode;
+ mode = GET_MODE_WIDER_MODE (mode))
+ const_tiny_rtx[0][(int) mode] = gen_const_vector_0 (mode);
+
+ for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FLOAT);
+ mode != VOIDmode;
+ mode = GET_MODE_WIDER_MODE (mode))
+ const_tiny_rtx[0][(int) mode] = gen_const_vector_0 (mode);
+
for (i = (int) CCmode; i < (int) MAX_MACHINE_MODE; ++i)
if (GET_MODE_CLASS ((enum machine_mode) i) == MODE_CC)
const_tiny_rtx[0][i] = const0_rtx;
diff --git a/contrib/gcc/except.c b/contrib/gcc/except.c
index 606c0e6..a258731 100644
--- a/contrib/gcc/except.c
+++ b/contrib/gcc/except.c
@@ -97,8 +97,15 @@ int (*lang_eh_type_covers) PARAMS ((tree a, tree b));
/* Map a type to a runtime object to match type. */
tree (*lang_eh_runtime_type) PARAMS ((tree));
-/* A list of labels used for exception handlers. */
-rtx exception_handler_labels;
+/* A hash table of label to region number. */
+
+struct ehl_map_entry
+{
+ rtx label;
+ struct eh_region *region;
+};
+
+static htab_t exception_handler_label_map;
static int call_site_base;
static unsigned int sjlj_funcdef_number;
@@ -125,6 +132,10 @@ struct eh_region
/* An identifier for this region. */
int region_number;
+ /* When a region is deleted, its parents inherit the REG_EH_REGION
+ numbers already assigned. */
+ bitmap aka;
+
/* Each region does exactly one thing. */
enum eh_region_type
{
@@ -247,6 +258,10 @@ struct eh_status
static void mark_eh_region PARAMS ((struct eh_region *));
+static int mark_ehl_map_entry PARAMS ((PTR *, PTR));
+static void mark_ehl_map PARAMS ((void *));
+
+static void free_region PARAMS ((struct eh_region *));
static int t2r_eq PARAMS ((const PTR,
const PTR));
@@ -297,8 +312,15 @@ static void sjlj_emit_dispatch_table
PARAMS ((rtx, struct sjlj_lp_info *));
static void sjlj_build_landing_pads PARAMS ((void));
+static hashval_t ehl_hash PARAMS ((const PTR));
+static int ehl_eq PARAMS ((const PTR,
+ const PTR));
+static void ehl_free PARAMS ((PTR));
+static void add_ehl_entry PARAMS ((rtx,
+ struct eh_region *));
static void remove_exception_handler_label PARAMS ((rtx));
static void remove_eh_handler PARAMS ((struct eh_region *));
+static int for_each_eh_label_1 PARAMS ((PTR *, PTR));
struct reachable_info;
@@ -369,7 +391,7 @@ doing_eh (do_warn)
void
init_eh ()
{
- ggc_add_rtx_root (&exception_handler_labels, 1);
+ ggc_add_root (&exception_handler_label_map, 1, 1, mark_ehl_map);
if (! flag_exceptions)
return;
@@ -515,6 +537,25 @@ mark_eh_region (region)
ggc_mark_rtx (region->post_landing_pad);
}
+static int
+mark_ehl_map_entry (pentry, data)
+ PTR *pentry;
+ PTR data ATTRIBUTE_UNUSED;
+{
+ struct ehl_map_entry *entry = *(struct ehl_map_entry **) pentry;
+ ggc_mark_rtx (entry->label);
+ return 1;
+}
+
+static void
+mark_ehl_map (pp)
+ void *pp;
+{
+ htab_t map = *(htab_t *) pp;
+ if (map)
+ htab_traverse (map, mark_ehl_map_entry, NULL);
+}
+
void
mark_eh_status (eh)
struct eh_status *eh;
@@ -577,6 +618,16 @@ mark_eh_status (eh)
ggc_mark_rtx (eh->sjlj_exit_after);
}
+static inline void
+free_region (r)
+ struct eh_region *r;
+{
+ /* Note that the aka bitmap is freed by regset_release_memory. But if
+ we ever replace with a non-obstack implementation, this would be
+ the place to do it. */
+ free (r);
+}
+
void
free_eh_status (f)
struct function *f;
@@ -591,7 +642,7 @@ free_eh_status (f)
struct eh_region *r = eh->region_array[i];
/* Mind we don't free a region struct more than once. */
if (r && r->region_number == i)
- free (r);
+ free_region (r);
}
free (eh->region_array);
}
@@ -605,20 +656,20 @@ free_eh_status (f)
else if (r->next_peer)
{
next = r->next_peer;
- free (r);
+ free_region (r);
r = next;
}
else
{
do {
next = r->outer;
- free (r);
+ free_region (r);
r = next;
if (r == NULL)
goto tree_done;
} while (r->next_peer == NULL);
next = r->next_peer;
- free (r);
+ free_region (r);
r = next;
}
}
@@ -633,7 +684,12 @@ free_eh_status (f)
free (eh);
f->eh = NULL;
- exception_handler_labels = NULL;
+
+ if (exception_handler_label_map)
+ {
+ htab_delete (exception_handler_label_map);
+ exception_handler_label_map = NULL;
+ }
}
@@ -1366,13 +1422,56 @@ convert_from_eh_region_ranges ()
remove_unreachable_regions (insns);
}
+static void
+add_ehl_entry (label, region)
+ rtx label;
+ struct eh_region *region;
+{
+ struct ehl_map_entry **slot, *entry;
+
+ LABEL_PRESERVE_P (label) = 1;
+
+ entry = (struct ehl_map_entry *) xmalloc (sizeof (*entry));
+ entry->label = label;
+ entry->region = region;
+
+ slot = (struct ehl_map_entry **)
+ htab_find_slot (exception_handler_label_map, entry, INSERT);
+
+ /* Before landing pad creation, each exception handler has its own
+ label. After landing pad creation, the exception handlers may
+ share landing pads. This is ok, since maybe_remove_eh_handler
+ only requires the 1-1 mapping before landing pad creation. */
+ if (*slot && !cfun->eh->built_landing_pads)
+ abort ();
+
+ *slot = entry;
+}
+
+static void
+ehl_free (pentry)
+ PTR pentry;
+{
+ struct ehl_map_entry *entry = (struct ehl_map_entry *)pentry;
+ LABEL_PRESERVE_P (entry->label) = 0;
+ free (entry);
+}
+
void
find_exception_handler_labels ()
{
- rtx list = NULL_RTX;
int i;
- free_EXPR_LIST_list (&exception_handler_labels);
+ if (exception_handler_label_map)
+ htab_empty (exception_handler_label_map);
+ else
+ {
+ /* ??? The expansion factor here (3/2) must be greater than the htab
+ occupancy factor (4/3) to avoid unnecessary resizing. */
+ exception_handler_label_map
+ = htab_create (cfun->eh->last_region_number * 3 / 2,
+ ehl_hash, ehl_eq, ehl_free);
+ }
if (cfun->eh->region_tree == NULL)
return;
@@ -1390,17 +1489,32 @@ find_exception_handler_labels ()
lab = region->label;
if (lab)
- list = alloc_EXPR_LIST (0, lab, list);
+ add_ehl_entry (lab, region);
}
/* For sjlj exceptions, need the return label to remain live until
after landing pad generation. */
if (USING_SJLJ_EXCEPTIONS && ! cfun->eh->built_landing_pads)
- list = alloc_EXPR_LIST (0, return_label, list);
-
- exception_handler_labels = list;
+ add_ehl_entry (return_label, NULL);
}
+bool
+current_function_has_exception_handlers ()
+{
+ int i;
+
+ for (i = cfun->eh->last_region_number; i > 0; --i)
+ {
+ struct eh_region *region = cfun->eh->region_array[i];
+
+ if (! region || region->region_number != i)
+ continue;
+ if (region->type != ERT_THROW)
+ return true;
+ }
+
+ return false;
+}
static struct eh_region *
duplicate_eh_region_1 (o, map)
@@ -2467,28 +2581,50 @@ finish_eh_generation ()
cleanup_cfg (CLEANUP_PRE_LOOP);
}
+static hashval_t
+ehl_hash (pentry)
+ const PTR pentry;
+{
+ struct ehl_map_entry *entry = (struct ehl_map_entry *) pentry;
+
+ /* 2^32 * ((sqrt(5) - 1) / 2) */
+ const hashval_t scaled_golden_ratio = 0x9e3779b9;
+ return CODE_LABEL_NUMBER (entry->label) * scaled_golden_ratio;
+}
+
+static int
+ehl_eq (pentry, pdata)
+ const PTR pentry;
+ const PTR pdata;
+{
+ struct ehl_map_entry *entry = (struct ehl_map_entry *) pentry;
+ struct ehl_map_entry *data = (struct ehl_map_entry *) pdata;
+
+ return entry->label == data->label;
+}
+
/* This section handles removing dead code for flow. */
-/* Remove LABEL from the exception_handler_labels list. */
+/* Remove LABEL from exception_handler_label_map. */
static void
remove_exception_handler_label (label)
rtx label;
{
- rtx *pl, l;
+ struct ehl_map_entry **slot, tmp;
- /* If exception_handler_labels was not built yet,
+ /* If exception_handler_label_map was not built yet,
there is nothing to do. */
- if (exception_handler_labels == NULL)
+ if (exception_handler_label_map == NULL)
return;
- for (pl = &exception_handler_labels, l = *pl;
- XEXP (l, 0) != label;
- pl = &XEXP (l, 1), l = *pl)
- continue;
+ tmp.label = label;
+ slot = (struct ehl_map_entry **)
+ htab_find_slot (exception_handler_label_map, &tmp, NO_INSERT);
+ if (! slot)
+ abort ();
- *pl = XEXP (l, 1);
- free_EXPR_LIST_node (l);
+ htab_clear_slot (exception_handler_label_map, (void **) slot);
}
/* Splice REGION from the region tree etc. */
@@ -2497,18 +2633,32 @@ static void
remove_eh_handler (region)
struct eh_region *region;
{
- struct eh_region **pp, *p;
+ struct eh_region **pp, **pp_start, *p, *outer, *inner;
rtx lab;
- int i;
/* For the benefit of efficiently handling REG_EH_REGION notes,
replace this region in the region array with its containing
region. Note that previous region deletions may result in
- multiple copies of this region in the array, so we have to
- search the whole thing. */
- for (i = cfun->eh->last_region_number; i > 0; --i)
- if (cfun->eh->region_array[i] == region)
- cfun->eh->region_array[i] = region->outer;
+ multiple copies of this region in the array, so we have a
+ list of alternate numbers by which we are known. */
+
+ outer = region->outer;
+ cfun->eh->region_array[region->region_number] = outer;
+ if (region->aka)
+ {
+ int i;
+ EXECUTE_IF_SET_IN_BITMAP (region->aka, 0, i,
+ { cfun->eh->region_array[i] = outer; });
+ }
+
+ if (outer)
+ {
+ if (!outer->aka)
+ outer->aka = BITMAP_XMALLOC ();
+ if (region->aka)
+ bitmap_a_or_b (outer->aka, outer->aka, region->aka);
+ bitmap_set_bit (outer->aka, region->region_number);
+ }
if (cfun->eh->built_landing_pads)
lab = region->landing_pad;
@@ -2517,23 +2667,24 @@ remove_eh_handler (region)
if (lab)
remove_exception_handler_label (lab);
- if (region->outer)
- pp = &region->outer->inner;
+ if (outer)
+ pp_start = &outer->inner;
else
- pp = &cfun->eh->region_tree;
- for (p = *pp; p != region; pp = &p->next_peer, p = *pp)
+ pp_start = &cfun->eh->region_tree;
+ for (pp = pp_start, p = *pp; p != region; pp = &p->next_peer, p = *pp)
continue;
+ *pp = region->next_peer;
- if (region->inner)
+ inner = region->inner;
+ if (inner)
{
- for (p = region->inner; p->next_peer ; p = p->next_peer)
- p->outer = region->outer;
- p->next_peer = region->next_peer;
- p->outer = region->outer;
- *pp = region->inner;
+ for (p = inner; p->next_peer ; p = p->next_peer)
+ p->outer = outer;
+ p->outer = outer;
+
+ p->next_peer = *pp_start;
+ *pp_start = inner;
}
- else
- *pp = region->next_peer;
if (region->type == ERT_CATCH)
{
@@ -2563,7 +2714,7 @@ remove_eh_handler (region)
}
}
- free (region);
+ free_region (region);
}
/* LABEL heads a basic block that is about to be deleted. If this
@@ -2574,7 +2725,8 @@ void
maybe_remove_eh_handler (label)
rtx label;
{
- int i;
+ struct ehl_map_entry **slot, tmp;
+ struct eh_region *region;
/* ??? After generating landing pads, it's not so simple to determine
if the region data is completely unused. One must examine the
@@ -2583,27 +2735,50 @@ maybe_remove_eh_handler (label)
if (cfun->eh->built_landing_pads)
return;
- for (i = cfun->eh->last_region_number; i > 0; --i)
+ tmp.label = label;
+ slot = (struct ehl_map_entry **)
+ htab_find_slot (exception_handler_label_map, &tmp, NO_INSERT);
+ if (! slot)
+ return;
+ region = (*slot)->region;
+ if (! region)
+ return;
+
+ /* Flow will want to remove MUST_NOT_THROW regions as unreachable
+ because there is no path to the fallback call to terminate.
+ But the region continues to affect call-site data until there
+ are no more contained calls, which we don't see here. */
+ if (region->type == ERT_MUST_NOT_THROW)
{
- struct eh_region *region = cfun->eh->region_array[i];
- if (region && region->label == label)
- {
- /* Flow will want to remove MUST_NOT_THROW regions as unreachable
- because there is no path to the fallback call to terminate.
- But the region continues to affect call-site data until there
- are no more contained calls, which we don't see here. */
- if (region->type == ERT_MUST_NOT_THROW)
- {
- remove_exception_handler_label (region->label);
- region->label = NULL_RTX;
- }
- else
- remove_eh_handler (region);
- break;
- }
+ htab_clear_slot (exception_handler_label_map, (void **) slot);
+ region->label = NULL_RTX;
}
+ else
+ remove_eh_handler (region);
}
+/* Invokes CALLBACK for every exception handler label. Only used by old
+ loop hackery; should not be used by new code. */
+
+void
+for_each_eh_label (callback)
+ void (*callback) PARAMS ((rtx));
+{
+ htab_traverse (exception_handler_label_map, for_each_eh_label_1,
+ (void *)callback);
+}
+
+static int
+for_each_eh_label_1 (pentry, data)
+ PTR *pentry;
+ PTR data;
+{
+ struct ehl_map_entry *entry = *(struct ehl_map_entry **)pentry;
+ void (*callback) PARAMS ((rtx)) = (void (*) PARAMS ((rtx))) data;
+
+ (*callback) (entry->label);
+ return 1;
+}
/* This section describes CFG exception edges for flow. */
@@ -3088,7 +3263,7 @@ expand_builtin_extract_return_addr (addr_tree)
/* First mask out any unwanted bits. */
#ifdef MASK_RETURN_ADDR
- expand_and (addr, MASK_RETURN_ADDR, addr);
+ expand_and (Pmode, addr, MASK_RETURN_ADDR, addr);
#endif
/* Then adjust to find the real return address. */
diff --git a/contrib/gcc/except.h b/contrib/gcc/except.h
index f543c46..883a2b1 100644
--- a/contrib/gcc/except.h
+++ b/contrib/gcc/except.h
@@ -1,5 +1,5 @@
/* Exception Handling interface routines.
- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
Contributed by Mike Stump <mrs@cygnus.com>.
@@ -96,9 +96,9 @@ extern void add_partial_entry PARAMS ((tree));
add_partial_entry. */
extern void end_protect_partials PARAMS ((void));
-
-/* A list of labels used for exception handlers. */
-extern rtx exception_handler_labels;
+/* Invokes CALLBACK for every exception handler label. Only used by old
+ loop hackery; should not be used by new code. */
+extern void for_each_eh_label PARAMS ((void (*) (rtx)));
/* Determine if the given INSN can throw an exception. */
extern bool can_throw_internal PARAMS ((rtx));
@@ -120,6 +120,7 @@ extern void maybe_remove_eh_handler PARAMS ((rtx));
extern void convert_from_eh_region_ranges PARAMS ((void));
extern void convert_to_eh_region_ranges PARAMS ((void));
extern void find_exception_handler_labels PARAMS ((void));
+extern bool current_function_has_exception_handlers PARAMS ((void));
extern void output_function_exception_table PARAMS ((void));
extern void expand_builtin_unwind_init PARAMS ((void));
diff --git a/contrib/gcc/explow.c b/contrib/gcc/explow.c
index 8f9e0bf..7a770ee 100644
--- a/contrib/gcc/explow.c
+++ b/contrib/gcc/explow.c
@@ -142,7 +142,7 @@ plus_constant_wide (x, c)
Look for constant term in the sum and combine
with C. For an integer constant term, we make a combined
integer. For a constant term that is not an explicit integer,
- we cannot really combine, but group them together anyway.
+ we cannot really combine, but group them together anyway.
Restart or use a recursive call in case the remaining operand is
something that we handle specially, such as a SYMBOL_REF.
@@ -391,7 +391,7 @@ convert_memory_address (to_mode, x)
case CONST:
if (POINTERS_EXTEND_UNSIGNED >= 0)
- return gen_rtx_CONST (to_mode,
+ return gen_rtx_CONST (to_mode,
convert_memory_address (to_mode, XEXP (x, 0)));
break;
@@ -406,11 +406,11 @@ convert_memory_address (to_mode, x)
|| (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT
&& (INTVAL (XEXP (x, 1)) + 20000 < 40000
|| CONSTANT_P (XEXP (x, 0))))))
- return gen_rtx_fmt_ee (GET_CODE (x), to_mode,
+ return gen_rtx_fmt_ee (GET_CODE (x), to_mode,
convert_memory_address (to_mode, XEXP (x, 0)),
convert_memory_address (to_mode, XEXP (x, 1)));
break;
-
+
default:
break;
}
@@ -670,12 +670,12 @@ copy_to_reg (x)
rtx x;
{
rtx temp = gen_reg_rtx (GET_MODE (x));
-
+
/* If not an operand, must be an address with PLUS and MULT so
- do the computation. */
+ do the computation. */
if (! general_operand (x, VOIDmode))
x = force_operand (x, temp);
-
+
if (x != temp)
emit_move_insn (temp, x);
@@ -701,9 +701,9 @@ copy_to_mode_reg (mode, x)
rtx x;
{
rtx temp = gen_reg_rtx (mode);
-
+
/* If not an operand, must be an address with PLUS and MULT so
- do the computation. */
+ do the computation. */
if (! general_operand (x, VOIDmode))
x = force_operand (x, temp);
@@ -731,13 +731,24 @@ force_reg (mode, x)
if (GET_CODE (x) == REG)
return x;
-
- temp = gen_reg_rtx (mode);
-
- if (! general_operand (x, mode))
- x = force_operand (x, NULL_RTX);
-
- insn = emit_move_insn (temp, x);
+
+ if (general_operand (x, mode))
+ {
+ temp = gen_reg_rtx (mode);
+ insn = emit_move_insn (temp, x);
+ }
+ else
+ {
+ temp = force_operand (x, NULL_RTX);
+ if (GET_CODE (temp) == REG)
+ insn = get_last_insn ();
+ else
+ {
+ rtx temp2 = gen_reg_rtx (mode);
+ insn = emit_move_insn (temp2, temp);
+ temp = temp2;
+ }
+ }
/* Let optimizers know that TEMP's value never changes
and that X can be substituted for it. Don't get confused
@@ -746,6 +757,7 @@ force_reg (mode, x)
&& (set = single_set (insn)) != 0
&& SET_DEST (set) == temp)
set_unique_reg_note (insn, REG_EQUAL, x);
+
return temp;
}
@@ -823,7 +835,7 @@ promote_mode (type, mode, punsignedp, for_call)
unsignedp = POINTERS_EXTEND_UNSIGNED;
break;
#endif
-
+
default:
break;
}
@@ -1010,9 +1022,9 @@ emit_stack_save (save_level, psave, after)
}
/* Restore the stack pointer for the purpose in SAVE_LEVEL. SA is the save
- area made by emit_stack_save. If it is zero, we have nothing to do.
+ area made by emit_stack_save. If it is zero, we have nothing to do.
- Put any emitted insns after insn AFTER, if nonzero, otherwise at
+ Put any emitted insns after insn AFTER, if nonzero, otherwise at
current position. */
void
@@ -1096,7 +1108,7 @@ optimize_save_area_alloca (insns)
/* If we do not see the note in a pattern matching
these precise characteristics, we did something
- entirely wrong in allocate_dynamic_stack_space.
+ entirely wrong in allocate_dynamic_stack_space.
Note, one way this could happen is if SETJMP_VIA_SAVE_AREA
was defined on a machine where stacks grow towards higher
@@ -1187,7 +1199,7 @@ allocate_dynamic_stack_space (size, target, known_align)
/* We will need to ensure that the address we return is aligned to
BIGGEST_ALIGNMENT. If STACK_DYNAMIC_OFFSET is defined, we don't
- always know its final value at this point in the compilation (it
+ always know its final value at this point in the compilation (it
might depend on the size of the outgoing parameter lists, for
example), so we must align the value to be returned in that case.
(Note that STACK_DYNAMIC_OFFSET will have a default non-zero value if
@@ -1206,7 +1218,7 @@ allocate_dynamic_stack_space (size, target, known_align)
if (MUST_ALIGN)
size
- = force_operand (plus_constant (size,
+ = force_operand (plus_constant (size,
BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
NULL_RTX);
@@ -1339,11 +1351,11 @@ allocate_dynamic_stack_space (size, target, known_align)
rtx available;
rtx space_available = gen_label_rtx ();
#ifdef STACK_GROWS_DOWNWARD
- available = expand_binop (Pmode, sub_optab,
+ available = expand_binop (Pmode, sub_optab,
stack_pointer_rtx, stack_limit_rtx,
NULL_RTX, 1, OPTAB_WIDEN);
#else
- available = expand_binop (Pmode, sub_optab,
+ available = expand_binop (Pmode, sub_optab,
stack_limit_rtx, stack_pointer_rtx,
NULL_RTX, 1, OPTAB_WIDEN);
#endif
@@ -1372,7 +1384,7 @@ allocate_dynamic_stack_space (size, target, known_align)
#endif /* SETJMP_VIA_SAVE_AREA */
#ifdef STACK_GROWS_DOWNWARD
- emit_move_insn (target, virtual_stack_dynamic_rtx);
+ emit_move_insn (target, virtual_stack_dynamic_rtx);
#endif
}
@@ -1391,7 +1403,7 @@ allocate_dynamic_stack_space (size, target, known_align)
GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT),
NULL_RTX, 1);
}
-
+
/* Some systems require a particular insn to refer to the stack
to make the pages exist. */
#ifdef HAVE_probe
@@ -1406,7 +1418,7 @@ allocate_dynamic_stack_space (size, target, known_align)
return target;
}
-/* A front end may want to override GCC's stack checking by providing a
+/* A front end may want to override GCC's stack checking by providing a
run-time routine to call to check the stack, so provide a mechanism for
calling that routine. */
@@ -1436,7 +1448,7 @@ emit_stack_probe (address)
emit_move_insn (memref, const0_rtx);
}
-/* Probe a range of stack addresses from FIRST to FIRST+SIZE, inclusive.
+/* Probe a range of stack addresses from FIRST to FIRST+SIZE, inclusive.
FIRST is a constant and size is a Pmode RTX. These are offsets from the
current stack pointer. STACK_GROWS_DOWNWARD says whether to add or
subtract from the stack. If SIZE is constant, this is done
@@ -1603,6 +1615,10 @@ hard_function_value (valtype, func, outgoing)
unsigned HOST_WIDE_INT bytes = int_size_in_bytes (valtype);
enum machine_mode tmpmode;
+ /* int_size_in_bytes can return -1. We don't need a check here
+ since the value of bytes will be large enough that no mode
+ will match and we will abort later in this function. */
+
for (tmpmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
tmpmode != VOIDmode;
tmpmode = GET_MODE_WIDER_MODE (tmpmode))
@@ -1617,7 +1633,7 @@ hard_function_value (valtype, func, outgoing)
abort ();
PUT_MODE (val, tmpmode);
- }
+ }
return val;
}
diff --git a/contrib/gcc/expmed.c b/contrib/gcc/expmed.c
index 53ff05b..7836de7 100644
--- a/contrib/gcc/expmed.c
+++ b/contrib/gcc/expmed.c
@@ -54,7 +54,7 @@ static void do_cmp_and_jump PARAMS ((rtx, rtx, enum rtx_code,
enum machine_mode, rtx));
/* Non-zero means divides or modulus operations are relatively cheap for
- powers of two, so don't use branches; emit the operation instead.
+ powers of two, so don't use branches; emit the operation instead.
Usually, this will mean that the MD file will emit non-branch
sequences. */
@@ -299,6 +299,7 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, total_size)
unsigned HOST_WIDE_INT offset = bitnum / unit;
unsigned HOST_WIDE_INT bitpos = bitnum % unit;
rtx op0 = str_rtx;
+ int byte_offset;
enum machine_mode op_mode = mode_for_extraction (EP_insv, 3);
@@ -324,7 +325,12 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, total_size)
value = protect_from_queue (value, 0);
if (flag_force_mem)
- value = force_not_mem (value);
+ {
+ int old_generating_concat_p = generating_concat_p;
+ generating_concat_p = 0;
+ value = force_not_mem (value);
+ generating_concat_p = old_generating_concat_p;
+ }
/* If the target is a register, overwriting the entire object, or storing
a full-word or multi-word field can be done with just a SUBREG.
@@ -332,12 +338,16 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, total_size)
If the target is memory, storing any naturally aligned field can be
done with a simple store. For targets that support fast unaligned
memory, any naturally sized, unit aligned field can be done directly. */
-
+
+ byte_offset = (bitnum % BITS_PER_WORD) / BITS_PER_UNIT
+ + (offset * UNITS_PER_WORD);
+
if (bitpos == 0
&& bitsize == GET_MODE_BITSIZE (fieldmode)
&& (GET_CODE (op0) != MEM
- ? (GET_MODE_SIZE (fieldmode) >= UNITS_PER_WORD
+ ? ((GET_MODE_SIZE (fieldmode) >= UNITS_PER_WORD
|| GET_MODE_SIZE (GET_MODE (op0)) == GET_MODE_SIZE (fieldmode))
+ && byte_offset % GET_MODE_SIZE (fieldmode) == 0)
: (! SLOW_UNALIGNED_ACCESS (fieldmode, MEM_ALIGN (op0))
|| (offset * BITS_PER_UNIT % bitsize == 0
&& MEM_ALIGN (op0) % GET_MODE_BITSIZE (fieldmode) == 0))))
@@ -357,9 +367,7 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, total_size)
abort ();
}
if (GET_CODE (op0) == REG)
- op0 = gen_rtx_SUBREG (fieldmode, op0,
- (bitnum % BITS_PER_WORD) / BITS_PER_UNIT
- + (offset * UNITS_PER_WORD));
+ op0 = gen_rtx_SUBREG (fieldmode, op0, byte_offset);
else
op0 = adjust_address (op0, fieldmode, offset);
}
@@ -384,6 +392,15 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, total_size)
}
}
+ /* We may be accessing data outside the field, which means
+ we can alias adjacent data. */
+ if (GET_CODE (op0) == MEM)
+ {
+ op0 = shallow_copy_rtx (op0);
+ set_mem_alias_set (op0, 0);
+ set_mem_expr (op0, 0);
+ }
+
/* If OP0 is a register, BITPOS must count within a word.
But as we have it, it counts within whatever size OP0 now has.
On a bigendian machine, these are not the same, so convert. */
@@ -516,12 +533,9 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, total_size)
corresponding size. This can occur on a machine with 64 bit registers
that uses SFmode for float. This can also occur for unaligned float
structure fields. */
- if (GET_MODE_CLASS (GET_MODE (value)) == MODE_FLOAT)
- {
- if (GET_CODE (value) != REG)
- value = copy_to_reg (value);
- value = gen_rtx_SUBREG (word_mode, value, 0);
- }
+ if (GET_MODE_CLASS (GET_MODE (value)) != MODE_INT
+ && GET_MODE_CLASS (GET_MODE (value)) != MODE_PARTIAL_INT)
+ value = gen_lowpart (word_mode, value);
/* Now OFFSET is nonzero only if OP0 is memory
and is therefore always measured in bytes. */
@@ -573,7 +587,7 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, total_size)
&& GET_MODE_BITSIZE (bestmode) > MEM_ALIGN (op0)))
goto insv_loses;
- /* Adjust address to point to the containing unit of that mode.
+ /* Adjust address to point to the containing unit of that mode.
Compute offset as multiple of this unit, counting in bytes. */
unit = GET_MODE_BITSIZE (bestmode);
offset = (bitnum / unit) * GET_MODE_SIZE (bestmode);
@@ -627,8 +641,17 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, total_size)
if we must narrow it, be sure we do it correctly. */
if (GET_MODE_SIZE (GET_MODE (value)) < GET_MODE_SIZE (maxmode))
- value1 = simplify_gen_subreg (maxmode, value1,
- GET_MODE (value1), 0);
+ {
+ rtx tmp;
+
+ tmp = simplify_subreg (maxmode, value1, GET_MODE (value), 0);
+ if (! tmp)
+ tmp = simplify_gen_subreg (maxmode,
+ force_reg (GET_MODE (value),
+ value1),
+ GET_MODE (value), 0);
+ value1 = tmp;
+ }
else
value1 = gen_lowpart (maxmode, value1);
}
@@ -709,7 +732,7 @@ store_fixed_bit_field (op0, offset, bitsize, bitpos, value)
{
/* Get the proper mode to use for this field. We want a mode that
includes the entire field. If such a mode would be larger than
- a word, we won't be doing the extraction the normal way.
+ a word, we won't be doing the extraction the normal way.
We don't want a mode bigger than the destination. */
mode = GET_MODE (op0);
@@ -1055,10 +1078,19 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
}
}
+ /* We may be accessing data outside the field, which means
+ we can alias adjacent data. */
+ if (GET_CODE (op0) == MEM)
+ {
+ op0 = shallow_copy_rtx (op0);
+ set_mem_alias_set (op0, 0);
+ set_mem_expr (op0, 0);
+ }
+
/* ??? We currently assume TARGET is at least as big as BITSIZE.
If that's wrong, the solution is to test for it and set TARGET to 0
if needed. */
-
+
/* If OP0 is a register, BITPOS must count within a word.
But as we have it, it counts within whatever size OP0 now has.
On a bigendian machine, these are not the same, so convert. */
@@ -1125,7 +1157,7 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
}
/* Handle fields bigger than a word. */
-
+
if (bitsize > BITS_PER_WORD)
{
/* Here we transfer the words of the field
@@ -1197,14 +1229,14 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
build_int_2 (GET_MODE_BITSIZE (mode) - bitsize, 0),
NULL_RTX, 0);
}
-
+
/* From here on we know the desired field is smaller than a word. */
/* Check if there is a correspondingly-sized integer field, so we can
safely extract it as one size of integer, if necessary; then
truncate or extend to the size that is wanted; then use SUBREGs or
convert_to_mode to get one of the modes we really wanted. */
-
+
int_mode = int_mode_for_mode (tmode);
if (int_mode == BLKmode)
int_mode = int_mode_for_mode (mode);
@@ -1363,7 +1395,7 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
}
else
extzv_loses:
- target = extract_fixed_bit_field (int_mode, op0, offset, bitsize,
+ target = extract_fixed_bit_field (int_mode, op0, offset, bitsize,
bitpos, target, 1);
}
else
@@ -1489,10 +1521,10 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
target = extract_fixed_bit_field (int_mode, op0, offset, bitsize,
bitpos, target, 0);
}
- }
+ }
else
extv_loses:
- target = extract_fixed_bit_field (int_mode, op0, offset, bitsize,
+ target = extract_fixed_bit_field (int_mode, op0, offset, bitsize,
bitpos, target, 0);
}
if (target == spec_target)
@@ -1504,14 +1536,13 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
/* If the target mode is floating-point, first convert to the
integer mode of that size and then access it as a floating-point
value via a SUBREG. */
- if (GET_MODE_CLASS (tmode) == MODE_FLOAT)
+ if (GET_MODE_CLASS (tmode) != MODE_INT
+ && GET_MODE_CLASS (tmode) != MODE_PARTIAL_INT)
{
target = convert_to_mode (mode_for_size (GET_MODE_BITSIZE (tmode),
MODE_INT, 0),
target, unsignedp);
- if (GET_CODE (target) != REG)
- target = copy_to_reg (target);
- return gen_rtx_SUBREG (tmode, target, 0);
+ return gen_lowpart (tmode, target);
}
else
return convert_to_mode (tmode, target, unsignedp);
@@ -1657,7 +1688,7 @@ extract_fixed_bit_field (tmode, op0, offset, bitsize, bitpos,
}
return expand_shift (RSHIFT_EXPR, mode, op0,
- build_int_2 (GET_MODE_BITSIZE (mode) - bitsize, 0),
+ build_int_2 (GET_MODE_BITSIZE (mode) - bitsize, 0),
target, 0);
}
@@ -1682,7 +1713,7 @@ mask_rtx (mode, bitpos, bitsize, complement)
if (bitpos + bitsize < HOST_BITS_PER_WIDE_INT)
masklow &= ((unsigned HOST_WIDE_INT) -1
>> (HOST_BITS_PER_WIDE_INT - bitpos - bitsize));
-
+
if (bitpos <= HOST_BITS_PER_WIDE_INT)
maskhigh = -1;
else
@@ -1972,7 +2003,7 @@ expand_shift (code, mode, shifted, amount, target, unsignedp)
&& (unsigned int) INTVAL (op1) < GET_MODE_BITSIZE (mode))
temp = expand_binop (mode,
left ? rotr_optab : rotl_optab,
- shifted,
+ shifted,
GEN_INT (GET_MODE_BITSIZE (mode)
- INTVAL (op1)),
target, unsignedp, methods);
@@ -2003,7 +2034,7 @@ expand_shift (code, mode, shifted, amount, target, unsignedp)
}
/* We used to try extzv here for logical right shifts, but that was
- only useful for one machine, the VAX, and caused poor code
+ only useful for one machine, the VAX, and caused poor code
generation there for lshrdi3, so the code was deleted and a
define_expand for lshrsi3 was added to vax.md. */
}
@@ -2144,7 +2175,7 @@ synth_mult (alg_out, t, cost_limit)
for (w = 1; (w & t) != 0; w <<= 1)
;
/* If T was -1, then W will be zero after the loop. This is another
- case where T ends with ...111. Handling this with (T + 1) and
+ case where T ends with ...111. Handling this with (T + 1) and
subtract 1 produces slightly better code and results in algorithm
selection much faster than treating it like the ...0111 case
below. */
@@ -2424,7 +2455,7 @@ expand_mult (mode, op0, op1, target, unsignedp)
&& ! preserve)
? target : 0;
rtx accum_target = preserve ? 0 : accum;
-
+
switch (alg.op[opno])
{
case alg_shift:
@@ -2506,7 +2537,7 @@ expand_mult (mode, op0, op1, target, unsignedp)
}
insn = get_last_insn ();
- set_unique_reg_note (insn,
+ set_unique_reg_note (insn,
REG_EQUAL,
gen_rtx_MULT (nmode, tem,
GEN_INT (val_so_far)));
@@ -2532,7 +2563,7 @@ expand_mult (mode, op0, op1, target, unsignedp)
/* This used to use umul_optab if unsigned, but for non-widening multiply
there is no difference between signed and unsigned. */
- op0 = expand_binop (mode,
+ op0 = expand_binop (mode,
! unsignedp
&& flag_trapv && (GET_MODE_CLASS(mode) == MODE_INT)
? smulv_optab : smul_optab,
@@ -2714,7 +2745,7 @@ expand_mult_highpart_adjust (mode, adj_operand, op0, op1, target, unsignedp)
tem = expand_shift (RSHIFT_EXPR, mode, op0,
build_int_2 (GET_MODE_BITSIZE (mode) - 1, 0),
NULL_RTX, 0);
- tem = expand_and (tem, op1, NULL_RTX);
+ tem = expand_and (mode, tem, op1, NULL_RTX);
adj_operand
= force_operand (gen_rtx_fmt_ee (adj_code, mode, adj_operand, tem),
adj_operand);
@@ -2722,7 +2753,7 @@ expand_mult_highpart_adjust (mode, adj_operand, op0, op1, target, unsignedp)
tem = expand_shift (RSHIFT_EXPR, mode, op1,
build_int_2 (GET_MODE_BITSIZE (mode) - 1, 0),
NULL_RTX, 0);
- tem = expand_and (tem, op0, NULL_RTX);
+ tem = expand_and (mode, tem, op0, NULL_RTX);
target = force_operand (gen_rtx_fmt_ee (adj_code, mode, adj_operand, tem),
target);
@@ -2760,15 +2791,12 @@ expand_mult_highpart (mode, op0, cnst1, target, unsignedp, max_cost)
op1 = GEN_INT (trunc_int_for_mode (cnst1, mode));
- if (GET_MODE_BITSIZE (wider_mode) <= HOST_BITS_PER_INT)
- wide_op1 = op1;
- else
- wide_op1
- = immed_double_const (cnst1,
- (unsignedp
- ? (HOST_WIDE_INT) 0
- : -(cnst1 >> (HOST_BITS_PER_WIDE_INT - 1))),
- wider_mode);
+ wide_op1
+ = immed_double_const (cnst1,
+ (unsignedp
+ ? (HOST_WIDE_INT) 0
+ : -(cnst1 >> (HOST_BITS_PER_WIDE_INT - 1))),
+ wider_mode);
/* expand_mult handles constant multiplication of word_mode
or narrower. It does a poor job for large modes. */
@@ -2823,7 +2851,7 @@ expand_mult_highpart (mode, op0, cnst1, target, unsignedp, max_cost)
{
op1 = force_reg (mode, op1);
goto try;
- }
+ }
/* Try widening the mode and perform a non-widening multiplication. */
moptab = smul_optab;
@@ -3230,7 +3258,7 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp)
if (insn != last
&& (set = single_set (insn)) != 0
&& SET_DEST (set) == quotient)
- set_unique_reg_note (insn,
+ set_unique_reg_note (insn,
REG_EQUAL,
gen_rtx_UDIV (compute_mode, op0, op1));
}
@@ -3318,7 +3346,7 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp)
&& SET_DEST (set) == quotient
&& abs_d < ((unsigned HOST_WIDE_INT) 1
<< (HOST_BITS_PER_WIDE_INT - 1)))
- set_unique_reg_note (insn,
+ set_unique_reg_note (insn,
REG_EQUAL,
gen_rtx_DIV (compute_mode,
op0,
@@ -3409,7 +3437,7 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp)
if (insn != last
&& (set = single_set (insn)) != 0
&& SET_DEST (set) == quotient)
- set_unique_reg_note (insn,
+ set_unique_reg_note (insn,
REG_EQUAL,
gen_rtx_DIV (compute_mode, op0, op1));
}
@@ -3902,7 +3930,7 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp)
emit_label (label);
}
return gen_lowpart (mode, rem_flag ? remainder : quotient);
-
+
default:
abort ();
}
@@ -4041,39 +4069,57 @@ make_tree (type, x)
}
return t;
-
+
+ case CONST_VECTOR:
+ {
+ int i, units;
+ rtx elt;
+ tree t = NULL_TREE;
+
+ units = CONST_VECTOR_NUNITS (x);
+
+ /* Build a tree with vector elements. */
+ for (i = units - 1; i >= 0; --i)
+ {
+ elt = CONST_VECTOR_ELT (x, i);
+ t = tree_cons (NULL_TREE, make_tree (type, elt), t);
+ }
+
+ return build_vector (type, t);
+ }
+
case PLUS:
return fold (build (PLUS_EXPR, type, make_tree (type, XEXP (x, 0)),
make_tree (type, XEXP (x, 1))));
-
+
case MINUS:
return fold (build (MINUS_EXPR, type, make_tree (type, XEXP (x, 0)),
make_tree (type, XEXP (x, 1))));
-
+
case NEG:
return fold (build1 (NEGATE_EXPR, type, make_tree (type, XEXP (x, 0))));
case MULT:
return fold (build (MULT_EXPR, type, make_tree (type, XEXP (x, 0)),
make_tree (type, XEXP (x, 1))));
-
+
case ASHIFT:
return fold (build (LSHIFT_EXPR, type, make_tree (type, XEXP (x, 0)),
make_tree (type, XEXP (x, 1))));
-
+
case LSHIFTRT:
return fold (convert (type,
build (RSHIFT_EXPR, unsigned_type (type),
make_tree (unsigned_type (type),
XEXP (x, 0)),
make_tree (type, XEXP (x, 1)))));
-
+
case ASHIFTRT:
return fold (convert (type,
build (RSHIFT_EXPR, signed_type (type),
make_tree (signed_type (type), XEXP (x, 0)),
make_tree (type, XEXP (x, 1)))));
-
+
case DIV:
if (TREE_CODE (type) != REAL_TYPE)
t = signed_type (type);
@@ -4141,23 +4187,16 @@ expand_mult_add (x, target, mult, add, mode, unsignedp)
If TARGET is 0, a pseudo-register or constant is returned. */
rtx
-expand_and (op0, op1, target)
+expand_and (mode, op0, op1, target)
+ enum machine_mode mode;
rtx op0, op1, target;
{
- enum machine_mode mode = VOIDmode;
- rtx tem;
+ rtx tem = 0;
- if (GET_MODE (op0) != VOIDmode)
- mode = GET_MODE (op0);
- else if (GET_MODE (op1) != VOIDmode)
- mode = GET_MODE (op1);
-
- if (mode != VOIDmode)
+ if (GET_MODE (op0) == VOIDmode && GET_MODE (op1) == VOIDmode)
+ tem = simplify_binary_operation (AND, mode, op0, op1);
+ if (tem == 0)
tem = expand_binop (mode, and_optab, op0, op1, target, 0, OPTAB_LIB_WIDEN);
- else if (GET_CODE (op0) == CONST_INT && GET_CODE (op1) == CONST_INT)
- tem = GEN_INT (INTVAL (op0) & INTVAL (op1));
- else
- abort ();
if (target == 0)
target = tem;
@@ -4171,7 +4210,7 @@ expand_and (op0, op1, target)
Return 0 if that cannot be done.
MODE is the mode to use for OP0 and OP1 should they be CONST_INTs. If
- it is VOIDmode, they cannot both be CONST_INT.
+ it is VOIDmode, they cannot both be CONST_INT.
UNSIGNEDP is for the case where we have to widen the operands
to perform the operation. It says to use zero-extension.
@@ -4219,7 +4258,7 @@ emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep)
if (mode == VOIDmode)
mode = GET_MODE (op0);
- /* For some comparisons with 1 and -1, we can convert this to
+ /* For some comparisons with 1 and -1, we can convert this to
comparisons with zero. This will often produce more opportunities for
store-flag insns. */
@@ -4257,7 +4296,8 @@ emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep)
the comparison into one involving a single word. */
if (GET_MODE_BITSIZE (mode) == BITS_PER_WORD * 2
&& GET_MODE_CLASS (mode) == MODE_INT
- && op1 == const0_rtx)
+ && op1 == const0_rtx
+ && (GET_CODE (op0) != MEM || ! MEM_VOLATILE_P (op0)))
{
if (code == EQ || code == NE)
{
@@ -4415,14 +4455,14 @@ emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep)
subtarget, normalizep == 1);
else if (STORE_FLAG_VALUE & 1)
{
- op0 = expand_and (op0, const1_rtx, subtarget);
+ op0 = expand_and (compare_mode, op0, const1_rtx, subtarget);
if (normalizep == -1)
op0 = expand_unop (compare_mode, neg_optab, op0, op0, 0);
}
else
abort ();
- /* If we were converting to a smaller mode, do the
+ /* If we were converting to a smaller mode, do the
conversion now. */
if (target_mode != compare_mode)
{
@@ -4467,7 +4507,7 @@ emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep)
return tem;
}
- /* Some other cases we can do are EQ, NE, LE, and GT comparisons with
+ /* Some other cases we can do are EQ, NE, LE, and GT comparisons with
the constant zero. Reject all other comparisons at this point. Only
do LE and GT if branches are expensive since they are expensive on
2-operand machines. */
@@ -4529,22 +4569,22 @@ emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep)
tem = expand_binop (mode, sub_optab, tem, op0, subtarget, 0,
OPTAB_WIDEN);
}
-
+
if (code == EQ || code == NE)
{
/* For EQ or NE, one way to do the comparison is to apply an operation
that converts the operand into a positive number if it is non-zero
or zero if it was originally zero. Then, for EQ, we subtract 1 and
for NE we negate. This puts the result in the sign bit. Then we
- normalize with a shift, if needed.
+ normalize with a shift, if needed.
Two operations that can do the above actions are ABS and FFS, so try
them. If that doesn't work, and MODE is smaller than a full word,
we can use zero-extension to the wider mode (an unsigned conversion)
as the operation. */
- /* Note that ABS doesn't yield a positive number for INT_MIN, but
- that is compensated by the subsequent overflow when subtracting
+ /* Note that ABS doesn't yield a positive number for INT_MIN, but
+ that is compensated by the subsequent overflow when subtracting
one / negating. */
if (abs_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
diff --git a/contrib/gcc/expr.c b/contrib/gcc/expr.c
index 2b8b085..a6ec546 100644
--- a/contrib/gcc/expr.c
+++ b/contrib/gcc/expr.c
@@ -147,6 +147,8 @@ static rtx store_field PARAMS ((rtx, HOST_WIDE_INT,
int));
static rtx var_rtx PARAMS ((tree));
static HOST_WIDE_INT highest_pow2_factor PARAMS ((tree));
+static HOST_WIDE_INT highest_pow2_factor_for_type PARAMS ((tree, tree));
+static int is_aligning_offset PARAMS ((tree, tree));
static rtx expand_increment PARAMS ((tree, int, int));
static void do_jump_by_parts_greater PARAMS ((tree, int, rtx, rtx));
static void do_jump_by_parts_equality PARAMS ((tree, rtx, rtx));
@@ -2004,12 +2006,17 @@ emit_group_load (dst, orig_src, ssize)
}
else if (GET_CODE (src) == CONCAT)
{
- if (bytepos == 0
- && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 0))))
- tmps[i] = XEXP (src, 0);
- else if (bytepos == (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
- && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 1))))
- tmps[i] = XEXP (src, 1);
+ if ((bytepos == 0
+ && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 0))))
+ || (bytepos == (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
+ && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 1)))))
+ {
+ tmps[i] = XEXP (src, bytepos != 0);
+ if (! CONSTANT_P (tmps[i])
+ && (GET_CODE (tmps[i]) != REG || GET_MODE (tmps[i]) != mode))
+ tmps[i] = extract_bit_field (tmps[i], bytelen * BITS_PER_UNIT,
+ 0, 1, NULL_RTX, mode, mode, ssize);
+ }
else if (bytepos == 0)
{
rtx mem = assign_stack_temp (GET_MODE (src),
@@ -2095,7 +2102,7 @@ emit_group_store (orig_dst, src, ssize)
emit_group_load (dst, temp, ssize);
return;
}
- else if (GET_CODE (dst) != MEM)
+ else if (GET_CODE (dst) != MEM && GET_CODE (dst) != CONCAT)
{
dst = gen_reg_rtx (GET_MODE (orig_dst));
/* Make life a bit easier for combine. */
@@ -2108,6 +2115,7 @@ emit_group_store (orig_dst, src, ssize)
HOST_WIDE_INT bytepos = INTVAL (XEXP (XVECEXP (src, 0, i), 1));
enum machine_mode mode = GET_MODE (tmps[i]);
unsigned int bytelen = GET_MODE_SIZE (mode);
+ rtx dest = dst;
/* Handle trailing fragments that run over the size of the struct. */
if (ssize >= 0 && bytepos + (HOST_WIDE_INT) bytelen > ssize)
@@ -2121,14 +2129,27 @@ emit_group_store (orig_dst, src, ssize)
bytelen = ssize - bytepos;
}
+ if (GET_CODE (dst) == CONCAT)
+ {
+ if (bytepos + bytelen <= GET_MODE_SIZE (GET_MODE (XEXP (dst, 0))))
+ dest = XEXP (dst, 0);
+ else if (bytepos >= GET_MODE_SIZE (GET_MODE (XEXP (dst, 0))))
+ {
+ bytepos -= GET_MODE_SIZE (GET_MODE (XEXP (dst, 0)));
+ dest = XEXP (dst, 1);
+ }
+ else
+ abort ();
+ }
+
/* Optimize the access just a bit. */
- if (GET_CODE (dst) == MEM
- && MEM_ALIGN (dst) >= GET_MODE_ALIGNMENT (mode)
+ if (GET_CODE (dest) == MEM
+ && MEM_ALIGN (dest) >= GET_MODE_ALIGNMENT (mode)
&& bytepos * BITS_PER_UNIT % GET_MODE_ALIGNMENT (mode) == 0
&& bytelen == GET_MODE_SIZE (mode))
- emit_move_insn (adjust_address (dst, mode, bytepos), tmps[i]);
+ emit_move_insn (adjust_address (dest, mode, bytepos), tmps[i]);
else
- store_bit_field (dst, bytelen * BITS_PER_UNIT, bytepos * BITS_PER_UNIT,
+ store_bit_field (dest, bytelen * BITS_PER_UNIT, bytepos * BITS_PER_UNIT,
mode, tmps[i], ssize);
}
@@ -3659,17 +3680,17 @@ expand_assignment (to, from, want_value, suggest_reg)
if (offset != 0)
{
- rtx offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode, 0);
+ rtx offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode, EXPAND_SUM);
if (GET_CODE (to_rtx) != MEM)
abort ();
- if (GET_MODE (offset_rtx) != ptr_mode)
- offset_rtx = convert_to_mode (ptr_mode, offset_rtx, 0);
-
#ifdef POINTERS_EXTEND_UNSIGNED
if (GET_MODE (offset_rtx) != Pmode)
offset_rtx = convert_memory_address (Pmode, offset_rtx);
+#else
+ if (GET_MODE (offset_rtx) != ptr_mode)
+ offset_rtx = convert_to_mode (ptr_mode, offset_rtx, 0);
#endif
/* A constant address in TO_RTX can have VOIDmode, we must not try
@@ -3682,20 +3703,13 @@ expand_assignment (to, from, want_value, suggest_reg)
&& (bitsize % GET_MODE_ALIGNMENT (mode1)) == 0
&& MEM_ALIGN (to_rtx) == GET_MODE_ALIGNMENT (mode1))
{
- rtx temp
- = adjust_address (to_rtx, mode1, bitpos / BITS_PER_UNIT);
-
- if (GET_CODE (XEXP (temp, 0)) == REG)
- to_rtx = temp;
- else
- to_rtx = (replace_equiv_address
- (to_rtx, force_reg (GET_MODE (XEXP (temp, 0)),
- XEXP (temp, 0))));
+ to_rtx = adjust_address (to_rtx, mode1, bitpos / BITS_PER_UNIT);
bitpos = 0;
}
to_rtx = offset_address (to_rtx, offset_rtx,
- highest_pow2_factor (offset));
+ highest_pow2_factor_for_type (TREE_TYPE (to),
+ offset));
}
if (GET_CODE (to_rtx) == MEM)
@@ -3997,6 +4011,8 @@ store_expr (exp, target, want_value)
and then convert to the wider mode. Our value is the computed
expression. */
{
+ rtx inner_target = 0;
+
/* If we don't want a value, we can do the conversion inside EXP,
which will often result in some optimizations. Do the conversion
in two steps: first change the signedness, if needed, then
@@ -4017,9 +4033,11 @@ store_expr (exp, target, want_value)
exp = convert (type_for_mode (GET_MODE (SUBREG_REG (target)),
SUBREG_PROMOTED_UNSIGNED_P (target)),
exp);
+
+ inner_target = SUBREG_REG (target);
}
- temp = expand_expr (exp, NULL_RTX, VOIDmode, 0);
+ temp = expand_expr (exp, inner_target, VOIDmode, 0);
/* If TEMP is a volatile MEM and we want a result value, make
the access now so it gets done only once. Likewise if
@@ -4110,7 +4128,12 @@ store_expr (exp, target, want_value)
|| (temp != target && (side_effects_p (temp)
|| side_effects_p (target))))
&& TREE_CODE (exp) != ERROR_MARK
- && ! dont_store_target)
+ && ! dont_store_target
+ /* If store_expr stores a DECL whose DECL_RTL(exp) == TARGET,
+ but TARGET is not valid memory reference, TEMP will differ
+ from TARGET although it is really the same location. */
+ && (TREE_CODE_CLASS (TREE_CODE (exp)) != 'd'
+ || target != DECL_RTL_IF_SET (exp)))
{
target = protect_from_queue (target, 1);
if (GET_MODE (temp) != GET_MODE (target)
@@ -4165,7 +4188,7 @@ store_expr (exp, target, want_value)
}
else
{
- size = expand_binop (ptr_mode, sub_optab, size,
+ size = expand_binop (TYPE_MODE (sizetype), sub_optab, size,
copy_size_rtx, NULL_RTX, 0,
OPTAB_LIB_WIDEN);
@@ -4244,6 +4267,14 @@ is_zeros_p (exp)
case REAL_CST:
return REAL_VALUES_IDENTICAL (TREE_REAL_CST (exp), dconst0);
+ case VECTOR_CST:
+ for (elt = TREE_VECTOR_CST_ELTS (exp); elt;
+ elt = TREE_CHAIN (elt))
+ if (!is_zeros_p (TREE_VALUE (elt)))
+ return 0;
+
+ return 1;
+
case CONSTRUCTOR:
if (TREE_TYPE (exp) && TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
return CONSTRUCTOR_ELTS (exp) == NULL_TREE;
@@ -4466,12 +4497,12 @@ store_constructor (exp, target, cleared, size)
if (GET_CODE (to_rtx) != MEM)
abort ();
- if (GET_MODE (offset_rtx) != ptr_mode)
- offset_rtx = convert_to_mode (ptr_mode, offset_rtx, 0);
-
#ifdef POINTERS_EXTEND_UNSIGNED
if (GET_MODE (offset_rtx) != Pmode)
offset_rtx = convert_memory_address (Pmode, offset_rtx);
+#else
+ if (GET_MODE (offset_rtx) != ptr_mode)
+ offset_rtx = convert_to_mode (ptr_mode, offset_rtx, 0);
#endif
to_rtx = offset_address (to_rtx, offset_rtx,
@@ -4528,20 +4559,34 @@ store_constructor (exp, target, cleared, size)
get_alias_set (TREE_TYPE (field)));
}
}
- else if (TREE_CODE (type) == ARRAY_TYPE)
+ else if (TREE_CODE (type) == ARRAY_TYPE
+ || TREE_CODE (type) == VECTOR_TYPE)
{
tree elt;
int i;
int need_to_clear;
tree domain = TYPE_DOMAIN (type);
tree elttype = TREE_TYPE (type);
- int const_bounds_p = (TYPE_MIN_VALUE (domain)
- && TYPE_MAX_VALUE (domain)
- && host_integerp (TYPE_MIN_VALUE (domain), 0)
- && host_integerp (TYPE_MAX_VALUE (domain), 0));
+ int const_bounds_p;
HOST_WIDE_INT minelt = 0;
HOST_WIDE_INT maxelt = 0;
+ /* Vectors are like arrays, but the domain is stored via an array
+ type indirectly. */
+ if (TREE_CODE (type) == VECTOR_TYPE)
+ {
+ /* Note that although TYPE_DEBUG_REPRESENTATION_TYPE uses
+ the same field as TYPE_DOMAIN, we are not guaranteed that
+ it always will. */
+ domain = TYPE_DEBUG_REPRESENTATION_TYPE (type);
+ domain = TYPE_DOMAIN (TREE_TYPE (TYPE_FIELDS (domain)));
+ }
+
+ const_bounds_p = (TYPE_MIN_VALUE (domain)
+ && TYPE_MAX_VALUE (domain)
+ && host_integerp (TYPE_MIN_VALUE (domain), 0)
+ && host_integerp (TYPE_MAX_VALUE (domain), 0));
+
/* If we have constant bounds for the range of the type, get them. */
if (const_bounds_p)
{
@@ -4602,7 +4647,12 @@ store_constructor (exp, target, cleared, size)
if (need_to_clear && size > 0)
{
if (! cleared)
- clear_storage (target, GEN_INT (size));
+ {
+ if (REG_P (target))
+ emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
+ else
+ clear_storage (target, GEN_INT (size));
+ }
cleared = 1;
}
else if (REG_P (target))
@@ -4665,6 +4715,7 @@ store_constructor (exp, target, cleared, size)
if (GET_CODE (target) == MEM
&& !MEM_KEEP_ALIAS_SET_P (target)
+ && TREE_CODE (type) == ARRAY_TYPE
&& TYPE_NONALIASED_COMPONENT (type))
{
target = copy_rtx (target);
@@ -4762,6 +4813,7 @@ store_constructor (exp, target, cleared, size)
bitpos = (i * tree_low_cst (TYPE_SIZE (elttype), 1));
if (GET_CODE (target) == MEM && !MEM_KEEP_ALIAS_SET_P (target)
+ && TREE_CODE (type) == ARRAY_TYPE
&& TYPE_NONALIASED_COMPONENT (type))
{
target = copy_rtx (target);
@@ -5114,18 +5166,16 @@ store_field (target, bitsize, bitpos, mode, exp, value_mode, unsignedp, type,
tree count;
enum machine_mode tmode;
- if (unsignedp)
- return expand_and (temp,
- GEN_INT
- (trunc_int_for_mode
- (width_mask,
- GET_MODE (temp) == VOIDmode
- ? value_mode
- : GET_MODE (temp))), NULL_RTX);
-
tmode = GET_MODE (temp);
if (tmode == VOIDmode)
tmode = value_mode;
+
+ if (unsignedp)
+ return expand_and (tmode, temp,
+ GEN_INT (trunc_int_for_mode (width_mask,
+ tmode)),
+ NULL_RTX);
+
count = build_int_2 (GET_MODE_BITSIZE (tmode) - bitsize, 0);
temp = expand_shift (LSHIFT_EXPR, tmode, temp, count, 0, 0);
return expand_shift (RSHIFT_EXPR, tmode, temp, count, 0, 0);
@@ -5555,7 +5605,7 @@ safe_from_p (x, exp, top_p)
switch (TREE_CODE_CLASS (TREE_CODE (exp)))
{
case 'd':
- exp_rtl = DECL_RTL_SET_P (exp) ? DECL_RTL (exp) : NULL_RTX;
+ exp_rtl = DECL_RTL_IF_SET (exp);
break;
case 'c':
@@ -5711,7 +5761,7 @@ safe_from_p (x, exp, top_p)
are memory and they conflict. */
return ! (rtx_equal_p (x, exp_rtl)
|| (GET_CODE (x) == MEM && GET_CODE (exp_rtl) == MEM
- && true_dependence (exp_rtl, GET_MODE (x), x,
+ && true_dependence (exp_rtl, VOIDmode, x,
rtx_addr_varies_p)));
}
@@ -5804,20 +5854,21 @@ highest_pow2_factor (exp)
switch (TREE_CODE (exp))
{
case INTEGER_CST:
- /* If the integer is expressable in a HOST_WIDE_INT, we can find the
- lowest bit that's a one. If the result is zero, return
- BIGGEST_ALIGNMENT. We need to handle this case since we can find it
- in a COND_EXPR, a MIN_EXPR, or a MAX_EXPR. If the constant overlows,
- we have an erroneous program, so return BIGGEST_ALIGNMENT to avoid any
+ /* We can find the lowest bit that's a one. If the low
+ HOST_BITS_PER_WIDE_INT bits are zero, return BIGGEST_ALIGNMENT.
+ We need to handle this case since we can find it in a COND_EXPR,
+ a MIN_EXPR, or a MAX_EXPR. If the constant overlows, we have an
+ erroneous program, so return BIGGEST_ALIGNMENT to avoid any
later ICE. */
- if (TREE_CONSTANT_OVERFLOW (exp)
- || integer_zerop (exp))
+ if (TREE_CONSTANT_OVERFLOW (exp))
return BIGGEST_ALIGNMENT;
- else if (host_integerp (exp, 0))
+ else
{
- c0 = tree_low_cst (exp, 0);
- c0 = c0 < 0 ? - c0 : c0;
- return c0 & -c0;
+ /* Note: tree_low_cst is intentionally not used here,
+ we don't care about the upper bits. */
+ c0 = TREE_INT_CST_LOW (exp);
+ c0 &= -c0;
+ return c0 ? c0 : BIGGEST_ALIGNMENT;
}
break;
@@ -5860,6 +5911,21 @@ highest_pow2_factor (exp)
return 1;
}
+
+/* Similar, except that it is known that the expression must be a multiple
+ of the alignment of TYPE. */
+
+static HOST_WIDE_INT
+highest_pow2_factor_for_type (type, exp)
+ tree type;
+ tree exp;
+{
+ HOST_WIDE_INT type_align, factor;
+
+ factor = highest_pow2_factor (exp);
+ type_align = TYPE_ALIGN (type) / BITS_PER_UNIT;
+ return MAX (factor, type_align);
+}
/* Return an object on the placeholder list that matches EXP, a
PLACEHOLDER_EXPR. An object "matches" if it is of the type of the
@@ -6261,7 +6327,8 @@ expand_expr (exp, target, tmode, modifier)
/* Get the signedness used for this variable. Ensure we get the
same mode we got when the variable was declared. */
if (GET_MODE (DECL_RTL (exp))
- != promote_mode (type, DECL_MODE (exp), &unsignedp, 0))
+ != promote_mode (type, DECL_MODE (exp), &unsignedp,
+ (TREE_CODE (exp) == RESULT_DECL ? 1 : 0)))
abort ();
temp = gen_lowpart_SUBREG (mode, DECL_RTL (exp));
@@ -6273,9 +6340,20 @@ expand_expr (exp, target, tmode, modifier)
return DECL_RTL (exp);
case INTEGER_CST:
- return immed_double_const (TREE_INT_CST_LOW (exp),
+ temp = immed_double_const (TREE_INT_CST_LOW (exp),
TREE_INT_CST_HIGH (exp), mode);
+ /* ??? If overflow is set, fold will have done an incomplete job,
+ which can result in (plus xx (const_int 0)), which can get
+ simplified by validate_replace_rtx during virtual register
+ instantiation, which can result in unrecognizable insns.
+ Avoid this by forcing all overflows into registers. */
+ if (TREE_CONSTANT_OVERFLOW (exp)
+ && modifier != EXPAND_INITIALIZER)
+ temp = force_reg (mode, temp);
+
+ return temp;
+
case CONST_DECL:
return expand_expr (DECL_INITIAL (exp), target, VOIDmode, 0);
@@ -6603,7 +6681,8 @@ expand_expr (exp, target, tmode, modifier)
&& GET_MODE_SIZE (mode) == 1
&& modifier != EXPAND_WRITE)
return
- GEN_INT (TREE_STRING_POINTER (string)[TREE_INT_CST_LOW (index)]);
+ GEN_INT (trunc_int_for_mode (TREE_STRING_POINTER (string)
+ [TREE_INT_CST_LOW (index)], mode));
op0 = expand_expr (exp1, NULL_RTX, VOIDmode, EXPAND_SUM);
op0 = memory_address (mode, op0);
@@ -6653,7 +6732,8 @@ expand_expr (exp, target, tmode, modifier)
&& GET_MODE_CLASS (mode) == MODE_INT
&& GET_MODE_SIZE (mode) == 1)
return
- GEN_INT (TREE_STRING_POINTER (array)[TREE_INT_CST_LOW (index)]);
+ GEN_INT (trunc_int_for_mode (TREE_STRING_POINTER (array)
+ [TREE_INT_CST_LOW (index)], mode));
/* If this is a constant index into a constant array,
just get the value from the array. Handle both the cases when
@@ -6713,9 +6793,9 @@ expand_expr (exp, target, tmode, modifier)
if (GET_MODE_CLASS (mode) == MODE_INT
&& GET_MODE_SIZE (mode) == 1)
- return (GEN_INT
- (TREE_STRING_POINTER
- (init)[TREE_INT_CST_LOW (index)]));
+ return GEN_INT (trunc_int_for_mode
+ (TREE_STRING_POINTER (init)
+ [TREE_INT_CST_LOW (index)], mode));
}
}
}
@@ -6756,16 +6836,16 @@ expand_expr (exp, target, tmode, modifier)
{
HOST_WIDE_INT bitsize
= TREE_INT_CST_LOW (DECL_SIZE (TREE_PURPOSE (elt)));
+ enum machine_mode imode
+ = TYPE_MODE (TREE_TYPE (TREE_PURPOSE (elt)));
if (TREE_UNSIGNED (TREE_TYPE (TREE_PURPOSE (elt))))
{
op1 = GEN_INT (((HOST_WIDE_INT) 1 << bitsize) - 1);
- op0 = expand_and (op0, op1, target);
+ op0 = expand_and (imode, op0, op1, target);
}
else
{
- enum machine_mode imode
- = TYPE_MODE (TREE_TYPE (TREE_PURPOSE (elt)));
tree count
= build_int_2 (GET_MODE_BITSIZE (imode) - bitsize,
0);
@@ -6825,7 +6905,7 @@ expand_expr (exp, target, tmode, modifier)
if (offset != 0)
{
- rtx offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode, 0);
+ rtx offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode, EXPAND_SUM);
/* If this object is in a register, put it into memory.
This case can't occur in C, but can in Ada if we have
@@ -6857,12 +6937,12 @@ expand_expr (exp, target, tmode, modifier)
if (GET_CODE (op0) != MEM)
abort ();
- if (GET_MODE (offset_rtx) != ptr_mode)
- offset_rtx = convert_to_mode (ptr_mode, offset_rtx, 0);
-
#ifdef POINTERS_EXTEND_UNSIGNED
if (GET_MODE (offset_rtx) != Pmode)
offset_rtx = convert_memory_address (Pmode, offset_rtx);
+#else
+ if (GET_MODE (offset_rtx) != ptr_mode)
+ offset_rtx = convert_to_mode (ptr_mode, offset_rtx, 0);
#endif
/* A constant address in OP0 can have VOIDmode, we must not try
@@ -6875,15 +6955,7 @@ expand_expr (exp, target, tmode, modifier)
&& (bitsize % GET_MODE_ALIGNMENT (mode1)) == 0
&& MEM_ALIGN (op0) == GET_MODE_ALIGNMENT (mode1))
{
- rtx temp = adjust_address (op0, mode1, bitpos / BITS_PER_UNIT);
-
- if (GET_CODE (XEXP (temp, 0)) == REG)
- op0 = temp;
- else
- op0 = (replace_equiv_address
- (op0,
- force_reg (GET_MODE (XEXP (temp, 0)),
- XEXP (temp, 0))));
+ op0 = adjust_address (op0, mode1, bitpos / BITS_PER_UNIT);
bitpos = 0;
}
@@ -6891,6 +6963,12 @@ expand_expr (exp, target, tmode, modifier)
highest_pow2_factor (offset));
}
+ /* If OFFSET is making OP0 more aligned than BIGGEST_ALIGNMENT,
+ record its alignment as BIGGEST_ALIGNMENT. */
+ if (GET_CODE (op0) == MEM && bitpos == 0 && offset != 0
+ && is_aligning_offset (offset, tem))
+ set_mem_align (op0, BIGGEST_ALIGNMENT);
+
/* Don't forget about volatility even if this is a bitfield. */
if (GET_CODE (op0) == MEM && volatilep && ! MEM_VOLATILE_P (op0))
{
@@ -6900,6 +6978,16 @@ expand_expr (exp, target, tmode, modifier)
MEM_VOLATILE_P (op0) = 1;
}
+ /* The following code doesn't handle CONCAT.
+ Assume only bitpos == 0 can be used for CONCAT, due to
+ one element arrays having the same mode as its element. */
+ if (GET_CODE (op0) == CONCAT)
+ {
+ if (bitpos != 0 || bitsize != GET_MODE_BITSIZE (GET_MODE (op0)))
+ abort ();
+ return op0;
+ }
+
/* In cases where an aligned union has an unaligned object
as a field, we might be extracting a BLKmode value from
an integer-mode (e.g., SImode) object. Handle this case
@@ -7274,15 +7362,24 @@ expand_expr (exp, target, tmode, modifier)
return op0;
}
- op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode, 0);
+ op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode, modifier);
if (GET_MODE (op0) == mode)
return op0;
/* If OP0 is a constant, just convert it into the proper mode. */
if (CONSTANT_P (op0))
- return
- convert_modes (mode, TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))),
- op0, TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
+ {
+ tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
+ enum machine_mode inner_mode = TYPE_MODE (inner_type);
+
+ if (modifier == EXPAND_INITIALIZER)
+ return simplify_gen_subreg (mode, op0, inner_mode,
+ subreg_lowpart_offset (mode,
+ inner_mode));
+ else
+ return convert_modes (mode, inner_mode, op0,
+ TREE_UNSIGNED (inner_type));
+ }
if (modifier == EXPAND_INITIALIZER)
return gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND, mode, op0);
@@ -7440,7 +7537,8 @@ expand_expr (exp, target, tmode, modifier)
rtx constant_part;
op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode,
- EXPAND_SUM);
+ (modifier == EXPAND_INITIALIZER
+ ? EXPAND_INITIALIZER : EXPAND_SUM));
if (! CONSTANT_P (op0))
{
op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX,
@@ -7586,23 +7684,20 @@ expand_expr (exp, target, tmode, modifier)
indexed address, for machines that support that. */
if (modifier == EXPAND_SUM && mode == ptr_mode
- && TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST
- && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
+ && host_integerp (TREE_OPERAND (exp, 1), 0))
{
op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode,
EXPAND_SUM);
- /* Apply distributive law if OP0 is x+c. */
- if (GET_CODE (op0) == PLUS
- && GET_CODE (XEXP (op0, 1)) == CONST_INT)
- return
- gen_rtx_PLUS
- (mode,
- gen_rtx_MULT
- (mode, XEXP (op0, 0),
- GEN_INT (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1)))),
- GEN_INT (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1))
- * INTVAL (XEXP (op0, 1))));
+ /* If we knew for certain that this is arithmetic for an array
+ reference, and we knew the bounds of the array, then we could
+ apply the distributive law across (PLUS X C) for constant C.
+ Without such knowledge, we risk overflowing the computation
+ when both X and C are large, but X+C isn't. */
+ /* ??? Could perhaps special-case EXP being unsigned and C being
+ positive. In that case we are certain that X+C is no smaller
+ than X and so the transformed expression will overflow iff the
+ original would have. */
if (GET_CODE (op0) != REG)
op0 = force_operand (op0, NULL_RTX);
@@ -7611,7 +7706,7 @@ expand_expr (exp, target, tmode, modifier)
return
gen_rtx_MULT (mode, op0,
- GEN_INT (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1))));
+ GEN_INT (tree_low_cst (TREE_OPERAND (exp, 1), 0)));
}
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
@@ -7712,6 +7807,7 @@ expand_expr (exp, target, tmode, modifier)
expensive divide. If not, combine will rebuild the original
computation. */
if (flag_unsafe_math_optimizations && optimize && !optimize_size
+ && TREE_CODE (type) == REAL_TYPE
&& !real_onep (TREE_OPERAND (exp, 0)))
return expand_expr (build (MULT_EXPR, type, TREE_OPERAND (exp, 0),
build (RDIV_EXPR, type,
@@ -7921,8 +8017,25 @@ expand_expr (exp, target, tmode, modifier)
temp = expand_expr (TREE_OPERAND (exp, 0), original_target,
VOIDmode, 0);
+ /* If temp is constant, we can just compute the result. */
+ if (GET_CODE (temp) == CONST_INT)
+ {
+ if (INTVAL (temp) != 0)
+ emit_move_insn (target, const1_rtx);
+ else
+ emit_move_insn (target, const0_rtx);
+
+ return target;
+ }
+
if (temp != original_target)
- temp = copy_to_reg (temp);
+ {
+ enum machine_mode mode1 = GET_MODE (temp);
+ if (mode1 == VOIDmode)
+ mode1 = tmode != VOIDmode ? tmode : mode;
+
+ temp = copy_to_mode_reg (mode1, temp);
+ }
op1 = gen_label_rtx ();
emit_cmp_and_jump_insns (temp, const0_rtx, EQ, NULL_RTX,
@@ -8758,6 +8871,56 @@ expand_expr (exp, target, tmode, modifier)
return temp;
}
+/* Subroutine of above: returns 1 if OFFSET corresponds to an offset that
+ when applied to the address of EXP produces an address known to be
+ aligned more than BIGGEST_ALIGNMENT. */
+
+static int
+is_aligning_offset (offset, exp)
+ tree offset;
+ tree exp;
+{
+ /* Strip off any conversions and WITH_RECORD_EXPR nodes. */
+ while (TREE_CODE (offset) == NON_LVALUE_EXPR
+ || TREE_CODE (offset) == NOP_EXPR
+ || TREE_CODE (offset) == CONVERT_EXPR
+ || TREE_CODE (offset) == WITH_RECORD_EXPR)
+ offset = TREE_OPERAND (offset, 0);
+
+ /* We must now have a BIT_AND_EXPR with a constant that is one less than
+ power of 2 and which is larger than BIGGEST_ALIGNMENT. */
+ if (TREE_CODE (offset) != BIT_AND_EXPR
+ || !host_integerp (TREE_OPERAND (offset, 1), 1)
+ || compare_tree_int (TREE_OPERAND (offset, 1), BIGGEST_ALIGNMENT) <= 0
+ || !exact_log2 (tree_low_cst (TREE_OPERAND (offset, 1), 1) + 1) < 0)
+ return 0;
+
+ /* Look at the first operand of BIT_AND_EXPR and strip any conversion.
+ It must be NEGATE_EXPR. Then strip any more conversions. */
+ offset = TREE_OPERAND (offset, 0);
+ while (TREE_CODE (offset) == NON_LVALUE_EXPR
+ || TREE_CODE (offset) == NOP_EXPR
+ || TREE_CODE (offset) == CONVERT_EXPR)
+ offset = TREE_OPERAND (offset, 0);
+
+ if (TREE_CODE (offset) != NEGATE_EXPR)
+ return 0;
+
+ offset = TREE_OPERAND (offset, 0);
+ while (TREE_CODE (offset) == NON_LVALUE_EXPR
+ || TREE_CODE (offset) == NOP_EXPR
+ || TREE_CODE (offset) == CONVERT_EXPR)
+ offset = TREE_OPERAND (offset, 0);
+
+ /* This must now be the address either of EXP or of a PLACEHOLDER_EXPR
+ whose type is the same as EXP. */
+ return (TREE_CODE (offset) == ADDR_EXPR
+ && (TREE_OPERAND (offset, 0) == exp
+ || (TREE_CODE (TREE_OPERAND (offset, 0)) == PLACEHOLDER_EXPR
+ && (TREE_TYPE (TREE_OPERAND (offset, 0))
+ == TREE_TYPE (exp)))));
+}
+
/* Return the tree node if a ARG corresponds to a string constant or zero
if it doesn't. If we return non-zero, set *PTR_OFFSET to the offset
in bytes within the string that ARG is accessing. The type of the
@@ -10184,7 +10347,7 @@ do_store_flag (exp, target, mode, only_cheap)
/* Put the AND last so it can combine with more things. */
if (bitnum != TYPE_PRECISION (type) - 1)
- op0 = expand_and (op0, const1_rtx, subtarget);
+ op0 = expand_and (mode, op0, const1_rtx, subtarget);
return op0;
}
diff --git a/contrib/gcc/expr.h b/contrib/gcc/expr.h
index e5b488a..91ffa3f 100644
--- a/contrib/gcc/expr.h
+++ b/contrib/gcc/expr.h
@@ -75,29 +75,37 @@ struct args_size
/* Add the value of the tree INC to the `struct args_size' TO. */
-#define ADD_PARM_SIZE(TO, INC) \
-{ tree inc = (INC); \
- if (host_integerp (inc, 0)) \
- (TO).constant += tree_low_cst (inc, 0); \
- else if ((TO).var == 0) \
- (TO).var = inc; \
- else \
- (TO).var = size_binop (PLUS_EXPR, (TO).var, inc); }
-
-#define SUB_PARM_SIZE(TO, DEC) \
-{ tree dec = (DEC); \
- if (host_integerp (dec, 0)) \
- (TO).constant -= tree_low_cst (dec, 0); \
- else if ((TO).var == 0) \
- (TO).var = size_binop (MINUS_EXPR, ssize_int (0), dec); \
- else \
- (TO).var = size_binop (MINUS_EXPR, (TO).var, dec); }
+#define ADD_PARM_SIZE(TO, INC) \
+do { \
+ tree inc = (INC); \
+ if (host_integerp (inc, 0)) \
+ (TO).constant += tree_low_cst (inc, 0); \
+ else if ((TO).var == 0) \
+ (TO).var = convert (ssizetype, inc); \
+ else \
+ (TO).var = size_binop (PLUS_EXPR, (TO).var, \
+ convert (ssizetype, inc)); \
+} while (0)
+
+#define SUB_PARM_SIZE(TO, DEC) \
+do { \
+ tree dec = (DEC); \
+ if (host_integerp (dec, 0)) \
+ (TO).constant -= tree_low_cst (dec, 0); \
+ else if ((TO).var == 0) \
+ (TO).var = size_binop (MINUS_EXPR, ssize_int (0), \
+ convert (ssizetype, dec)); \
+ else \
+ (TO).var = size_binop (MINUS_EXPR, (TO).var, \
+ convert (ssizetype, dec)); \
+} while (0)
/* Convert the implicit sum in a `struct args_size' into a tree
of type ssizetype. */
#define ARGS_SIZE_TREE(SIZE) \
((SIZE).var == 0 ? ssize_int ((SIZE).constant) \
- : size_binop (PLUS_EXPR, (SIZE).var, ssize_int ((SIZE).constant)))
+ : size_binop (PLUS_EXPR, convert (ssizetype, (SIZE).var), \
+ ssize_int ((SIZE).constant)))
/* Convert the implicit sum in a `struct args_size' into an rtx. */
#define ARGS_SIZE_RTX(SIZE) \
@@ -308,7 +316,7 @@ int can_conditionally_move_p PARAMS ((enum machine_mode mode));
extern rtx negate_rtx PARAMS ((enum machine_mode, rtx));
/* Expand a logical AND operation. */
-extern rtx expand_and PARAMS ((rtx, rtx, rtx));
+extern rtx expand_and PARAMS ((enum machine_mode, rtx, rtx, rtx));
/* Emit a store-flag operation. */
extern rtx emit_store_flag PARAMS ((rtx, enum rtx_code, rtx, rtx,
@@ -332,7 +340,6 @@ extern rtx get_condition PARAMS ((rtx, rtx *));
extern rtx gen_cond_trap PARAMS ((enum rtx_code, rtx, rtx, rtx));
/* Functions from builtins.c: */
-#ifdef TREE_CODE
extern rtx expand_builtin PARAMS ((tree, rtx, rtx, enum machine_mode, int));
extern void std_expand_builtin_va_start PARAMS ((int, tree, rtx));
extern rtx std_expand_builtin_va_arg PARAMS ((tree, tree));
@@ -340,12 +347,11 @@ extern rtx expand_builtin_va_arg PARAMS ((tree, tree));
extern void default_init_builtins PARAMS ((void));
extern rtx default_expand_builtin PARAMS ((tree, rtx, rtx,
enum machine_mode, int));
-#endif
-
extern void expand_builtin_setjmp_setup PARAMS ((rtx, rtx));
extern void expand_builtin_setjmp_receiver PARAMS ((rtx));
extern void expand_builtin_longjmp PARAMS ((rtx, rtx));
extern rtx expand_builtin_saveregs PARAMS ((void));
+extern void expand_builtin_trap PARAMS ((void));
extern HOST_WIDE_INT get_varargs_alias_set PARAMS ((void));
extern HOST_WIDE_INT get_frame_alias_set PARAMS ((void));
extern void record_base_value PARAMS ((unsigned int, rtx, int));
diff --git a/contrib/gcc/f/ChangeLog b/contrib/gcc/f/ChangeLog
index 7cec89c..d3f8626 100644
--- a/contrib/gcc/f/ChangeLog
+++ b/contrib/gcc/f/ChangeLog
@@ -1,3 +1,103 @@
+2002-04-29 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * invoke.texi: Use @gol at ends of lines inside @gccoptlist.
+ * g77.texi: Update last update date.
+
+2002-04-20 Toon Moene <toon@moene.indiv.nluug.nl>
+
+ * root.texi: Remove variable version-g77.
+ * g77.texi: Remove the single use of that variable.
+
+Tue Apr 16 14:55:47 2002 Mark Mitchell <mark@codesourcery.com>
+
+ * com.c (ffecom_expr_power_integer): Add has_scope argument to
+ call to expand_start_stmt_expr.
+
+Mon Apr 15 10:59:14 2002 Mark Mitchell <mark@codesourcery.com>
+
+ * g77.texi: Remove Chill reference.
+
+2002-04-14 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * Make-lang.in (f/target.o): Depend on diagnostic.h.
+ * target.c: Include diagnostic.h.
+ (ffetarget_memcpy_): Call sorry if host and target endians are
+ not matching.
+
+2002-04-13 Toon Moene <toon@moene.indiv.nluug.nl>
+
+ * news.texi: Deprecate frontend version number;
+ update list of fixed bugs.
+
+2002-04-01 Phil Edwards <pme@gcc.gnu.org>
+
+ * version.c: Fix misplaced leading blanks on first line.
+
+2002-03-23 Toon Moene <toon@moene.indiv.nluug.nl>
+
+ * com.c (ffecom_check_size_overflow_): Add a test
+ so that arrays too large for 32-bit byte-offset
+ addressing get caught.
+ * news.texi: Document the fixing of this problem.
+
+Mon Mar 18 18:43:22 CET 2002 Jan Hubicka <jh@suse.cz>
+
+ * target.h (FFETARGET_32bit_longs): Undefine for x86-64.
+
+2002-02-13 Toon Moene <toon@moene.indiv.nluug.nl>
+
+ * news.texi: List Problem Reports fixed in 3.1.
+
+2002-02-13 Toon Moene <toon@moene.indiv.nluug.nl>
+
+ * data.c (ffedata_eval_offset_): Only convert index,
+ low and high bound in data statements to default integer
+ if they are constants. Use a copy of the data structure.
+
+2002-02-09 Toon Moene <toon@moene.indiv.nluug.nl>
+
+ * data.c (ffedata_eval_offset_): Convert non-default integer
+ constants to default integer kind if necessary.
+
+2002-02-09 Toon Moene <toon@moene.indiv.nlug.nl>
+
+ * invoke.texi: Add a short debugging session
+ as an example to the documentation of -g.
+
+2002-02-06 Toon Moene <toon@moene.indiv.nluug.nl>
+
+ PR fortran/4730 fortran/5473
+ * com.c (ffecom_expr_): Deal with %VAL constructs.
+ * intrin.c (ffeintrin_check_): Handle 'N' constraints for intrinsics,
+ to indicate "no larger than default kind" integers and logicals.
+ * intrin.def: Use 'N' constraints in table of intrinsics.
+ * intdoc.c: Document this constraint.
+ * intdoc.texi: Regenerated.
+
+2002-02-04 Philipp Thomas <pthomas@suse.de>
+
+ * implic.c lex.c stb.c ste.c stu.c: Update copyright dates.
+
+2002-02-04 Philipp Thomas <pthomas@suse.de>
+
+ * bad.def com.c expr.c implic.c lex.c stb.c ste.c stu.c:
+ Insert comments to mark messages as not being printf style
+ where appropriate.
+
+2002-02-03 Toon Moene <toon@moene.indiv.nluug.nl>
+
+ * expr.c (ffeexpr_sym_impdoitem_): Allow other than
+ default INTEGER implied-do loop counts.
+
+2002-02-01 Toon Moene <toon@moene.indiv.nluug.nl>
+
+ * bad.def: Remove non-historical reference to version 0.6.
+ * bugs.texi: Ditto.
+ * com.c: Ditto.
+ * ffe.texi: Ditto.
+ * proj.h: Ditto.
+ * g77.texi: Ditto.
+
2002-01-31 Joseph S. Myers <jsm28@cam.ac.uk>
* g77spec.c (lang_specific_driver): Follow GNU Coding Standards
diff --git a/contrib/gcc/f/Make-lang.in b/contrib/gcc/f/Make-lang.in
index f9744d7..d2daf34 100644
--- a/contrib/gcc/f/Make-lang.in
+++ b/contrib/gcc/f/Make-lang.in
@@ -1,5 +1,5 @@
# Top level makefile fragment for GNU Fortran. -*-makefile-*-
-# Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001 Free Software Foundation, Inc.
+# Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
#This file is part of GNU Fortran.
@@ -513,7 +513,7 @@ f/symbol.o: f/symbol.c f/proj.h $(CONFIG_H) $(SYSTEM_H) f/symbol.h \
f/global.h f/name.h f/src.h f/st.h
f/target.o: f/target.c f/proj.h $(CONFIG_H) $(SYSTEM_H) glimits.h f/target.h \
$(TREE_H) f/bad.h f/bad.def f/where.h f/top.h f/malloc.h f/info.h \
- f/info-b.def f/info-k.def f/info-w.def f/type.h f/lex.h
+ f/info-b.def f/info-k.def f/info-w.def f/type.h f/lex.h diagnostic.h
f/top.o: f/top.c f/proj.h $(CONFIG_H) $(SYSTEM_H) f/top.h f/malloc.h f/where.h \
glimits.h f/bad.h f/bad.def f/bit.h f/bld.h f/bld-op.def f/com.h \
f/com-rt.def $(TREE_H) f/info.h f/info-b.def f/info-k.def \
diff --git a/contrib/gcc/f/bad.def b/contrib/gcc/f/bad.def
index 165a5a3..92d7e23 100644
--- a/contrib/gcc/f/bad.def
+++ b/contrib/gcc/f/bad.def
@@ -35,674 +35,1062 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define DISASTER FFEBAD_severityDISASTER
FFEBAD_MSG (FFEBAD_MISSING_FIRST_BINARY_OPERAND, FATAL,
+/* xgettext:no-c-format */
"Missing first operand for binary operator at %0")
FFEBAD_MSG (FFEBAD_NULL_CHAR_CONST, WARN,
+/* xgettext:no-c-format */
"Zero-length character constant at %0")
FFEBAD_MSG (FFEBAD_INVALID_TOKEN_IN_EXPRESSION, FATAL,
+/* xgettext:no-c-format */
"Invalid token at %0 in expression or subexpression at %1")
FFEBAD_MSG (FFEBAD_MISSING_OPERAND_FOR_OPERATOR, FATAL,
+/* xgettext:no-c-format */
"Missing operand for operator at %1 at end of expression at %0")
FFEBAD_MSG (FFEBAD_LABEL_ALREADY_DEFINED, FATAL,
+/* xgettext:no-c-format */
"Label %A already defined at %1 when redefined at %0")
FFEBAD_MSG (FFEBAD_UNRECOGNIZED_CHARACTER, FATAL,
+/* xgettext:no-c-format */
"Unrecognized character at %0 [info -f g77 M LEX]")
FFEBAD_MSG (FFEBAD_LABEL_WITHOUT_STMT, WARN,
+/* xgettext:no-c-format */
"Label definition %A at %0 on empty statement (as of %1)")
FFEBAD_MSG (FFEBAD_EXTRA_LABEL_DEF, FATAL,
+/* xgettext:no-c-format */
LONG("Extra label definition %A at %0 -- perhaps previous label definition %B at %1 should have CONTINUE statement?")
+/* xgettext:no-c-format */
SHORT("Extra label definition %A at %0 following label definition %B at %1"))
FFEBAD_MSG (FFEBAD_FIRST_CHAR_INVALID, FATAL,
+/* xgettext:no-c-format */
"Invalid first character at %0 [info -f g77 M LEX]")
FFEBAD_MSG (FFEBAD_LINE_TOO_LONG, FATAL,
+/* xgettext:no-c-format */
"Line too long as of %0 [info -f g77 M LEX]")
FFEBAD_MSG (FFEBAD_LABEL_FIELD_NOT_NUMERIC, FATAL,
+/* xgettext:no-c-format */
"Non-numeric character at %0 in label field [info -f g77 M LEX]")
FFEBAD_MSG (FFEBAD_LABEL_NUMBER_INVALID, FATAL,
+/* xgettext:no-c-format */
"Label number at %0 not in range 1-99999")
FFEBAD_MSG (FFEBAD_NON_ANSI_COMMENT, WARN,
+/* xgettext:no-c-format */
"At %0, '!' and '/*' are not valid comment delimiters")
FFEBAD_MSG (FFEBAD_NON_ANSI_CONTINUATION_COLUMN, WARN,
+/* xgettext:no-c-format */
"Continuation indicator at %0 must appear in column 6 [info -f g77 M LEX]")
FFEBAD_MSG (FFEBAD_LABEL_ON_CONTINUATION, FATAL,
+/* xgettext:no-c-format */
"Label at %0 invalid with continuation line indicator at %1 [info -f g77 M LEX]")
FFEBAD_MSG (FFEBAD_INVALID_CONTINUATION, FATAL,
+/* xgettext:no-c-format */
LONG("Continuation indicator at %0 invalid on first non-comment line of file or following END or INCLUDE [info -f g77 M LEX]")
+/* xgettext:no-c-format */
SHORT("Continuation indicator at %0 invalid here [info -f g77 M LEX]"))
FFEBAD_MSG (FFEBAD_NO_CLOSING_APOSTROPHE, FATAL,
+/* xgettext:no-c-format */
"Character constant at %0 has no closing apostrophe at %1")
FFEBAD_MSG (FFEBAD_NOT_ENOUGH_HOLLERITH_CHARS, FATAL,
+/* xgettext:no-c-format */
"Hollerith constant at %0 specified %A more characters than are present as of %1")
FFEBAD_MSG (FFEBAD_MISSING_CLOSE_PAREN, FATAL,
+/* xgettext:no-c-format */
"Missing close parenthese at %0 needed to match open parenthese at %1")
FFEBAD_MSG (FFEBAD_INTEGER_TOO_LARGE, FATAL,
+/* xgettext:no-c-format */
"Integer at %0 too large")
FFEBAD_MSG (FFEBAD_BAD_MAGICAL, WARN,
+/* xgettext:no-c-format */
LONG("Integer at %0 too large except as negative number (preceded by unary minus sign)")
+/* xgettext:no-c-format */
SHORT("Non-negative integer at %0 too large"))
FFEBAD_MSG (FFEBAD_BAD_MAGICAL_PRECEDENCE, WARN,
+/* xgettext:no-c-format */
LONG("Integer at %0 too large; even though preceded by unary minus sign at %1, subsequent operator at %2 has precedence over unary minus -- enclose unary minus sign and integer in parentheses to force precedence")
+/* xgettext:no-c-format */
SHORT("Integer at %0 too large (%2 has precedence over %1)"))
FFEBAD_MSG (FFEBAD_BAD_MAGICAL_BINARY, WARN,
+/* xgettext:no-c-format */
LONG("Integer at %0 too large; even though preceded by minus sign at %1, because minus sign is a binary, not unary, operator -- insert plus sign before minus sign to change it to a unary minus sign")
+/* xgettext:no-c-format */
SHORT("Integer at %0 too large (needs unary, not binary, minus at %1)"))
FFEBAD_MSG (FFEBAD_BAD_MAGICAL_PRECEDENCE_BINARY, WARN,
+/* xgettext:no-c-format */
LONG("Integer at %0 too large; even though preceded by minus sign at %1, subsequent operator at %2 has precedence over minus, and that minus sign should be a unary minus rather than a binary minus -- insert plus sign before minus sign to change it to a unary minus sign, and enclose unary minus sign and integer in parentheses to force precedence")
+/* xgettext:no-c-format */
SHORT("Integer at %0 too large (%2 has precedence over %1, which needs to be unary, not binary, minus)"))
FFEBAD_MSG (FFEBAD_IGNORING_PERIOD, FATAL,
+/* xgettext:no-c-format */
"Period at %0 not followed by digits for floating-point number or by `NOT.', `TRUE.', or `FALSE.'")
FFEBAD_MSG (FFEBAD_INSERTING_PERIOD, FATAL,
+/* xgettext:no-c-format */
"Missing close-period between `.%A' at %0 and %1")
FFEBAD_MSG (FFEBAD_INVALID_EXPONENT, FATAL,
+/* xgettext:no-c-format */
"Invalid exponent at %0 for real constant at %1; nondigit `%A' in exponent field")
FFEBAD_MSG (FFEBAD_MISSING_EXPONENT_VALUE, FATAL,
+/* xgettext:no-c-format */
"Missing value at %1 for real-number exponent at %0")
FFEBAD_MSG (FFEBAD_MISSING_BINARY_OPERATOR, FATAL,
+/* xgettext:no-c-format */
"Expected binary operator between expressions at %0 and at %1")
FFEBAD_MSG (FFEBAD_INVALID_DOTDOT, FATAL,
+/* xgettext:no-c-format */
LONG("Period at %0 not followed by valid keyword forming a valid binary operator; `.%A.' is not a valid binary operator")
+/* xgettext:no-c-format */
SHORT("`.%A.' at %0 not a binary operator"))
FFEBAD_MSG (FFEBAD_QUOTE_MISSES_DIGITS, FATAL,
+/* xgettext:no-c-format */
LONG("Double-quote at %0 not followed by a string of valid octal digits at %1")
+/* xgettext:no-c-format */
SHORT("Invalid octal constant at %0"))
FFEBAD_MSG (FFEBAD_INVALID_BINARY_DIGIT, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid binary digit(s) found in string of digits at %0")
+/* xgettext:no-c-format */
SHORT("Invalid binary constant at %0"))
FFEBAD_MSG (FFEBAD_INVALID_HEX_DIGIT, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid hexadecimal digit(s) found in string of digits at %0")
+/* xgettext:no-c-format */
SHORT("Invalid hexadecimal constant at %0"))
FFEBAD_MSG (FFEBAD_INVALID_OCTAL_DIGIT, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid octal digit(s) found in string of digits at %0")
+/* xgettext:no-c-format */
SHORT("Invalid octal constant at %0"))
FFEBAD_MSG (FFEBAD_INVALID_RADIX_SPECIFIER, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid radix specifier `%A' at %0 for typeless constant at %1")
+/* xgettext:no-c-format */
SHORT("Invalid typeless constant at %1"))
FFEBAD_MSG (FFEBAD_INVALID_TYPELESS_BINARY_DIGIT, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid binary digit(s) found in string of digits at %0")
+/* xgettext:no-c-format */
SHORT("Invalid binary constant at %0"))
FFEBAD_MSG (FFEBAD_INVALID_TYPELESS_OCTAL_DIGIT, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid octal digit(s) found in string of digits at %0")
+/* xgettext:no-c-format */
SHORT("Invalid octal constant at %0"))
FFEBAD_MSG (FFEBAD_INVALID_TYPELESS_HEX_DIGIT, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid hexadecimal digit(s) found in string of digits at %0")
+/* xgettext:no-c-format */
SHORT("Invalid hexadecimal constant at %0"))
FFEBAD_MSG (FFEBAD_INVALID_COMPLEX_PART, FATAL,
+/* xgettext:no-c-format */
LONG("%A part of complex constant at %0 must be a real or integer constant -- otherwise use CMPLX() or COMPLEX() in place of ()")
+/* xgettext:no-c-format */
SHORT("%A part of complex constant at %0 not a real or integer constant"))
FFEBAD_MSG (FFEBAD_INVALID_PERCENT, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid keyword `%%%A' at %0 in this context")
+/* xgettext:no-c-format */
SHORT("Invalid keyword `%%%A' at %0"))
FFEBAD_MSG (FFEBAD_NULL_EXPRESSION, FATAL,
+/* xgettext:no-c-format */
LONG("Null expression between %0 and %1 invalid in this context")
+/* xgettext:no-c-format */
SHORT("Invalid null expression between %0 and %1"))
FFEBAD_MSG (FFEBAD_CONCAT_ARGS_TYPE, FATAL,
+/* xgettext:no-c-format */
LONG("Concatenation operator at %0 must operate on two subexpressions of character type, but neither subexpression at %1 or %2 is of character type")
+/* xgettext:no-c-format */
SHORT("Invalid operands at %1 and %2 for concatenation operator at %0"))
FFEBAD_MSG (FFEBAD_CONCAT_ARG_TYPE, FATAL,
+/* xgettext:no-c-format */
LONG("Concatenation operator at %0 must operate on two subexpressions of character type, but the subexpression at %1 is not of character type")
+/* xgettext:no-c-format */
SHORT("Invalid operand at %1 for concatenation operator at %0"))
FFEBAD_MSG (FFEBAD_CONCAT_ARG_KIND, FATAL,
+/* xgettext:no-c-format */
LONG("Concatenation operator at %0 must operate on two scalar (not array) subexpressions, two function invocations returning character scalars, or a combination of both -- but the subexpression at %1 is %A")
+/* xgettext:no-c-format */
SHORT("Invalid operand (is %A) at %1 for concatenation operator at %0"))
FFEBAD_MSG (FFEBAD_MATH_ARGS_TYPE, FATAL,
+/* xgettext:no-c-format */
LONG("Arithmetic operator at %0 must operate on two subexpressions of arithmetic type, but neither subexpression at %1 or %2 is of arithmetic type")
+/* xgettext:no-c-format */
SHORT("Invalid operands at %1 and %2 for arithmetic operator at %0"))
FFEBAD_MSG (FFEBAD_MATH_ARG_TYPE, FATAL,
+/* xgettext:no-c-format */
LONG("Arithmetic operator at %0 must operate on two subexpressions of arithmetic type, but the subexpression at %1 is not of arithmetic type")
+/* xgettext:no-c-format */
SHORT("Invalid operand at %1 for arithmetic operator at %0"))
FFEBAD_MSG (FFEBAD_MATH_ARG_KIND, FATAL,
+/* xgettext:no-c-format */
LONG("Arithmetic operator at %0 must operate on two scalar (not array) subexpressions, two function invocations returning arithmetic scalars, or a combination of both -- but the subexpression at %1 is %A")
+/* xgettext:no-c-format */
SHORT("Invalid operand (is %A) at %1 for arithmetic operator at %0"))
FFEBAD_MSG (FFEBAD_NO_CLOSING_QUOTE, FATAL,
+/* xgettext:no-c-format */
LONG("Character constant at %0 has no closing quote at %1 [info -f g77 M LEX]")
+/* xgettext:no-c-format */
SHORT("Unterminated character constant at %0 [info -f g77 M LEX]"))
FFEBAD_MSG (FFEBAD_BAD_CHAR_CONTINUE, FATAL,
+/* xgettext:no-c-format */
LONG("Continuation line at %0 must have initial `&' since it continues a character context [info -f g77 M LEX]")
+/* xgettext:no-c-format */
SHORT("Missing initial `&' on continuation line at %0 [info -f g77 M LEX]"))
FFEBAD_MSG (FFEBAD_BAD_LEXTOK_CONTINUE, FATAL,
+/* xgettext:no-c-format */
LONG("Continuation line at %0 must have initial `&' since it continues a split lexical token [info -f g77 M LEX]")
+/* xgettext:no-c-format */
SHORT("Missing initial `&' on continuation line at %0 [info -f g77 M LEX]"))
FFEBAD_MSG (FFEBAD_BAD_FREE_CONTINUE, FATAL,
+/* xgettext:no-c-format */
LONG("Continuation line at %0 invalid because it consists only of a single `&' as the only nonblank character")
+/* xgettext:no-c-format */
SHORT("Invalid continuation line at %0"))
FFEBAD_MSG (FFEBAD_STMT_BEGINS_BAD, FATAL,
+/* xgettext:no-c-format */
LONG("Statement at %0 begins with invalid token [info -f g77 M LEX]")
+/* xgettext:no-c-format */
SHORT("Invalid statement at %0 [info -f g77 M LEX]"))
FFEBAD_MSG (FFEBAD_SEMICOLON, FATAL,
+/* xgettext:no-c-format */
"Semicolon at %0 is an invalid token")
FFEBAD_MSG (FFEBAD_UNREC_STMT, FATAL,
+/* xgettext:no-c-format */
LONG("Unrecognized statement name at %0 and invalid form for assignment or statement-function definition at %1")
+/* xgettext:no-c-format */
SHORT("Invalid statement at %0"))
FFEBAD_MSG (FFEBAD_INVALID_STMT_FORM, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid form for %A statement at %0")
+/* xgettext:no-c-format */
SHORT("Invalid %A statement at %0"))
FFEBAD_MSG (FFEBAD_INVALID_HOLL_IN_STMT, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid use of hollerith constant in statement at %0 -- enclose the constant in parentheses (for example, change BACKSPACE 2HAB to BACKSPACE (2HAB))")
+/* xgettext:no-c-format */
SHORT("Enclose hollerith constant in statement at %0 in parentheses"))
FFEBAD_MSG (FFEBAD_FORMAT_EXTRA_COMMA, FATAL,
+/* xgettext:no-c-format */
"Extraneous comma in FORMAT statement at %0")
FFEBAD_MSG (FFEBAD_FORMAT_MISSING_COMMA, WARN,
+/* xgettext:no-c-format */
"Missing comma in FORMAT statement at %0")
FFEBAD_MSG (FFEBAD_FORMAT_SPURIOUS_SIGN, FATAL,
+/* xgettext:no-c-format */
"Spurious sign in FORMAT statement at %0")
FFEBAD_MSG (FFEBAD_FORMAT_SPURIOUS_NUMBER, FATAL,
+/* xgettext:no-c-format */
"Spurious number in FORMAT statement at %0")
FFEBAD_MSG (FFEBAD_FORMAT_TEXT_IN_NUMBER, FATAL,
+/* xgettext:no-c-format */
"Spurious text trailing number in FORMAT statement at %0")
FFEBAD_MSG (FFEBAD_FORMAT_P_NOCOMMA, FATAL,
+/* xgettext:no-c-format */
LONG("nP control edit descriptor not followed by comma but followed by edit descriptor at %0 other than D, E, EN, F, or G")
+/* xgettext:no-c-format */
SHORT("Invalid edit descriptor at %0 following nP control edit descriptor"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_SPEC, FATAL,
+/* xgettext:no-c-format */
"Unrecognized FORMAT specifier at %0")
FFEBAD_MSG (FFEBAD_FORMAT_BAD_I_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid I specifier in FORMAT statement at %0 -- correct form: [r]Iw.[m]")
+/* xgettext:no-c-format */
SHORT("Invalid I specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_B_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid B specifier in FORMAT statement at %0 -- correct form: [r]Bw.[m]")
+/* xgettext:no-c-format */
SHORT("Invalid B specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_O_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid O specifier in FORMAT statement at %0 -- correct form: [r]Ow.[m]")
+/* xgettext:no-c-format */
SHORT("Invalid O specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_Z_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid Z specifier in FORMAT statement at %0 -- correct form: [r]Zw.[m]")
+/* xgettext:no-c-format */
SHORT("Invalid Z specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_F_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid F specifier in FORMAT statement at %0 -- correct form: [r]Fw.d")
+/* xgettext:no-c-format */
SHORT("Invalid F specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_E_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid E specifier in FORMAT statement at %0 -- correct form: [r]Ew.d[Ee]")
+/* xgettext:no-c-format */
SHORT("Invalid E specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_EN_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid EN specifier in FORMAT statement at %0 -- correct form: [r]ENw.d[Ee]")
+/* xgettext:no-c-format */
SHORT("Invalid EN specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_G_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid G specifier in FORMAT statement at %0 -- correct form: [r]Gw.d[Ee]")
+/* xgettext:no-c-format */
SHORT("Invalid G specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_L_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid L specifier in FORMAT statement at %0 -- correct form: [r]Lw")
+/* xgettext:no-c-format */
SHORT("Invalid L specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_A_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid A specifier in FORMAT statement at %0 -- correct form: [r]A[w]")
+/* xgettext:no-c-format */
SHORT("Invalid A specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_D_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid D specifier in FORMAT statement at %0 -- correct form: [r]Dw.d")
+/* xgettext:no-c-format */
SHORT("Invalid D specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_Q_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid Q specifier in FORMAT statement at %0 -- correct form: Q")
+/* xgettext:no-c-format */
SHORT("Invalid Q specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_DOLLAR_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid $ specifier in FORMAT statement at %0 -- correct form: $")
+/* xgettext:no-c-format */
SHORT("Invalid $ specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_P_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid P specifier in FORMAT statement at %0 -- correct form: kP")
+/* xgettext:no-c-format */
SHORT("Invalid P specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_T_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid T specifier in FORMAT statement at %0 -- correct form: Tn")
+/* xgettext:no-c-format */
SHORT("Invalid T specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_TL_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid TL specifier in FORMAT statement at %0 -- correct form: TLn")
+/* xgettext:no-c-format */
SHORT("Invalid TL specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_TR_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid TR specifier in FORMAT statement at %0 -- correct form: TRn")
+/* xgettext:no-c-format */
SHORT("Invalid TR specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_X_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid X specifier in FORMAT statement at %0 -- correct form: nX")
+/* xgettext:no-c-format */
SHORT("Invalid X specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_S_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid S specifier in FORMAT statement at %0 -- correct form: S")
+/* xgettext:no-c-format */
SHORT("Invalid S specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_SP_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid SP specifier in FORMAT statement at %0 -- correct form: SP")
+/* xgettext:no-c-format */
SHORT("Invalid SP specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_SS_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid SS specifier in FORMAT statement at %0 -- correct form: SS")
+/* xgettext:no-c-format */
SHORT("Invalid SS specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_BN_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid BN specifier in FORMAT statement at %0 -- correct form: BN")
+/* xgettext:no-c-format */
SHORT("Invalid BN specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_BZ_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid BZ specifier in FORMAT statement at %0 -- correct form: BZ")
+/* xgettext:no-c-format */
SHORT("Invalid BZ specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_COLON_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid : specifier in FORMAT statement at %0 -- correct form: :")
+/* xgettext:no-c-format */
SHORT("Invalid : specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_BAD_H_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid H specifier in FORMAT statement at %0 -- correct form: nHcharacters !where n is an unsigned decimal constant, and characters !contains exactly n characters (including spaces)")
+/* xgettext:no-c-format */
SHORT("Invalid H specifier in FORMAT statement at %0"))
FFEBAD_MSG (FFEBAD_FORMAT_MISSING_PAREN, FATAL,
+/* xgettext:no-c-format */
"Missing close-parenthese(s) in FORMAT statement at %0")
FFEBAD_MSG (FFEBAD_FORMAT_MISSING_DOT, FATAL,
+/* xgettext:no-c-format */
"Missing number following period in FORMAT statement at %0")
FFEBAD_MSG (FFEBAD_FORMAT_MISSING_EXP, FATAL,
+/* xgettext:no-c-format */
"Missing number following `E' in FORMAT statement at %0")
FFEBAD_MSG (FFEBAD_FORMAT_EXPR_TOKEN, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid token with FORMAT run-time expression at %0 -- use the traditional operators .LT., .LE., .GT., .GE., .EQ., and .NE. in place of the newer tokens <, <=, >, >=, ==, and !=, because > ends an expression within a FORMAT statement")
+/* xgettext:no-c-format */
SHORT("Invalid token with FORMAT run-time expression at %0"))
FFEBAD_MSG (FFEBAD_TRAILING_COMMA, WARN,
+/* xgettext:no-c-format */
"Spurious trailing comma preceding terminator at %0")
FFEBAD_MSG (FFEBAD_INTERFACE_ASSIGNMENT, WARN,
+/* xgettext:no-c-format */
"At %0, specify OPERATOR instead of ASSIGNMENT for INTERFACE statement not specifying the assignment operator (=)")
FFEBAD_MSG (FFEBAD_INTERFACE_OPERATOR, WARN,
+/* xgettext:no-c-format */
"At %0, specify ASSIGNMENT instead of OPERATOR for INTERFACE statement specifying the assignment operator (=)")
FFEBAD_MSG (FFEBAD_INTERFACE_NONLETTER, FATAL,
+/* xgettext:no-c-format */
LONG("Defined operator at %0 contains a nonletter -- must contain only letters A-Z (or a-z)")
+/* xgettext:no-c-format */
SHORT("Nonletter in defined operator at %0"))
FFEBAD_MSG (FFEBAD_INVALID_TYPEDECL_ATTR, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid type-declaration attribute at %0 -- must be one of: DIMENSION(array-spec), EXTERNAL, INTRINSIC, PARAMETER, or SAVE")
+/* xgettext:no-c-format */
SHORT("Invalid type-declaration attribute at %0"))
FFEBAD_MSG (FFEBAD_INVALID_TYPEDECL_INIT, FATAL,
+/* xgettext:no-c-format */
"Cannot specify =initialization-expr at %0 unless `::' appears before list of objects")
FFEBAD_MSG (FFEBAD_LABEL_USE_DEF, FATAL,
+/* xgettext:no-c-format */
"Reference to label at %1 inconsistent with its definition at %0")
FFEBAD_MSG (FFEBAD_LABEL_USE_USE, FATAL,
+/* xgettext:no-c-format */
"Reference to label at %1 inconsistent with earlier reference at %0")
FFEBAD_MSG (FFEBAD_LABEL_DEF_DO, FATAL,
+/* xgettext:no-c-format */
"DO-statement reference to label at %1 follows its definition at %0")
FFEBAD_MSG (FFEBAD_LABEL_BLOCK, WARN,
+/* xgettext:no-c-format */
"Reference to label at %1 is outside block containing definition at %0")
FFEBAD_MSG (FFEBAD_LABEL_DO_BLOCK_DO, FATAL,
+/* xgettext:no-c-format */
"DO-statement references to label at %0 and %2 separated by unterminated block starting at %1")
FFEBAD_MSG (FFEBAD_LABEL_DO_BLOCK_END, FATAL,
+/* xgettext:no-c-format */
"DO-statement reference to label at %0 and label definition at %2 separated by unterminated block starting at %1")
FFEBAD_MSG (FFEBAD_INVALID_LABEL_DEF, FATAL,
+/* xgettext:no-c-format */
"Label definition at %0 invalid on this kind of statement")
FFEBAD_MSG (FFEBAD_ORDER_1, FATAL,
+/* xgettext:no-c-format */
"Statement at %0 invalid in this context")
FFEBAD_MSG (FFEBAD_ORDER_2, FATAL,
+/* xgettext:no-c-format */
"Statement at %0 invalid in context established by statement at %1")
FFEBAD_MSG (FFEBAD_CONSTRUCT_NAMED, FATAL,
+/* xgettext:no-c-format */
"Statement at %0 must specify construct name specified at %1")
FFEBAD_MSG (FFEBAD_CONSTRUCT_NOT_NAMED, FATAL,
+/* xgettext:no-c-format */
"Construct name at %0 superfluous, no construct name specified at %1")
FFEBAD_MSG (FFEBAD_CONSTRUCT_WRONG_NAME, FATAL,
+/* xgettext:no-c-format */
"Construct name at %0 not the same as construct name at %1")
FFEBAD_MSG (FFEBAD_CONSTRUCT_NO_DO_NAME, FATAL,
+/* xgettext:no-c-format */
"Construct name at %0 does not match construct name for any containing DO constructs")
FFEBAD_MSG (FFEBAD_DO_HAD_LABEL, FATAL,
+/* xgettext:no-c-format */
"Label definition missing at %0 for DO construct specifying label at %1")
FFEBAD_MSG (FFEBAD_AFTER_ELSE, FATAL,
+/* xgettext:no-c-format */
"Statement at %0 follows ELSE block for IF construct at %1")
FFEBAD_MSG (FFEBAD_FORMAT_NO_LABEL_DEF, FATAL,
+/* xgettext:no-c-format */
"No label definition for FORMAT statement at %0")
FFEBAD_MSG (FFEBAD_SECOND_ELSE_WHERE, FATAL,
+/* xgettext:no-c-format */
"Second occurrence of ELSE WHERE at %0 within WHERE at %1")
FFEBAD_MSG (FFEBAD_END_WO, WARN,
+/* xgettext:no-c-format */
"END statement at %0 missing `%A' keyword required for internal or module procedure(s) bounded by %1")
FFEBAD_MSG (FFEBAD_INVALID_MODULE_PROCEDURE, FATAL,
+/* xgettext:no-c-format */
"MODULE PROCEDURE statement at %0 disallowed because INTERFACE at %1 specifies no generic name, operator, or assignment")
FFEBAD_MSG (FFEBAD_BLOCKDATA_NOT_NAMED, FATAL,
+/* xgettext:no-c-format */
"BLOCK DATA name at %0 superfluous, no name specified at %1")
FFEBAD_MSG (FFEBAD_PROGRAM_NOT_NAMED, FATAL,
+/* xgettext:no-c-format */
"Program name at %0 superfluous, no PROGRAM statement specified at %1")
FFEBAD_MSG (FFEBAD_UNIT_WRONG_NAME, FATAL,
+/* xgettext:no-c-format */
"Program unit name at %0 not the same as name at %1")
FFEBAD_MSG (FFEBAD_TYPE_WRONG_NAME, FATAL,
+/* xgettext:no-c-format */
"Type name at %0 not the same as name at %1")
FFEBAD_MSG (FFEBAD_EOF_BEFORE_BLOCK_END, FATAL,
+/* xgettext:no-c-format */
"End of source file before end of block started at %0")
FFEBAD_MSG (FFEBAD_UNDEF_LABEL, FATAL,
+/* xgettext:no-c-format */
"Undefined label, first referenced at %0")
FFEBAD_MSG (FFEBAD_CONFLICTING_SAVES, WARN,
+/* xgettext:no-c-format */
"SAVE statement or attribute at %1 cannot be specified along with SAVE statement or attribute at %0")
FFEBAD_MSG (FFEBAD_CONFLICTING_ACCESSES, FATAL,
+/* xgettext:no-c-format */
"PUBLIC or PRIVATE statement at %1 cannot be specified along with PUBLIC or PRIVATE statement at %0")
FFEBAD_MSG (FFEBAD_RETURN_IN_MAIN, WARN,
+/* xgettext:no-c-format */
"RETURN statement at %0 invalid within a main program unit")
FFEBAD_MSG (FFEBAD_ALTRETURN_IN_PROGRAM, FATAL,
+/* xgettext:no-c-format */
"Alternate return specifier at %0 invalid within a main program unit")
FFEBAD_MSG (FFEBAD_ALTRETURN_IN_FUNCTION, FATAL,
+/* xgettext:no-c-format */
"Alternate return specifier at %0 invalid within a function")
FFEBAD_MSG (FFEBAD_DERIVTYP_ACCESS, FATAL,
+/* xgettext:no-c-format */
"Access specifier or PRIVATE statement at %0 invalid for derived-type definition within other than the specification part of a module")
FFEBAD_MSG (FFEBAD_DERIVTYP_ACCESS_FIRST, FATAL,
+/* xgettext:no-c-format */
"Access specifier at %0 must immediately follow derived-type statement at %1 with no intervening statements")
FFEBAD_MSG (FFEBAD_DERIVTYP_NO_COMPONENTS, FATAL,
+/* xgettext:no-c-format */
"No components specified as of %0 for derived-type definition beginning at %1")
FFEBAD_MSG (FFEBAD_STRUCT_NO_COMPONENTS, FATAL,
+/* xgettext:no-c-format */
"No components specified as of %0 for structure definition beginning at %1")
FFEBAD_MSG (FFEBAD_STRUCT_MISSING_NAME, FATAL,
+/* xgettext:no-c-format */
"Missing structure name for outer structure definition at %0")
FFEBAD_MSG (FFEBAD_STRUCT_IGNORING_FIELD, FATAL,
+/* xgettext:no-c-format */
"Field names at %0 for outer structure definition -- specify them in a subsequent RECORD statement instead")
FFEBAD_MSG (FFEBAD_STRUCT_MISSING_FIELD, FATAL,
+/* xgettext:no-c-format */
"Missing field name(s) for structure definition at %0 within structure definition at %1")
FFEBAD_MSG (FFEBAD_MAP_NO_COMPONENTS, FATAL,
+/* xgettext:no-c-format */
"No components specified as of %0 for map beginning at %1")
FFEBAD_MSG (FFEBAD_UNION_NO_TWO_MAPS, FATAL,
+/* xgettext:no-c-format */
"Zero or one maps specified as of %0 for union beginning at %1 -- at least two are required")
FFEBAD_MSG (FFEBAD_MISSING_SPECIFIER, FATAL,
+/* xgettext:no-c-format */
"Missing %A specifier in statement at %0")
FFEBAD_MSG (FFEBAD_NAMELIST_ITEMS, FATAL,
+/* xgettext:no-c-format */
"Items in I/O list starting at %0 invalid for namelist-directed I/O")
FFEBAD_MSG (FFEBAD_CONFLICTING_SPECS, FATAL,
+/* xgettext:no-c-format */
"Conflicting I/O control specifications at %0 and %1")
FFEBAD_MSG (FFEBAD_NO_UNIT_SPEC, FATAL,
+/* xgettext:no-c-format */
"No UNIT= specifier in I/O control list at %0")
FFEBAD_MSG (FFEBAD_MISSING_ADVANCE_SPEC, FATAL,
+/* xgettext:no-c-format */
"Specification at %0 requires ADVANCE=`NO' specification in same I/O control list")
FFEBAD_MSG (FFEBAD_MISSING_FORMAT_SPEC, FATAL,
+/* xgettext:no-c-format */
"Specification at %0 requires explicit FMT= specification in same I/O control list")
FFEBAD_MSG (FFEBAD_SPEC_VALUE, FATAL,
+/* xgettext:no-c-format */
LONG("Unrecognized value for character constant at %0 -- expecting %A")
+/* xgettext:no-c-format */
SHORT("Unrecognized value for character constant at %0"))
FFEBAD_MSG (FFEBAD_CASE_SECOND_DEFAULT, FATAL,
+/* xgettext:no-c-format */
"Second occurrence of CASE DEFAULT at %0 within SELECT CASE at %1")
FFEBAD_MSG (FFEBAD_CASE_DUPLICATE, FATAL,
+/* xgettext:no-c-format */
"Duplicate or overlapping case values/ranges at %0 and %1")
FFEBAD_MSG (FFEBAD_CASE_TYPE_DISAGREE, FATAL,
+/* xgettext:no-c-format */
"Type and/or kind-type parameter disagreement between CASE value or value within range at %0 and SELECT CASE at %1")
FFEBAD_MSG (FFEBAD_CASE_LOGICAL_RANGE, FATAL,
+/* xgettext:no-c-format */
"Range specification at %0 invalid for CASE statement within logical-type SELECT CASE statement")
FFEBAD_MSG (FFEBAD_CASE_BAD_RANGE, FATAL,
+/* xgettext:no-c-format */
LONG("Range specification at %0 invalid -- at least one expression must be specified, or use CASE DEFAULT")
+/* xgettext:no-c-format */
SHORT("Range specification at %0 invalid"))
FFEBAD_MSG (FFEBAD_CASE_RANGE_USELESS, INFORM,
+/* xgettext:no-c-format */
LONG("Range specification at %0 useless; first expression greater than second expression in range, so range can never be matched by any selection expression")
+/* xgettext:no-c-format */
SHORT("Useless range at %0"))
FFEBAD_MSG (FFEBAD_F90, FATAL,
+/* xgettext:no-c-format */
"Fortran 90 feature at %0 unsupported")
FFEBAD_MSG (FFEBAD_KINDTYPE, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid kind at %0 for type at %1 -- unsupported or not permitted")
+/* xgettext:no-c-format */
SHORT("Invalid kind at %0 for type at %1"))
FFEBAD_MSG (FFEBAD_BAD_IMPLICIT, FATAL,
+/* xgettext:no-c-format */
LONG("Cannot establish implicit type for initial letter `%A' at %0 -- already explicitly established or used to set implicit type of some name, or backwards order of letters in letter range")
+/* xgettext:no-c-format */
SHORT("Cannot establish implicit type for initial letter `%A' at %0"))
FFEBAD_MSG (FFEBAD_SYMERR, FATAL,
+/* xgettext:no-c-format */
"Invalid declaration of or reference to symbol `%A' at %0 [initially seen at %1]")
FFEBAD_MSG (FFEBAD_LABEL_WRONG_PLACE, FATAL,
+/* xgettext:no-c-format */
LONG("Label definition %A (at %0) invalid -- must be in columns 1-5")
+/* xgettext:no-c-format */
SHORT("Invalid label definition %A (at %0)"))
FFEBAD_MSG (FFEBAD_NULL_ELEMENT, FATAL,
+/* xgettext:no-c-format */
"Null element at %0 for array reference at %1")
FFEBAD_MSG (FFEBAD_TOO_FEW_ELEMENTS, FATAL,
+/* xgettext:no-c-format */
"Too few elements (%A missing) as of %0 for array reference at %1")
FFEBAD_MSG (FFEBAD_TOO_MANY_ELEMENTS, FATAL,
+/* xgettext:no-c-format */
"Too many elements as of %0 for array reference at %1")
FFEBAD_MSG (FFEBAD_MISSING_COLON_IN_SUBSTR, FATAL,
+/* xgettext:no-c-format */
"Missing colon as of %0 in substring reference for %1")
FFEBAD_MSG (FFEBAD_BAD_SUBSTR, FATAL,
+/* xgettext:no-c-format */
"Invalid use at %0 of substring operator on %1")
FFEBAD_MSG (FFEBAD_RANGE_SUBSTR, WARN,
+/* xgettext:no-c-format */
"Substring begin/end point at %0 out of defined range")
FFEBAD_MSG (FFEBAD_RANGE_ARRAY, WARN,
+/* xgettext:no-c-format */
"Array element value at %0 out of defined range")
FFEBAD_MSG (FFEBAD_EXPR_WRONG, FATAL,
+/* xgettext:no-c-format */
"Expression at %0 has incorrect data type or rank for its context")
FFEBAD_MSG (FFEBAD_DIV_BY_ZERO, WARN,
+/* xgettext:no-c-format */
"Division by 0 (zero) at %0 (IEEE not yet supported)")
FFEBAD_MSG (FFEBAD_DO_STEP_ZERO, FATAL,
+/* xgettext:no-c-format */
"%A step count known to be 0 (zero) at %0")
FFEBAD_MSG (FFEBAD_DO_END_OVERFLOW, WARN,
+/* xgettext:no-c-format */
"%A end value plus step count known to overflow at %0")
FFEBAD_MSG (FFEBAD_DO_IMP_OVERFLOW, WARN,
+/* xgettext:no-c-format */
"%A begin, end, and step-count values known to result in implementation-dependent behavior due to overflow(s) in intermediate calculations at %0")
FFEBAD_MSG (FFEBAD_DO_NULL, WARN,
+/* xgettext:no-c-format */
"%A begin, end, and step-count values known to result in no iterations at %0")
FFEBAD_MSG (FFEBAD_BAD_TYPES, FATAL,
+/* xgettext:no-c-format */
"Type disagreement between expressions at %0 and %1")
FFEBAD_MSG (FFEBAD_FORMAT_EXPR_SPEC, FATAL,
+/* xgettext:no-c-format */
LONG("Run-time expression at %0 in FORMAT statement that does not follow the first executable statement in the program unit -- move the statement")
+/* xgettext:no-c-format */
SHORT("FORMAT at %0 with run-time expression must follow first executable statement"))
FFEBAD_MSG (FFEBAD_BAD_IMPDO, FATAL,
+/* xgettext:no-c-format */
LONG("Unexpected token at %0 in implied-DO construct at %1 -- form of implied-DO is `(item-list,do-var=start,end[,incr])'")
+/* xgettext:no-c-format */
SHORT("Unexpected token at %0 in implied-DO construct at %1"))
FFEBAD_MSG (FFEBAD_BAD_IMPDCL, FATAL,
+/* xgettext:no-c-format */
"No specification for implied-DO iterator `%A' at %0")
FFEBAD_MSG (FFEBAD_IMPDO_PAREN, WARN,
+/* xgettext:no-c-format */
"Gratuitous parentheses surround implied-DO construct at %0")
FFEBAD_MSG (FFEBAD_ZERO_SIZE, FATAL,
+/* xgettext:no-c-format */
"Zero-size specification invalid at %0")
FFEBAD_MSG (FFEBAD_ZERO_ARRAY, FATAL,
+/* xgettext:no-c-format */
"Zero-size array at %0")
FFEBAD_MSG (FFEBAD_BAD_COMPLEX, FATAL,
+/* xgettext:no-c-format */
"Target machine does not support complex entity of kind specified at %0")
FFEBAD_MSG (FFEBAD_BAD_DBLCMPLX, FATAL,
+/* xgettext:no-c-format */
"Target machine does not support DOUBLE COMPLEX, specified at %0")
FFEBAD_MSG (FFEBAD_BAD_POWER, WARN,
+/* xgettext:no-c-format */
"Attempt to raise constant zero to a power at %0")
FFEBAD_MSG (FFEBAD_BOOL_ARGS_TYPE, FATAL,
+/* xgettext:no-c-format */
LONG("Boolean/logical operator at %0 must operate on two subexpressions of logical type, but neither subexpression at %1 or %2 is of logical type")
+/* xgettext:no-c-format */
SHORT("Invalid operands at %1 and %2 for boolean operator at %0"))
FFEBAD_MSG (FFEBAD_BOOL_ARG_TYPE, FATAL,
+/* xgettext:no-c-format */
LONG("Boolean/logical operator at %0 must operate on two subexpressions of logical type, but the subexpression at %1 is not of logical type")
+/* xgettext:no-c-format */
SHORT("Invalid operand at %1 for boolean operator at %0"))
FFEBAD_MSG (FFEBAD_BOOL_ARG_KIND, FATAL,
+/* xgettext:no-c-format */
LONG("Boolean/logical operator at %0 must operate on two scalar (not array) subexpressions, two function invocations returning logical scalars, or a combination of both -- but the subexpression at %1 is %A")
+/* xgettext:no-c-format */
SHORT("Invalid operand (is %A) at %1 for boolean operator at %0"))
FFEBAD_MSG (FFEBAD_NOT_ARG_TYPE, FATAL,
+/* xgettext:no-c-format */
LONG(".NOT. operator at %0 must operate on subexpression of logical type, but the subexpression at %1 is not of logical type")
+/* xgettext:no-c-format */
SHORT("Invalid operand at %1 for .NOT. operator at %0"))
FFEBAD_MSG (FFEBAD_NOT_ARG_KIND, FATAL,
+/* xgettext:no-c-format */
LONG(".NOT. operator at %0 must operate on scalar subexpressions -- but the subexpression at %1 is %A")
+/* xgettext:no-c-format */
SHORT("Invalid operand (is %A) at %1 for .NOT. operator at %0"))
FFEBAD_MSG (FFEBAD_EQOP_ARGS_TYPE, FATAL,
+/* xgettext:no-c-format */
LONG("Equality operator at %0 must operate on two subexpressions of arithmetic or character type, but neither subexpression at %1 or %2 is of arithmetic or character type")
+/* xgettext:no-c-format */
SHORT("Invalid operands at %1 and %2 for equality operator at %0"))
FFEBAD_MSG (FFEBAD_EQOP_ARG_TYPE, FATAL,
+/* xgettext:no-c-format */
LONG("Equality operator at %0 must operate on two subexpressions of arithmetic or character type, but the subexpression at %1 is not of arithmetic or character type")
+/* xgettext:no-c-format */
SHORT("Invalid operand at %1 for equality operator at %0"))
FFEBAD_MSG (FFEBAD_EQOP_ARG_KIND, FATAL,
+/* xgettext:no-c-format */
LONG("Equality operator at %0 must operate on two scalar (not array) subexpressions, two function invocations returning arithmetic or character scalars, or a combination of both -- but the subexpression at %1 is %A")
+/* xgettext:no-c-format */
SHORT("Invalid operand (is %A) at %1 for equality operator at %0"))
FFEBAD_MSG (FFEBAD_RELOP_ARGS_TYPE, FATAL,
+/* xgettext:no-c-format */
LONG("Relational operator at %0 must operate on two subexpressions of integer, real, or character type, but neither subexpression at %1 or %2 is of integer, real, or character type")
+/* xgettext:no-c-format */
SHORT("Invalid operands at %1 and %2 for relational operator at %0"))
FFEBAD_MSG (FFEBAD_RELOP_ARG_TYPE, FATAL,
+/* xgettext:no-c-format */
LONG("Relational operator at %0 must operate on two subexpressions of integer, real, or character type, but the subexpression at %1 is not of integer, real, or character type")
+/* xgettext:no-c-format */
SHORT("Invalid operand at %1 for relational operator at %0"))
FFEBAD_MSG (FFEBAD_RELOP_ARG_KIND, FATAL,
+/* xgettext:no-c-format */
LONG("Relational operator at %0 must operate on two scalar (not array) subexpressions, two function invocations returning integer, real, or character scalars, or a combination of both -- but the subexpression at %1 is %A")
+/* xgettext:no-c-format */
SHORT("Invalid operand (is %A) at %1 for relational operator at %0"))
FFEBAD_MSG (FFEBAD_INTRINSIC_REF, FATAL,
+/* xgettext:no-c-format */
LONG("Reference to intrinsic `%A' at %0 invalid -- one or more arguments have incorrect type")
+/* xgettext:no-c-format */
SHORT("Invalid reference to intrinsic `%A' at %0"))
FFEBAD_MSG (FFEBAD_INTRINSIC_TOOFEW, FATAL,
+/* xgettext:no-c-format */
LONG("Too few arguments passed to intrinsic `%A' at %0")
+/* xgettext:no-c-format */
SHORT("Too few arguments for intrinsic `%A' at %0"))
FFEBAD_MSG (FFEBAD_INTRINSIC_TOOMANY, FATAL,
+/* xgettext:no-c-format */
LONG("Too many arguments passed to intrinsic `%A' at %0")
+/* xgettext:no-c-format */
SHORT("Too many arguments for intrinsic `%A' at %0"))
FFEBAD_MSG (FFEBAD_INTRINSIC_DISABLED, FATAL,
+/* xgettext:no-c-format */
LONG("Reference to disabled intrinsic `%A' at %0")
+/* xgettext:no-c-format */
SHORT("Disabled intrinsic `%A' at %0"))
FFEBAD_MSG (FFEBAD_INTRINSIC_IS_SUBR, FATAL,
+/* xgettext:no-c-format */
LONG("Reference to intrinsic subroutine `%A' as if it were a function at %0")
+/* xgettext:no-c-format */
SHORT("Function reference to intrinsic subroutine `%A' at %0"))
FFEBAD_MSG (FFEBAD_INTRINSIC_IS_FUNC, FATAL,
+/* xgettext:no-c-format */
LONG("Reference to intrinsic function `%A' as if it were a subroutine at %0")
+/* xgettext:no-c-format */
SHORT("Subroutine reference to intrinsic function `%A' at %0"))
FFEBAD_MSG (FFEBAD_INTRINSIC_UNIMPL, FATAL,
+/* xgettext:no-c-format */
LONG("Reference to unimplemented intrinsic `%A' at %0 -- use EXTERNAL to reference user-written procedure with this name")
+/* xgettext:no-c-format */
SHORT("Unimplemented intrinsic `%A' at %0"))
FFEBAD_MSG (FFEBAD_INTRINSIC_UNIMPLW, WARN,
+/* xgettext:no-c-format */
LONG("Reference to unimplemented intrinsic `%A' at %0 (assumed EXTERNAL)")
+/* xgettext:no-c-format */
SHORT("Unimplemented intrinsic `%A' at %0 (assumed EXTERNAL)"))
FFEBAD_MSG (FFEBAD_INTRINSIC_AMBIG, FATAL,
+/* xgettext:no-c-format */
"Reference to generic intrinsic `%A' at %0 could be to form %B or %C")
FFEBAD_MSG (FFEBAD_INTRINSIC_CMPAMBIG, FATAL,
+/* xgettext:no-c-format */
"Ambiguous use of intrinsic `%A' at %0 [info -f g77 M CMPAMBIG]")
FFEBAD_MSG (FFEBAD_INTRINSIC_EXPIMP, WARN,
+/* xgettext:no-c-format */
"Intrinsic `%A' referenced %Bly at %0, %Cly at %1 [info -f g77 M EXPIMP]")
FFEBAD_MSG (FFEBAD_INTRINSIC_GLOBAL, WARN,
+/* xgettext:no-c-format */
"Same name `%A' used for %B at %0 and %C at %1 [info -f g77 M INTGLOB]")
FFEBAD_MSG (FFEBAD_INTRINSIC_TYPE, WARN,
+/* xgettext:no-c-format */
"Explicit type declaration for intrinsic `%A' disagrees with invocation at %0")
FFEBAD_MSG (FFEBAD_OPEN_INCLUDE, FATAL,
+/* xgettext:no-c-format */
"Unable to open INCLUDE file `%A' at %0")
FFEBAD_MSG (FFEBAD_DOITER, FATAL,
+/* xgettext:no-c-format */
LONG("Attempt to modify variable `%A' at %0 while it serves as DO-loop iterator at %1")
+/* xgettext:no-c-format */
SHORT("Modification of DO-loop iterator `%A' at %0"))
FFEBAD_MSG (FFEBAD_DOITER_IMPDO, FATAL,
+/* xgettext:no-c-format */
LONG("Attempt to modify variable `%A' via item #%B in list at %0 while it serves as implied-DO iterator at %1")
+/* xgettext:no-c-format */
SHORT("Modification of DO-loop iterator `%A' at %0"))
FFEBAD_MSG (FFEBAD_TOO_MANY_DIMS, FATAL,
+/* xgettext:no-c-format */
LONG("Array has too many dimensions, as of dimension specifier at %0")
+/* xgettext:no-c-format */
SHORT("Too many dimensions at %0"))
FFEBAD_MSG (FFEBAD_NULL_ARGUMENT, FATAL,
+/* xgettext:no-c-format */
"Null argument at %0 for statement function reference at %1")
FFEBAD_MSG (FFEBAD_NULL_ARGUMENT_W, WARN,
+/* xgettext:no-c-format */
"Null argument at %0 for procedure invocation at %1")
FFEBAD_MSG (FFEBAD_TOO_FEW_ARGUMENTS, FATAL,
+/* xgettext:no-c-format */
"%A too few arguments (starting with dummy argument `%B') as of %0 for statement function reference at %1")
FFEBAD_MSG (FFEBAD_TOO_MANY_ARGUMENTS, FATAL,
+/* xgettext:no-c-format */
"%A too many arguments as of %0 for statement function reference at %1")
FFEBAD_MSG (FFEBAD_ARRAY_AS_SFARG, FATAL,
+/* xgettext:no-c-format */
"Array supplied at %1 for dummy argument `%A' in statement function reference at %0")
FFEBAD_MSG (FFEBAD_FORMAT_UNSUPPORTED, FATAL,
+/* xgettext:no-c-format */
"Unsupported FORMAT specifier at %0")
FFEBAD_MSG (FFEBAD_FORMAT_VARIABLE, FATAL,
+/* xgettext:no-c-format */
"Variable-expression FORMAT specifier at %0 -- unsupported")
FFEBAD_MSG (FFEBAD_OPEN_UNSUPPORTED, FATAL,
+/* xgettext:no-c-format */
LONG("Unsupported OPEN control item at %0 -- ACTION=, ASSOCIATEVARIABLE=, BLOCKSIZE=, BUFFERCOUNT=, CARRIAGECONTROL=, DEFAULTFILE=, DELIM=, DISPOSE=, EXTENDSIZE=, INITIALSIZE=, KEY=, MAXREC=, NOSPANBLOCKS, ORGANIZATION=, PAD=, POSITION=, READONLY=, RECORDTYPE=, SHARED=, and USEROPEN= are not supported")
+/* xgettext:no-c-format */
SHORT("Unsupported OPEN control item at %0"))
FFEBAD_MSG (FFEBAD_INQUIRE_UNSUPPORTED, FATAL,
+/* xgettext:no-c-format */
LONG("Unsupported INQUIRE control item at %0 -- ACTION=, CARRIAGECONTROL=, DEFAULTFILE=, DELIM=, KEYED=, ORGANIZATION=, PAD=, POSITION=, READ=, READWRITE=, RECORDTYPE=, and WRITE= are not supported")
+/* xgettext:no-c-format */
SHORT("Unsupported INQUIRE control item at %0"))
FFEBAD_MSG (FFEBAD_READ_UNSUPPORTED, FATAL,
+/* xgettext:no-c-format */
LONG("Unsupported READ control item at %0 -- ADVANCE=, EOR=, KEYEQ=, KEYGE=, KEYGT=, KEYID=, NULLS=, and SIZE= are not supported")
+/* xgettext:no-c-format */
SHORT("Unsupported READ control item at %0"))
FFEBAD_MSG (FFEBAD_WRITE_UNSUPPORTED, FATAL,
+/* xgettext:no-c-format */
LONG("Unsupported WRITE control item at %0 -- ADVANCE= and EOR= are not supported")
+/* xgettext:no-c-format */
SHORT("Unsupported WRITE control item at %0"))
FFEBAD_MSG (FFEBAD_VXT_UNSUPPORTED, FATAL,
+/* xgettext:no-c-format */
"Unsupported VXT statement at %0")
FFEBAD_MSG (FFEBAD_DATA_REINIT, FATAL,
+/* xgettext:no-c-format */
"Attempt to specify second initial value for `%A' at %0")
FFEBAD_MSG (FFEBAD_DATA_TOOFEW, FATAL,
+/* xgettext:no-c-format */
"Too few initial values in list of initializers for `%A' at %0")
FFEBAD_MSG (FFEBAD_DATA_TOOMANY, FATAL,
+/* xgettext:no-c-format */
"Too many initial values in list of initializers starting at %0")
FFEBAD_MSG (FFEBAD_DATA_RANGE, FATAL,
+/* xgettext:no-c-format */
"Array or substring specification for `%A' out of range in statement at %0")
FFEBAD_MSG (FFEBAD_DATA_SUBSCRIPT, FATAL,
+/* xgettext:no-c-format */
"Array subscript #%B out of range for initialization of `%A' in statement at %0")
FFEBAD_MSG (FFEBAD_DATA_ZERO, FATAL,
+/* xgettext:no-c-format */
"Implied do-loop step count of 0 (zero) for iteration variable `%A' in statement at %0")
FFEBAD_MSG (FFEBAD_DATA_EMPTY, FATAL,
+/* xgettext:no-c-format */
"Implied do-loop iteration count of 0 (zero) for iteration variable `%A' in statement at %0")
FFEBAD_MSG (FFEBAD_DATA_EVAL, FATAL,
+/* xgettext:no-c-format */
"Not an integer constant expression in implied do-loop in statement at %0")
FFEBAD_MSG (FFEBAD_DATA_MULTIPLE, FATAL,
+/* xgettext:no-c-format */
"Attempt to specify second initial value for element of `%A' at %0")
FFEBAD_MSG (FFEBAD_EQUIV_COMMON, FATAL,
+/* xgettext:no-c-format */
"Attempt to EQUIVALENCE common areas `%A' and `%B' at %0")
FFEBAD_MSG (FFEBAD_EQUIV_ALIGN, FATAL,
+/* xgettext:no-c-format */
"Can't place `%A' as directed by EQUIVALENCE due to alignment restrictions")
FFEBAD_MSG (FFEBAD_EQUIV_MISMATCH, FATAL,
+/* xgettext:no-c-format */
"Mismatched EQUIVALENCE requirements for placement of `%A' at both %C and %D bytes offset from `%B'")
FFEBAD_MSG (FFEBAD_EQUIV_RANGE, FATAL,
+/* xgettext:no-c-format */
"Array or substring specification for `%A' out of range in EQUIVALENCE statement")
FFEBAD_MSG (FFEBAD_EQUIV_SUBSTR, FATAL,
+/* xgettext:no-c-format */
"Substring of non-CHARACTER entity `%A' in EQUIVALENCE statement")
FFEBAD_MSG (FFEBAD_EQUIV_ARRAY, FATAL,
+/* xgettext:no-c-format */
"Array reference to scalar variable `%A' in EQUIVALENCE statement")
FFEBAD_MSG (FFEBAD_EQUIV_SUBSCRIPT, WARN,
+/* xgettext:no-c-format */
"Array subscript #%B out of range for EQUIVALENCE of `%A'")
FFEBAD_MSG (FFEBAD_COMMON_PAD, WARN,
+/* xgettext:no-c-format */
LONG("Padding of %A %D required before `%B' in common block `%C' at %0 -- consider reordering members, largest-type-size first")
+/* xgettext:no-c-format */
SHORT("Padding of %A %D required before `%B' in common block `%C' at %0"))
FFEBAD_MSG (FFEBAD_COMMON_NEG, FATAL,
+/* xgettext:no-c-format */
"Attempt to extend COMMON area beyond its starting point via EQUIVALENCE of `%A'")
FFEBAD_MSG (FFEBAD_EQUIV_FEW, FATAL,
+/* xgettext:no-c-format */
"Too few elements in reference to array `%A' in EQUIVALENCE statement")
FFEBAD_MSG (FFEBAD_EQUIV_MANY, FATAL,
+/* xgettext:no-c-format */
"Too many elements in reference to array `%A' in EQUIVALENCE statement")
FFEBAD_MSG (FFEBAD_MIXED_TYPES, WARN,
+/* xgettext:no-c-format */
"Mixed CHARACTER and non-CHARACTER types via COMMON/EQUIVALENCE -- for example, `%A' and `%B'")
FFEBAD_MSG (FFEBAD_IMPLICIT_ADJLEN, FATAL,
+/* xgettext:no-c-format */
LONG("Invalid length specification at %0 for IMPLICIT statement -- must be integer constant expression")
+/* xgettext:no-c-format */
SHORT("Invalid length specification at %0"))
FFEBAD_MSG (FFEBAD_ENTRY_CONFLICTS, FATAL,
+/* xgettext:no-c-format */
LONG("Type of ENTRY point at %0 to function conflicts with type(s) of previous entrypoint(s) -- must all be identical-length CHARACTER or none be CHARACTER type")
+/* xgettext:no-c-format */
SHORT("Type of ENTRY point at %0 to function conflicts with type(s) of previous entrypoint(s)"))
FFEBAD_MSG (FFEBAD_RETURN_VALUE_UNSET, WARN,
+/* xgettext:no-c-format */
"Return value `%A' for FUNCTION at %0 not referenced in subprogram")
FFEBAD_MSG (FFEBAD_COMMON_ALREADY_INIT, FATAL,
+/* xgettext:no-c-format */
LONG("Common block `%A' initialized at %0 already initialized at %1 -- only one program unit may specify initial values for a particular common block")
+/* xgettext:no-c-format */
SHORT("Common block `%A' initialized at %0 already initialized at %1"))
FFEBAD_MSG (FFEBAD_COMMON_INIT_PAD, WARN,
+/* xgettext:no-c-format */
LONG("Initial padding for common block `%A' is %B %C at %0 -- consider reordering members, largest-type-size first")
+/* xgettext:no-c-format */
SHORT("Initial padding for common block `%A' is %B %C at %0"))
FFEBAD_MSG (FFEBAD_COMMON_DIFF_PAD, FATAL,
+/* xgettext:no-c-format */
LONG("Initial padding for common block `%A' is %B %D at %0 but %C %E at %1 -- consider reordering members, largest-type-size first")
+/* xgettext:no-c-format */
SHORT("Initial padding for common block `%A' is %B %D at %0 but %C %E at %1"))
FFEBAD_MSG (FFEBAD_COMMON_DIFF_SAVE, WARN,
+/* xgettext:no-c-format */
"Common block `%A' is SAVEd, explicitly or implicitly, at %0 but not SAVEd at %1")
FFEBAD_MSG (FFEBAD_COMMON_DIFF_SIZE, WARN,
+/* xgettext:no-c-format */
"Common block `%A' is %B %D in length at %0 but %C %E at %1")
FFEBAD_MSG (FFEBAD_COMMON_ENLARGED, FATAL,
+/* xgettext:no-c-format */
LONG("Common block `%A' is initialized to %B %D long at %0 but enlarged to %C %E at %1 -- use consistent definitions or reorder program units in source file")
+/* xgettext:no-c-format */
SHORT("Common block `%A' is initialized to %B %D long at %0 but enlarged to %C %E at %1"))
FFEBAD_MSG (FFEBAD_COMMON_BLANK_INIT, WARN,
+/* xgettext:no-c-format */
"Blank common initialized at %0")
FFEBAD_MSG (FFEBAD_NEED_INTRINSIC, WARN,
+/* xgettext:no-c-format */
"Intrinsic `%A' is passed as actual argument at %0 but not explicitly declared INTRINSIC")
FFEBAD_MSG (FFEBAD_NEED_EXTERNAL, WARN,
+/* xgettext:no-c-format */
"External procedure `%A' is passed as actual argument at %0 but not explicitly declared EXTERNAL")
FFEBAD_MSG (FFEBAD_SYMBOL_UPPER_CASE, WARN,
+/* xgettext:no-c-format */
"Character `%A' (for example) is upper-case in symbol name at %0")
FFEBAD_MSG (FFEBAD_SYMBOL_LOWER_CASE, WARN,
+/* xgettext:no-c-format */
"Character `%A' (for example) is lower-case in symbol name at %0")
FFEBAD_MSG (FFEBAD_SYMBOL_NOLOWER_INITCAP, WARN,
+/* xgettext:no-c-format */
"Character `%A' not followed at some point by lower-case character in symbol name at %0")
FFEBAD_MSG (FFEBAD_SYMBOL_LOWER_INITCAP, WARN,
+/* xgettext:no-c-format */
"Initial character `%A' is lower-case in symbol name at %0")
FFEBAD_MSG (FFEBAD_DO_REAL, WARN,
+/* xgettext:no-c-format */
LONG("DO-variable `%A' is type REAL or DOUBLE PRECISION at %0 -- unexpected behavior likely")
+/* xgettext:no-c-format */
SHORT("DO-variable `%A' is type REAL or DOUBLE PRECISION at %0"))
FFEBAD_MSG (FFEBAD_NAMELIST_CASE, WARN,
+/* xgettext:no-c-format */
"NAMELIST not adequately supported by run-time library for source files with case preserved")
FFEBAD_MSG (FFEBAD_NESTED_PERCENT, WARN,
+/* xgettext:no-c-format */
"Nested %% construct (%%VAL, %%REF, or %%DESCR) at %0")
FFEBAD_MSG (FFEBAD_ACTUALARG, WARN,
+/* xgettext:no-c-format */
LONG("Invalid actual argument at %0 -- replace hollerith constants with %%REF('string') and typeless constants with INTEGER constant equivalents, or use -fugly-args or -fugly")
+/* xgettext:no-c-format */
SHORT("Invalid actual argument at %0"))
FFEBAD_MSG (FFEBAD_QUAD_UNSUPPORTED, FATAL,
+/* xgettext:no-c-format */
LONG("Quadruple-precision floating-point unsupported -- treating constant at %0 as double-precision")
+/* xgettext:no-c-format */
SHORT("Quadruple-precision floating-point unsupported"))
FFEBAD_MSG (FFEBAD_TOO_BIG_INIT, WARN,
-LONG("Initialization of large (%B-unit) aggregate area `%A' at %0 currently very slow and takes lots of memory during g77 compile -- to be improved in 0.6")
+/* xgettext:no-c-format */
+LONG("Initialization of large (%B-unit) aggregate area `%A' at %0 slow and takes lots of memory during g77 compile")
+/* xgettext:no-c-format */
SHORT("This could take a while (initializing `%A' at %0)..."))
FFEBAD_MSG (FFEBAD_BLOCKDATA_STMT, FATAL,
+/* xgettext:no-c-format */
"Statement at %0 invalid in BLOCK DATA program unit at %1")
FFEBAD_MSG (FFEBAD_TRUNCATING_CHARACTER, FATAL,
+/* xgettext:no-c-format */
"Truncating characters on right side of character constant at %0")
FFEBAD_MSG (FFEBAD_TRUNCATING_HOLLERITH, FATAL,
+/* xgettext:no-c-format */
"Truncating characters on right side of hollerith constant at %0")
FFEBAD_MSG (FFEBAD_TRUNCATING_NUMERIC, FATAL,
+/* xgettext:no-c-format */
"Truncating non-zero data on left side of numeric constant at %0")
FFEBAD_MSG (FFEBAD_TRUNCATING_TYPELESS, FATAL,
+/* xgettext:no-c-format */
"Truncating non-zero data on left side of typeless constant at %0")
FFEBAD_MSG (FFEBAD_TYPELESS_OVERFLOW, FATAL,
+/* xgettext:no-c-format */
"Typeless constant at %0 too large")
FFEBAD_MSG (FFEBAD_AMPERSAND, WARN,
+/* xgettext:no-c-format */
"First-column ampersand continuation at %0")
FFEBAD_MSG (FFEBAD_FILEWIDE_ALREADY_SEEN, FATAL,
+/* xgettext:no-c-format */
"Global name `%A' defined at %0 already defined at %1 [info -f g77 M GLOBALS]")
FFEBAD_MSG (FFEBAD_FILEWIDE_ALREADY_SEEN_W, WARN,
+/* xgettext:no-c-format */
"Global name `%A' defined at %0 already defined at %1 [info -f g77 M GLOBALS]")
FFEBAD_MSG (FFEBAD_FILEWIDE_DISAGREEMENT, FATAL,
+/* xgettext:no-c-format */
"Global name `%A' is %B at %0 but is %C at %1 [info -f g77 M GLOBALS]")
FFEBAD_MSG (FFEBAD_FILEWIDE_DISAGREEMENT_W, WARN,
+/* xgettext:no-c-format */
"Global name `%A' is %B at %0 but is %C at %1 [info -f g77 M GLOBALS]")
FFEBAD_MSG (FFEBAD_FILEWIDE_TYPE_MISMATCH, FATAL,
+/* xgettext:no-c-format */
"Global name `%A' at %0 has different type at %1 [info -f g77 M GLOBALS]")
FFEBAD_MSG (FFEBAD_FILEWIDE_TYPE_MISMATCH_W, WARN,
+/* xgettext:no-c-format */
"Global name `%A' at %0 has different type at %1 [info -f g77 M GLOBALS]")
FFEBAD_MSG (FFEBAD_FILEWIDE_NARGS, FATAL,
+/* xgettext:no-c-format */
"Too %B arguments passed to `%A' at %0 versus definition at %1 [info -f g77 M GLOBALS]")
FFEBAD_MSG (FFEBAD_FILEWIDE_NARGS_W, WARN,
+/* xgettext:no-c-format */
"Too %B arguments for `%A' at %0 versus invocation at %1 [info -f g77 M GLOBALS]")
FFEBAD_MSG (FFEBAD_FILEWIDE_ARG, FATAL,
+/* xgettext:no-c-format */
"Argument #%B of `%A' is %C at %0 but is %D at %1 [info -f g77 M GLOBALS]")
FFEBAD_MSG (FFEBAD_FILEWIDE_ARG_W, WARN,
+/* xgettext:no-c-format */
"Argument #%B of `%A' is %C at %0 but is %D at %1 [info -f g77 M GLOBALS]")
FFEBAD_MSG (FFEBAD_ARRAY_LARGE, FATAL,
+/* xgettext:no-c-format */
"Array `%A' at %0 is too large to handle")
FFEBAD_MSG (FFEBAD_SFUNC_UNUSED, WARN,
+/* xgettext:no-c-format */
"Statement function `%A' defined at %0 is not used")
FFEBAD_MSG (FFEBAD_INTRINSIC_Y2KBAD, WARN,
+/* xgettext:no-c-format */
"Intrinsic `%A', invoked at %0, known to be non-Y2K-compliant [info -f g77 M Y2KBAD]")
FFEBAD_MSG (FFEBAD_NOCANDO, DISASTER,
+/* xgettext:no-c-format */
"Internal compiler error -- cannot perform operation")
#undef INFORM
diff --git a/contrib/gcc/f/bugs.texi b/contrib/gcc/f/bugs.texi
index 382ed08..dd50190 100644
--- a/contrib/gcc/f/bugs.texi
+++ b/contrib/gcc/f/bugs.texi
@@ -7,9 +7,9 @@
@c Keep this the same as the dates above, since it's used
@c in the standalone derivations of this file (e.g. BUGS).
-@set copyrights-bugs 1995,1996,1997,1998,1999,2000,2001
+@set copyrights-bugs 1995,1996,1997,1998,1999,2000,2001,2002
-@set last-update-bugs 2001-06-10
+@set last-update-bugs 2002-02-01
@include root.texi
@@ -120,8 +120,6 @@ configuration that it no longer makes regarding variables (types).
Included with this item is the fact that @code{g77} doesn't recognize
that, on IEEE-754/854-compliant systems, @samp{0./0.} should produce a NaN
and no warning instead of the value @samp{0.} and a warning.
-This is to be fixed in version 0.6, when @code{g77} will use the
-@code{gcc} back end's constant-handling mechanisms to replace its own.
@cindex compiler speed
@cindex speed, of compiler
@@ -138,7 +136,6 @@ areas having any initialized elements.
For example, @samp{REAL A(1000000)} followed by @samp{DATA A(1)/1/}
takes up way too much time and space, including
the size of the generated assembler file.
-This is to be mitigated somewhat in version 0.6.
Version 0.5.18 improves cases like this---specifically,
cases of @emph{sparse} initialization that leave large, contiguous
@@ -232,8 +229,6 @@ working together properly sooner.
such as the Digital Semiconductor (``DEC'') Alpha.
This problem is largely resolved as of version 0.5.23.
-Version 0.6 should solve most or all remaining problems
-(such as cross-compiling involving 64-bit machines).
@cindex padding
@cindex structures
diff --git a/contrib/gcc/f/com.c b/contrib/gcc/f/com.c
index 979d735..a915139 100644
--- a/contrib/gcc/f/com.c
+++ b/contrib/gcc/f/com.c
@@ -1,5 +1,5 @@
/* com.c -- Implementation File (module.c template V1.0)
- Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001
+ Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
Contributed by James Craig Burley.
@@ -2262,8 +2262,13 @@ ffecom_check_size_overflow_ (ffesymbol s, tree type, bool dummy)
if (TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
return type;
+ /* An array is too large if size is negative or the type_size overflows
+ or its "upper half" is larger than 3 (which would make the signed
+ byte size and offset computations overflow). */
+
if ((tree_int_cst_sgn (TYPE_SIZE (type)) < 0)
- || (!dummy && TREE_OVERFLOW (TYPE_SIZE (type))))
+ || (!dummy && (TREE_INT_CST_HIGH (TYPE_SIZE (type)) > 3
+ || TREE_OVERFLOW (TYPE_SIZE (type)))))
{
ffebad_start (FFEBAD_ARRAY_LARGE);
ffebad_string (ffesymbol_text (s));
@@ -3113,6 +3118,7 @@ ffecom_expr_ (ffebld expr, tree dest_tree, ffebld dest,
if (ffesymbol_hook (s).assign_tree == NULL_TREE)
{
+ /* xgettext:no-c-format */
ffebad_start_msg ("ASSIGN'ed label cannot fit into `%A' at %0 -- using wider sibling",
FFEBAD_severityWARNING);
ffebad_string (ffesymbol_text (s));
@@ -3729,6 +3735,10 @@ ffecom_expr_ (ffebld expr, tree dest_tree, ffebld dest,
item = ffecom_arg_ptr_to_expr (ffebld_left (expr), &list);
return convert (tree_type, item);
+ case FFEBLD_opPERCENT_VAL:
+ item = ffecom_arg_expr (ffebld_left (expr), &list);
+ return convert (tree_type, item);
+
case FFEBLD_opITEM:
case FFEBLD_opSTAR:
case FFEBLD_opBOUNDS:
@@ -5585,7 +5595,7 @@ ffecom_expr_power_integer_ (ffebld expr)
basetypeof_l_is_int
= build_int_2 ((TREE_CODE (ltype) == INTEGER_TYPE), 0);
- se = expand_start_stmt_expr ();
+ se = expand_start_stmt_expr (/*has_scope=*/1);
ffecom_start_compstmt ();
@@ -11823,8 +11833,7 @@ ffecom_init_0 ()
warning ("and pointers are %d bits wide, but g77 doesn't yet work",
(int) TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (null_pointer_node))));
warning ("properly unless they all are 32 bits wide");
- warning ("Please keep this in mind before you report bugs. g77 should");
- warning ("support non-32-bit machines better as of version 0.6");
+ warning ("Please keep this in mind before you report bugs.");
}
#endif
@@ -15373,6 +15382,7 @@ print_containing_files (ffebadSeverity sev)
else
str2 = "";
+ /* xgettext:no-c-format */
ffebad_start_msg ("%A from %B at %0%C", sev);
ffebad_here (0, ip->line, ip->column);
ffebad_string (str1);
@@ -15692,6 +15702,7 @@ ffecom_open_include_ (char *name, ffewhereLine l, ffewhereColumn c)
if (f == NULL && errno == EACCES)
{
print_containing_files (FFEBAD_severityWARNING);
+ /* xgettext:no-c-format */
ffebad_start_msg ("At %0, INCLUDE file %A exists, but is not readable",
FFEBAD_severityWARNING);
ffebad_string (fname);
@@ -15726,6 +15737,7 @@ ffecom_open_include_ (char *name, ffewhereLine l, ffewhereColumn c)
if (indepth >= (INPUT_STACK_MAX - 1))
{
print_containing_files (FFEBAD_severityFATAL);
+ /* xgettext:no-c-format */
ffebad_start_msg ("At %0, INCLUDE nesting too deep",
FFEBAD_severityFATAL);
ffebad_string (fname);
diff --git a/contrib/gcc/f/data.c b/contrib/gcc/f/data.c
index 51eb2b7..3e1ae62 100644
--- a/contrib/gcc/f/data.c
+++ b/contrib/gcc/f/data.c
@@ -1,5 +1,5 @@
/* data.c -- Implementation File (module.c template V1.0)
- Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 2002 Free Software Foundation, Inc.
Contributed by James Craig Burley.
This file is part of GNU Fortran.
@@ -977,6 +977,9 @@ ffedata_eval_offset_ (ffebld subscripts, ffebld dims)
while (subscripts != NULL)
{
+ ffeinfoKindtype sub_kind, low_kind, hi_kind;
+ ffebld sub1, low1, hi1;
+
++rank;
assert (dims != NULL);
@@ -984,8 +987,19 @@ ffedata_eval_offset_ (ffebld subscripts, ffebld dims)
dim = ffebld_head (dims);
assert (ffeinfo_basictype (ffebld_info (subscript)) == FFEINFO_basictypeINTEGER);
- assert (ffeinfo_kindtype (ffebld_info (subscript)) == FFEINFO_kindtypeINTEGER1);
- value = ffedata_eval_integer1_ (subscript);
+ if (ffebld_op (subscript) == FFEBLD_opCONTER)
+ {
+ /* Force to default - it's a constant expression ! */
+ sub_kind = ffeinfo_kindtype (ffebld_info (subscript));
+ sub1 = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val (
+ sub_kind == FFEINFO_kindtypeINTEGER2 ? subscript->u.conter.expr->u.integer2 :
+ sub_kind == FFEINFO_kindtypeINTEGER3 ? subscript->u.conter.expr->u.integer3 :
+ sub_kind == FFEINFO_kindtypeINTEGER4 ? subscript->u.conter.expr->u.integer4 :
+ subscript->u.conter.expr->u.integer1), NULL);
+ value = ffedata_eval_integer1_ (sub1);
+ }
+ else
+ value = ffedata_eval_integer1_ (subscript);
assert (ffebld_op (dim) == FFEBLD_opBOUNDS);
low = ffebld_left (dim);
@@ -996,13 +1010,35 @@ ffedata_eval_offset_ (ffebld subscripts, ffebld dims)
else
{
assert (ffeinfo_basictype (ffebld_info (low)) == FFEINFO_basictypeINTEGER);
- assert (ffeinfo_kindtype (ffebld_info (low)) == FFEINFO_kindtypeINTEGERDEFAULT);
- lowbound = ffedata_eval_integer1_ (low);
+ if (ffebld_op (low) == FFEBLD_opCONTER)
+ {
+ /* Force to default - it's a constant expression ! */
+ low_kind = ffeinfo_kindtype (ffebld_info (low));
+ low1 = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val (
+ low_kind == FFEINFO_kindtypeINTEGER2 ? low->u.conter.expr->u.integer2 :
+ low_kind == FFEINFO_kindtypeINTEGER3 ? low->u.conter.expr->u.integer3 :
+ low_kind == FFEINFO_kindtypeINTEGER4 ? low->u.conter.expr->u.integer4 :
+ low->u.conter.expr->u.integer1), NULL);
+ lowbound = ffedata_eval_integer1_ (low1);
+ }
+ else
+ lowbound = ffedata_eval_integer1_ (low);
}
assert (ffeinfo_basictype (ffebld_info (high)) == FFEINFO_basictypeINTEGER);
- assert (ffeinfo_kindtype (ffebld_info (high)) == FFEINFO_kindtypeINTEGERDEFAULT);
- highbound = ffedata_eval_integer1_ (high);
+ if (ffebld_op (high) == FFEBLD_opCONTER)
+ {
+ /* Force to default - it's a constant expression ! */
+ hi_kind = ffeinfo_kindtype (ffebld_info (high));
+ hi1 = ffebld_new_conter_with_orig (ffebld_constant_new_integer1_val (
+ hi_kind == FFEINFO_kindtypeINTEGER2 ? high->u.conter.expr->u.integer2 :
+ hi_kind == FFEINFO_kindtypeINTEGER3 ? high->u.conter.expr->u.integer3 :
+ hi_kind == FFEINFO_kindtypeINTEGER4 ? high->u.conter.expr->u.integer4 :
+ high->u.conter.expr->u.integer1), NULL);
+ highbound = ffedata_eval_integer1_ (hi1);
+ }
+ else
+ highbound = ffedata_eval_integer1_ (high);
if ((value < lowbound) || (value > highbound))
{
diff --git a/contrib/gcc/f/expr.c b/contrib/gcc/f/expr.c
index d873018..1772727 100644
--- a/contrib/gcc/f/expr.c
+++ b/contrib/gcc/f/expr.c
@@ -1,5 +1,6 @@
/* expr.c -- Implementation File (module.c template V1.0)
- Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, 1998, 2001, 2002
+ Free Software Foundation, Inc.
Contributed by James Craig Burley.
This file is part of GNU Fortran.
@@ -9608,6 +9609,7 @@ ffeexpr_exprstack_push_unary_ (ffeexprExpr_ e)
<= FFEEXPR_operatorprecedenceLOWARITH_)
&& (e->u.operator.prec <= FFEEXPR_operatorprecedenceLOWARITH_))
{
+ /* xgettext:no-c-format */
ffebad_start_msg ("Two arithmetic operators in a row at %0 and %1 -- use parentheses",
ffe_is_pedantic ()
? FFEBAD_severityPEDANTIC
@@ -9657,6 +9659,7 @@ ffeexpr_exprstack_push_binary_ (ffeexprExpr_ e)
&& (e->u.operator.prec
< ffeexpr_stack_->exprstack->previous->u.operator.prec))
{
+ /* xgettext:no-c-format */
ffebad_start_msg ("Operator at %0 has lower precedence than that at %1 -- use parentheses", FFEBAD_severityWARNING);
ffebad_here (0,
ffelex_token_where_line (ffeexpr_stack_->exprstack->previous->token),
@@ -10517,6 +10520,7 @@ ffeexpr_reduced_eqop2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
if ((lbt == FFEINFO_basictypeLOGICAL)
&& (rbt == FFEINFO_basictypeLOGICAL))
{
+ /* xgettext:no-c-format */
if (ffebad_start_msg ("Use .EQV./.NEQV. instead of .EQ./.NE. at %0 for LOGICAL operands at %1 and %2",
FFEBAD_severityFATAL))
{
@@ -10887,6 +10891,7 @@ ffeexpr_reduced_power_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
}
if (rkt == FFEINFO_kindtypeINTEGER4)
{
+ /* xgettext:no-c-format */
ffebad_start_msg ("Unsupported operand for ** at %1 -- converting to default INTEGER",
FFEBAD_severityWARNING);
ffebad_here (0, ffelex_token_where_line (r->token), ffelex_token_where_column (r->token));
@@ -16489,10 +16494,8 @@ ffeexpr_sym_impdoitem_ (ffesymbol sp, ffelexToken t)
FFETARGET_charactersizeNONE));
ffesymbol_signal_unreported (s);
- if (((ffesymbol_basictype (sp) != FFEINFO_basictypeINTEGER)
+ if ((ffesymbol_basictype (sp) != FFEINFO_basictypeINTEGER)
&& (ffesymbol_basictype (sp) != FFEINFO_basictypeANY))
- || ((ffesymbol_kindtype (sp) != FFEINFO_kindtypeINTEGERDEFAULT)
- && (ffesymbol_kindtype (sp) != FFEINFO_kindtypeANY)))
ffesymbol_error (s, t);
return s;
diff --git a/contrib/gcc/f/ffe.texi b/contrib/gcc/f/ffe.texi
index 8e019fa..b6fbac9 100644
--- a/contrib/gcc/f/ffe.texi
+++ b/contrib/gcc/f/ffe.texi
@@ -11,10 +11,6 @@
This chapter describes some aspects of the design and implementation
of the @code{g77} front end.
-Much of the information below applies not to current
-releases of @code{g77},
-but to the 0.6 rewrite being designed and implemented
-as of late May, 1999.
To find about things that are ``To Be Determined'' or ``To Be Done'',
search for the string TBD.
@@ -589,11 +585,6 @@ Preserving case seems necessary to provide more direct access
to facilities outside of @code{g77}, such as to C or Pascal code.
Names of intrinsics will probably be matchable in any case,
-However, there probably won't be any option to require
-a particular mixed-case appearance of intrinsics
-(as there was for @code{g77} prior to version 0.6),
-because that's painful to maintain,
-and probably nobody uses it.
(How @samp{external SiN; r = sin(x)} would be handled is TBD.
I think old @code{g77} might already handle that pretty elegantly,
diff --git a/contrib/gcc/f/g77.texi b/contrib/gcc/f/g77.texi
index 38512cf..82c5574 100644
--- a/contrib/gcc/f/g77.texi
+++ b/contrib/gcc/f/g77.texi
@@ -2,8 +2,8 @@
@c %**start of header
@setfilename g77.info
-@set last-update 2001-11-20
-@set copyrights-g77 1995,1996,1997,1998,1999,2000,2001
+@set last-update 2002-04-29
+@set copyrights-g77 1995,1996,1997,1998,1999,2000,2001,2002
@include root.texi
@@ -161,7 +161,7 @@ was contributed to Craig by David Ronis (@email{ronis@@onsager.chem.mcgill.ca}).
@sp 3
@center Last updated @value{last-update}
@sp 1
-@center for version @value{version-g77}
+@center for version @value{which-g77}
@page
@vskip 0pt plus 1filll
Copyright @copyright{} @value{copyrights-g77} Free Software Foundation, Inc.
@@ -359,8 +359,7 @@ for @code{INTEGER*1}, @code{INTEGER*2}, and
@code{LOGICAL*1}.
This inspired Craig to add further support,
even though the resulting support
-would still be incomplete, because version 0.6 is still
-a ways off.
+would still be incomplete.
@item
David Ronis (@email{ronis@@onsager.chem.mcgill.ca}) inspired
@@ -425,10 +424,6 @@ Email @email{gnu@@gnu.org} for information on funding the FSF.
Another important way to support work on GNU Fortran is to volunteer
to help out.
-Work is needed on documentation, testing, porting
-to various machines, and in some cases, coding (although major
-changes planned for version 0.6 make it difficult to add manpower to this
-area).
Email @email{@value{email-general}} to volunteer for this work.
@@ -846,7 +841,7 @@ files and accepts Fortran-specific command-line options, plus some
command-line options that are designed to cater to Fortran users
but apply to other languages as well.
-@xref{G++ and GCC,,Compile C; C++; Objective-C; Ada; CHILL; Fortran;
+@xref{G++ and GCC,,Compile C; C++; Objective-C; Ada; Fortran;
or Java,gcc,Using the GNU Compiler Collection (GCC)},
for information on the way different languages are handled
by the GNU CC compiler (@command{gcc}).
@@ -3561,10 +3556,7 @@ implementation choices made for the compiler, since those choices
are explicitly left to the implementation by the published Fortran
standards.
GNU Fortran currently tries to be somewhat like a few popular compilers
-(@command{f2c}, Digital (``DEC'') Fortran, and so on), though a cleaner default
-definition along with more
-flexibility offered by command-line options is likely to be offered
-in version 0.6.
+(@command{f2c}, Digital (``DEC'') Fortran, and so on).
This section describes how @command{g77} interprets source lines.
@@ -3605,20 +3597,6 @@ than (currently) noting whether a tab was found on a line and using this
information to decide how to interpret the length of the line and continued
constants.
-Note that this default behavior probably will change for version 0.6,
-when it will presumably be available via a command-line option.
-The default as of version 0.6 is planned to be a ``pure visual''
-model, where tabs are immediately
-converted to spaces and otherwise have no effect, so the way a typical
-user sees source lines produces a consistent result no matter how the
-spacing in those source lines is actually implemented via tabs, spaces,
-and trailing tabs/spaces before newline.
-Command-line options are likely to be added to specify whether all or
-just-tabbed lines are to be extended to 132 or full input-line length,
-and perhaps even an option will be added to specify the truncated-line
-behavior to which some Digital compilers default (and which affects
-the way continued character/Hollerith constants are interpreted).
-
@node Short Lines
@subsection Short Lines
@cindex short source lines
@@ -8879,8 +8857,6 @@ to fund a comprehensive project to create GNU Fortran 95.
@cindex statements, PARAMETER
@command{g77} doesn't allow intrinsics in @code{PARAMETER} statements.
-This feature is considered to be absolutely vital, even though it
-is not standard-conforming, and is scheduled for version 0.6.
Related to this, @command{g77} doesn't allow non-integral
exponentiation in @code{PARAMETER} statements, such as
@@ -8984,8 +8960,6 @@ alleviate this problem).
@command{g77} doesn't fully support @code{INTEGER*2}, @code{LOGICAL*1},
and similar.
-Version 0.6 will provide full support for this very
-popular set of features.
In the meantime, version 0.5.18 provides rudimentary support
for them.
@@ -9004,7 +8978,6 @@ support (using F90 syntax) as well, and, for most
machines will result in automatic support of @code{INTEGER*1},
@code{INTEGER*2}, @code{INTEGER*8}, maybe even @code{REAL*16},
and so on.
-This is scheduled for version 0.6.
@node Array Bounds Expressions
@subsection Array Bounds Expressions
@@ -9615,8 +9588,6 @@ item pointed to won't be modified
Probably the best solution for now, but not quite trivial
to implement in the general case.
-Worth considering after @command{g77} 0.6 is considered
-pretty solid.
@end itemize
@node Gracefully Handle Sensible Bad Code
@@ -10467,24 +10438,6 @@ useful warnings).
@emph{Note:} Currently, the text of the line and a pointer to the column
is printed in most @command{g77} diagnostics.
-Probably, as of version 0.6, @command{g77} will
-no longer print the text of the source line, instead printing
-the column number following the file name and line number in
-a form that GNU Emacs recognizes.
-This change is expected to speed up and reduce the memory usage
-of the @command{g77} compiler.
-@c
-@c Say this when it is true -- hopefully 0.6, maybe 0.7 or later. --burley
-@c
-@c GNU Fortran always tries to compile your program if possible; it never
-@c gratuitously rejects a program whose meaning is clear merely because
-@c (for instance) it fails to conform to a standard. In some cases,
-@c however, the Fortran standard specifies that certain extensions are
-@c forbidden, and a diagnostic @emph{must} be issued by a conforming
-@c compiler. The @option{-pedantic} option tells GNU Fortran to issue warnings
-@c in such cases; @option{-pedantic-errors} says to make them errors instead.
-@c This does not mean that @emph{all} non-ANSI constructs get warnings
-@c or errors.
@xref{Warning Options,,Options to Request or Suppress Warnings}, for
more detail on these and related command-line options.
@@ -11551,8 +11504,6 @@ libraries are installed) after building.
@section Internals Documentation
Better info on how @command{g77} works and how to port it is needed.
-Much of this should be done only after the redesign planned for
-0.6 is complete.
@xref{Front End}, which contains some information
on @command{g77} internals.
diff --git a/contrib/gcc/f/implic.c b/contrib/gcc/f/implic.c
index 625742f..6fe4606 100644
--- a/contrib/gcc/f/implic.c
+++ b/contrib/gcc/f/implic.c
@@ -1,5 +1,5 @@
/* implic.c -- Implementation File (module.c template V1.0)
- Copyright (C) 1995 Free Software Foundation, Inc.
+ Copyright (C) 1995, 2002 Free Software Foundation, Inc.
Contributed by James Craig Burley.
This file is part of GNU Fortran.
@@ -199,6 +199,7 @@ ffeimplic_establish_symbol (ffesymbol s)
if (ffe_is_warn_implicit ())
{
+ /* xgettext:no-c-format */
ffebad_start_msg ("Implicit declaration of `%A' at %0",
FFEBAD_severityWARNING);
ffebad_here (0, ffesymbol_where_line (s),
diff --git a/contrib/gcc/f/intdoc.c b/contrib/gcc/f/intdoc.c
index 84720a3..fb88e88 100644
--- a/contrib/gcc/f/intdoc.c
+++ b/contrib/gcc/f/intdoc.c
@@ -709,6 +709,10 @@ types of all the arguments.\n\n");
argument_name_string (imp, 0));
break;
+ case 'N':
+ printf ("@code{INTEGER} not wider than the default kind");
+ break;
+
default:
assert ("Ia" == NULL);
break;
@@ -732,6 +736,10 @@ types of all the arguments.\n\n");
argument_name_string (imp, 0));
break;
+ case 'N':
+ printf ("@code{LOGICAL} not wider than the default kind");
+ break;
+
default:
assert ("La" == NULL);
break;
@@ -779,6 +787,10 @@ types of all the arguments.\n\n");
argument_name_string (imp, 0));
break;
+ case 'N':
+ printf ("@code{INTEGER} or @code{LOGICAL} not wider than the default kind");
+ break;
+
default:
assert ("Ba" == NULL);
break;
diff --git a/contrib/gcc/f/intdoc.texi b/contrib/gcc/f/intdoc.texi
index 6165e44..e829b35 100644
--- a/contrib/gcc/f/intdoc.texi
+++ b/contrib/gcc/f/intdoc.texi
@@ -1673,7 +1673,7 @@ BesJN(@var{N}, @var{X})
BesJN: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
@noindent
-@var{N}: @code{INTEGER}; scalar; INTENT(IN).
+@var{N}: @code{INTEGER} not wider than the default kind; scalar; INTENT(IN).
@noindent
@var{X}: @code{REAL}; scalar; INTENT(IN).
@@ -1748,7 +1748,7 @@ BesYN(@var{N}, @var{X})
BesYN: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
@noindent
-@var{N}: @code{INTEGER}; scalar; INTENT(IN).
+@var{N}: @code{INTEGER} not wider than the default kind; scalar; INTENT(IN).
@noindent
@var{X}: @code{REAL}; scalar; INTENT(IN).
@@ -3113,7 +3113,7 @@ DbesJN(@var{N}, @var{X})
DbesJN: @code{REAL(KIND=2)} function.
@noindent
-@var{N}: @code{INTEGER}; scalar; INTENT(IN).
+@var{N}: @code{INTEGER} not wider than the default kind; scalar; INTENT(IN).
@noindent
@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
@@ -3194,7 +3194,7 @@ DbesYN(@var{N}, @var{X})
DbesYN: @code{REAL(KIND=2)} function.
@noindent
-@var{N}: @code{INTEGER}; scalar; INTENT(IN).
+@var{N}: @code{INTEGER} not wider than the default kind; scalar; INTENT(IN).
@noindent
@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
@@ -4385,7 +4385,7 @@ CALL Exit(@var{Status})
@end example
@noindent
-@var{Status}: @code{INTEGER}; OPTIONAL; scalar; INTENT(IN).
+@var{Status}: @code{INTEGER} not wider than the default kind; OPTIONAL; scalar; INTENT(IN).
@noindent
Intrinsic groups: @code{unix}.
@@ -5249,7 +5249,7 @@ CALL GetArg(@var{Pos}, @var{Value})
@end example
@noindent
-@var{Pos}: @code{INTEGER}; scalar; INTENT(IN).
+@var{Pos}: @code{INTEGER} not wider than the default kind; scalar; INTENT(IN).
@noindent
@var{Value}: @code{CHARACTER}; scalar; INTENT(OUT).
diff --git a/contrib/gcc/f/intrin.c b/contrib/gcc/f/intrin.c
index 83a478c..1c6c00c 100644
--- a/contrib/gcc/f/intrin.c
+++ b/contrib/gcc/f/intrin.c
@@ -414,6 +414,24 @@ ffeintrin_check_ (ffeintrinImp imp, ffebldOp op,
: firstarg_kt;
break;
+ case 'N':
+ /* Accept integers and logicals not wider than the default integer/logical. */
+ if (ffeinfo_basictype (i) == FFEINFO_basictypeINTEGER)
+ {
+ okay &= anynum || (ffeinfo_kindtype (i) == FFEINFO_kindtypeINTEGER1
+ || ffeinfo_kindtype (i) == FFEINFO_kindtypeINTEGER2
+ || ffeinfo_kindtype (i) == FFEINFO_kindtypeINTEGER3);
+ akt = FFEINFO_kindtypeINTEGER1; /* The default. */
+ }
+ else if (ffeinfo_basictype (i) == FFEINFO_basictypeLOGICAL)
+ {
+ okay &= anynum || (ffeinfo_kindtype (i) == FFEINFO_kindtypeLOGICAL1
+ || ffeinfo_kindtype (i) == FFEINFO_kindtypeLOGICAL2
+ || ffeinfo_kindtype (i) == FFEINFO_kindtypeLOGICAL3);
+ akt = FFEINFO_kindtypeLOGICAL1; /* The default. */
+ }
+ break;
+
case '*':
default:
break;
diff --git a/contrib/gcc/f/intrin.def b/contrib/gcc/f/intrin.def
index 9451a27..5d712ba 100644
--- a/contrib/gcc/f/intrin.def
+++ b/contrib/gcc/f/intrin.def
@@ -3102,6 +3102,7 @@ DEFSPEC (NONE,
4 (Twice the size of 2)
6 (Twice the size as 3)
A Same as first argument
+ N Not wider than the default kind
<arg-len> is:
@@ -3218,10 +3219,10 @@ DEFIMP (ALARM, "ALARM", ALARM,,, "--:-:Seconds=I*,Handler=s*,Status=?I1w")
DEFIMP (AND, "AND", ,,, "B=:*:I=B*,J=B*")
DEFIMP (BESJ0, "BESJ0", L_BESJ0,,, "R=:0:X=R*")
DEFIMP (BESJ1, "BESJ1", L_BESJ1,,, "R=:0:X=R*")
-DEFIMP (BESJN, "BESJN", L_BESJN,,, "R=:1:N=I*,X=R*")
+DEFIMP (BESJN, "BESJN", L_BESJN,,, "R=:1:N=IN,X=R*")
DEFIMP (BESY0, "BESY0", L_BESY0,,, "R=:0:X=R*")
DEFIMP (BESY1, "BESY1", L_BESY1,,, "R=:0:X=R*")
-DEFIMP (BESYN, "BESYN", L_BESYN,,, "R=:1:N=I*,X=R*")
+DEFIMP (BESYN, "BESYN", L_BESYN,,, "R=:1:N=IN,X=R*")
DEFIMP (BIT_SIZE, "BIT_SIZE", ,,, "I=:0:I=I*i")
DEFIMP (BTEST, "BTEST", ,,, "L1:*:I=I*,Pos=I*")
DEFIMP (CDABS, "CDABS", ,CDABS,, "R2:-:A=C2")
@@ -3242,10 +3243,10 @@ DEFIMPY (DATE, "DATE", DATE,,, "--:-:Date=A1w", TRUE)
DEFIMP (DATE_AND_TIME, "DATE_AND_TIME", DATE_AND_TIME,,, "--:-:Date=A1w,Time=?A1w,Zone=?A1w,Values=?I1(8)w")
DEFIMP (DBESJ0, "DBESJ0", L_BESJ0,,, "R2:-:X=R2")
DEFIMP (DBESJ1, "DBESJ1", L_BESJ1,,, "R2:-:X=R2")
-DEFIMP (DBESJN, "DBESJN", L_BESJN,,, "R2:-:N=I*,X=R2")
+DEFIMP (DBESJN, "DBESJN", L_BESJN,,, "R2:-:N=IN,X=R2")
DEFIMP (DBESY0, "DBESY0", L_BESY0,,, "R2:-:X=R2")
DEFIMP (DBESY1, "DBESY1", L_BESY1,,, "R2:-:X=R2")
-DEFIMP (DBESYN, "DBESYN", L_BESYN,,, "R2:-:N=I*,X=R2")
+DEFIMP (DBESYN, "DBESYN", L_BESYN,,, "R2:-:N=IN,X=R2")
DEFIMP (DCONJG, "DCONJG", ,DCONJG,, "C2:-:Z=C2")
DEFIMP (DERF, "DERF", L_ERF,DERF,, "R2:-:X=R2")
DEFIMP (DERFC, "DERFC", L_ERFC,DERFC,, "R2:-:X=R2")
@@ -3258,7 +3259,7 @@ DEFIMP (ERF, "ERF", L_ERF,ERF,, "R=:0:X=R*")
DEFIMP (ERFC, "ERFC", L_ERFC,ERFC,, "R=:0:X=R*")
DEFIMP (ETIME_func, "ETIME_func", ETIME,,, "R1:-:TArray=R1(2)w")
DEFIMP (ETIME_subr, "ETIME_subr", ETIME,,, "--:-:TArray=R1(2)w,Result=R1w")
-DEFIMP (EXIT, "EXIT", EXIT,,, "--:-:Status=?I*")
+DEFIMP (EXIT, "EXIT", EXIT,,, "--:-:Status=?IN")
DEFIMP (FDATE_func, "FDATE_func", FDATE,,, "A1*:-:")
DEFIMP (FDATE_subr, "FDATE_subr", FDATE,,, "--:-:Date=A1w")
DEFIMP (FGET_func, "FGET_func", FGET,,, "I1:-:C=A1w")
@@ -3277,7 +3278,7 @@ DEFIMP (FSTAT_subr, "FSTAT_subr", FSTAT,,, "--:-:Unit=I*,SArray=I1(13)w,Status=?
DEFIMP (FTELL_func, "FTELL_func", FTELL,,, "I1:-:Unit=I*")
DEFIMP (FTELL_subr, "FTELL_subr", FTELL,,, "--:-:Unit=I*,Offset=I1w")
DEFIMP (GERROR, "GERROR", GERROR,,, "--:-:Message=A1w")
-DEFIMP (GETARG, "GETARG", GETARG,,, "--:-:Pos=I*,Value=A1w")
+DEFIMP (GETARG, "GETARG", GETARG,,, "--:-:Pos=IN,Value=A1w")
DEFIMP (GETCWD_func, "GETCWD_func", GETCWD,,, "I1:-:Name=A1w")
DEFIMP (GETCWD_subr, "GETCWD_subr", GETCWD,,, "--:-:Name=A1w,Status=?I1w")
DEFIMP (GETGID, "GETGID", GETGID,,, "I1:-:")
diff --git a/contrib/gcc/f/invoke.texi b/contrib/gcc/f/invoke.texi
index ff2de1a..d2d1ed1 100644
--- a/contrib/gcc/f/invoke.texi
+++ b/contrib/gcc/f/invoke.texi
@@ -1,11 +1,11 @@
-@c Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+@c Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
@c Free Software Foundation, Inc.
@c This is part of the G77 manual.
@c For copying conditions, see the file g77.texi.
@ignore
@c man begin COPYRIGHT
-Copyright @copyright{} 1996, 1997, 1998, 1999, 2000, 2001
+Copyright @copyright{} 1996, 1997, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
@@ -132,43 +132,43 @@ by type. Explanations are in the following sections.
@item Fortran Language Options
@xref{Fortran Dialect Options,,Options Controlling Fortran Dialect}.
@gccoptlist{
--ffree-form -fno-fixed-form -ff90
--fvxt -fdollar-ok -fno-backslash
--fno-ugly-args -fno-ugly-assign -fno-ugly-assumed
--fugly-comma -fugly-complex -fugly-init -fugly-logint
--fonetrip -ftypeless-boz
--fintrin-case-initcap -fintrin-case-upper
--fintrin-case-lower -fintrin-case-any
--fmatch-case-initcap -fmatch-case-upper
--fmatch-case-lower -fmatch-case-any
--fsource-case-upper -fsource-case-lower
--fsource-case-preserve
--fsymbol-case-initcap -fsymbol-case-upper
--fsymbol-case-lower -fsymbol-case-any
--fcase-strict-upper -fcase-strict-lower
--fcase-initcap -fcase-upper -fcase-lower -fcase-preserve
--ff2c-intrinsics-delete -ff2c-intrinsics-hide
--ff2c-intrinsics-disable -ff2c-intrinsics-enable
--fbadu77-intrinsics-delete -fbadu77-intrinsics-hide
--fbadu77-intrinsics-disable -fbadu77-intrinsics-enable
--ff90-intrinsics-delete -ff90-intrinsics-hide
--ff90-intrinsics-disable -ff90-intrinsics-enable
--fgnu-intrinsics-delete -fgnu-intrinsics-hide
--fgnu-intrinsics-disable -fgnu-intrinsics-enable
--fmil-intrinsics-delete -fmil-intrinsics-hide
--fmil-intrinsics-disable -fmil-intrinsics-enable
--funix-intrinsics-delete -funix-intrinsics-hide
--funix-intrinsics-disable -funix-intrinsics-enable
--fvxt-intrinsics-delete -fvxt-intrinsics-hide
--fvxt-intrinsics-disable -fvxt-intrinsics-enable
+-ffree-form -fno-fixed-form -ff90 @gol
+-fvxt -fdollar-ok -fno-backslash @gol
+-fno-ugly-args -fno-ugly-assign -fno-ugly-assumed @gol
+-fugly-comma -fugly-complex -fugly-init -fugly-logint @gol
+-fonetrip -ftypeless-boz @gol
+-fintrin-case-initcap -fintrin-case-upper @gol
+-fintrin-case-lower -fintrin-case-any @gol
+-fmatch-case-initcap -fmatch-case-upper @gol
+-fmatch-case-lower -fmatch-case-any @gol
+-fsource-case-upper -fsource-case-lower @gol
+-fsource-case-preserve @gol
+-fsymbol-case-initcap -fsymbol-case-upper @gol
+-fsymbol-case-lower -fsymbol-case-any @gol
+-fcase-strict-upper -fcase-strict-lower @gol
+-fcase-initcap -fcase-upper -fcase-lower -fcase-preserve @gol
+-ff2c-intrinsics-delete -ff2c-intrinsics-hide @gol
+-ff2c-intrinsics-disable -ff2c-intrinsics-enable @gol
+-fbadu77-intrinsics-delete -fbadu77-intrinsics-hide @gol
+-fbadu77-intrinsics-disable -fbadu77-intrinsics-enable @gol
+-ff90-intrinsics-delete -ff90-intrinsics-hide @gol
+-ff90-intrinsics-disable -ff90-intrinsics-enable @gol
+-fgnu-intrinsics-delete -fgnu-intrinsics-hide @gol
+-fgnu-intrinsics-disable -fgnu-intrinsics-enable @gol
+-fmil-intrinsics-delete -fmil-intrinsics-hide @gol
+-fmil-intrinsics-disable -fmil-intrinsics-enable @gol
+-funix-intrinsics-delete -funix-intrinsics-hide @gol
+-funix-intrinsics-disable -funix-intrinsics-enable @gol
+-fvxt-intrinsics-delete -fvxt-intrinsics-hide @gol
+-fvxt-intrinsics-disable -fvxt-intrinsics-enable @gol
-ffixed-line-length-@var{n} -ffixed-line-length-none}
@item Warning Options
@xref{Warning Options,,Options to Request or Suppress Warnings}.
@gccoptlist{
--fsyntax-only -pedantic -pedantic-errors -fpedantic
--w -Wno-globals -Wimplicit -Wunused -Wuninitialized
--Wall -Wsurprising
+-fsyntax-only -pedantic -pedantic-errors -fpedantic @gol
+-w -Wno-globals -Wimplicit -Wunused -Wuninitialized @gol
+-Wall -Wsurprising @gol
-Werror -W}
@item Debugging Options
@@ -179,14 +179,14 @@ by type. Explanations are in the following sections.
@item Optimization Options
@xref{Optimize Options,,Options that Control Optimization}.
@gccoptlist{
--malign-double
--ffloat-store -fforce-mem -fforce-addr -fno-inline
--ffast-math -fstrength-reduce -frerun-cse-after-loop
--funsafe-math-optimizations -fno-trapping-math
--fexpensive-optimizations -fdelayed-branch
--fschedule-insns -fschedule-insn2 -fcaller-saves
--funroll-loops -funroll-all-loops
--fno-move-all-movables -fno-reduce-all-givs
+-malign-double @gol
+-ffloat-store -fforce-mem -fforce-addr -fno-inline @gol
+-ffast-math -fstrength-reduce -frerun-cse-after-loop @gol
+-funsafe-math-optimizations -fno-trapping-math @gol
+-fexpensive-optimizations -fdelayed-branch @gol
+-fschedule-insns -fschedule-insn2 -fcaller-saves @gol
+-funroll-loops -funroll-all-loops @gol
+-fno-move-all-movables -fno-reduce-all-givs @gol
-fno-rerun-loop-opt}
@item Directory Options
@@ -197,15 +197,15 @@ by type. Explanations are in the following sections.
@item Code Generation Options
@xref{Code Gen Options,,Options for Code Generation Conventions}.
@gccoptlist{
--fno-automatic -finit-local-zero -fno-f2c
--ff2c-library -fno-underscoring -fno-ident
--fpcc-struct-return -freg-struct-return
--fshort-double -fno-common -fpack-struct
--fzeros -fno-second-underscore
--femulate-complex
--falias-check -fargument-alias
--fargument-noalias -fno-argument-noalias-global
--fno-globals -fflatten-arrays
+-fno-automatic -finit-local-zero -fno-f2c @gol
+-ff2c-library -fno-underscoring -fno-ident @gol
+-fpcc-struct-return -freg-struct-return @gol
+-fshort-double -fno-common -fpack-struct @gol
+-fzeros -fno-second-underscore @gol
+-femulate-complex @gol
+-falias-check -fargument-alias @gol
+-fargument-noalias -fno-argument-noalias-global @gol
+-fno-globals -fflatten-arrays @gol
-fbounds-check -ffortran-bounds-check}
@end table
@@ -1398,6 +1398,37 @@ either your program or @command{g77}
Produce debugging information in the operating system's native format
(stabs, COFF, XCOFF, or DWARF). GDB can work with this debugging
information.
+
+A sample debugging session looks like this (note the use of the breakpoint):
+@smallexample
+$ cat gdb.f
+ PROGRAM PROG
+ DIMENSION A(10)
+ DATA A /1.,2.,3.,4.,5.,6.,7.,8.,9.,10./
+ A(5) = 4.
+ PRINT*,A
+ END
+$ g77 -g -O gdb.f
+$ gdb a.out
+...
+(gdb) break MAIN__
+Breakpoint 1 at 0x8048e96: file gdb.f, line 4.
+(gdb) run
+Starting program: /home/toon/g77-bugs/./a.out
+Breakpoint 1, MAIN__ () at gdb.f:4
+4 A(5) = 4.
+Current language: auto; currently fortran
+(gdb) print a(5)
+$1 = 5
+(gdb) step
+5 PRINT*,A
+(gdb) print a(5)
+$2 = 4
+...
+@end smallexample
+One could also add the setting of the breakpoint and the first run command
+to the file @file{.gdbinit} in the current directory, to simplify the debugging
+session.
@end table
@xref{Debugging Options,,Options for Debugging Your Program or GCC,
diff --git a/contrib/gcc/f/lex.c b/contrib/gcc/f/lex.c
index acbb4d3..d9f3bad 100644
--- a/contrib/gcc/f/lex.c
+++ b/contrib/gcc/f/lex.c
@@ -1,5 +1,6 @@
/* Implementation of Fortran lexer
- Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, 1998, 2001, 2002
+ Free Software Foundation, Inc.
Contributed by James Craig Burley.
This file is part of GNU Fortran.
@@ -269,6 +270,7 @@ ffelex_backslash_ (int c, ffewhereColumnNumber col)
case 'x':
if (warn_traditional)
{
+ /* xgettext:no-c-format */
ffebad_start_msg_lex ("The meaning of `\\x' (at %0) varies with -traditional",
FFEBAD_severityWARNING);
ffelex_bad_here_ (0, line, column);
@@ -319,6 +321,7 @@ ffelex_backslash_ (int c, ffewhereColumnNumber col)
case 'a':
if (warn_traditional)
{
+ /* xgettext:no-c-format */
ffebad_start_msg_lex ("The meaning of `\\a' (at %0) varies with -traditional",
FFEBAD_severityWARNING);
ffelex_bad_here_ (0, line, column);
@@ -348,6 +351,7 @@ ffelex_backslash_ (int c, ffewhereColumnNumber col)
m[0] = c;
m[1] = '\0';
+ /* xgettext:no-c-format */
ffebad_start_msg_lex ("Non-ISO-C-standard escape sequence `\\%A' at %0",
FFEBAD_severityPEDANTIC);
ffelex_bad_here_ (0, line, column);
@@ -366,6 +370,7 @@ ffelex_backslash_ (int c, ffewhereColumnNumber col)
m[0] = c;
m[1] = '\0';
+ /* xgettext:no-c-format */
ffebad_start_msg_lex ("Unknown escape sequence `\\%A' at %0",
FFEBAD_severityPEDANTIC);
ffelex_bad_here_ (0, line, column);
@@ -374,6 +379,7 @@ ffelex_backslash_ (int c, ffewhereColumnNumber col)
}
else if (c == EOF)
{
+ /* xgettext:no-c-format */
ffebad_start_msg_lex ("Unterminated escape sequence `\\' at %0",
FFEBAD_severityPEDANTIC);
ffelex_bad_here_ (0, line, column);
@@ -384,6 +390,7 @@ ffelex_backslash_ (int c, ffewhereColumnNumber col)
char m[20];
sprintf (&m[0], "%x", c);
+ /* xgettext:no-c-format */
ffebad_start_msg_lex ("Unknown escape sequence `\\' followed by char code 0x%A at %0",
FFEBAD_severityPEDANTIC);
ffelex_bad_here_ (0, line, column);
@@ -411,6 +418,7 @@ ffelex_backslash_ (int c, ffewhereColumnNumber col)
if (! nonnull)
{
+ /* xgettext:no-c-format */
ffebad_start_msg_lex ("\\x used at %0 with no following hex digits",
FFEBAD_severityFATAL);
ffelex_bad_here_ (0, line, column);
@@ -424,6 +432,7 @@ ffelex_backslash_ (int c, ffewhereColumnNumber col)
&& ((1 << (TYPE_PRECISION (integer_type_node) - (count - 1) * 4))
<= (int) firstdig)))
{
+ /* xgettext:no-c-format */
ffebad_start_msg_lex ("Hex escape at %0 out of range",
FFEBAD_severityPEDANTIC);
ffelex_bad_here_ (0, line, column);
@@ -457,6 +466,7 @@ ffelex_backslash_ (int c, ffewhereColumnNumber col)
&& TYPE_PRECISION (char_type_node) < HOST_BITS_PER_INT
&& code >= (1 << TYPE_PRECISION (char_type_node)))
{
+ /* xgettext:no-c-format */
ffebad_start_msg_lex ("Escape sequence at %0 out of range for character",
FFEBAD_severityFATAL);
ffelex_bad_here_ (0, line, column);
@@ -1462,6 +1472,7 @@ ffelex_image_char_ (int c, ffewhereColumnNumber column)
ffelex_bad_line_ = TRUE;
strcpy (&ffelex_card_image_[column], "[\\0]");
ffelex_card_length_ = column + 4;
+ /* xgettext:no-c-format */
ffebad_start_msg_lex ("Null character at %0 -- line ignored",
FFEBAD_severityFATAL);
ffelex_bad_here_ (0, ffelex_linecount_current_, column + 1);
diff --git a/contrib/gcc/f/news.texi b/contrib/gcc/f/news.texi
index 55341b3..beb5184 100644
--- a/contrib/gcc/f/news.texi
+++ b/contrib/gcc/f/news.texi
@@ -1,4 +1,5 @@
-@c Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+@c Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+@c Free Software Foundation, Inc.
@c This is part of the G77 manual.
@c For copying conditions, see the file g77.texi.
@@ -7,9 +8,9 @@
@c Keep this the same as the dates above, since it's used
@c in the standalone derivations of this file (e.g. NEWS).
-@set copyrights-news 1995,1996,1997,1998,1999,2000,2001
+@set copyrights-news 1995,1996,1997,1998,1999,2000,2001,2002
-@set last-update-news 2001-11-20
+@set last-update-news 2002-04-13
@include root.texi
@@ -152,9 +153,38 @@ is available at
The following information was last updated on @value{last-update-news}:
-@heading In development, 0.5.27, @code{GCC} 3.1 versus @code{GCC} 3.0:
+@heading In @code{GCC} 3.1 (formerly known as g77-0.5.27) versus @code{GCC} 3.0:
@itemize @bullet
@item
+Problem Reports fixed (in chronological order of submission):
+@table @code
+@item 947
+Data statement initialization with subscript of kind INTEGER*2
+@item 3743
+Reference to intrinsic `ISHFT' invalid
+@item 3807
+Function BESJN(integer,double) problems
+@item 3957
+g77 -pipe -xf77-cpp-input sends output to stdout
+@item 4279
+g77 -h" gives bogus output
+@item 4730
+ICE on valid input using CALL EXIT(%VAL(...))
+@item 4752
+g77 -v -c -xf77-version /dev/null -xnone causes ice
+@item 4885
+BACKSPACE example that doesn't work as of gcc/g77-3.0.x
+@item 5122
+g77 rejects accepted use of INTEGER*2 as type of DATA statement loop index
+@item 5397
+ICE on compiling source with 540 000 000 REAL array
+@item 5473
+ICE on BESJN(integer*8,real)
+@item 5837
+bug in loop unrolling
+@end table
+
+@item
@command{g77} now has its man page generated from the texinfo documentation,
to guarantee that it remains up to date.
diff --git a/contrib/gcc/f/proj.h b/contrib/gcc/f/proj.h
index fd4a65c..8cf54c9 100644
--- a/contrib/gcc/f/proj.h
+++ b/contrib/gcc/f/proj.h
@@ -1,5 +1,5 @@
/* proj.h file for Gnu Fortran
- Copyright (C) 1995, 1996, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 2000, 2001, 2002 Free Software Foundation, Inc.
Contributed by James Craig Burley.
This file is part of GNU Fortran.
@@ -32,7 +32,7 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#if (GCC_VERSION < 2000)
- #error "You have to use gcc 2.x to build g77 (might be fixed in g77-0.6)."
+ #error "You have to use gcc 2.x to build g77."
#endif
/* Include files everyone gets. <assert.h> is needed for assert(). */
diff --git a/contrib/gcc/f/root.texi b/contrib/gcc/f/root.texi
index 2ea699e..bcc52cf 100644
--- a/contrib/gcc/f/root.texi
+++ b/contrib/gcc/f/root.texi
@@ -2,8 +2,7 @@
@c as compared to a release version. When making a release
@c (e.g. a release branch in the CVS repository for gcc),
@c clear this and set the version information correctly.
-@set DEVELOPMENT
-@set version-g77 0.5.27
+@clear DEVELOPMENT
@set version-gcc 3.1
@set email-general gcc@@gcc.gnu.org
diff --git a/contrib/gcc/f/stb.c b/contrib/gcc/f/stb.c
index ef523c4..bf456a1 100644
--- a/contrib/gcc/f/stb.c
+++ b/contrib/gcc/f/stb.c
@@ -1,5 +1,5 @@
/* stb.c -- Implementation File (module.c template V1.0)
- Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 2002 Free Software Foundation, Inc.
Contributed by James Craig Burley.
This file is part of GNU Fortran.
@@ -12074,6 +12074,7 @@ ffestb_S3P41_ (ffelexToken ft, ffebld expr, ffelexToken t)
&& ((ffelex_token_type (t) == FFELEX_typeSEMICOLON)
|| ffesta_line_has_semicolons))
{
+ /* xgettext:no-c-format */
ffebad_start_msg ("INCLUDE at %0 not the only statement on the source line", FFEBAD_severityWARNING);
ffebad_here (0, ffelex_token_where_line (ffesta_tokens[0]),
ffelex_token_where_column (ffesta_tokens[0]));
diff --git a/contrib/gcc/f/ste.c b/contrib/gcc/f/ste.c
index 8bb9c2d..2959984 100644
--- a/contrib/gcc/f/ste.c
+++ b/contrib/gcc/f/ste.c
@@ -1,5 +1,5 @@
/* ste.c -- Implementation File (module.c template V1.0)
- Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 2000, 2002 Free Software Foundation, Inc.
Contributed by James Craig Burley.
This file is part of GNU Fortran.
@@ -2632,6 +2632,7 @@ ffeste_R809 (ffestw block, ffebld expr)
{
/* ~~~Someday handle CHARACTER*1, CHARACTER*N */
+ /* xgettext:no-c-format */
ffebad_start_msg ("SELECT CASE on CHARACTER type (at %0) not supported -- sorry",
FFEBAD_severityFATAL);
ffebad_here (0, ffestw_line (block), ffestw_col (block));
diff --git a/contrib/gcc/f/stu.c b/contrib/gcc/f/stu.c
index bd96ee7..1d58731 100644
--- a/contrib/gcc/f/stu.c
+++ b/contrib/gcc/f/stu.c
@@ -1,5 +1,5 @@
/* stu.c -- Implementation File (module.c template V1.0)
- Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, 2002 Free Software Foundation, Inc.
Contributed by James Craig Burley.
This file is part of GNU Fortran.
@@ -301,6 +301,7 @@ ffestu_sym_end_transition (ffesymbol s)
if (sa & FFESYMBOL_attrsADJUSTABLE)
{ /* Not actually in any dummy list! */
if (ffe_is_pedantic ()
+ /* xgettext:no-c-format */
&& ffebad_start_msg ("Local adjustable symbol `%A' at %0",
FFEBAD_severityPEDANTIC))
{
diff --git a/contrib/gcc/f/target.c b/contrib/gcc/f/target.c
index 11fb0b1..f934a8f 100644
--- a/contrib/gcc/f/target.c
+++ b/contrib/gcc/f/target.c
@@ -1,5 +1,5 @@
/* target.c -- Implementation File (module.c template V1.0)
- Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, 1998, 2002 Free Software Foundation, Inc.
Contributed by James Craig Burley.
This file is part of GNU Fortran.
@@ -71,6 +71,7 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "proj.h"
#include "glimits.h"
#include "target.h"
+#include "diagnostic.h"
#include "bad.h"
#include "info.h"
#include "lex.h"
@@ -2519,6 +2520,47 @@ ffetarget_verify_character1 (mallocPool pool, ffetargetCharacter1 val)
void *
ffetarget_memcpy_ (void *dst, void *src, size_t len)
{
+#ifdef CROSS_COMPILE
+ int host_words_big_endian =
+#ifndef HOST_WORDS_BIG_ENDIAN
+ 0
+#else
+ HOST_WORDS_BIG_ENDIAN
+#endif
+ ;
+
+ int host_bytes_big_endian =
+#ifndef HOST_BYTES_BIG_ENDIAN
+ 0
+#else
+ HOST_BYTES_BIG_ENDIAN
+#endif
+ ;
+
+ int host_bits_big_endian =
+#ifndef HOST_BITS_BIG_ENDIAN
+ 0
+#else
+ HOST_BITS_BIG_ENDIAN
+#endif
+ ;
+
+ /* This is just hands thrown up in the air over bits coming through this
+ function representing a number being memcpy:d as-is from host to
+ target. We can't generally adjust endianness here since we don't
+ know whether it's an integer or floating point number; they're passed
+ differently. Better to not emit code at all than to emit wrong code.
+ We will get some false hits because some data coming through here
+ seems to be just character vectors, but often enough it's numbers,
+ for instance in g77.f-torture/execute/980628-[4-6].f and alpha2.f.
+ Still, we compile *some* code. FIXME: Rewrite handling of numbers. */
+ if (!WORDS_BIG_ENDIAN != !host_words_big_endian
+ || !BYTES_BIG_ENDIAN != !host_bytes_big_endian
+ || !BITS_BIG_ENDIAN != !host_bits_big_endian)
+ sorry ("data initializer on host with different endianness");
+
+#endif /* CROSS_COMPILE */
+
return (void *) memcpy (dst, src, len);
}
diff --git a/contrib/gcc/f/target.h b/contrib/gcc/f/target.h
index 85b385d..09fbe5f 100644
--- a/contrib/gcc/f/target.h
+++ b/contrib/gcc/f/target.h
@@ -234,7 +234,7 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define FFETARGET_f2cTYLOGICAL2 13
#define FFETARGET_f2cTYQUAD 14
-#if !defined(__alpha__) && (!defined (_ARCH_PPC) || !defined (__64BIT__)) && (!defined(__sparc__) || (!defined(__sparcv9) && !defined(__arch64__))) && (!defined(__ia64__) || !defined(__LP64__)) && (!defined(__hppa__) || !defined(__LP64__)) && !defined(__s390x__)
+#if !defined(__alpha__) && (!defined (_ARCH_PPC) || !defined (__64BIT__)) && (!defined(__sparc__) || (!defined(__sparcv9) && !defined(__arch64__))) && (!defined(__ia64__) || !defined(__LP64__)) && (!defined(__hppa__) || !defined(__LP64__)) && !defined(__s390x__) && !defined(__x86_64__)
#define FFETARGET_32bit_longs
#endif
diff --git a/contrib/gcc/f/version.c b/contrib/gcc/f/version.c
index 12c8e84..d447ab6 100644
--- a/contrib/gcc/f/version.c
+++ b/contrib/gcc/f/version.c
@@ -1,4 +1,4 @@
#include "ansidecl.h"
#include "f/version.h"
-const char *const ffe_version_string = "0.5.27 20020201 (experimental)";
+const char *const ffe_version_string = "3.1 20020509 (prerelease)";
diff --git a/contrib/gcc/fibheap.c b/contrib/gcc/fibheap.c
new file mode 100644
index 0000000..0ba9b8d
--- /dev/null
+++ b/contrib/gcc/fibheap.c
@@ -0,0 +1,523 @@
+/* A Fibonacci heap datatype.
+ Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Contributed by Daniel Berlin (dan@cgsoftware.com).
+
+This file is part of GNU CC.
+
+GNU CC 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.
+
+GNU CC 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 GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#include "libiberty.h"
+#include "fibheap.h"
+
+
+#define FIBHEAPKEY_MIN LONG_MIN
+
+static void fibheap_ins_root PARAMS ((fibheap_t, fibnode_t));
+static void fibheap_rem_root PARAMS ((fibheap_t, fibnode_t));
+static void fibheap_consolidate PARAMS ((fibheap_t));
+static void fibheap_link PARAMS ((fibheap_t, fibnode_t, fibnode_t));
+static void fibheap_cut PARAMS ((fibheap_t, fibnode_t, fibnode_t));
+static void fibheap_cascading_cut PARAMS ((fibheap_t, fibnode_t));
+static fibnode_t fibheap_extr_min_node PARAMS ((fibheap_t));
+static int fibheap_compare PARAMS ((fibheap_t, fibnode_t, fibnode_t));
+static int fibheap_comp_data PARAMS ((fibheap_t, fibheapkey_t, void *,
+ fibnode_t));
+static fibnode_t fibnode_new PARAMS ((void));
+static void fibnode_insert_after PARAMS ((fibnode_t, fibnode_t));
+#define fibnode_insert_before(a, b) fibnode_insert_after (a->left, b)
+static fibnode_t fibnode_remove PARAMS ((fibnode_t));
+
+
+/* Create a new fibonacci heap. */
+fibheap_t
+fibheap_new ()
+{
+ return (fibheap_t) xcalloc (1, sizeof (struct fibheap));
+}
+
+/* Create a new fibonacci heap node. */
+static fibnode_t
+fibnode_new ()
+{
+ fibnode_t node;
+
+ node = xcalloc (1, sizeof *node);
+ node->left = node;
+ node->right = node;
+
+ return node;
+}
+
+static inline int
+fibheap_compare (heap, a, b)
+ fibheap_t heap ATTRIBUTE_UNUSED;
+ fibnode_t a;
+ fibnode_t b;
+{
+ if (a->key < b->key)
+ return -1;
+ if (a->key > b->key)
+ return 1;
+ return 0;
+}
+
+static inline int
+fibheap_comp_data (heap, key, data, b)
+ fibheap_t heap;
+ fibheapkey_t key;
+ void *data;
+ fibnode_t b;
+{
+ struct fibnode a;
+
+ a.key = key;
+ a.data = data;
+
+ return fibheap_compare (heap, &a, b);
+}
+
+/* Insert DATA, with priority KEY, into HEAP. */
+fibnode_t
+fibheap_insert (heap, key, data)
+ fibheap_t heap;
+ fibheapkey_t key;
+ void *data;
+{
+ fibnode_t node;
+
+ /* Create the new node. */
+ node = fibnode_new ();
+
+ /* Set the node's data. */
+ node->data = data;
+ node->key = key;
+
+ /* Insert it into the root list. */
+ fibheap_ins_root (heap, node);
+
+ /* If their was no minimum, or this key is less than the min,
+ it's the new min. */
+ if (heap->min == NULL || node->key < heap->min->key)
+ heap->min = node;
+
+ heap->nodes++;
+
+ return node;
+}
+
+/* Return the data of the minimum node (if we know it). */
+void *
+fibheap_min (heap)
+ fibheap_t heap;
+{
+ /* If there is no min, we can't easily return it. */
+ if (heap->min == NULL)
+ return NULL;
+ return heap->min->data;
+}
+
+/* Return the key of the minimum node (if we know it). */
+fibheapkey_t
+fibheap_min_key (heap)
+ fibheap_t heap;
+{
+ /* If there is no min, we can't easily return it. */
+ if (heap->min == NULL)
+ return 0;
+ return heap->min->key;
+}
+
+/* Union HEAPA and HEAPB into a new heap. */
+fibheap_t
+fibheap_union (heapa, heapb)
+ fibheap_t heapa;
+ fibheap_t heapb;
+{
+ fibnode_t a_root, b_root, temp;
+
+ /* If one of the heaps is empty, the union is just the other heap. */
+ if ((a_root = heapa->root) == NULL)
+ {
+ free (heapa);
+ return heapb;
+ }
+ if ((b_root = heapb->root) == NULL)
+ {
+ free (heapb);
+ return heapa;
+ }
+
+ /* Merge them to the next nodes on the opposite chain. */
+ a_root->left->right = b_root;
+ b_root->left->right = a_root;
+ temp = a_root->left;
+ a_root->left = b_root->left;
+ b_root->left = temp;
+ heapa->nodes += heapb->nodes;
+
+ /* And set the new minimum, if it's changed. */
+ if (fibheap_compare (heapa, heapb->min, heapa->min) < 0)
+ heapa->min = heapb->min;
+
+ free (heapb);
+ return heapa;
+}
+
+/* Extract the data of the minimum node from HEAP. */
+void *
+fibheap_extract_min (heap)
+ fibheap_t heap;
+{
+ fibnode_t z;
+ void *ret = NULL;
+
+ /* If we don't have a min set, it means we have no nodes. */
+ if (heap->min != NULL)
+ {
+ /* Otherwise, extract the min node, free the node, and return the
+ node's data. */
+ z = fibheap_extr_min_node (heap);
+ ret = z->data;
+ free (z);
+ }
+
+ return ret;
+}
+
+/* Replace both the KEY and the DATA associated with NODE. */
+void *
+fibheap_replace_key_data (heap, node, key, data)
+ fibheap_t heap;
+ fibnode_t node;
+ fibheapkey_t key;
+ void *data;
+{
+ void *odata;
+ int okey;
+ fibnode_t y;
+
+ /* If we wanted to, we could actually do a real increase by redeleting and
+ inserting. However, this would require O (log n) time. So just bail out
+ for now. */
+ if (fibheap_comp_data (heap, key, data, node) > 0)
+ return NULL;
+
+ odata = node->data;
+ okey = node->key;
+ node->data = data;
+ node->key = key;
+ y = node->parent;
+
+ if (okey == key)
+ return odata;
+
+ /* These two compares are specifically <= 0 to make sure that in the case
+ of equality, a node we replaced the data on, becomes the new min. This
+ is needed so that delete's call to extractmin gets the right node. */
+ if (y != NULL && fibheap_compare (heap, node, y) <= 0)
+ {
+ fibheap_cut (heap, node, y);
+ fibheap_cascading_cut (heap, y);
+ }
+
+ if (fibheap_compare (heap, node, heap->min) <= 0)
+ heap->min = node;
+
+ return odata;
+}
+
+/* Replace the DATA associated with NODE. */
+void *
+fibheap_replace_data (heap, node, data)
+ fibheap_t heap;
+ fibnode_t node;
+ void *data;
+{
+ return fibheap_replace_key_data (heap, node, node->key, data);
+}
+
+/* Replace the KEY associated with NODE. */
+fibheapkey_t
+fibheap_replace_key (heap, node, key)
+ fibheap_t heap;
+ fibnode_t node;
+ fibheapkey_t key;
+{
+ int okey = node->key;
+ fibheap_replace_key_data (heap, node, key, node->data);
+ return okey;
+}
+
+/* Delete NODE from HEAP. */
+void *
+fibheap_delete_node (heap, node)
+ fibheap_t heap;
+ fibnode_t node;
+{
+ void *ret = node->data;
+
+ /* To perform delete, we just make it the min key, and extract. */
+ fibheap_replace_key (heap, node, FIBHEAPKEY_MIN);
+ fibheap_extract_min (heap);
+
+ return ret;
+}
+
+/* Delete HEAP. */
+void
+fibheap_delete (heap)
+ fibheap_t heap;
+{
+ while (heap->min != NULL)
+ free (fibheap_extr_min_node (heap));
+
+ free (heap);
+}
+
+/* Determine if HEAP is empty. */
+int
+fibheap_empty (heap)
+ fibheap_t heap;
+{
+ return heap->nodes == 0;
+}
+
+/* Extract the minimum node of the heap. */
+static fibnode_t
+fibheap_extr_min_node (heap)
+ fibheap_t heap;
+{
+ fibnode_t ret = heap->min;
+ fibnode_t x, y, orig;
+
+ /* Attach the child list of the minimum node to the root list of the heap.
+ If there is no child list, we don't do squat. */
+ for (x = ret->child, orig = NULL; x != orig && x != NULL; x = y)
+ {
+ if (orig == NULL)
+ orig = x;
+ y = x->right;
+ x->parent = NULL;
+ fibheap_ins_root (heap, x);
+ }
+
+ /* Remove the old root. */
+ fibheap_rem_root (heap, ret);
+ heap->nodes--;
+
+ /* If we are left with no nodes, then the min is NULL. */
+ if (heap->nodes == 0)
+ heap->min = NULL;
+ else
+ {
+ /* Otherwise, consolidate to find new minimum, as well as do the reorg
+ work that needs to be done. */
+ heap->min = ret->right;
+ fibheap_consolidate (heap);
+ }
+
+ return ret;
+}
+
+/* Insert NODE into the root list of HEAP. */
+static void
+fibheap_ins_root (heap, node)
+ fibheap_t heap;
+ fibnode_t node;
+{
+ /* If the heap is currently empty, the new node becomes the singleton
+ circular root list. */
+ if (heap->root == NULL)
+ {
+ heap->root = node;
+ node->left = node;
+ node->right = node;
+ return;
+ }
+
+ /* Otherwise, insert it in the circular root list between the root
+ and it's right node. */
+ fibnode_insert_after (heap->root, node);
+}
+
+/* Remove NODE from the rootlist of HEAP. */
+static void
+fibheap_rem_root (heap, node)
+ fibheap_t heap;
+ fibnode_t node;
+{
+ if (node->left == node)
+ heap->root = NULL;
+ else
+ heap->root = fibnode_remove (node);
+}
+
+/* Consolidate the heap. */
+static void
+fibheap_consolidate (heap)
+ fibheap_t heap;
+{
+ fibnode_t a[1 + 8 * sizeof (long)];
+ fibnode_t w;
+ fibnode_t y;
+ fibnode_t x;
+ int i;
+ int d;
+ int D;
+
+ D = 1 + 8 * sizeof (long);
+
+ memset (a, 0, sizeof (fibnode_t) * D);
+
+ while ((w = heap->root) != NULL)
+ {
+ x = w;
+ fibheap_rem_root (heap, w);
+ d = x->degree;
+ while (a[d] != NULL)
+ {
+ y = a[d];
+ if (fibheap_compare (heap, x, y) > 0)
+ {
+ fibnode_t temp;
+ temp = x;
+ x = y;
+ y = temp;
+ }
+ fibheap_link (heap, y, x);
+ a[d] = NULL;
+ d++;
+ }
+ a[d] = x;
+ }
+ heap->min = NULL;
+ for (i = 0; i < D; i++)
+ if (a[i] != NULL)
+ {
+ fibheap_ins_root (heap, a[i]);
+ if (heap->min == NULL || fibheap_compare (heap, a[i], heap->min) < 0)
+ heap->min = a[i];
+ }
+}
+
+/* Make NODE a child of PARENT. */
+static void
+fibheap_link (heap, node, parent)
+ fibheap_t heap ATTRIBUTE_UNUSED;
+ fibnode_t node;
+ fibnode_t parent;
+{
+ if (parent->child == NULL)
+ parent->child = node;
+ else
+ fibnode_insert_before (parent->child, node);
+ node->parent = parent;
+ parent->degree++;
+ node->mark = 0;
+}
+
+/* Remove NODE from PARENT's child list. */
+static void
+fibheap_cut (heap, node, parent)
+ fibheap_t heap;
+ fibnode_t node;
+ fibnode_t parent;
+{
+ fibnode_remove (node);
+ parent->degree--;
+ fibheap_ins_root (heap, node);
+ node->parent = NULL;
+ node->mark = 0;
+}
+
+static void
+fibheap_cascading_cut (heap, y)
+ fibheap_t heap;
+ fibnode_t y;
+{
+ fibnode_t z;
+
+ while ((z = y->parent) != NULL)
+ {
+ if (y->mark == 0)
+ {
+ y->mark = 1;
+ return;
+ }
+ else
+ {
+ fibheap_cut (heap, y, z);
+ y = z;
+ }
+ }
+}
+
+static void
+fibnode_insert_after (a, b)
+ fibnode_t a;
+ fibnode_t b;
+{
+ if (a == a->right)
+ {
+ a->right = b;
+ a->left = b;
+ b->right = a;
+ b->left = a;
+ }
+ else
+ {
+ b->right = a->right;
+ a->right->left = b;
+ a->right = b;
+ b->left = a;
+ }
+}
+
+static fibnode_t
+fibnode_remove (node)
+ fibnode_t node;
+{
+ fibnode_t ret;
+
+ if (node == node->left)
+ ret = NULL;
+ else
+ ret = node->left;
+
+ if (node->parent != NULL && node->parent->child == node)
+ node->parent->child = ret;
+
+ node->right->left = node->left;
+ node->left->right = node->right;
+
+ node->parent = NULL;
+ node->left = node;
+ node->right = node;
+
+ return ret;
+}
diff --git a/contrib/gcc/fibheap.h b/contrib/gcc/fibheap.h
new file mode 100644
index 0000000..d109e4a
--- /dev/null
+++ b/contrib/gcc/fibheap.h
@@ -0,0 +1,81 @@
+/* A Fibonacci heap datatype.
+ Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Contributed by Daniel Berlin (dan@cgsoftware.com).
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Fibonacci heaps are somewhat complex, but, there's an article in
+ DDJ that explains them pretty well:
+
+ http://www.ddj.com/articles/1997/9701/9701o/9701o.htm?topic=algoritms
+
+ Introduction to algorithms by Corman and Rivest also goes over them.
+
+ The original paper that introduced them is "Fibonacci heaps and their
+ uses in improved network optimization algorithms" by Tarjan and
+ Fredman (JACM 34(3), July 1987).
+
+ Amortized and real worst case time for operations:
+
+ ExtractMin: O(lg n) amortized. O(n) worst case.
+ DecreaseKey: O(1) amortized. O(lg n) worst case.
+ Insert: O(2) amortized. O(1) actual.
+ Union: O(1) amortized. O(1) actual. */
+
+#ifndef _FIBHEAP_H_
+#define _FIBHEAP_H_
+
+#include <ansidecl.h>
+
+typedef long fibheapkey_t;
+
+typedef struct fibheap
+{
+ size_t nodes;
+ struct fibnode *min;
+ struct fibnode *root;
+} *fibheap_t;
+
+typedef struct fibnode
+{
+ struct fibnode *parent;
+ struct fibnode *child;
+ struct fibnode *left;
+ struct fibnode *right;
+ fibheapkey_t key;
+ void *data;
+ unsigned int degree : 31;
+ unsigned int mark : 1;
+} *fibnode_t;
+
+extern fibheap_t fibheap_new PARAMS ((void));
+extern fibnode_t fibheap_insert PARAMS ((fibheap_t, fibheapkey_t, void *));
+extern int fibheap_empty PARAMS ((fibheap_t));
+extern fibheapkey_t fibheap_min_key PARAMS ((fibheap_t));
+extern fibheapkey_t fibheap_replace_key PARAMS ((fibheap_t, fibnode_t,
+ fibheapkey_t));
+extern void *fibheap_replace_key_data PARAMS ((fibheap_t, fibnode_t,
+ fibheapkey_t, void *));
+extern void *fibheap_extract_min PARAMS ((fibheap_t));
+extern void *fibheap_min PARAMS ((fibheap_t));
+extern void *fibheap_replace_data PARAMS ((fibheap_t, fibnode_t, void *));
+extern void *fibheap_delete_node PARAMS ((fibheap_t, fibnode_t));
+extern void fibheap_delete PARAMS ((fibheap_t));
+extern fibheap_t fibheap_union PARAMS ((fibheap_t, fibheap_t));
+
+#endif /* _FIBHEAP_H_ */
diff --git a/contrib/gcc/flow.c b/contrib/gcc/flow.c
index 315cb2d..09c1094 100644
--- a/contrib/gcc/flow.c
+++ b/contrib/gcc/flow.c
@@ -167,6 +167,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#ifndef EPILOGUE_USES
#define EPILOGUE_USES(REGNO) 0
#endif
+#ifndef EH_USES
+#define EH_USES(REGNO) 0
+#endif
#ifdef HAVE_conditional_execution
#ifndef REVERSE_CONDEXEC_PREDICATES_P
@@ -633,6 +636,7 @@ update_life_info (blocks, extent, prop_flags)
regset tmp;
regset_head tmp_head;
int i;
+ int stabilized_prop_flags = prop_flags;
tmp = INITIALIZE_REG_SET (tmp_head);
@@ -676,8 +680,21 @@ update_life_info (blocks, extent, prop_flags)
| PROP_KILL_DEAD_CODE));
}
- if (! changed || ! cleanup_cfg (CLEANUP_EXPENSIVE))
+ /* Don't pass PROP_SCAN_DEAD_CODE or PROP_KILL_DEAD_CODE to
+ subsequent propagate_block calls, since removing or acting as
+ removing dead code can affect global register liveness, which
+ is supposed to be finalized for this call after this loop. */
+ stabilized_prop_flags
+ &= ~(PROP_SCAN_DEAD_CODE | PROP_KILL_DEAD_CODE);
+
+ if (! changed)
break;
+
+ /* We repeat regardless of what cleanup_cfg says. If there were
+ instructions deleted above, that might have been only a
+ partial improvement (see MAX_MEM_SET_LIST_LEN usage).
+ Further improvement may be possible. */
+ cleanup_cfg (CLEANUP_EXPENSIVE);
}
/* If asked, remove notes from the blocks we'll update. */
@@ -692,7 +709,7 @@ update_life_info (blocks, extent, prop_flags)
basic_block bb = BASIC_BLOCK (i);
COPY_REG_SET (tmp, bb->global_live_at_end);
- propagate_block (bb, tmp, NULL, NULL, prop_flags);
+ propagate_block (bb, tmp, NULL, NULL, stabilized_prop_flags);
if (extent == UPDATE_LIFE_LOCAL)
verify_local_live_at_start (tmp, bb);
@@ -705,7 +722,8 @@ update_life_info (blocks, extent, prop_flags)
basic_block bb = BASIC_BLOCK (i);
COPY_REG_SET (tmp, bb->global_live_at_end);
- propagate_block (bb, tmp, NULL, NULL, prop_flags);
+
+ propagate_block (bb, tmp, NULL, NULL, stabilized_prop_flags);
if (extent == UPDATE_LIFE_LOCAL)
verify_local_live_at_start (tmp, bb);
@@ -1077,6 +1095,11 @@ calculate_global_regs_live (blocks_in, blocks_out, flags)
}
}
+ /* We clean aux when we remove the initially-enqueued bbs, but we
+ don't enqueue ENTRY and EXIT initially, so clean them upfront and
+ unconditionally. */
+ ENTRY_BLOCK_PTR->aux = EXIT_BLOCK_PTR->aux = NULL;
+
if (blocks_out)
sbitmap_zero (blocks_out);
@@ -1111,21 +1134,40 @@ calculate_global_regs_live (blocks_in, blocks_out, flags)
/* Begin by propagating live_at_start from the successor blocks. */
CLEAR_REG_SET (new_live_at_end);
- for (e = bb->succ; e; e = e->succ_next)
- {
- basic_block sb = e->dest;
- /* Call-clobbered registers die across exception and call edges. */
- /* ??? Abnormal call edges ignored for the moment, as this gets
- confused by sibling call edges, which crashes reg-stack. */
- if (e->flags & EDGE_EH)
- {
- bitmap_operation (tmp, sb->global_live_at_start,
- call_used, BITMAP_AND_COMPL);
- IOR_REG_SET (new_live_at_end, tmp);
- }
- else
- IOR_REG_SET (new_live_at_end, sb->global_live_at_start);
+ if (bb->succ)
+ for (e = bb->succ; e; e = e->succ_next)
+ {
+ basic_block sb = e->dest;
+
+ /* Call-clobbered registers die across exception and
+ call edges. */
+ /* ??? Abnormal call edges ignored for the moment, as this gets
+ confused by sibling call edges, which crashes reg-stack. */
+ if (e->flags & EDGE_EH)
+ {
+ bitmap_operation (tmp, sb->global_live_at_start,
+ call_used, BITMAP_AND_COMPL);
+ IOR_REG_SET (new_live_at_end, tmp);
+ }
+ else
+ IOR_REG_SET (new_live_at_end, sb->global_live_at_start);
+
+ /* If a target saves one register in another (instead of on
+ the stack) the save register will need to be live for EH. */
+ if (e->flags & EDGE_EH)
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ if (EH_USES (i))
+ SET_REGNO_REG_SET (new_live_at_end, i);
+ }
+ else
+ {
+ /* This might be a noreturn function that throws. And
+ even if it isn't, getting the unwind info right helps
+ debugging. */
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ if (EH_USES (i))
+ SET_REGNO_REG_SET (new_live_at_end, i);
}
/* The all-important stack pointer must always be live. */
@@ -3543,6 +3585,10 @@ mark_used_reg (pbi, reg, cond, insn)
/* Mark the register as being live. */
for (i = regno_first; i <= regno_last; ++i)
{
+#ifdef HAVE_conditional_execution
+ int this_was_live = REGNO_REG_SET_P (pbi->reg_live, i);
+#endif
+
SET_REGNO_REG_SET (pbi->reg_live, i);
#ifdef HAVE_conditional_execution
@@ -3554,7 +3600,7 @@ mark_used_reg (pbi, reg, cond, insn)
struct reg_cond_life_info *rcli;
rtx ncond;
- if (some_was_live)
+ if (this_was_live)
{
node = splay_tree_lookup (pbi->reg_cond_dead, i);
if (node == NULL)
@@ -3596,7 +3642,7 @@ mark_used_reg (pbi, reg, cond, insn)
SET_REGNO_REG_SET (pbi->reg_cond_reg, REGNO (XEXP (cond, 0)));
}
}
- else if (some_was_live)
+ else if (this_was_live)
{
/* The register may have been conditionally live previously, but
is now unconditionally live. Remove it from the conditionally
@@ -3635,6 +3681,7 @@ mark_used_regs (pbi, x, cond, insn)
case CONST_INT:
case CONST:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case PC:
case ADDR_VEC:
case ADDR_DIFF_VEC:
diff --git a/contrib/gcc/fold-const.c b/contrib/gcc/fold-const.c
index 2f0d4ace..2169998 100644
--- a/contrib/gcc/fold-const.c
+++ b/contrib/gcc/fold-const.c
@@ -64,7 +64,7 @@ static void exact_real_inverse_1 PARAMS ((PTR));
#endif
static tree negate_expr PARAMS ((tree));
static tree split_tree PARAMS ((tree, enum tree_code, tree *, tree *,
- int));
+ tree *, int));
static tree associate_trees PARAMS ((tree, tree, enum tree_code, tree));
static tree int_const_binop PARAMS ((enum tree_code, tree, tree, int));
static void const_binop_1 PARAMS ((PTR));
@@ -109,10 +109,6 @@ static int count_cond PARAMS ((tree, int));
static tree fold_binary_op_with_conditional_arg
PARAMS ((enum tree_code, tree, tree, tree, int));
-#ifndef BRANCH_COST
-#define BRANCH_COST 1
-#endif
-
#if defined(HOST_EBCDIC)
/* bit 8 is significant in EBCDIC */
#define CHARMASK 0xff
@@ -1389,13 +1385,16 @@ negate_expr (t)
combined with CODE to make IN. "constant" means an expression with
TREE_CONSTANT but that isn't an actual constant. CODE must be a
commutative arithmetic operation. Store the constant part into *CONP,
- the literal in &LITP and return the variable part. If a part isn't
+ the literal in *LITP and return the variable part. If a part isn't
present, set it to null. If the tree does not decompose in this way,
return the entire tree as the variable part and the other parts as null.
If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR. In that
- case, we negate an operand that was subtracted. If NEGATE_P is true, we
- are negating all of IN.
+ case, we negate an operand that was subtracted. Except if it is a
+ literal for which we use *MINUS_LITP instead.
+
+ If NEGATE_P is true, we are negating all of IN, again except a literal
+ for which we use *MINUS_LITP instead.
If IN is itself a literal or constant, return it as appropriate.
@@ -1403,16 +1402,17 @@ negate_expr (t)
same type as IN, but they will have the same signedness and mode. */
static tree
-split_tree (in, code, conp, litp, negate_p)
+split_tree (in, code, conp, litp, minus_litp, negate_p)
tree in;
enum tree_code code;
- tree *conp, *litp;
+ tree *conp, *litp, *minus_litp;
int negate_p;
{
tree var = 0;
*conp = 0;
*litp = 0;
+ *minus_litp = 0;
/* Strip any conversions that don't change the machine mode or signedness. */
STRIP_SIGN_NOPS (in);
@@ -1454,9 +1454,12 @@ split_tree (in, code, conp, litp, negate_p)
var = op1, neg_var_p = neg1_p;
/* Now do any needed negations. */
- if (neg_litp_p) *litp = negate_expr (*litp);
- if (neg_conp_p) *conp = negate_expr (*conp);
- if (neg_var_p) var = negate_expr (var);
+ if (neg_litp_p)
+ *minus_litp = *litp, *litp = 0;
+ if (neg_conp_p)
+ *conp = negate_expr (*conp);
+ if (neg_var_p)
+ var = negate_expr (var);
}
else if (TREE_CONSTANT (in))
*conp = in;
@@ -1465,9 +1468,12 @@ split_tree (in, code, conp, litp, negate_p)
if (negate_p)
{
- var = negate_expr (var);
+ if (*litp)
+ *minus_litp = *litp, *litp = 0;
+ else if (*minus_litp)
+ *litp = *minus_litp, *minus_litp = 0;
*conp = negate_expr (*conp);
- *litp = negate_expr (*litp);
+ var = negate_expr (var);
}
return var;
@@ -1475,9 +1481,7 @@ split_tree (in, code, conp, litp, negate_p)
/* Re-associate trees split by the above function. T1 and T2 are either
expressions to associate or null. Return the new expression, if any. If
- we build an operation, do it in TYPE and with CODE, except if CODE is a
- MINUS_EXPR, in which case we use PLUS_EXPR since split_tree will already
- have taken care of the negations. */
+ we build an operation, do it in TYPE and with CODE. */
static tree
associate_trees (t1, t2, code, type)
@@ -1490,9 +1494,6 @@ associate_trees (t1, t2, code, type)
else if (t2 == 0)
return t1;
- if (code == MINUS_EXPR)
- code = PLUS_EXPR;
-
/* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
try to fold this since we will have infinite recursion. But do
deal with any NEGATE_EXPRs. */
@@ -2427,6 +2428,27 @@ operand_equal_p (arg0, arg1, only_const)
&& REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
TREE_REAL_CST (arg1)));
+ case VECTOR_CST:
+ {
+ tree v1, v2;
+
+ if (TREE_CONSTANT_OVERFLOW (arg0)
+ || TREE_CONSTANT_OVERFLOW (arg1))
+ return 0;
+
+ v1 = TREE_VECTOR_CST_ELTS (arg0);
+ v2 = TREE_VECTOR_CST_ELTS (arg1);
+ while (v1 && v2)
+ {
+ if (!operand_equal_p (v1, v2, only_const))
+ return 0;
+ v1 = TREE_CHAIN (v1);
+ v2 = TREE_CHAIN (v2);
+ }
+
+ return 1;
+ }
+
case COMPLEX_CST:
return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
only_const)
@@ -4442,8 +4464,8 @@ optimize_minmax_comparison (t)
other operations already in T. WIDE_TYPE, if non-null, is a type that
should be used for the computation if wider than our type.
- For example, if we are dividing (X * 8) + (Y + 16) by 4, we can return
- (X * 2) + (Y + 4). We must, however, be assured that either the original
+ For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
+ (X * 2) + (Y * 4). We must, however, be assured that either the original
expression would not overflow or that overflow is undefined for the type
in the language in question.
@@ -5184,6 +5206,7 @@ fold (expr)
{
case INTEGER_CST:
case REAL_CST:
+ case VECTOR_CST:
case STRING_CST:
case COMPLEX_CST:
case CONSTRUCTOR:
@@ -5658,24 +5681,68 @@ fold (expr)
&& (! FLOAT_TYPE_P (type)
|| (flag_unsafe_math_optimizations && code == MULT_EXPR)))
{
- tree var0, con0, lit0, var1, con1, lit1;
+ tree var0, con0, lit0, minus_lit0;
+ tree var1, con1, lit1, minus_lit1;
/* Split both trees into variables, constants, and literals. Then
associate each group together, the constants with literals,
then the result with variables. This increases the chances of
literals being recombined later and of generating relocatable
expressions for the sum of a constant and literal. */
- var0 = split_tree (arg0, code, &con0, &lit0, 0);
- var1 = split_tree (arg1, code, &con1, &lit1, code == MINUS_EXPR);
+ var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
+ var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
+ code == MINUS_EXPR);
/* Only do something if we found more than two objects. Otherwise,
nothing has changed and we risk infinite recursion. */
- if (2 < ((var0 != 0) + (var1 != 0) + (con0 != 0) + (con1 != 0)
- + (lit0 != 0) + (lit1 != 0)))
+ if (2 < ((var0 != 0) + (var1 != 0)
+ + (con0 != 0) + (con1 != 0)
+ + (lit0 != 0) + (lit1 != 0)
+ + (minus_lit0 != 0) + (minus_lit1 != 0)))
{
+ /* Recombine MINUS_EXPR operands by using PLUS_EXPR. */
+ if (code == MINUS_EXPR)
+ code = PLUS_EXPR;
+
var0 = associate_trees (var0, var1, code, type);
con0 = associate_trees (con0, con1, code, type);
lit0 = associate_trees (lit0, lit1, code, type);
+ minus_lit0 = associate_trees (minus_lit0, minus_lit1, code, type);
+
+ /* Preserve the MINUS_EXPR if the negative part of the literal is
+ greater than the positive part. Otherwise, the multiplicative
+ folding code (i.e extract_muldiv) may be fooled in case
+ unsigned constants are substracted, like in the following
+ example: ((X*2 + 4) - 8U)/2. */
+ if (minus_lit0 && lit0)
+ {
+ if (tree_int_cst_lt (lit0, minus_lit0))
+ {
+ minus_lit0 = associate_trees (minus_lit0, lit0,
+ MINUS_EXPR, type);
+ lit0 = 0;
+ }
+ else
+ {
+ lit0 = associate_trees (lit0, minus_lit0,
+ MINUS_EXPR, type);
+ minus_lit0 = 0;
+ }
+ }
+ if (minus_lit0)
+ {
+ if (con0 == 0)
+ return convert (type, associate_trees (var0, minus_lit0,
+ MINUS_EXPR, type));
+ else
+ {
+ con0 = associate_trees (con0, minus_lit0,
+ MINUS_EXPR, type);
+ return convert (type, associate_trees (var0, con0,
+ PLUS_EXPR, type));
+ }
+ }
+
con0 = associate_trees (con0, lit0, code, type);
return convert (type, associate_trees (var0, con0, code, type));
}
@@ -7090,7 +7157,7 @@ fold (expr)
STRIP_NOPS (arg2);
- /* If we have A op 0 ? A : -A, this is A, -A, abs (A), or abs (-A),
+ /* If we have A op 0 ? A : -A, this is A, -A, abs (A), or -abs (A),
depending on the comparison operation. */
if ((FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 1)))
? real_zerop (TREE_OPERAND (arg0, 1))
@@ -7586,6 +7653,23 @@ rtl_expr_nonnegative_p (r)
return CONST_DOUBLE_HIGH (r) >= 0;
return 0;
+ case CONST_VECTOR:
+ {
+ int units, i;
+ rtx elt;
+
+ units = CONST_VECTOR_NUNITS (r);
+
+ for (i = 0; i < units; ++i)
+ {
+ elt = CONST_VECTOR_ELT (r, i);
+ if (!rtl_expr_nonnegative_p (elt))
+ return 0;
+ }
+
+ return 1;
+ }
+
case SYMBOL_REF:
case LABEL_REF:
/* These are always nonnegative. */
diff --git a/contrib/gcc/function.h b/contrib/gcc/function.h
index 5cc0948..cddfce5 100644
--- a/contrib/gcc/function.h
+++ b/contrib/gcc/function.h
@@ -364,6 +364,9 @@ struct function
/* Highest label number in current function. */
int inl_max_label_num;
+ /* Profile label number. */
+ int profile_label_no;
+
/* For md files. */
/* tm.h can use this to store whatever it likes. */
@@ -508,6 +511,7 @@ extern int virtuals_instantiated;
#define current_function_return_rtx (cfun->return_rtx)
#define current_function_instrument_entry_exit (cfun->instrument_entry_exit)
#define current_function_profile (cfun->profile)
+#define current_function_profile_label_no (cfun->profile_label_no)
#define current_function_limit_stack (cfun->limit_stack)
#define current_function_uses_pic_offset_table (cfun->uses_pic_offset_table)
#define current_function_uses_const_pool (cfun->uses_const_pool)
diff --git a/contrib/gcc/gccbug.in b/contrib/gcc/gccbug.in
new file mode 100755
index 0000000..9619e61
--- /dev/null
+++ b/contrib/gcc/gccbug.in
@@ -0,0 +1,551 @@
+#!/bin/sh
+# Submit a problem report to a GNATS site.
+# Copyright (C) 1993, 2000, 2001, 2002 Free Software Foundation, Inc.
+# Contributed by Brendan Kehoe (brendan@cygnus.com), based on a
+# version written by Heinz G. Seidl (hgs@cygnus.com).
+#
+# This file is part of GNU GNATS.
+#
+# GNU GNATS 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.
+#
+# GNU GNATS 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 GNU GNATS; see the file COPYING. If not, write to
+# the Free Software Foundation, 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# The version of this send-pr.
+VERSION=3.113
+
+# The submitter-id for your site.
+SUBMITTER=net
+
+# The default mail address for PR submissions.
+GNATS_ADDR=gcc-gnats@gcc.gnu.org
+
+# The default release for this host.
+DEFAULT_RELEASE="@gcc_version_full@"
+
+# The default organization.
+DEFAULT_ORGANIZATION=
+
+# What mailer to use. This must come after the config file, since it is
+# host-dependent.
+# Copied from cvsbug
+if [ -f /usr/sbin/sendmail ]; then
+ MAIL_AGENT="/usr/sbin/sendmail -oi -t"
+else
+ MAIL_AGENT="/usr/lib/sendmail -oi -t"
+fi
+MAILER=`echo $MAIL_AGENT | sed -e 's, .*,,'`
+if [ ! -f "$MAILER" ] ; then
+ echo "$COMMAND: Cannot file mail program \"$MAILER\"."
+ echo "$COMMAND: Please fix the MAIL_AGENT entry in the $COMMAND file."
+ exit 1
+fi
+
+
+# How to read the passwd database.
+PASSWD="cat /etc/passwd"
+
+ECHON=bsd
+
+if [ $ECHON = bsd ] ; then
+ ECHON1="echo -n"
+ ECHON2=
+elif [ $ECHON = sysv ] ; then
+ ECHON1=echo
+ ECHON2='\c'
+else
+ ECHON1=echo
+ ECHON2=
+fi
+
+#
+
+if [ -z "$TMPDIR" ]; then
+ TMPDIR=/tmp
+else
+ if [ "`echo $TMPDIR | grep '/$'`" != "" ]; then
+ TMPDIR="`echo $TMPDIR | sed -e 's,/$,,'`"
+ fi
+fi
+
+if [ @have_mktemp_command@ = yes ]; then
+ TEMP0=`mktemp $TMPDIR/poXXXXXX` || exit 1
+ TEMP=`mktemp $TMPDIR/pXXXXXX` || exit 1
+ BAD=`mktemp $TMPDIR/pbadXXXXXX` || exit 1
+ REF=`mktemp $TMPDIR/pfXXXXXX` || exit 1
+ REMOVE_TEMP="rm -f $TEMP0 $TEMP $BAD $REF"
+else
+ TEMPD=$TMPDIR/pd$$
+ TEMP0=$TEMPD/po$$
+ TEMP=$TEMPD/p$$
+ BAD=$TEMPD/pbad$$
+ REF=$TEMPD/pf$$
+ mkdir $TEMPD || exit 1
+ REMOVE_TEMP="rm -rf $TEMPD"
+fi
+
+# find a user name
+if [ "$LOGNAME" = "" ]; then
+ if [ "$USER" != "" ]; then
+ LOGNAME="$USER"
+ else
+ LOGNAME="UNKNOWN"
+ fi
+fi
+
+FROM="$LOGNAME"
+REPLY_TO="${REPLY_TO:-${REPLYTO:-$LOGNAME}}"
+
+# Find out the name of the originator of this PR.
+if [ -n "$NAME" ]; then
+ ORIGINATOR="$NAME"
+elif [ -f $HOME/.fullname ]; then
+ ORIGINATOR="`sed -e '1q' $HOME/.fullname`"
+else
+ # Must use temp file due to incompatibilities in quoting behavior
+ # and to protect shell metacharacters in the expansion of $LOGNAME
+ $PASSWD | grep "^$LOGNAME:" | awk -F: '{print $5}' | sed -e 's/,.*//' > $TEMP0
+ ORIGINATOR="`cat $TEMP0`"
+ rm -f $TEMP0
+fi
+
+if [ -n "$ORGANIZATION" ]; then
+ if [ -f "$ORGANIZATION" ]; then
+ ORGANIZATION="`cat $ORGANIZATION`"
+ fi
+else
+ if [ -n "$DEFAULT_ORGANIZATION" ]; then
+ ORGANIZATION="$DEFAULT_ORGANIZATION"
+ elif [ -f $HOME/.organization ]; then
+ ORGANIZATION="`cat $HOME/.organization`"
+ fi
+fi
+
+# If they don't have a preferred editor set, then use
+if [ -z "$VISUAL" ]; then
+ if [ -z "$EDITOR" ]; then
+ EDIT=vi
+ else
+ EDIT="$EDITOR"
+ fi
+else
+ EDIT="$VISUAL"
+fi
+
+# Find out some information.
+SYSTEM=`( [ -f /bin/uname ] && /bin/uname -a ) || \
+ ( [ -f /usr/bin/uname ] && /usr/bin/uname -a ) || echo ""`
+ARCH=`[ -f /bin/arch ] && /bin/arch`
+MACHINE=`[ -f /bin/machine ] && /bin/machine`
+
+COMMAND=`echo $0 | sed -e 's,.*/,,'`
+USAGE="Usage: $COMMAND [-PVL] [-t address] [-f filename] [-s severity]
+ [-c address] [--request-id] [--version]"
+REMOVE=
+BATCH=
+CC=
+SEVERITY_C=
+
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -r) ;; # Ignore for backward compat.
+ -t | --to) if [ $# -eq 1 ]; then echo "$USAGE"; $REMOVE_TEMP; exit 1; fi
+ shift ; GNATS_ADDR="$1"
+ EXPLICIT_GNATS_ADDR=true
+ ;;
+ -f | --file) if [ $# -eq 1 ]; then echo "$USAGE"; $REMOVE_TEMP; exit 1; fi
+ shift ; IN_FILE="$1"
+ if [ "$IN_FILE" != "-" -a ! -r "$IN_FILE" ]; then
+ echo "$COMMAND: cannot read $IN_FILE"
+ $REMOVE_TEMP
+ exit 1
+ fi
+ ;;
+ -b | --batch) BATCH=true ;;
+ -c | --cc) if [ $# -eq 1 ]; then echo "$USAGE"; $REMOVE_TEMP; exit 1; fi
+ shift ; CC="$1"
+ ;;
+ -s | --severity) if [ $# -eq 1 ]; then echo "$USAGE"; $REMOVE_TEMP; exit 1; fi
+ shift ; SEVERITY_C="$1"
+ ;;
+ -p | -P | --print) PRINT=true ;;
+ -L | --list) FORMAT=norm ;;
+ -l | -CL | --lisp) FORMAT=lisp ;;
+ --request-id) REQUEST_ID=true ;;
+ -h | --help) echo "$USAGE"; $REMOVE_TEMP; exit 0 ;;
+ -V | --version) cat <<EOF
+gccbug (GCC) $DEFAULT_RELEASE
+Copyright (C) 2002 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+EOF
+ $REMOVE_TEMP; exit 0 ;;
+ -*) echo "$USAGE" ; $REMOVE_TEMP; exit 1 ;;
+ *) echo "$USAGE" ; $REMOVE_TEMP; exit 1
+ esac
+ shift
+done
+
+# spam does not need to be listed here
+CATEGORIES="ada bootstrap c++ c debug fortran java libf2c libgcj libobjc libstdc++ middle-end objc optimization other preprocessor target web"
+
+case "$FORMAT" in
+ lisp) echo "$CATEGORIES" | \
+ awk 'BEGIN {printf "( "} {printf "(\"%s\") ",$0} END {printf ")\n"}'
+ $REMOVE_TEMP
+ exit 0
+ ;;
+ norm) l=`echo "$CATEGORIES" | \
+ awk 'BEGIN {max = 0; } { if (length($0) > max) { max = length($0); } }
+ END {print max + 1;}'`
+ c=`expr 70 / $l`
+ if [ $c -eq 0 ]; then c=1; fi
+ echo "$CATEGORIES" | \
+ awk 'BEGIN {print "Known categories:"; i = 0 }
+ { printf ("%-'$l'.'$l's", $0); if ((++i % '$c') == 0) { print "" } }
+ END { print ""; }'
+ $REMOVE_TEMP
+ exit 0
+ ;;
+esac
+
+ORIGINATOR_C='<name of the PR author (one line)>'
+ORGANIZATION_C='<organization of PR author (multiple lines)>'
+SYNOPSIS_C='<synopsis of the problem (one line)>'
+if [ -z "$SEVERITY_C" ]; then
+ SEVERITY_C='<[ non-critical | serious | critical ] (one line)>'
+fi
+PRIORITY_C='<[ low | medium ] (one line)>'
+CATEGORY_C='<choose from the top of this file (one line)>'
+RELEASE_C='<release number or tag (one line)>'
+ENVIRONMENT_C='<machine, os, target, libraries (multiple lines)>'
+DESCRIPTION_C='<precise description of the problem (multiple lines)>'
+HOW_TO_REPEAT_C='<When reporting a compiler error, preprocessor output must be included>'
+FIX_C='<how to correct or work around the problem, if known (multiple lines)>'
+
+# Catch some signals. ($xs kludge needed by Sun /bin/sh)
+xs=0
+trap '$REMOVE_TEMP; exit $xs' 0
+trap 'echo "$COMMAND: Aborting ..."; $REMOVE_TEMP; xs=1; exit' 1 3 13 15
+
+# If they told us to use a specific file, then do so.
+if [ -n "$IN_FILE" ]; then
+ if [ "$IN_FILE" = "-" ]; then
+ # The PR is coming from the standard input.
+ if [ -n "$EXPLICIT_GNATS_ADDR" ]; then
+ sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" > $TEMP
+ else
+ cat > $TEMP
+ fi
+ else
+ # Use the file they named.
+ if [ -n "$EXPLICIT_GNATS_ADDR" ]; then
+ sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" $IN_FILE > $TEMP
+ else
+ cat $IN_FILE > $TEMP
+ fi
+ fi
+else
+
+ if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then
+ # If their PR_FORM points to a bogus entry, then bail.
+ if [ ! -f "$PR_FORM" -o ! -r "$PR_FORM" -o ! -s "$PR_FORM" ]; then
+ echo "$COMMAND: can't seem to read your template file (\`$PR_FORM'), ignoring PR_FORM"
+ sleep 1
+ PRINT_INTERN=bad_prform
+ fi
+ fi
+
+ if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then
+ cp $PR_FORM $TEMP ||
+ ( echo "$COMMAND: could not copy $PR_FORM" ; xs=1; exit )
+ else
+ for file in $TEMP $REF ; do
+ cat > $file << '__EOF__'
+SEND-PR: -*- send-pr -*-
+SEND-PR: Lines starting with `SEND-PR' will be removed automatically, as
+SEND-PR: will all comments (text enclosed in `<' and `>').
+SEND-PR:
+SEND-PR: Please consult the GCC manual if you are not sure how to
+SEND-PR: fill out a problem report.
+SEND-PR: Note that the Synopsis field is mandatory. The Subject (for
+SEND-PR: the mail) will be made the same as Synopsis unless explicitly
+SEND-PR: changed.
+SEND-PR:
+SEND-PR: Choose from the following categories:
+SEND-PR:
+__EOF__
+
+ # Format the categories so they fit onto lines.
+ l=`echo "$CATEGORIES" | \
+ awk 'BEGIN {max = 0; } { if (length($0) > max) { max = length($0); } }
+ END {print max + 1;}'`
+ c=`expr 61 / $l`
+ if [ $c -eq 0 ]; then c=1; fi
+ echo "$CATEGORIES" | \
+ awk 'BEGIN {printf "SEND-PR: "; i = 0 }
+ { printf ("%-'$l'.'$l's", $0);
+ if ((++i % '$c') == 0) { printf "\nSEND-PR: " } }
+ END { printf "\nSEND-PR:\n"; }' >> $file
+
+ cat >> $file << __EOF__
+To: $GNATS_ADDR
+Subject:
+From: $FROM
+Reply-To: $REPLYTO
+Cc: $CC
+X-send-pr-version: $VERSION
+X-GNATS-Notify:
+
+
+>Submitter-Id: $SUBMITTER
+>Originator: $ORIGINATOR
+>Organization: ${ORGANIZATION-$ORGANIZATION_C}
+>Confidential: no
+SEND-PR: Leave "Confidential" as "no"; all GCC PRs are public.
+>Synopsis: $SYNOPSIS_C
+>Severity: $SEVERITY_C
+SEND-PR: critical GCC is completely not operational; no work-around known.
+SEND-PR: serious GCC is not working properly; a work-around is possible.
+SEND-PR: non-critical Report indicates minor problem.
+>Priority: $PRIORITY_C
+SEND-PR: medium The problem should be solved in the next release.
+SEND-PR: low The problem should be solve in a future release.
+>Category: $CATEGORY_C
+>Class: <[ doc-bug | accepts-illegal | rejects-legal | wrong-code | ice-on-legal-code| ice-on-illegal-code | pessimizes-code | sw-bug | change-request | support ] (one line)>
+SEND-PR: doc-bug The documentation is incorrect.
+SEND-PR: accepts-illegal GCC fails to reject erroneous code.
+SEND-PR: rejects-legal GCC gives an error message for correct code.
+SEND-PR: wrong-code The machine code generated by gcc is incorrect.
+SEND-PR: ice-on-legal-code GCC gives an Internal Compiler Error (ICE)
+SEND-PR: for correct code
+SEND-PR: ice-on-illegal-code GCC gives an ICE instead of reporting an error
+SEND-PR: pessimizes-code GCC misses an important optimization opportunity
+SEND-PR: sw-bug Software bug of some other class than above
+SEND-PR: change-request A feature in GCC is missing.
+SEND-PR: support I need help with gcc.
+>Release: ${DEFAULT_RELEASE-$RELEASE_C}
+>Environment:
+`[ -n "$SYSTEM" ] && echo System: $SYSTEM`
+`[ -n "$ARCH" ] && echo Architecture: $ARCH`
+`[ -n "$MACHINE" ] && echo Machine: $MACHINE`
+ $ENVIRONMENT_C
+host: @host@
+build: @build@
+target: @target@
+configured with: @gcc_config_arguments@
+>Description:
+ $DESCRIPTION_C
+>How-To-Repeat:
+ $HOW_TO_REPEAT_C
+>Fix:
+ $FIX_C
+__EOF__
+ done
+ fi
+
+ if [ "$PRINT" = true -o "$PRINT_INTERN" = true ]; then
+ cat $TEMP
+ xs=0; exit
+ fi
+
+ chmod u+w $TEMP
+ if [ -z "$REQUEST_ID" ]; then
+ eval $EDIT $TEMP
+ else
+ ed -s $TEMP << '__EOF__'
+/^Subject/s/^Subject:.*/Subject: request for a customer id/
+/^>Category/s/^>Category:.*/>Category: send-pr/
+w
+q
+__EOF__
+ fi
+
+ if cmp -s $REF $TEMP ; then
+ echo "$COMMAND: problem report not filled out, therefore not sent"
+ xs=1; exit
+ fi
+fi
+
+#
+# Check the enumeration fields
+
+# This is a "sed-subroutine" with one keyword parameter
+# (with workaround for Sun sed bug)
+#
+SED_CMD='
+/$PATTERN/{
+s|||
+s|<.*>||
+s|^[ ]*||
+s|[ ]*$||
+p
+q
+}'
+
+
+while [ -z "$REQUEST_ID" ]; do
+ CNT=0
+
+ # 1) Confidential
+ #
+ PATTERN=">Confidential:"
+ CONFIDENTIAL=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+ case "$CONFIDENTIAL" in
+ no) CNT=`expr $CNT + 1` ;;
+ *) echo "$COMMAND: \`$CONFIDENTIAL' is not a valid value for \`Confidential'." ;;
+ esac
+ #
+ # 2) Severity
+ #
+ PATTERN=">Severity:"
+ SEVERITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+ case "$SEVERITY" in
+ ""|non-critical|serious|critical) CNT=`expr $CNT + 1` ;;
+ *) echo "$COMMAND: \`$SEVERITY' is not a valid value for \`Severity'."
+ esac
+ #
+ # 3) Priority
+ #
+ PATTERN=">Priority:"
+ PRIORITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+ case "$PRIORITY" in
+ ""|low|medium) CNT=`expr $CNT + 1` ;;
+ high) echo "$COMMAND: \`Priority: high' is reserved for GCC maintainers." ;;
+ *) echo "$COMMAND: \`$PRIORITY' is not a valid value for \`Priority'."
+ esac
+ #
+ # 4) Category
+ #
+ PATTERN=">Category:"
+ CATEGORY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+ FOUND=
+ for C in $CATEGORIES
+ do
+ if [ "$C" = "$CATEGORY" ]; then FOUND=true ; break ; fi
+ done
+ if [ -n "$FOUND" ]; then
+ CNT=`expr $CNT + 1`
+ else
+ if [ -z "$CATEGORY" ]; then
+ echo "$COMMAND: you must include a Category: field in your report."
+ else
+ echo "$COMMAND: \`$CATEGORY' is not a known category."
+ fi
+ fi
+ #
+ # 5) Class
+ #
+ PATTERN=">Class:"
+ CLASS=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+ case "$CLASS" in
+ ""|doc-bug|accepts-illegal|rejects-legal|wrong-code|ice-on-legal-code|ice-on-illegal-code|pessimizes-code|sw-bug|change-request|support) CNT=`expr $CNT + 1` ;;
+ *) echo "$COMMAND: \`$CLASS' is not a valid value for \`Class'."
+ esac
+ #
+ # 6) Check that synopsis is not empty
+ #
+ if grep "^>Synopsis:[ ]*${SYNOPSIS_C}\$" $TEMP > /dev/null
+ then
+ echo "$COMMAND: Synopsis must not be empty."
+ else
+ CNT=`expr $CNT + 1`
+ fi
+
+ [ $CNT -lt 6 -a -z "$BATCH" ] &&
+ echo "Errors were found with the problem report."
+
+ while true; do
+ if [ -z "$BATCH" ]; then
+ $ECHON1 "a)bort, e)dit or s)end? $ECHON2"
+ read input
+ else
+ if [ $CNT -eq 6 ]; then
+ input=s
+ else
+ input=a
+ fi
+ fi
+ case "$input" in
+ a*)
+ if [ -z "$BATCH" ]; then
+ echo "$COMMAND: the problem report remains in $BAD and is not sent."
+ REMOVE_TEMP="rm -f $TEMP0 $TEMP $REF"
+ mv $TEMP $BAD
+ else
+ echo "$COMMAND: the problem report is not sent."
+ fi
+ xs=1; exit
+ ;;
+ e*)
+ eval $EDIT $TEMP
+ continue 2
+ ;;
+ s*)
+ break 2
+ ;;
+ esac
+ done
+done
+
+#
+# Make sure the mail has got a Subject. If not, use the same as
+# in Synopsis.
+#
+
+if grep '^Subject:[ ]*$' $TEMP > /dev/null
+then
+ SYNOPSIS=`grep '^>Synopsis:' $TEMP | sed -e 's/^>Synopsis:[ ]*//'`
+ ed -s $TEMP << __EOF__
+/^Subject:/s/:.*\$/: $SYNOPSIS/
+w
+q
+__EOF__
+fi
+
+#
+# Remove comments and send the problem report
+# (we have to use patterns, where the comment contains regex chars)
+#
+# /^>Originator:/s;$ORIGINATOR;;
+sed -e "
+/^SEND-PR:/d
+/^>Organization:/,/^>[A-Za-z-]*:/s;$ORGANIZATION_C;;
+/^>Confidential:/s;<.*>;;
+/^>Synopsis:/s;$SYNOPSIS_C;;
+/^>Severity:/s;<.*>;;
+/^>Priority:/s;<.*>;;
+/^>Category:/s;$CATEGORY_C;;
+/^>Class:/s;<.*>;;
+/^>Release:/,/^>[A-Za-z-]*:/s;$RELEASE_C;;
+/^>Environment:/,/^>[A-Za-z-]*:/s;$ENVIRONMENT_C;;
+/^>Description:/,/^>[A-Za-z-]*:/s;$DESCRIPTION_C;;
+/^>How-To-Repeat:/,/^>[A-Za-z-]*:/s;$HOW_TO_REPEAT_C;;
+/^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;;
+" $TEMP > $REF
+
+if $MAIL_AGENT < $REF; then
+ echo "$COMMAND: problem report sent"
+ xs=0; exit
+else
+ echo "$COMMAND: mysterious mail failure."
+ if [ -z "$BATCH" ]; then
+ echo "$COMMAND: the problem report remains in $BAD and is not sent."
+ REMOVE_TEMP="rm -f $TEMP0 $TEMP $REF"
+ mv $REF $BAD
+ else
+ echo "$COMMAND: the problem report is not sent."
+ fi
+ xs=1; exit
+fi
diff --git a/contrib/gcc/gcse.c b/contrib/gcc/gcse.c
index 928b639..8c6b87f 100644
--- a/contrib/gcc/gcse.c
+++ b/contrib/gcc/gcse.c
@@ -159,6 +159,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "output.h"
#include "function.h"
#include "expr.h"
+#include "except.h"
#include "ggc.h"
#include "params.h"
@@ -696,6 +697,7 @@ static void delete_store PARAMS ((struct ls_expr *,
basic_block));
static void free_store_memory PARAMS ((void));
static void store_motion PARAMS ((void));
+static void free_insn_expr_list_list PARAMS ((rtx *));
static void clear_modify_mem_tables PARAMS ((void));
static void free_modify_mem_tables PARAMS ((void));
@@ -903,7 +905,8 @@ gcse_main (f, file)
end_alias_analysis ();
allocate_reg_info (max_reg_num (), FALSE, FALSE);
- if (!optimize_size && flag_gcse_sm)
+ /* Store motion disabled until it is fixed. */
+ if (0 && !optimize_size && flag_gcse_sm)
store_motion ();
/* Record where pseudo-registers are set. */
return run_jump_opt_after_gcse;
@@ -1315,6 +1318,7 @@ want_to_gcse_p (x)
case SUBREG:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CALL:
return 0;
@@ -1400,6 +1404,7 @@ oprs_unchanged_p (x, insn, avail_p)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
case ADDR_VEC:
@@ -1635,6 +1640,22 @@ hash_expr_1 (x, mode, do_not_record_p)
+ (unsigned int) CONST_DOUBLE_HIGH (x));
return hash;
+ case CONST_VECTOR:
+ {
+ int units;
+ rtx elt;
+
+ units = CONST_VECTOR_NUNITS (x);
+
+ for (i = 0; i < units; ++i)
+ {
+ elt = CONST_VECTOR_ELT (x, i);
+ hash += hash_expr_1 (elt, GET_MODE (elt), do_not_record_p);
+ }
+
+ return hash;
+ }
+
/* Assume there is only one rtx object for any given label. */
case LABEL_REF:
/* We don't hash on the address of the CODE_LABEL to avoid bootstrap
@@ -2171,6 +2192,10 @@ hash_scan_set (pat, insn, set_p)
&& regno >= FIRST_PSEUDO_REGISTER
/* Don't GCSE something if we can't do a reg/reg copy. */
&& can_copy_p [GET_MODE (dest)]
+ /* GCSE commonly inserts instruction after the insn. We can't
+ do that easily for EH_REGION notes so disable GCSE on these
+ for now. */
+ && !can_throw_internal (insn)
/* Is SET_SRC something we want to gcse? */
&& want_to_gcse_p (src)
/* Don't CSE a nop. */
@@ -2364,6 +2389,7 @@ canon_list_insert (dest, unused1, v_insn)
void * v_insn;
{
rtx dest_addr, insn;
+ int bb;
while (GET_CODE (dest) == SUBREG
|| GET_CODE (dest) == ZERO_EXTRACT
@@ -2381,12 +2407,13 @@ canon_list_insert (dest, unused1, v_insn)
dest_addr = get_addr (XEXP (dest, 0));
dest_addr = canon_rtx (dest_addr);
insn = (rtx) v_insn;
+ bb = BLOCK_NUM (insn);
- canon_modify_mem_list[BLOCK_NUM (insn)] =
- alloc_INSN_LIST (dest_addr, canon_modify_mem_list[BLOCK_NUM (insn)]);
- canon_modify_mem_list[BLOCK_NUM (insn)] =
- alloc_INSN_LIST (dest, canon_modify_mem_list[BLOCK_NUM (insn)]);
- bitmap_set_bit (canon_modify_mem_list_set, BLOCK_NUM (insn));
+ canon_modify_mem_list[bb] =
+ alloc_EXPR_LIST (VOIDmode, dest_addr, canon_modify_mem_list[bb]);
+ canon_modify_mem_list[bb] =
+ alloc_EXPR_LIST (VOIDmode, dest, canon_modify_mem_list[bb]);
+ bitmap_set_bit (canon_modify_mem_list_set, bb);
}
/* Record memory modification information for INSN. We do not actually care
@@ -2397,23 +2424,24 @@ static void
record_last_mem_set_info (insn)
rtx insn;
{
+ int bb = BLOCK_NUM (insn);
+
/* load_killed_in_block_p will handle the case of calls clobbering
everything. */
- modify_mem_list[BLOCK_NUM (insn)] =
- alloc_INSN_LIST (insn, modify_mem_list[BLOCK_NUM (insn)]);
- bitmap_set_bit (modify_mem_list_set, BLOCK_NUM (insn));
+ modify_mem_list[bb] = alloc_INSN_LIST (insn, modify_mem_list[bb]);
+ bitmap_set_bit (modify_mem_list_set, bb);
if (GET_CODE (insn) == CALL_INSN)
{
/* Note that traversals of this loop (other than for free-ing)
will break after encountering a CALL_INSN. So, there's no
need to insert a pair of items, as canon_list_insert does. */
- canon_modify_mem_list[BLOCK_NUM (insn)] =
- alloc_INSN_LIST (insn, canon_modify_mem_list[BLOCK_NUM (insn)]);
- bitmap_set_bit (canon_modify_mem_list_set, BLOCK_NUM (insn));
+ canon_modify_mem_list[bb] =
+ alloc_INSN_LIST (insn, canon_modify_mem_list[bb]);
+ bitmap_set_bit (canon_modify_mem_list_set, bb);
}
else
- note_stores (PATTERN (insn), canon_list_insert, (void*) insn );
+ note_stores (PATTERN (insn), canon_list_insert, (void*) insn);
}
/* Called from compute_hash_table via note_stores to handle one
@@ -2689,6 +2717,27 @@ next_set (regno, expr)
return expr;
}
+/* Like free_INSN_LIST_list or free_EXPR_LIST_list, except that the node
+ types may be mixed. */
+
+static void
+free_insn_expr_list_list (listp)
+ rtx *listp;
+{
+ rtx list, next;
+
+ for (list = *listp; list ; list = next)
+ {
+ next = XEXP (list, 1);
+ if (GET_CODE (list) == EXPR_LIST)
+ free_EXPR_LIST_node (list);
+ else
+ free_INSN_LIST_node (list);
+ }
+
+ *listp = NULL;
+}
+
/* Clear canon_modify_mem_list and modify_mem_list tables. */
static void
clear_modify_mem_tables ()
@@ -2696,14 +2745,13 @@ clear_modify_mem_tables ()
int i;
EXECUTE_IF_SET_IN_BITMAP
- (canon_modify_mem_list_set, 0, i,
- free_INSN_LIST_list (modify_mem_list + i));
- bitmap_clear (canon_modify_mem_list_set);
+ (modify_mem_list_set, 0, i, free_INSN_LIST_list (modify_mem_list + i));
+ bitmap_clear (modify_mem_list_set);
EXECUTE_IF_SET_IN_BITMAP
(canon_modify_mem_list_set, 0, i,
- free_INSN_LIST_list (canon_modify_mem_list + i));
- bitmap_clear (modify_mem_list_set);
+ free_insn_expr_list_list (canon_modify_mem_list + i));
+ bitmap_clear (canon_modify_mem_list_set);
}
/* Release memory used by modify_mem_list_set and canon_modify_mem_list_set. */
@@ -2756,6 +2804,7 @@ oprs_not_set_p (x, insn)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
case ADDR_VEC:
@@ -3089,6 +3138,7 @@ expr_killed_p (x, bb)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
case ADDR_VEC:
@@ -3789,6 +3839,7 @@ compute_transp (x, indx, bmap, set_p)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
case ADDR_VEC:
@@ -4588,13 +4639,23 @@ insert_insn_end_bb (expr, bb, pre)
pat = process_insert_insn (expr);
/* If the last insn is a jump, insert EXPR in front [taking care to
- handle cc0, etc. properly]. */
+ handle cc0, etc. properly]. Similary we need to care trapping
+ instructions in presence of non-call exceptions. */
- if (GET_CODE (insn) == JUMP_INSN)
+ if (GET_CODE (insn) == JUMP_INSN
+ || (GET_CODE (insn) == INSN
+ && (bb->succ->succ_next || (bb->succ->flags & EDGE_ABNORMAL))))
{
#ifdef HAVE_cc0
rtx note;
#endif
+ /* It should always be the case that we can put these instructions
+ anywhere in the basic block with performing PRE optimizations.
+ Check this. */
+ if (GET_CODE (insn) == INSN && pre
+ && !TEST_BIT (antloc[bb->index], expr->bitmap_index)
+ && !TEST_BIT (transp[bb->index], expr->bitmap_index))
+ abort ();
/* If this is a jump table, then we can't insert stuff here. Since
we know the previous real insn must be the tablejump, we insert
@@ -4624,7 +4685,8 @@ insert_insn_end_bb (expr, bb, pre)
/* Likewise if the last insn is a call, as will happen in the presence
of exception handling. */
- else if (GET_CODE (insn) == CALL_INSN)
+ else if (GET_CODE (insn) == CALL_INSN
+ && (bb->succ->succ_next || (bb->succ->flags & EDGE_ABNORMAL)))
{
/* Keeping in mind SMALL_REGISTER_CLASSES and parameters in registers,
we search backward and place the instructions before the first
@@ -6289,6 +6351,7 @@ store_ops_ok (x, bb)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
case ADDR_VEC:
@@ -6490,21 +6553,7 @@ store_killed_in_insn (x, insn)
{
/* A normal or pure call might read from pattern,
but a const call will not. */
- if (CONST_OR_PURE_CALL_P (insn))
- {
- rtx link;
-
- for (link = CALL_INSN_FUNCTION_USAGE (insn);
- link;
- link = XEXP (link, 1))
- if (GET_CODE (XEXP (link, 0)) == USE
- && GET_CODE (XEXP (XEXP (link, 0), 0)) == MEM
- && GET_CODE (XEXP (XEXP (XEXP (link, 0), 0), 0)) == SCRATCH)
- return 1;
- return 0;
- }
- else
- return 1;
+ return ! CONST_OR_PURE_CALL_P (insn) || pure_call_p (insn);
}
if (GET_CODE (PATTERN (insn)) == SET)
diff --git a/contrib/gcc/genattrtab.c b/contrib/gcc/genattrtab.c
index 1c916b3..a485dee 100644
--- a/contrib/gcc/genattrtab.c
+++ b/contrib/gcc/genattrtab.c
@@ -839,6 +839,7 @@ attr_copy_rtx (orig)
case QUEUED:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case CODE_LABEL:
case PC:
@@ -2278,6 +2279,7 @@ encode_units_mask (x)
case QUEUED:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case CODE_LABEL:
case PC:
@@ -4112,6 +4114,7 @@ clear_struct_flag (x)
case QUEUED:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case CODE_LABEL:
case PC:
@@ -4167,6 +4170,7 @@ count_sub_rtxs (x, max)
case QUEUED:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case CODE_LABEL:
case PC:
diff --git a/contrib/gcc/genemit.c b/contrib/gcc/genemit.c
index 712dd24..5a7f32a 100644
--- a/contrib/gcc/genemit.c
+++ b/contrib/gcc/genemit.c
@@ -58,7 +58,7 @@ struct clobber_ent
static void max_operand_1 PARAMS ((rtx));
static int max_operand_vec PARAMS ((rtx, int));
static void print_code PARAMS ((RTX_CODE));
-static void gen_exp PARAMS ((rtx, enum rtx_code));
+static void gen_exp PARAMS ((rtx, enum rtx_code, char *));
static void gen_insn PARAMS ((rtx));
static void gen_expand PARAMS ((rtx));
static void gen_split PARAMS ((rtx));
@@ -155,9 +155,10 @@ gen_rtx_scratch (x, subroutine_type)
substituting any operand references appearing within. */
static void
-gen_exp (x, subroutine_type)
+gen_exp (x, subroutine_type, used)
rtx x;
enum rtx_code subroutine_type;
+ char *used;
{
RTX_CODE code;
int i;
@@ -176,6 +177,15 @@ gen_exp (x, subroutine_type)
{
case MATCH_OPERAND:
case MATCH_DUP:
+ if (used)
+ {
+ if (used[XINT (x, 0)])
+ {
+ printf ("copy_rtx (operand%d)", XINT (x, 0));
+ return;
+ }
+ used[XINT (x, 0)] = 1;
+ }
printf ("operand%d", XINT (x, 0));
return;
@@ -188,7 +198,7 @@ gen_exp (x, subroutine_type)
for (i = 0; i < XVECLEN (x, 1); i++)
{
printf (",\n\t\t");
- gen_exp (XVECEXP (x, 1, i), subroutine_type);
+ gen_exp (XVECEXP (x, 1, i), subroutine_type, used);
}
printf (")");
return;
@@ -199,7 +209,7 @@ gen_exp (x, subroutine_type)
for (i = 0; i < XVECLEN (x, 2); i++)
{
printf (",\n\t\t");
- gen_exp (XVECEXP (x, 2, i), subroutine_type);
+ gen_exp (XVECEXP (x, 2, i), subroutine_type, used);
}
printf (")");
return;
@@ -262,7 +272,7 @@ gen_exp (x, subroutine_type)
break;
printf (",\n\t");
if (fmt[i] == 'e' || fmt[i] == 'u')
- gen_exp (XEXP (x, i), subroutine_type);
+ gen_exp (XEXP (x, i), subroutine_type, used);
else if (fmt[i] == 'i')
printf ("%u", XINT (x, i));
else if (fmt[i] == 's')
@@ -274,7 +284,7 @@ gen_exp (x, subroutine_type)
for (j = 0; j < XVECLEN (x, i); j++)
{
printf (",\n\t\t");
- gen_exp (XVECEXP (x, i, j), subroutine_type);
+ gen_exp (XVECEXP (x, i, j), subroutine_type, used);
}
printf (")");
}
@@ -397,7 +407,7 @@ gen_insn (insn)
if (XVECLEN (insn, 1) == 1)
{
printf (" return ");
- gen_exp (XVECEXP (insn, 1, 0), DEFINE_INSN);
+ gen_exp (XVECEXP (insn, 1, 0), DEFINE_INSN, NULL);
printf (";\n}\n\n");
}
else
@@ -408,7 +418,7 @@ gen_insn (insn)
for (i = 0; i < XVECLEN (insn, 1); i++)
{
printf (",\n\t\t");
- gen_exp (XVECEXP (insn, 1, i), DEFINE_INSN);
+ gen_exp (XVECEXP (insn, 1, i), DEFINE_INSN, NULL);
}
printf ("));\n}\n\n");
}
@@ -454,7 +464,7 @@ gen_expand (expand)
&& XVECLEN (expand, 1) == 1)
{
printf (" return ");
- gen_exp (XVECEXP (expand, 1, 0), DEFINE_EXPAND);
+ gen_exp (XVECEXP (expand, 1, 0), DEFINE_EXPAND, NULL);
printf (";\n}\n\n");
return;
}
@@ -535,7 +545,7 @@ gen_expand (expand)
printf (" emit (");
else
printf (" emit_insn (");
- gen_exp (next, DEFINE_EXPAND);
+ gen_exp (next, DEFINE_EXPAND, NULL);
printf (");\n");
if (GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC
&& GET_CODE (SET_SRC (next)) == LABEL_REF)
@@ -561,6 +571,7 @@ gen_split (split)
const char *const name =
((GET_CODE (split) == DEFINE_PEEPHOLE2) ? "peephole2" : "split");
const char *unused;
+ char *used;
if (XVEC (split, 0) == 0)
fatal ("define_%s (definition %d) lacks a pattern", name,
@@ -574,6 +585,7 @@ gen_split (split)
max_operand_vec (split, 2);
operands = MAX (max_opno, MAX (max_dup_opno, max_scratch_opno)) + 1;
unused = (operands == 0 ? " ATTRIBUTE_UNUSED" : "");
+ used = xcalloc (1, operands);
/* Output the prototype, function name and argument declarations. */
if (GET_CODE (split) == DEFINE_PEEPHOLE2)
@@ -645,7 +657,7 @@ gen_split (split)
printf (" emit (");
else
printf (" emit_insn (");
- gen_exp (next, GET_CODE (split));
+ gen_exp (next, GET_CODE (split), used);
printf (");\n");
if (GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC
&& GET_CODE (SET_SRC (next)) == LABEL_REF)
@@ -658,6 +670,8 @@ gen_split (split)
printf (" _val = gen_sequence ();\n");
printf (" end_sequence ();\n");
printf (" return _val;\n}\n\n");
+
+ free (used);
}
/* Write a function, `add_clobbers', that is given a PARALLEL of sufficient
@@ -686,7 +700,7 @@ output_add_clobbers ()
{
printf (" XVECEXP (pattern, 0, %d) = ", i);
gen_exp (XVECEXP (clobber->pattern, 1, i),
- GET_CODE (clobber->pattern));
+ GET_CODE (clobber->pattern), NULL);
printf (";\n");
}
@@ -708,7 +722,7 @@ output_added_clobbers_hard_reg_p ()
{
struct clobber_pat *clobber;
struct clobber_ent *ent;
- int clobber_p;
+ int clobber_p, used;
printf ("\n\nint\nadded_clobbers_hard_reg_p (insn_code_number)\n");
printf (" int insn_code_number;\n");
@@ -718,12 +732,17 @@ output_added_clobbers_hard_reg_p ()
for (clobber_p = 0; clobber_p <= 1; clobber_p++)
{
+ used = 0;
for (clobber = clobber_list; clobber; clobber = clobber->next)
if (clobber->has_hard_reg == clobber_p)
for (ent = clobber->insns; ent; ent = ent->next)
- printf (" case %d:\n", ent->code_number);
+ {
+ printf (" case %d:\n", ent->code_number);
+ used++;
+ }
- printf (" return %d;\n\n", clobber_p);
+ if (used)
+ printf (" return %d;\n\n", clobber_p);
}
printf (" default:\n");
diff --git a/contrib/gcc/genextract.c b/contrib/gcc/genextract.c
index 72e3e56..d52fc36 100644
--- a/contrib/gcc/genextract.c
+++ b/contrib/gcc/genextract.c
@@ -210,12 +210,12 @@ walk_rtx (x, path)
break;
case MATCH_DUP:
- case MATCH_PAR_DUP:
duplocs[dup_count] = xstrdup (path);
dupnums[dup_count] = XINT (x, 0);
dup_count++;
break;
+ case MATCH_PAR_DUP:
case MATCH_OP_DUP:
duplocs[dup_count] = xstrdup (path);
dupnums[dup_count] = XINT (x, 0);
@@ -227,7 +227,7 @@ walk_rtx (x, path)
for (i = XVECLEN (x, 1) - 1; i >= 0; i--)
{
- newpath[depth] = '0' + i;
+ newpath[depth] = (code == MATCH_OP_DUP ? '0' : 'a') + i;
walk_rtx (XVECEXP (x, 1, i), newpath);
}
free (newpath);
diff --git a/contrib/gcc/genflags.c b/contrib/gcc/genflags.c
index 031155f..010ac70 100644
--- a/contrib/gcc/genflags.c
+++ b/contrib/gcc/genflags.c
@@ -201,7 +201,7 @@ gen_insn (insn)
printf ("(");
for (p = XSTR (insn, 2); *p; p++)
{
- if (*p == '\n')
+ if (IS_VSPACE (*p))
printf (" \\\n");
else
printf ("%c", *p);
diff --git a/contrib/gcc/genoutput.c b/contrib/gcc/genoutput.c
index b11e083..80b73fc 100644
--- a/contrib/gcc/genoutput.c
+++ b/contrib/gcc/genoutput.c
@@ -366,8 +366,13 @@ output_insn_data ()
printf (" \"");
while (*p)
{
- if (*p == '\n' && prev != '\\')
- printf ("\\n\\\n");
+ if (IS_VSPACE (*p) && prev != '\\')
+ {
+ /* Preserve two consecutive \n's or \r's, but treat \r\n
+ as a single newline. */
+ if (*p == '\n' && prev != '\r')
+ printf ("\\n\\\n");
+ }
else
putchar (*p);
prev = *p;
@@ -530,7 +535,7 @@ scan_operands (d, part, this_address_p, this_strict_low)
case MATCH_OP_DUP:
case MATCH_PAR_DUP:
++num_dups;
- return;
+ break;
case ADDRESS:
scan_operands (d, XEXP (part, 0), 1, 0);
@@ -694,11 +699,11 @@ process_template (d, template)
for (i = 0, cp = &template[1]; *cp; )
{
- while (*cp == '\n' || *cp == ' ' || *cp== '\t')
+ while (ISSPACE (*cp))
cp++;
printf (" \"");
- while (*cp != '\n' && *cp != '\0')
+ while (!IS_VSPACE (*cp) && *cp != '\0')
{
putchar (*cp);
cp++;
diff --git a/contrib/gcc/genrecog.c b/contrib/gcc/genrecog.c
index 136422c..1e8f854 100644
--- a/contrib/gcc/genrecog.c
+++ b/contrib/gcc/genrecog.c
@@ -238,8 +238,6 @@ static void validate_pattern
static struct decision *add_to_sequence
PARAMS ((rtx, struct decision_head *, const char *, enum routine_type, int));
-static int maybe_both_true_mode
- PARAMS ((enum machine_mode, enum machine_mode));
static int maybe_both_true_2
PARAMS ((struct decision_test *, struct decision_test *));
static int maybe_both_true_1
@@ -1056,29 +1054,6 @@ add_to_sequence (pattern, last, position, insn_type, top)
return sub;
}
-/* A subroutine of maybe_both_true; compares two modes.
- Returns > 0 for "definitely both true" and < 0 for "maybe both true". */
-
-static int
-maybe_both_true_mode (m1, m2)
- enum machine_mode m1, m2;
-{
- enum mode_class other_mode_class;
-
- /* Pmode is not a distinct mode. We do know that it is
- either MODE_INT or MODE_PARTIAL_INT though. */
- if (m1 == Pmode)
- other_mode_class = GET_MODE_CLASS (m2);
- else if (m2 == Pmode)
- other_mode_class = GET_MODE_CLASS (m1);
- else
- return m1 == m2;
-
- return (other_mode_class == MODE_INT
- || other_mode_class == MODE_PARTIAL_INT
- ? -1 : 0);
-}
-
/* A subroutine of maybe_both_true; examines only one test.
Returns > 0 for "definitely both true" and < 0 for "maybe both true". */
@@ -1091,7 +1066,7 @@ maybe_both_true_2 (d1, d2)
switch (d1->type)
{
case DT_mode:
- return maybe_both_true_mode (d1->u.mode, d2->u.mode);
+ return d1->u.mode == d2->u.mode;
case DT_code:
return d1->u.code == d2->u.code;
@@ -1127,7 +1102,7 @@ maybe_both_true_2 (d1, d2)
{
if (d2->type == DT_mode)
{
- if (maybe_both_true_mode (d1->u.pred.mode, d2->u.mode) == 0
+ if (d1->u.pred.mode != d2->u.mode
/* The mode of an address_operand predicate is the
mode of the memory, not the operand. It can only
be used for testing the predicate, so we must
@@ -1910,9 +1885,6 @@ write_switch (start, depth)
|| type == DT_elt_zero_wide_safe)
{
const char *indent = "";
- /* Pmode may not be a compile-time constant. */
- if (type == DT_mode && p->tests->u.mode == Pmode)
- return p;
/* We cast switch parameter to integer, so we must ensure that the value
fits. */
@@ -1956,10 +1928,6 @@ write_switch (start, depth)
if (nodes_identical_1 (p->tests, q->tests))
goto case_done;
- /* Pmode may not be a compile-time constant. */
- if (type == DT_mode && p->tests->u.mode == Pmode)
- goto case_done;
-
if (p != start && p->need_label && needs_label == NULL)
needs_label = p;
diff --git a/contrib/gcc/getopt.c b/contrib/gcc/getopt.c
index c41531e..2402a39 100644
--- a/contrib/gcc/getopt.c
+++ b/contrib/gcc/getopt.c
@@ -6,8 +6,8 @@
Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98
Free Software Foundation, Inc.
- NOTE: The canonical source of this file is maintained with the GNU C Library.
- Bugs can be reported to bug-glibc@gnu.org.
+ NOTE: This source is derived from an old version taken from the GNU C
+ Library (glibc).
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
@@ -82,7 +82,7 @@
#ifndef _
/* This is for other GNU distributions with internationalized messages.
When compiling libc, the _ macro is predefined. */
-# ifdef HAVE_LIBINTL_H
+# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
# include <libintl.h>
# define _(msgid) gettext (msgid)
# else
diff --git a/contrib/gcc/getopt.h b/contrib/gcc/getopt.h
index fb30719..cb5feba 100644
--- a/contrib/gcc/getopt.h
+++ b/contrib/gcc/getopt.h
@@ -1,5 +1,6 @@
/* Declarations for getopt.
- Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
+ Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, 2000
+ Free Software Foundation, Inc.
NOTE: The canonical source of this file is maintained with the GNU C Library.
Bugs can be reported to bug-glibc@gnu.org.
@@ -99,13 +100,20 @@ struct option
#define optional_argument 2
#if defined (__STDC__) && __STDC__
-#ifdef __GNU_LIBRARY__
+/* HAVE_DECL_* is a three-state macro: undefined, 0 or 1. If it is
+ undefined, we haven't run the autoconf check so provide the
+ declaration without arguments. If it is 0, we checked and failed
+ to find the declaration so provide a fully prototyped one. If it
+ is 1, we found it so don't provide any declaration at all. */
+#if defined (__GNU_LIBRARY__) || (defined (HAVE_DECL_GETOPT) && !HAVE_DECL_GETOPT)
/* Many other libraries have conflicting prototypes for getopt, with
differences in the consts, in stdlib.h. To avoid compilation
errors, only prototype getopt for the GNU C library. */
extern int getopt (int argc, char *const *argv, const char *shortopts);
#else /* not __GNU_LIBRARY__ */
+# if !defined (HAVE_DECL_GETOPT)
extern int getopt ();
+# endif
#endif /* __GNU_LIBRARY__ */
extern int getopt_long (int argc, char *const *argv, const char *shortopts,
const struct option *longopts, int *longind);
diff --git a/contrib/gcc/getopt1.c b/contrib/gcc/getopt1.c
index ff25737..a3637c2 100644
--- a/contrib/gcc/getopt1.c
+++ b/contrib/gcc/getopt1.c
@@ -2,8 +2,8 @@
Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
Free Software Foundation, Inc.
- NOTE: The canonical source of this file is maintained with the GNU C Library.
- Bugs can be reported to bug-glibc@gnu.org.
+ NOTE: This source is derived from an old version taken from the GNU C
+ Library (glibc).
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
diff --git a/contrib/gcc/getpwd.c b/contrib/gcc/getpwd.c
index c3d155e..f508b1e 100644
--- a/contrib/gcc/getpwd.c
+++ b/contrib/gcc/getpwd.c
@@ -1,23 +1,60 @@
/* getpwd.c - get the working directory */
+/*
+
+@deftypefn Supplemental char* getpwd (void)
+
+Returns the current working directory. This implementation caches the
+result on the assumption that the process will not call @code{chdir}
+between calls to @code{getpwd}.
+
+@end deftypefn
+
+*/
+
+#ifdef HAVE_CONFIG_H
#include "config.h"
-#include "system.h"
+#endif
+
+#include <sys/types.h>
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#if HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+/* Prototype these in case the system headers don't provide them. */
+extern char *getpwd ();
+extern char *getwd ();
+
+#include "libiberty.h"
/* Virtually every UN*X system now in common use (except for pre-4.3-tahoe
BSD systems) now provides getcwd as called for by POSIX. Allow for
the few exceptions to the general rule here. */
-#if !(defined (POSIX) || defined (USG) || defined (VMS)) || defined (HAVE_GETWD)
+#if !defined(HAVE_GETCWD) && defined(HAVE_GETWD)
#define getcwd(buf,len) getwd(buf)
+#endif
+
#ifdef MAXPATHLEN
#define GUESSPATHLEN (MAXPATHLEN + 1)
#else
#define GUESSPATHLEN 100
#endif
-#else /* (defined (USG) || defined (VMS)) */
-/* We actually use this as a starting point, not a limit. */
-#define GUESSPATHLEN 100
-#endif /* (defined (USG) || defined (VMS)) */
#if !(defined (VMS) || (defined(_WIN32) && !defined(__CYGWIN__)))
diff --git a/contrib/gcc/ggc-common.c b/contrib/gcc/ggc-common.c
index 77614ff..b0676b2 100644
--- a/contrib/gcc/ggc-common.c
+++ b/contrib/gcc/ggc-common.c
@@ -43,6 +43,7 @@ void (*lang_mark_false_label_stack) PARAMS ((struct label_node *));
/* Trees that have been marked, but whose children still need marking. */
varray_type ggc_pending_trees;
+static void ggc_mark_rtx_children_1 PARAMS ((rtx));
static void ggc_mark_rtx_ptr PARAMS ((void *));
static void ggc_mark_tree_ptr PARAMS ((void *));
static void ggc_mark_rtx_varray_ptr PARAMS ((void *));
@@ -277,6 +278,43 @@ void
ggc_mark_rtx_children (r)
rtx r;
{
+ rtx i, last;
+
+ /* Special case the instruction chain. This is a data structure whose
+ chain length is potentially unbounded, and which contain references
+ within the chain (e.g. label_ref and insn_list). If do nothing here,
+ we risk blowing the stack recursing through a long chain of insns.
+
+ Combat this by marking all of the instructions in the chain before
+ marking the contents of those instructions. */
+
+ switch (GET_CODE (r))
+ {
+ case INSN:
+ case JUMP_INSN:
+ case CALL_INSN:
+ case NOTE:
+ case CODE_LABEL:
+ case BARRIER:
+ for (i = NEXT_INSN (r); ; i = NEXT_INSN (i))
+ if (! ggc_test_and_set_mark (i))
+ break;
+ last = i;
+
+ for (i = NEXT_INSN (r); i != last; i = NEXT_INSN (i))
+ ggc_mark_rtx_children_1 (i);
+
+ default:
+ break;
+ }
+
+ ggc_mark_rtx_children_1 (r);
+}
+
+static void
+ggc_mark_rtx_children_1 (r)
+ rtx r;
+{
const char *fmt;
int i;
rtx next_rtx;
diff --git a/contrib/gcc/gthr-dce.h b/contrib/gcc/gthr-dce.h
index afefaca..957f227 100644
--- a/contrib/gcc/gthr-dce.h
+++ b/contrib/gcc/gthr-dce.h
@@ -87,11 +87,10 @@ typedef pthread_mutex_t __gthread_mutex_t;
#pragma weak pthread_yield
#endif
-static void *__gthread_active_ptr = (void *) &pthread_create;
-
static inline int
__gthread_active_p (void)
{
+ static void *const __gthread_active_ptr = (void *) &pthread_create;
return __gthread_active_ptr != 0;
}
diff --git a/contrib/gcc/gthr-posix.h b/contrib/gcc/gthr-posix.h
index fe9e584..58bfcb3 100644
--- a/contrib/gcc/gthr-posix.h
+++ b/contrib/gcc/gthr-posix.h
@@ -77,11 +77,10 @@ typedef pthread_mutex_t __gthread_mutex_t;
#pragma weak pthread_setschedparam
#endif
-static void *__gthread_active_ptr = (void *) &pthread_create;
-
static inline int
__gthread_active_p (void)
{
+ static void *const __gthread_active_ptr = (void *) &pthread_create;
return __gthread_active_ptr != 0;
}
diff --git a/contrib/gcc/gthr-rtems.h b/contrib/gcc/gthr-rtems.h
index eca281e..b3a1d68 100644
--- a/contrib/gcc/gthr-rtems.h
+++ b/contrib/gcc/gthr-rtems.h
@@ -1,7 +1,7 @@
/* RTEMS threads compatibily routines for libgcc2 and libobjc.
by: Rosimildo da Silva( rdasilva@connecttel.com ) */
/* Compile this one with gcc. */
-/* Copyright (C) 1997, 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1999, 2000, 2002 Free Software Foundation, Inc.
This file is part of GCC.
@@ -30,6 +30,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#ifndef GCC_GTHR_RTEMS_H
#define GCC_GTHR_RTEMS_H
+#ifdef __cplusplus
+extern "C" {
+#endif
#define __GTHREADS 1
@@ -48,7 +51,7 @@ typedef void *__gthread_mutex_t;
*/
/* generic per task variables */
-extern int rtems_gxx_once (__gthread_once_t *once, void (*func) ());
+extern int rtems_gxx_once (__gthread_once_t *once, void (*func) (void));
extern int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *));
extern int rtems_gxx_key_dtor (__gthread_key_t key, void *ptr);
extern int rtems_gxx_key_delete (__gthread_key_t key);
@@ -71,7 +74,7 @@ __gthread_active_p (void)
/* Wrapper calls */
static inline int
-__gthread_once (__gthread_once_t *once, void (*func) ())
+__gthread_once (__gthread_once_t *once, void (*func) (void))
{
return rtems_gxx_once( once, func );
}
@@ -124,4 +127,8 @@ __gthread_mutex_unlock (__gthread_mutex_t *mutex)
return rtems_gxx_mutex_unlock( mutex );
}
+#ifdef __cplusplus
+}
+#endif
+
#endif /* ! GCC_GTHR_RTEMS_H */
diff --git a/contrib/gcc/gthr-solaris.h b/contrib/gcc/gthr-solaris.h
index 291210d..6d7ff25 100644
--- a/contrib/gcc/gthr-solaris.h
+++ b/contrib/gcc/gthr-solaris.h
@@ -81,11 +81,10 @@ typedef mutex_t __gthread_mutex_t;
/* This will not actually work in Solaris 2.5, since libc contains
dummy symbols of all thr_* routines. */
-static void *__gthread_active_ptr = (void *) &thr_create;
-
static inline int
__gthread_active_p (void)
{
+ static void *const __gthread_active_ptr = (void *) &thr_create;
return __gthread_active_ptr != 0;
}
diff --git a/contrib/gcc/gthr-win32.h b/contrib/gcc/gthr-win32.h
new file mode 100644
index 0000000..97d5a82
--- /dev/null
+++ b/contrib/gcc/gthr-win32.h
@@ -0,0 +1,509 @@
+/* Threads compatibility routines for libgcc2 and libobjc. */
+/* Compile this one with gcc. */
+/* Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+ Contributed by Mumit Khan <khan@xraylith.wisc.edu>.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
+
+/* As a special exception, if you link this library with other files,
+ some of which are compiled with GCC, to produce an executable,
+ this library does not by itself cause the resulting executable
+ to be covered by the GNU General Public License.
+ This exception does not however invalidate any other reasons why
+ the executable file might be covered by the GNU General Public License. */
+
+#ifndef GCC_GTHR_WIN32_H
+#define GCC_GTHR_WIN32_H
+
+/* Windows32 threads specific definitions. The windows32 threading model
+ does not map well into pthread-inspired gcc's threading model, and so
+ there are caveats one needs to be aware of.
+
+ 1. The destructor supplied to __gthread_key_create is ignored for
+ generic x86-win32 ports. This will certainly cause memory leaks
+ due to unreclaimed eh contexts (sizeof (eh_context) is at least
+ 24 bytes for x86 currently).
+
+ This memory leak may be significant for long-running applications
+ that make heavy use of C++ EH.
+
+ However, Mingw runtime (version 0.3 or newer) provides a mechanism
+ to emulate pthreads key dtors; the runtime provides a special DLL,
+ linked in if -mthreads option is specified, that runs the dtors in
+ the reverse order of registration when each thread exits. If
+ -mthreads option is not given, a stub is linked in instead of the
+ DLL, which results in memory leak. Other x86-win32 ports can use
+ the same technique of course to avoid the leak.
+
+ 2. The error codes returned are non-POSIX like, and cast into ints.
+ This may cause incorrect error return due to truncation values on
+ hw where sizeof (DWORD) > sizeof (int).
+
+ 3. We might consider using Critical Sections instead of Windows32
+ mutexes for better performance, but emulating __gthread_mutex_trylock
+ interface becomes more complicated (Win9x does not support
+ TryEnterCriticalSectioni, while NT does).
+
+ The basic framework should work well enough. In the long term, GCC
+ needs to use Structured Exception Handling on Windows32. */
+
+#define __GTHREADS 1
+
+#include <errno.h>
+#ifdef __MINGW32__
+#include <_mingw.h>
+#endif
+
+#ifdef _LIBOBJC
+
+/* This is necessary to prevent windef.h (included from windows.h) from
+ defining it's own BOOL as a typedef. */
+#ifndef __OBJC__
+#define __OBJC__
+#endif
+#include <windows.h>
+/* Now undef the windows BOOL. */
+#undef BOOL
+
+/* Key structure for maintaining thread specific storage */
+static DWORD __gthread_objc_data_tls = (DWORD)-1;
+
+/* Backend initialization functions */
+
+/* Initialize the threads subsystem. */
+int
+__gthread_objc_init_thread_system(void)
+{
+ /* Initialize the thread storage key */
+ if ((__gthread_objc_data_tls = TlsAlloc()) != (DWORD)-1)
+ return 0;
+ else
+ return -1;
+}
+
+/* Close the threads subsystem. */
+int
+__gthread_objc_close_thread_system(void)
+{
+ if (__gthread_objc_data_tls != (DWORD)-1)
+ TlsFree(__gthread_objc_data_tls);
+ return 0;
+}
+
+/* Backend thread functions */
+
+/* Create a new thread of execution. */
+objc_thread_t
+__gthread_objc_thread_detach(void (*func)(void *arg), void *arg)
+{
+ DWORD thread_id = 0;
+ HANDLE win32_handle;
+
+ if (!(win32_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func,
+ arg, 0, &thread_id)))
+ thread_id = 0;
+
+ return (objc_thread_t)thread_id;
+}
+
+/* Set the current thread's priority. */
+int
+__gthread_objc_thread_set_priority(int priority)
+{
+ int sys_priority = 0;
+
+ switch (priority)
+ {
+ case OBJC_THREAD_INTERACTIVE_PRIORITY:
+ sys_priority = THREAD_PRIORITY_NORMAL;
+ break;
+ default:
+ case OBJC_THREAD_BACKGROUND_PRIORITY:
+ sys_priority = THREAD_PRIORITY_BELOW_NORMAL;
+ break;
+ case OBJC_THREAD_LOW_PRIORITY:
+ sys_priority = THREAD_PRIORITY_LOWEST;
+ break;
+ }
+
+ /* Change priority */
+ if (SetThreadPriority(GetCurrentThread(), sys_priority))
+ return 0;
+ else
+ return -1;
+}
+
+/* Return the current thread's priority. */
+int
+__gthread_objc_thread_get_priority(void)
+{
+ int sys_priority;
+
+ sys_priority = GetThreadPriority(GetCurrentThread());
+
+ switch (sys_priority)
+ {
+ case THREAD_PRIORITY_HIGHEST:
+ case THREAD_PRIORITY_TIME_CRITICAL:
+ case THREAD_PRIORITY_ABOVE_NORMAL:
+ case THREAD_PRIORITY_NORMAL:
+ return OBJC_THREAD_INTERACTIVE_PRIORITY;
+
+ default:
+ case THREAD_PRIORITY_BELOW_NORMAL:
+ return OBJC_THREAD_BACKGROUND_PRIORITY;
+
+ case THREAD_PRIORITY_IDLE:
+ case THREAD_PRIORITY_LOWEST:
+ return OBJC_THREAD_LOW_PRIORITY;
+ }
+
+ /* Couldn't get priority. */
+ return -1;
+}
+
+/* Yield our process time to another thread. */
+void
+__gthread_objc_thread_yield(void)
+{
+ Sleep(0);
+}
+
+/* Terminate the current thread. */
+int
+__gthread_objc_thread_exit(void)
+{
+ /* exit the thread */
+ ExitThread(__objc_thread_exit_status);
+
+ /* Failed if we reached here */
+ return -1;
+}
+
+/* Returns an integer value which uniquely describes a thread. */
+objc_thread_t
+__gthread_objc_thread_id(void)
+{
+ return (objc_thread_t)GetCurrentThreadId();
+}
+
+/* Sets the thread's local storage pointer. */
+int
+__gthread_objc_thread_set_data(void *value)
+{
+ if (TlsSetValue(__gthread_objc_data_tls, value))
+ return 0;
+ else
+ return -1;
+}
+
+/* Returns the thread's local storage pointer. */
+void *
+__gthread_objc_thread_get_data(void)
+{
+ DWORD lasterror;
+ void *ptr;
+
+ lasterror = GetLastError();
+
+ ptr = TlsGetValue(__gthread_objc_data_tls); /* Return thread data. */
+
+ SetLastError( lasterror );
+
+ return ptr;
+}
+
+/* Backend mutex functions */
+
+/* Allocate a mutex. */
+int
+__gthread_objc_mutex_allocate(objc_mutex_t mutex)
+{
+ if ((mutex->backend = (void *)CreateMutex(NULL, 0, NULL)) == NULL)
+ return -1;
+ else
+ return 0;
+}
+
+/* Deallocate a mutex. */
+int
+__gthread_objc_mutex_deallocate(objc_mutex_t mutex)
+{
+ CloseHandle((HANDLE)(mutex->backend));
+ return 0;
+}
+
+/* Grab a lock on a mutex. */
+int
+__gthread_objc_mutex_lock(objc_mutex_t mutex)
+{
+ int status;
+
+ status = WaitForSingleObject((HANDLE)(mutex->backend), INFINITE);
+ if (status != WAIT_OBJECT_0 && status != WAIT_ABANDONED)
+ return -1;
+ else
+ return 0;
+}
+
+/* Try to grab a lock on a mutex. */
+int
+__gthread_objc_mutex_trylock(objc_mutex_t mutex)
+{
+ int status;
+
+ status = WaitForSingleObject((HANDLE)(mutex->backend), 0);
+ if (status != WAIT_OBJECT_0 && status != WAIT_ABANDONED)
+ return -1;
+ else
+ return 0;
+}
+
+/* Unlock the mutex */
+int
+__gthread_objc_mutex_unlock(objc_mutex_t mutex)
+{
+ if (ReleaseMutex((HANDLE)(mutex->backend)) == 0)
+ return -1;
+ else
+ return 0;
+}
+
+/* Backend condition mutex functions */
+
+/* Allocate a condition. */
+int
+__gthread_objc_condition_allocate(objc_condition_t condition)
+{
+ /* Unimplemented. */
+ return -1;
+}
+
+/* Deallocate a condition. */
+int
+__gthread_objc_condition_deallocate(objc_condition_t condition)
+{
+ /* Unimplemented. */
+ return -1;
+}
+
+/* Wait on the condition */
+int
+__gthread_objc_condition_wait(objc_condition_t condition, objc_mutex_t mutex)
+{
+ /* Unimplemented. */
+ return -1;
+}
+
+/* Wake up all threads waiting on this condition. */
+int
+__gthread_objc_condition_broadcast(objc_condition_t condition)
+{
+ /* Unimplemented. */
+ return -1;
+}
+
+/* Wake up one thread waiting on this condition. */
+int
+__gthread_objc_condition_signal(objc_condition_t condition)
+{
+ /* Unimplemented. */
+ return -1;
+}
+
+#else /* _LIBOBJC */
+
+#include <windows.h>
+
+typedef DWORD __gthread_key_t;
+
+typedef struct {
+ int done;
+ long started;
+} __gthread_once_t;
+
+typedef HANDLE __gthread_mutex_t;
+
+#define __GTHREAD_ONCE_INIT {FALSE, -1}
+#define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function
+
+#if __MINGW32_MAJOR_VERSION >= 1 || \
+ (__MINGW32_MAJOR_VERSION == 0 && __MINGW32_MINOR_VERSION > 2)
+#define MINGW32_SUPPORTS_MT_EH 1
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern int __mingwthr_key_dtor (DWORD, void (*) (void *));
+#ifdef __cplusplus
+}
+#endif
+
+/* Mingw runtime >= v0.3 provides a magic variable that is set to non-zero
+ if -mthreads option was specified, or 0 otherwise. This is to get around
+ the lack of weak symbols in PE-COFF. */
+extern int _CRT_MT;
+#endif
+
+static inline int
+__gthread_active_p (void)
+{
+#ifdef MINGW32_SUPPORTS_MT_EH
+ return _CRT_MT;
+#else
+ return 1;
+#endif
+}
+
+static inline int
+__gthread_once (__gthread_once_t *once, void (*func) (void))
+{
+ if (! __gthread_active_p ())
+ return -1;
+ else if (once == NULL || func == NULL)
+ return EINVAL;
+
+ if (! once->done)
+ {
+ if (InterlockedIncrement (&(once->started)) == 0)
+ {
+ (*func) ();
+ once->done = TRUE;
+ }
+ else
+ {
+ /* Another thread is currently executing the code, so wait for it
+ to finish; yield the CPU in the meantime. If performance
+ does become an issue, the solution is to use an Event that
+ we wait on here (and set above), but that implies a place to
+ create the event before this routine is called. */
+ while (! once->done)
+ Sleep (0);
+ }
+ }
+
+ return 0;
+}
+
+/* Windows32 thread local keys don't support destructors; this leads to
+ leaks, especially in threaded applications making extensive use of
+ C++ EH. Mingw uses a thread-support DLL to work-around this problem. */
+static inline int
+__gthread_key_create (__gthread_key_t *key, void (*dtor) (void *))
+{
+ int status = 0;
+ DWORD tls_index = TlsAlloc ();
+ if (tls_index != 0xFFFFFFFF)
+ {
+ *key = tls_index;
+#ifdef MINGW32_SUPPORTS_MT_EH
+ /* Mingw runtime will run the dtors in reverse order for each thread
+ when the thread exits. */
+ status = __mingwthr_key_dtor (*key, dtor);
+#endif
+ }
+ else
+ status = (int) GetLastError ();
+ return status;
+}
+
+/* Currently, this routine is called only for Mingw runtime, and if
+ -mthreads option is chosen to link in the thread support DLL. */
+static inline int
+__gthread_key_dtor (__gthread_key_t key, void *ptr)
+{
+ /* Nothing needed. */
+ return 0;
+}
+
+static inline int
+__gthread_key_delete (__gthread_key_t key)
+{
+ return (TlsFree (key) != 0) ? 0 : (int) GetLastError ();
+}
+
+static inline void *
+__gthread_getspecific (__gthread_key_t key)
+{
+ DWORD lasterror;
+ void *ptr;
+
+ lasterror = GetLastError();
+
+ ptr = TlsGetValue(key);
+
+ SetLastError( lasterror );
+
+ return ptr;
+}
+
+static inline int
+__gthread_setspecific (__gthread_key_t key, const void *ptr)
+{
+ return (TlsSetValue (key, (void*) ptr) != 0) ? 0 : (int) GetLastError ();
+}
+
+static inline void
+__gthread_mutex_init_function (__gthread_mutex_t *mutex)
+{
+ /* Create unnamed mutex with default security attr and no initial owner. */
+ *mutex = CreateMutex (NULL, 0, NULL);
+}
+
+static inline int
+__gthread_mutex_lock (__gthread_mutex_t *mutex)
+{
+ int status = 0;
+
+ if (__gthread_active_p ())
+ {
+ if (WaitForSingleObject (*mutex, INFINITE) == WAIT_OBJECT_0)
+ status = 0;
+ else
+ status = 1;
+ }
+ return status;
+}
+
+static inline int
+__gthread_mutex_trylock (__gthread_mutex_t *mutex)
+{
+ int status = 0;
+
+ if (__gthread_active_p ())
+ {
+ if (WaitForSingleObject (*mutex, 0) == WAIT_OBJECT_0)
+ status = 0;
+ else
+ status = 1;
+ }
+ return status;
+}
+
+static inline int
+__gthread_mutex_unlock (__gthread_mutex_t *mutex)
+{
+ if (__gthread_active_p ())
+ return (ReleaseMutex (*mutex) != 0) ? 0 : 1;
+ else
+ return 0;
+}
+
+#endif /* _LIBOBJC */
+
+#endif /* ! GCC_GTHR_WIN32_H */
+
diff --git a/contrib/gcc/haifa-sched.c b/contrib/gcc/haifa-sched.c
index 150cb09..686369d 100644
--- a/contrib/gcc/haifa-sched.c
+++ b/contrib/gcc/haifa-sched.c
@@ -1617,6 +1617,18 @@ move_insn (insn, last)
return retval;
}
+/* Called from backends from targetm.sched.reorder to emit stuff into
+ the instruction stream. */
+
+rtx
+sched_emit_insn (pat)
+ rtx pat;
+{
+ rtx insn = emit_insn_after (pat, last_scheduled_insn);
+ last_scheduled_insn = insn;
+ return insn;
+}
+
/* Use forward list scheduling to rearrange insns of block B in region RGN,
possibly bringing insns from subsequent blocks in the same region. */
@@ -1625,7 +1637,6 @@ schedule_block (b, rgn_n_insns)
int b;
int rgn_n_insns;
{
- rtx last;
struct ready_list ready;
int can_issue_more;
@@ -1673,8 +1684,8 @@ schedule_block (b, rgn_n_insns)
if (targetm.sched.md_init)
(*targetm.sched.md_init) (sched_dump, sched_verbose, ready.veclen);
- /* No insns scheduled in this block yet. */
- last_scheduled_insn = 0;
+ /* We start inserting insns after PREV_HEAD. */
+ last_scheduled_insn = prev_head;
/* Initialize INSN_QUEUE. Q_SIZE is the total number of insns in the
queue. */
@@ -1686,9 +1697,6 @@ schedule_block (b, rgn_n_insns)
/* Start just before the beginning of time. */
clock_var = -1;
- /* We start inserting insns after PREV_HEAD. */
- last = prev_head;
-
/* Loop until all the insns in BB are scheduled. */
while ((*current_sched_info->schedule_more_p) ())
{
@@ -1700,9 +1708,6 @@ schedule_block (b, rgn_n_insns)
list. */
queue_to_ready (&ready);
- if (sched_verbose && targetm.sched.cycle_display)
- last = (*targetm.sched.cycle_display) (clock_var, last);
-
if (ready.n_ready == 0)
abort ();
@@ -1725,6 +1730,10 @@ schedule_block (b, rgn_n_insns)
else
can_issue_more = issue_rate;
+ if (sched_verbose && targetm.sched.cycle_display)
+ last_scheduled_insn
+ = (*targetm.sched.cycle_display) (clock_var, last_scheduled_insn);
+
if (sched_verbose)
{
fprintf (sched_dump, "\n;;\tReady list (t =%3d): ", clock_var);
@@ -1749,8 +1758,7 @@ schedule_block (b, rgn_n_insns)
if (! (*current_sched_info->can_schedule_ready_p) (insn))
goto next;
- last_scheduled_insn = insn;
- last = move_insn (insn, last);
+ last_scheduled_insn = move_insn (insn, last_scheduled_insn);
if (targetm.sched.variable_issue)
can_issue_more =
@@ -1798,7 +1806,7 @@ schedule_block (b, rgn_n_insns)
/* Update head/tail boundaries. */
head = NEXT_INSN (prev_head);
- tail = last;
+ tail = last_scheduled_insn;
/* Restore-other-notes: NOTE_LIST is the end of a chain of notes
previously found among the insns. Insert them at the beginning
diff --git a/contrib/gcc/hashtab.c b/contrib/gcc/hashtab.c
new file mode 100644
index 0000000..7477c35
--- /dev/null
+++ b/contrib/gcc/hashtab.c
@@ -0,0 +1,616 @@
+/* An expandable hash tables datatype.
+ Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ Contributed by Vladimir Makarov (vmakarov@cygnus.com).
+
+This file is part of the libiberty library.
+Libiberty is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+Libiberty 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with libiberty; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* This package implements basic hash table functionality. It is possible
+ to search for an entry, create an entry and destroy an entry.
+
+ Elements in the table are generic pointers.
+
+ The size of the table is not fixed; if the occupancy of the table
+ grows too high the hash table will be expanded.
+
+ The abstract data implementation is based on generalized Algorithm D
+ from Knuth's book "The art of computer programming". Hash table is
+ expanded by creation of new hash table and transferring elements from
+ the old table to the new table. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include <stdio.h>
+
+#include "libiberty.h"
+#include "hashtab.h"
+
+/* This macro defines reserved value for empty table entry. */
+
+#define EMPTY_ENTRY ((PTR) 0)
+
+/* This macro defines reserved value for table entry which contained
+ a deleted element. */
+
+#define DELETED_ENTRY ((PTR) 1)
+
+static unsigned long higher_prime_number PARAMS ((unsigned long));
+static hashval_t hash_pointer PARAMS ((const void *));
+static int eq_pointer PARAMS ((const void *, const void *));
+static int htab_expand PARAMS ((htab_t));
+static PTR *find_empty_slot_for_expand PARAMS ((htab_t, hashval_t));
+
+/* At some point, we could make these be NULL, and modify the
+ hash-table routines to handle NULL specially; that would avoid
+ function-call overhead for the common case of hashing pointers. */
+htab_hash htab_hash_pointer = hash_pointer;
+htab_eq htab_eq_pointer = eq_pointer;
+
+/* The following function returns a nearest prime number which is
+ greater than N, and near a power of two. */
+
+static unsigned long
+higher_prime_number (n)
+ unsigned long n;
+{
+ /* These are primes that are near, but slightly smaller than, a
+ power of two. */
+ static const unsigned long primes[] = {
+ (unsigned long) 7,
+ (unsigned long) 13,
+ (unsigned long) 31,
+ (unsigned long) 61,
+ (unsigned long) 127,
+ (unsigned long) 251,
+ (unsigned long) 509,
+ (unsigned long) 1021,
+ (unsigned long) 2039,
+ (unsigned long) 4093,
+ (unsigned long) 8191,
+ (unsigned long) 16381,
+ (unsigned long) 32749,
+ (unsigned long) 65521,
+ (unsigned long) 131071,
+ (unsigned long) 262139,
+ (unsigned long) 524287,
+ (unsigned long) 1048573,
+ (unsigned long) 2097143,
+ (unsigned long) 4194301,
+ (unsigned long) 8388593,
+ (unsigned long) 16777213,
+ (unsigned long) 33554393,
+ (unsigned long) 67108859,
+ (unsigned long) 134217689,
+ (unsigned long) 268435399,
+ (unsigned long) 536870909,
+ (unsigned long) 1073741789,
+ (unsigned long) 2147483647,
+ /* 4294967291L */
+ ((unsigned long) 2147483647) + ((unsigned long) 2147483644),
+ };
+
+ const unsigned long *low = &primes[0];
+ const unsigned long *high = &primes[sizeof(primes) / sizeof(primes[0])];
+
+ while (low != high)
+ {
+ const unsigned long *mid = low + (high - low) / 2;
+ if (n > *mid)
+ low = mid + 1;
+ else
+ high = mid;
+ }
+
+ /* If we've run out of primes, abort. */
+ if (n > *low)
+ {
+ fprintf (stderr, "Cannot find prime bigger than %lu\n", n);
+ abort ();
+ }
+
+ return *low;
+}
+
+/* Returns a hash code for P. */
+
+static hashval_t
+hash_pointer (p)
+ const PTR p;
+{
+ return (hashval_t) ((long)p >> 3);
+}
+
+/* Returns non-zero if P1 and P2 are equal. */
+
+static int
+eq_pointer (p1, p2)
+ const PTR p1;
+ const PTR p2;
+{
+ return p1 == p2;
+}
+
+/* This function creates table with length slightly longer than given
+ source length. Created hash table is initiated as empty (all the
+ hash table entries are EMPTY_ENTRY). The function returns the
+ created hash table. Memory allocation must not fail. */
+
+htab_t
+htab_create (size, hash_f, eq_f, del_f)
+ size_t size;
+ htab_hash hash_f;
+ htab_eq eq_f;
+ htab_del del_f;
+{
+ htab_t result;
+
+ size = higher_prime_number (size);
+ result = (htab_t) xcalloc (1, sizeof (struct htab));
+ result->entries = (PTR *) xcalloc (size, sizeof (PTR));
+ result->size = size;
+ result->hash_f = hash_f;
+ result->eq_f = eq_f;
+ result->del_f = del_f;
+ result->return_allocation_failure = 0;
+ return result;
+}
+
+/* This function creates table with length slightly longer than given
+ source length. The created hash table is initiated as empty (all the
+ hash table entries are EMPTY_ENTRY). The function returns the created
+ hash table. Memory allocation may fail; it may return NULL. */
+
+htab_t
+htab_try_create (size, hash_f, eq_f, del_f)
+ size_t size;
+ htab_hash hash_f;
+ htab_eq eq_f;
+ htab_del del_f;
+{
+ htab_t result;
+
+ size = higher_prime_number (size);
+ result = (htab_t) calloc (1, sizeof (struct htab));
+ if (result == NULL)
+ return NULL;
+
+ result->entries = (PTR *) calloc (size, sizeof (PTR));
+ if (result->entries == NULL)
+ {
+ free (result);
+ return NULL;
+ }
+
+ result->size = size;
+ result->hash_f = hash_f;
+ result->eq_f = eq_f;
+ result->del_f = del_f;
+ result->return_allocation_failure = 1;
+ return result;
+}
+
+/* This function frees all memory allocated for given hash table.
+ Naturally the hash table must already exist. */
+
+void
+htab_delete (htab)
+ htab_t htab;
+{
+ int i;
+
+ if (htab->del_f)
+ for (i = htab->size - 1; i >= 0; i--)
+ if (htab->entries[i] != EMPTY_ENTRY
+ && htab->entries[i] != DELETED_ENTRY)
+ (*htab->del_f) (htab->entries[i]);
+
+ free (htab->entries);
+ free (htab);
+}
+
+/* This function clears all entries in the given hash table. */
+
+void
+htab_empty (htab)
+ htab_t htab;
+{
+ int i;
+
+ if (htab->del_f)
+ for (i = htab->size - 1; i >= 0; i--)
+ if (htab->entries[i] != EMPTY_ENTRY
+ && htab->entries[i] != DELETED_ENTRY)
+ (*htab->del_f) (htab->entries[i]);
+
+ memset (htab->entries, 0, htab->size * sizeof (PTR));
+}
+
+/* Similar to htab_find_slot, but without several unwanted side effects:
+ - Does not call htab->eq_f when it finds an existing entry.
+ - Does not change the count of elements/searches/collisions in the
+ hash table.
+ This function also assumes there are no deleted entries in the table.
+ HASH is the hash value for the element to be inserted. */
+
+static PTR *
+find_empty_slot_for_expand (htab, hash)
+ htab_t htab;
+ hashval_t hash;
+{
+ size_t size = htab->size;
+ unsigned int index = hash % size;
+ PTR *slot = htab->entries + index;
+ hashval_t hash2;
+
+ if (*slot == EMPTY_ENTRY)
+ return slot;
+ else if (*slot == DELETED_ENTRY)
+ abort ();
+
+ hash2 = 1 + hash % (size - 2);
+ for (;;)
+ {
+ index += hash2;
+ if (index >= size)
+ index -= size;
+
+ slot = htab->entries + index;
+ if (*slot == EMPTY_ENTRY)
+ return slot;
+ else if (*slot == DELETED_ENTRY)
+ abort ();
+ }
+}
+
+/* The following function changes size of memory allocated for the
+ entries and repeatedly inserts the table elements. The occupancy
+ of the table after the call will be about 50%. Naturally the hash
+ table must already exist. Remember also that the place of the
+ table entries is changed. If memory allocation failures are allowed,
+ this function will return zero, indicating that the table could not be
+ expanded. If all goes well, it will return a non-zero value. */
+
+static int
+htab_expand (htab)
+ htab_t htab;
+{
+ PTR *oentries;
+ PTR *olimit;
+ PTR *p;
+
+ oentries = htab->entries;
+ olimit = oentries + htab->size;
+
+ htab->size = higher_prime_number (htab->size * 2);
+
+ if (htab->return_allocation_failure)
+ {
+ PTR *nentries = (PTR *) calloc (htab->size, sizeof (PTR *));
+ if (nentries == NULL)
+ return 0;
+ htab->entries = nentries;
+ }
+ else
+ htab->entries = (PTR *) xcalloc (htab->size, sizeof (PTR *));
+
+ htab->n_elements -= htab->n_deleted;
+ htab->n_deleted = 0;
+
+ p = oentries;
+ do
+ {
+ PTR x = *p;
+
+ if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
+ {
+ PTR *q = find_empty_slot_for_expand (htab, (*htab->hash_f) (x));
+
+ *q = x;
+ }
+
+ p++;
+ }
+ while (p < olimit);
+
+ free (oentries);
+ return 1;
+}
+
+/* This function searches for a hash table entry equal to the given
+ element. It cannot be used to insert or delete an element. */
+
+PTR
+htab_find_with_hash (htab, element, hash)
+ htab_t htab;
+ const PTR element;
+ hashval_t hash;
+{
+ unsigned int index;
+ hashval_t hash2;
+ size_t size;
+ PTR entry;
+
+ htab->searches++;
+ size = htab->size;
+ index = hash % size;
+
+ entry = htab->entries[index];
+ if (entry == EMPTY_ENTRY
+ || (entry != DELETED_ENTRY && (*htab->eq_f) (entry, element)))
+ return entry;
+
+ hash2 = 1 + hash % (size - 2);
+
+ for (;;)
+ {
+ htab->collisions++;
+ index += hash2;
+ if (index >= size)
+ index -= size;
+
+ entry = htab->entries[index];
+ if (entry == EMPTY_ENTRY
+ || (entry != DELETED_ENTRY && (*htab->eq_f) (entry, element)))
+ return entry;
+ }
+}
+
+/* Like htab_find_slot_with_hash, but compute the hash value from the
+ element. */
+
+PTR
+htab_find (htab, element)
+ htab_t htab;
+ const PTR element;
+{
+ return htab_find_with_hash (htab, element, (*htab->hash_f) (element));
+}
+
+/* This function searches for a hash table slot containing an entry
+ equal to the given element. To delete an entry, call this with
+ INSERT = 0, then call htab_clear_slot on the slot returned (possibly
+ after doing some checks). To insert an entry, call this with
+ INSERT = 1, then write the value you want into the returned slot.
+ When inserting an entry, NULL may be returned if memory allocation
+ fails. */
+
+PTR *
+htab_find_slot_with_hash (htab, element, hash, insert)
+ htab_t htab;
+ const PTR element;
+ hashval_t hash;
+ enum insert_option insert;
+{
+ PTR *first_deleted_slot;
+ unsigned int index;
+ hashval_t hash2;
+ size_t size;
+ PTR entry;
+
+ if (insert == INSERT && htab->size * 3 <= htab->n_elements * 4
+ && htab_expand (htab) == 0)
+ return NULL;
+
+ size = htab->size;
+ index = hash % size;
+
+ htab->searches++;
+ first_deleted_slot = NULL;
+
+ entry = htab->entries[index];
+ if (entry == EMPTY_ENTRY)
+ goto empty_entry;
+ else if (entry == DELETED_ENTRY)
+ first_deleted_slot = &htab->entries[index];
+ else if ((*htab->eq_f) (entry, element))
+ return &htab->entries[index];
+
+ hash2 = 1 + hash % (size - 2);
+ for (;;)
+ {
+ htab->collisions++;
+ index += hash2;
+ if (index >= size)
+ index -= size;
+
+ entry = htab->entries[index];
+ if (entry == EMPTY_ENTRY)
+ goto empty_entry;
+ else if (entry == DELETED_ENTRY)
+ {
+ if (!first_deleted_slot)
+ first_deleted_slot = &htab->entries[index];
+ }
+ else if ((*htab->eq_f) (entry, element))
+ return &htab->entries[index];
+ }
+
+ empty_entry:
+ if (insert == NO_INSERT)
+ return NULL;
+
+ htab->n_elements++;
+
+ if (first_deleted_slot)
+ {
+ *first_deleted_slot = EMPTY_ENTRY;
+ return first_deleted_slot;
+ }
+
+ return &htab->entries[index];
+}
+
+/* Like htab_find_slot_with_hash, but compute the hash value from the
+ element. */
+
+PTR *
+htab_find_slot (htab, element, insert)
+ htab_t htab;
+ const PTR element;
+ enum insert_option insert;
+{
+ return htab_find_slot_with_hash (htab, element, (*htab->hash_f) (element),
+ insert);
+}
+
+/* This function deletes an element with the given value from hash
+ table. If there is no matching element in the hash table, this
+ function does nothing. */
+
+void
+htab_remove_elt (htab, element)
+ htab_t htab;
+ PTR element;
+{
+ PTR *slot;
+
+ slot = htab_find_slot (htab, element, NO_INSERT);
+ if (*slot == EMPTY_ENTRY)
+ return;
+
+ if (htab->del_f)
+ (*htab->del_f) (*slot);
+
+ *slot = DELETED_ENTRY;
+ htab->n_deleted++;
+}
+
+/* This function clears a specified slot in a hash table. It is
+ useful when you've already done the lookup and don't want to do it
+ again. */
+
+void
+htab_clear_slot (htab, slot)
+ htab_t htab;
+ PTR *slot;
+{
+ if (slot < htab->entries || slot >= htab->entries + htab->size
+ || *slot == EMPTY_ENTRY || *slot == DELETED_ENTRY)
+ abort ();
+
+ if (htab->del_f)
+ (*htab->del_f) (*slot);
+
+ *slot = DELETED_ENTRY;
+ htab->n_deleted++;
+}
+
+/* This function scans over the entire hash table calling
+ CALLBACK for each live entry. If CALLBACK returns false,
+ the iteration stops. INFO is passed as CALLBACK's second
+ argument. */
+
+void
+htab_traverse (htab, callback, info)
+ htab_t htab;
+ htab_trav callback;
+ PTR info;
+{
+ PTR *slot = htab->entries;
+ PTR *limit = slot + htab->size;
+
+ do
+ {
+ PTR x = *slot;
+
+ if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
+ if (!(*callback) (slot, info))
+ break;
+ }
+ while (++slot < limit);
+}
+
+/* Return the current size of given hash table. */
+
+size_t
+htab_size (htab)
+ htab_t htab;
+{
+ return htab->size;
+}
+
+/* Return the current number of elements in given hash table. */
+
+size_t
+htab_elements (htab)
+ htab_t htab;
+{
+ return htab->n_elements - htab->n_deleted;
+}
+
+/* Return the fraction of fixed collisions during all work with given
+ hash table. */
+
+double
+htab_collisions (htab)
+ htab_t htab;
+{
+ if (htab->searches == 0)
+ return 0.0;
+
+ return (double) htab->collisions / (double) htab->searches;
+}
+
+/* Hash P as a null-terminated string.
+
+ Copied from gcc/hashtable.c. Zack had the following to say with respect
+ to applicability, though note that unlike hashtable.c, this hash table
+ implementation re-hashes rather than chain buckets.
+
+ http://gcc.gnu.org/ml/gcc-patches/2001-08/msg01021.html
+ From: Zack Weinberg <zackw@panix.com>
+ Date: Fri, 17 Aug 2001 02:15:56 -0400
+
+ I got it by extracting all the identifiers from all the source code
+ I had lying around in mid-1999, and testing many recurrences of
+ the form "H_n = H_{n-1} * K + c_n * L + M" where K, L, M were either
+ prime numbers or the appropriate identity. This was the best one.
+ I don't remember exactly what constituted "best", except I was
+ looking at bucket-length distributions mostly.
+
+ So it should be very good at hashing identifiers, but might not be
+ as good at arbitrary strings.
+
+ I'll add that it thoroughly trounces the hash functions recommended
+ for this use at http://burtleburtle.net/bob/hash/index.html, both
+ on speed and bucket distribution. I haven't tried it against the
+ function they just started using for Perl's hashes. */
+
+hashval_t
+htab_hash_string (p)
+ const PTR p;
+{
+ const unsigned char *str = (const unsigned char *) p;
+ hashval_t r = 0;
+ unsigned char c;
+
+ while ((c = *str++) != 0)
+ r = r * 67 + c - 113;
+
+ return r;
+}
diff --git a/contrib/gcc/hashtab.h b/contrib/gcc/hashtab.h
new file mode 100644
index 0000000..8871710
--- /dev/null
+++ b/contrib/gcc/hashtab.h
@@ -0,0 +1,155 @@
+/* An expandable hash tables datatype.
+ Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ Contributed by Vladimir Makarov (vmakarov@cygnus.com).
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* This package implements basic hash table functionality. It is possible
+ to search for an entry, create an entry and destroy an entry.
+
+ Elements in the table are generic pointers.
+
+ The size of the table is not fixed; if the occupancy of the table
+ grows too high the hash table will be expanded.
+
+ The abstract data implementation is based on generalized Algorithm D
+ from Knuth's book "The art of computer programming". Hash table is
+ expanded by creation of new hash table and transferring elements from
+ the old table to the new table. */
+
+#ifndef __HASHTAB_H__
+#define __HASHTAB_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include <ansidecl.h>
+
+/* The type for a hash code. */
+typedef unsigned int hashval_t;
+
+/* Callback function pointer types. */
+
+/* Calculate hash of a table entry. */
+typedef hashval_t (*htab_hash) PARAMS ((const void *));
+
+/* Compare a table entry with a possible entry. The entry already in
+ the table always comes first, so the second element can be of a
+ different type (but in this case htab_find and htab_find_slot
+ cannot be used; instead the variants that accept a hash value
+ must be used). */
+typedef int (*htab_eq) PARAMS ((const void *, const void *));
+
+/* Cleanup function called whenever a live element is removed from
+ the hash table. */
+typedef void (*htab_del) PARAMS ((void *));
+
+/* Function called by htab_traverse for each live element. The first
+ arg is the slot of the element (which can be passed to htab_clear_slot
+ if desired), the second arg is the auxiliary pointer handed to
+ htab_traverse. Return 1 to continue scan, 0 to stop. */
+typedef int (*htab_trav) PARAMS ((void **, void *));
+
+/* Hash tables are of the following type. The structure
+ (implementation) of this type is not needed for using the hash
+ tables. All work with hash table should be executed only through
+ functions mentioned below. */
+
+struct htab
+{
+ /* Pointer to hash function. */
+ htab_hash hash_f;
+
+ /* Pointer to comparison function. */
+ htab_eq eq_f;
+
+ /* Pointer to cleanup function. */
+ htab_del del_f;
+
+ /* Table itself. */
+ PTR *entries;
+
+ /* Current size (in entries) of the hash table */
+ size_t size;
+
+ /* Current number of elements including also deleted elements */
+ size_t n_elements;
+
+ /* Current number of deleted elements in the table */
+ size_t n_deleted;
+
+ /* The following member is used for debugging. Its value is number
+ of all calls of `htab_find_slot' for the hash table. */
+ unsigned int searches;
+
+ /* The following member is used for debugging. Its value is number
+ of collisions fixed for time of work with the hash table. */
+ unsigned int collisions;
+
+ /* This is non-zero if we are allowed to return NULL for function calls
+ that allocate memory. */
+ int return_allocation_failure;
+};
+
+typedef struct htab *htab_t;
+
+/* An enum saying whether we insert into the hash table or not. */
+enum insert_option {NO_INSERT, INSERT};
+
+/* The prototypes of the package functions. */
+
+extern htab_t htab_create PARAMS ((size_t, htab_hash,
+ htab_eq, htab_del));
+
+/* This function is like htab_create, but may return NULL if memory
+ allocation fails, and also signals that htab_find_slot_with_hash and
+ htab_find_slot are allowed to return NULL when inserting. */
+extern htab_t htab_try_create PARAMS ((size_t, htab_hash,
+ htab_eq, htab_del));
+extern void htab_delete PARAMS ((htab_t));
+extern void htab_empty PARAMS ((htab_t));
+
+extern PTR htab_find PARAMS ((htab_t, const void *));
+extern PTR *htab_find_slot PARAMS ((htab_t, const void *,
+ enum insert_option));
+extern PTR htab_find_with_hash PARAMS ((htab_t, const void *,
+ hashval_t));
+extern PTR *htab_find_slot_with_hash PARAMS ((htab_t, const void *,
+ hashval_t,
+ enum insert_option));
+extern void htab_clear_slot PARAMS ((htab_t, void **));
+extern void htab_remove_elt PARAMS ((htab_t, void *));
+
+extern void htab_traverse PARAMS ((htab_t, htab_trav, void *));
+
+extern size_t htab_size PARAMS ((htab_t));
+extern size_t htab_elements PARAMS ((htab_t));
+extern double htab_collisions PARAMS ((htab_t));
+
+/* A hash function for pointers. */
+extern htab_hash htab_hash_pointer;
+
+/* An equality function for pointers. */
+extern htab_eq htab_eq_pointer;
+
+/* A hash function for null-terminated strings. */
+extern hashval_t htab_hash_string PARAMS ((const PTR));
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __HASHTAB_H */
diff --git a/contrib/gcc/hex.c b/contrib/gcc/hex.c
new file mode 100644
index 0000000..3ba04ba
--- /dev/null
+++ b/contrib/gcc/hex.c
@@ -0,0 +1,111 @@
+/* Hex character manipulation support.
+ Copyright (C) 1995, 2001 Free Software Foundation, Inc.
+
+This file is part of the libiberty library.
+Libiberty is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+Libiberty 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with libiberty; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include <stdio.h> /* for EOF */
+#include "libiberty.h"
+
+/* Provided for ABI compatibility. */
+void
+hex_init ()
+{
+}
+
+/* Are we ASCII? */
+#if '\n' == 0x0A && ' ' == 0x20 && '0' == 0x30 \
+ && 'A' == 0x41 && 'a' == 0x61 && '!' == 0x21 \
+ && EOF == -1
+
+const char _hex_value[_hex_array_size] =
+{
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* NUL SOH STX ETX */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* EOT ENQ ACK BEL */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* BS HT LF VT */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* FF CR SO SI */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* DLE DC1 DC2 DC3 */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* DC4 NAK SYN ETB */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* CAN EM SUB ESC */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* FS GS RS US */
+
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* SP ! " # */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* $ % & ' */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* ( ) * + */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* , - . / */
+ 0, 1, 2, 3, /* 0 1 2 3 */
+ 4, 5, 6, 7, /* 4 5 6 7 */
+ 8, 9, _hex_bad, _hex_bad, /* 8 9 : ; */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* < = > ? */
+
+ _hex_bad, 10, 11, 12, /* @ A B C */
+ 13, 14, 15, _hex_bad, /* D E F G */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* H I J K */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* L M N O */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* P Q R S */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* T U V W */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* X Y Z [ */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* \ ] ^ _ */
+
+ _hex_bad, 10, 11, 12, /* ` a b c */
+ 13, 14, 15, _hex_bad, /* d e f g */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* h i j k */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* l m n o */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* p q r s */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* t u v w */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* x y z { */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad, /* | } ~ DEL */
+
+ /* The high half of unsigned char, all values are _hex_bad. */
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+ _hex_bad, _hex_bad, _hex_bad, _hex_bad,
+};
+#else
+ #error "Unsupported host character set"
+#endif /* not ASCII */
diff --git a/contrib/gcc/hooks.c b/contrib/gcc/hooks.c
new file mode 100644
index 0000000..387f4db
--- /dev/null
+++ b/contrib/gcc/hooks.c
@@ -0,0 +1,34 @@
+/* General-purpose hooks.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ In other words, you are welcome to use, share and improve this program.
+ You are forbidden to forbid anyone else to use, share and improve
+ what you give them. Help stamp out software-hoarding! */
+
+/* This file contains generic hooks that can be used as defaults for
+ target or language-dependent hook initializers. */
+
+#include "config.h"
+#include "system.h"
+#include "hooks.h"
+
+/* Generic hook that takes no arguments and returns false. */
+bool
+hook_void_bool_false ()
+{
+ return false;
+}
diff --git a/contrib/gcc/hooks.h b/contrib/gcc/hooks.h
new file mode 100644
index 0000000..7a8daa5
--- /dev/null
+++ b/contrib/gcc/hooks.h
@@ -0,0 +1,22 @@
+/* General-purpose hooks.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ In other words, you are welcome to use, share and improve this program.
+ You are forbidden to forbid anyone else to use, share and improve
+ what you give them. Help stamp out software-hoarding! */
+
+bool hook_void_bool_false PARAMS ((void));
diff --git a/contrib/gcc/hwint.h b/contrib/gcc/hwint.h
index ea8be55..57d7edf 100644
--- a/contrib/gcc/hwint.h
+++ b/contrib/gcc/hwint.h
@@ -18,7 +18,7 @@
#ifdef HAVE_LONG_LONG
# define HOST_BITS_PER_LONGLONG (CHAR_BIT * SIZEOF_LONG_LONG)
#else
-#ifdef HAVE__INT64
+#ifdef HAVE___INT64
# define HOST_BITS_PER_LONGLONG (CHAR_BIT * SIZEOF___INT64)
#else
/* If we're here and we're GCC, assume this is stage 2+ of a bootstrap
diff --git a/contrib/gcc/ifcvt.c b/contrib/gcc/ifcvt.c
index a7860e3..0d65eab 100644
--- a/contrib/gcc/ifcvt.c
+++ b/contrib/gcc/ifcvt.c
@@ -27,6 +27,7 @@
#include "flags.h"
#include "insn-config.h"
#include "recog.h"
+#include "except.h"
#include "hard-reg-set.h"
#include "basic-block.h"
#include "expr.h"
@@ -104,6 +105,7 @@ static int find_if_block PARAMS ((basic_block, edge, edge));
static int find_if_case_1 PARAMS ((basic_block, edge, edge));
static int find_if_case_2 PARAMS ((basic_block, edge, edge));
static int find_cond_trap PARAMS ((basic_block, edge, edge));
+static rtx block_has_only_trap PARAMS ((basic_block));
static int find_memory PARAMS ((rtx *, void *));
static int dead_or_predicable PARAMS ((basic_block, basic_block,
basic_block, basic_block, int));
@@ -620,7 +622,7 @@ noce_try_store_flag (if_info)
seq = get_insns ();
end_sequence ();
- emit_insns_before (seq, if_info->cond_earliest);
+ emit_insns_before (seq, if_info->jump);
return TRUE;
}
@@ -755,7 +757,7 @@ noce_try_store_flag_constants (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insns_before (seq, if_info->cond_earliest);
+ emit_insns_before (seq, if_info->jump);
return TRUE;
}
@@ -815,7 +817,7 @@ noce_try_store_flag_inc (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insns_before (seq, if_info->cond_earliest);
+ emit_insns_before (seq, if_info->jump);
return TRUE;
}
@@ -867,7 +869,7 @@ noce_try_store_flag_mask (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insns_before (seq, if_info->cond_earliest);
+ emit_insns_before (seq, if_info->jump);
return TRUE;
}
@@ -962,7 +964,7 @@ noce_try_cmove (if_info)
seq = get_insns ();
end_sequence ();
- emit_insns_before (seq, if_info->cond_earliest);
+ emit_insns_before (seq, if_info->jump);
return TRUE;
}
else
@@ -1124,7 +1126,7 @@ noce_try_cmove_arith (if_info)
tmp = get_insns ();
end_sequence ();
- emit_insns_before (tmp, if_info->cond_earliest);
+ emit_insns_before (tmp, if_info->jump);
return TRUE;
end_seq_and_fail:
@@ -1377,7 +1379,7 @@ noce_try_minmax (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insns_before (seq, earliest);
+ emit_insns_before (seq, if_info->jump);
if_info->cond = cond;
if_info->cond_earliest = earliest;
@@ -1495,7 +1497,7 @@ noce_try_abs (if_info)
if (seq_contains_jump (seq))
return FALSE;
- emit_insns_before (seq, earliest);
+ emit_insns_before (seq, if_info->jump);
if_info->cond = cond;
if_info->cond_earliest = earliest;
@@ -1783,7 +1785,7 @@ noce_process_if_block (test_bb, then_bb, else_bb, join_bb)
if (insn_b && else_bb)
delete_insn (insn_b);
- /* The new insns will have been inserted before cond_earliest. We should
+ /* The new insns will have been inserted just before the jump. We should
be able to remove the jump with impunity, but the condition itself may
have been modified by gcse to be shared across basic blocks. */
delete_insn (jump);
@@ -1844,11 +1846,14 @@ merge_if_block (test_bb, then_bb, else_bb, join_bb)
/* First merge TEST block into THEN block. This is a no-brainer since
the THEN block did not have a code label to begin with. */
-
- if (life_data_ok)
- COPY_REG_SET (combo_bb->global_live_at_end, then_bb->global_live_at_end);
- merge_blocks_nomove (combo_bb, then_bb);
- num_removed_blocks++;
+ if (then_bb)
+ {
+ if (life_data_ok)
+ COPY_REG_SET (combo_bb->global_live_at_end,
+ then_bb->global_live_at_end);
+ merge_blocks_nomove (combo_bb, then_bb);
+ num_removed_blocks++;
+ }
/* The ELSE block, if it existed, had a label. That label count
will almost always be zero, but odd things can happen when labels
@@ -1864,14 +1869,34 @@ merge_if_block (test_bb, then_bb, else_bb, join_bb)
if (! join_bb)
{
+ rtx last = combo_bb->end;
+
/* The outgoing edge for the current COMBO block should already
be correct. Verify this. */
if (combo_bb->succ == NULL_EDGE)
- abort ();
+ {
+ if (find_reg_note (last, REG_NORETURN, NULL))
+ ;
+ else if (GET_CODE (last) == INSN
+ && GET_CODE (PATTERN (last)) == TRAP_IF
+ && TRAP_CONDITION (PATTERN (last)) == const_true_rtx)
+ ;
+ else
+ abort ();
+ }
- /* There should still be a branch at the end of the THEN or ELSE
+ /* There should still be something at the end of the THEN or ELSE
blocks taking us to our final destination. */
- if (GET_CODE (combo_bb->end) != JUMP_INSN)
+ else if (GET_CODE (last) == JUMP_INSN)
+ ;
+ else if (combo_bb->succ->dest == EXIT_BLOCK_PTR
+ && GET_CODE (last) == CALL_INSN
+ && SIBLING_CALL_P (last))
+ ;
+ else if ((combo_bb->succ->flags & EDGE_EH)
+ && can_throw_internal (last))
+ ;
+ else
abort ();
}
@@ -2090,68 +2115,27 @@ find_cond_trap (test_bb, then_edge, else_edge)
basic_block test_bb;
edge then_edge, else_edge;
{
- basic_block then_bb, else_bb, join_bb, trap_bb;
+ basic_block then_bb, else_bb, trap_bb, other_bb;
rtx trap, jump, cond, cond_earliest, seq;
enum rtx_code code;
then_bb = then_edge->dest;
else_bb = else_edge->dest;
- join_bb = NULL;
/* Locate the block with the trap instruction. */
/* ??? While we look for no successors, we really ought to allow
EH successors. Need to fix merge_if_block for that to work. */
- /* ??? We can't currently handle merging the blocks if they are not
- already adjacent. Prevent losage in merge_if_block by detecting
- this now. */
- if (then_bb->succ == NULL)
- {
- trap_bb = then_bb;
- if (else_bb->index != then_bb->index + 1)
- return FALSE;
- join_bb = else_bb;
- else_bb = NULL;
- }
- else if (else_bb->succ == NULL)
- {
- trap_bb = else_bb;
- if (else_bb->index != then_bb->index + 1)
- else_bb = NULL;
- else if (then_bb->succ
- && ! then_bb->succ->succ_next
- && ! (then_bb->succ->flags & EDGE_COMPLEX)
- && then_bb->succ->dest->index == else_bb->index + 1)
- join_bb = then_bb->succ->dest;
- }
+ if ((trap = block_has_only_trap (then_bb)) != NULL)
+ trap_bb = then_bb, other_bb = else_bb;
+ else if ((trap = block_has_only_trap (else_bb)) != NULL)
+ trap_bb = else_bb, other_bb = then_bb;
else
return FALSE;
- /* Don't confuse a conditional return with something we want to
- optimize here. */
- if (trap_bb == EXIT_BLOCK_PTR)
- return FALSE;
-
- /* The only instruction in the THEN block must be the trap. */
- trap = first_active_insn (trap_bb);
- if (! (trap == trap_bb->end
- && GET_CODE (PATTERN (trap)) == TRAP_IF
- && TRAP_CONDITION (PATTERN (trap)) == const_true_rtx))
- return FALSE;
-
if (rtl_dump_file)
{
- if (trap_bb == then_bb)
- fprintf (rtl_dump_file,
- "\nTRAP-IF block found, start %d, trap %d",
- test_bb->index, then_bb->index);
- else
- fprintf (rtl_dump_file,
- "\nTRAP-IF block found, start %d, then %d, trap %d",
- test_bb->index, then_bb->index, trap_bb->index);
- if (join_bb)
- fprintf (rtl_dump_file, ", join %d\n", join_bb->index);
- else
- fputc ('\n', rtl_dump_file);
+ fprintf (rtl_dump_file, "\nTRAP-IF block found, start %d, trap %d\n",
+ test_bb->index, trap_bb->index);
}
/* If this is not a standard conditional jump, we can't parse it. */
@@ -2184,26 +2168,67 @@ find_cond_trap (test_bb, then_edge, else_edge)
if (seq == NULL)
return FALSE;
- /* Emit the new insns before cond_earliest; delete the old jump
- and trap insns. */
-
+ /* Emit the new insns before cond_earliest. */
emit_insn_before (seq, cond_earliest);
- delete_insn (jump);
-
- delete_insn (trap);
-
- /* Merge the blocks! */
- if (trap_bb != then_bb && ! else_bb)
+ /* Delete the trap block if possible. */
+ remove_edge (trap_bb == then_bb ? then_edge : else_edge);
+ if (trap_bb->pred == NULL)
{
flow_delete_block (trap_bb);
num_removed_blocks++;
}
- merge_if_block (test_bb, then_bb, else_bb, join_bb);
+
+ /* If the non-trap block and the test are now adjacent, merge them.
+ Otherwise we must insert a direct branch. */
+ if (test_bb->index + 1 == other_bb->index)
+ {
+ delete_insn (jump);
+ merge_if_block (test_bb, NULL, NULL, other_bb);
+ }
+ else
+ {
+ rtx lab, newjump;
+
+ lab = JUMP_LABEL (jump);
+ newjump = emit_jump_insn_after (gen_jump (lab), jump);
+ LABEL_NUSES (lab) += 1;
+ JUMP_LABEL (newjump) = lab;
+ emit_barrier_after (newjump);
+
+ delete_insn (jump);
+ }
return TRUE;
}
+/* Subroutine of find_cond_trap: if BB contains only a trap insn,
+ return it. */
+
+static rtx
+block_has_only_trap (bb)
+ basic_block bb;
+{
+ rtx trap;
+
+ /* We're not the exit block. */
+ if (bb == EXIT_BLOCK_PTR)
+ return NULL_RTX;
+
+ /* The block must have no successors. */
+ if (bb->succ)
+ return NULL_RTX;
+
+ /* The only instruction in the THEN block must be the trap. */
+ trap = first_active_insn (bb);
+ if (! (trap == bb->end
+ && GET_CODE (PATTERN (trap)) == TRAP_IF
+ && TRAP_CONDITION (PATTERN (trap)) == const_true_rtx))
+ return NULL_RTX;
+
+ return trap;
+}
+
/* Look for IF-THEN-ELSE cases in which one of THEN or ELSE is
transformable, but not necessarily the other. There need be no
JOIN block.
@@ -2444,7 +2469,7 @@ dead_or_predicable (test_bb, merge_bb, other_bb, new_dest, reversep)
basic_block new_dest;
int reversep;
{
- rtx head, end, jump, earliest, old_dest, new_label;
+ rtx head, end, jump, earliest, old_dest, new_label = NULL_RTX;
jump = test_bb->end;
@@ -2756,6 +2781,7 @@ if_convert (x_life_data_ok)
if (UPDATE_LIFE (BASIC_BLOCK (block_num)))
SET_BIT (update_life_blocks, block_num);
+ clear_aux_for_blocks ();
count_or_remove_death_notes (update_life_blocks, 1);
/* ??? See about adding a mode that verifies that the initial
set of blocks don't let registers come live. */
@@ -2765,7 +2791,8 @@ if_convert (x_life_data_ok)
sbitmap_free (update_life_blocks);
}
- clear_aux_for_blocks ();
+ else
+ clear_aux_for_blocks ();
/* Write the final stats. */
if (rtl_dump_file && num_possible_if_blocks > 0)
diff --git a/contrib/gcc/integrate.c b/contrib/gcc/integrate.c
index 10d98f2..d90e776 100644
--- a/contrib/gcc/integrate.c
+++ b/contrib/gcc/integrate.c
@@ -595,7 +595,8 @@ process_reg_param (map, loc, copy)
}
/* Compare two BLOCKs for qsort. The key we sort on is the
- BLOCK_ABSTRACT_ORIGIN of the blocks. */
+ BLOCK_ABSTRACT_ORIGIN of the blocks. We cannot just subtract the
+ two pointers, because it may overflow sizeof(int). */
static int
compare_blocks (v1, v2)
@@ -604,9 +605,12 @@ compare_blocks (v1, v2)
{
tree b1 = *((const tree *) v1);
tree b2 = *((const tree *) v2);
+ char *p1 = (char *) BLOCK_ABSTRACT_ORIGIN (b1);
+ char *p2 = (char *) BLOCK_ABSTRACT_ORIGIN (b2);
- return ((char *) BLOCK_ABSTRACT_ORIGIN (b1)
- - (char *) BLOCK_ABSTRACT_ORIGIN (b2));
+ if (p1 == p2)
+ return 0;
+ return p1 < p2 ? -1 : 1;
}
/* Compare two BLOCKs for bsearch. The first pointer corresponds to
@@ -619,8 +623,12 @@ find_block (v1, v2)
{
const union tree_node *b1 = (const union tree_node *) v1;
tree b2 = *((const tree *) v2);
+ char *p1 = (char *) b1;
+ char *p2 = (char *) BLOCK_ABSTRACT_ORIGIN (b2);
- return ((const char *) b1 - (char *) BLOCK_ABSTRACT_ORIGIN (b2));
+ if (p1 == p2)
+ return 0;
+ return p1 < p2 ? -1 : 1;
}
/* Integrate the procedure defined by FNDECL. Note that this function
@@ -2120,6 +2128,7 @@ copy_rtx_and_substitute (orig, map, for_lhs)
case PC:
case CC0:
case CONST_INT:
+ case CONST_VECTOR:
return orig;
case SYMBOL_REF:
@@ -2479,6 +2488,7 @@ subst_constants (loc, insn, map, memonly)
case PC:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case CONST:
case LABEL_REF:
diff --git a/contrib/gcc/jump.c b/contrib/gcc/jump.c
index fcb3c61..cad10ff 100644
--- a/contrib/gcc/jump.c
+++ b/contrib/gcc/jump.c
@@ -1,6 +1,6 @@
/* Optimize jump instructions, for GNU compiler.
Copyright (C) 1987, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997
- 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GCC.
@@ -91,13 +91,6 @@ rebuild_jump_labels (f)
for (insn = forced_labels; insn; insn = XEXP (insn, 1))
if (GET_CODE (XEXP (insn, 0)) == CODE_LABEL)
LABEL_NUSES (XEXP (insn, 0))++;
-
- /* Keep track of labels used for marking handlers for exception
- regions; they cannot usually be deleted. */
-
- for (insn = exception_handler_labels; insn; insn = XEXP (insn, 1))
- if (GET_CODE (XEXP (insn, 0)) == CODE_LABEL)
- LABEL_NUSES (XEXP (insn, 0))++;
}
/* Some old code expects exactly one BARRIER as the NEXT_INSN of a
@@ -1913,13 +1906,12 @@ delete_for_peephole (from, to)
so it's possible to get spurious warnings from this. */
void
-never_reached_warning (avoided_insn)
- rtx avoided_insn;
+never_reached_warning (avoided_insn, finish)
+ rtx avoided_insn, finish;
{
rtx insn;
rtx a_line_note = NULL;
- int two_avoided_lines = 0;
- int contains_insn = 0;
+ int two_avoided_lines = 0, contains_insn = 0, reached_end = 0;
if (! warn_notreached)
return;
@@ -1929,10 +1921,11 @@ never_reached_warning (avoided_insn)
for (insn = avoided_insn; insn != NULL; insn = NEXT_INSN (insn))
{
- if (GET_CODE (insn) == CODE_LABEL)
+ if (finish == NULL && GET_CODE (insn) == CODE_LABEL)
break;
- else if (GET_CODE (insn) == NOTE /* A line number note? */
- && NOTE_LINE_NUMBER (insn) >= 0)
+
+ if (GET_CODE (insn) == NOTE /* A line number note? */
+ && NOTE_LINE_NUMBER (insn) >= 0)
{
if (a_line_note == NULL)
a_line_note = insn;
@@ -1941,7 +1934,14 @@ never_reached_warning (avoided_insn)
!= NOTE_LINE_NUMBER (insn));
}
else if (INSN_P (insn))
- contains_insn = 1;
+ {
+ if (reached_end)
+ break;
+ contains_insn = 1;
+ }
+
+ if (insn == finish)
+ reached_end = 1;
}
if (two_avoided_lines && contains_insn)
warning_with_file_and_line (NOTE_SOURCE_FILE (a_line_note),
@@ -2084,7 +2084,9 @@ redirect_jump (jump, nlabel, delete_unused)
&& NOTE_LINE_NUMBER (NEXT_INSN (olabel)) == NOTE_INSN_FUNCTION_END)
emit_note_after (NOTE_INSN_FUNCTION_END, nlabel);
- if (olabel && --LABEL_NUSES (olabel) == 0 && delete_unused)
+ if (olabel && --LABEL_NUSES (olabel) == 0 && delete_unused
+ /* Undefined labels will remain outside the insn stream. */
+ && INSN_UID (olabel))
delete_related_insns (olabel);
return 1;
diff --git a/contrib/gcc/langhooks-def.h b/contrib/gcc/langhooks-def.h
index ca55a82..be8304a 100644
--- a/contrib/gcc/langhooks-def.h
+++ b/contrib/gcc/langhooks-def.h
@@ -62,6 +62,7 @@ tree lhd_tree_inlining_copy_res_decl_for_inlining PARAMS ((tree, tree,
int lhd_tree_inlining_anon_aggr_type_p PARAMS ((tree));
int lhd_tree_inlining_start_inlining PARAMS ((tree));
void lhd_tree_inlining_end_inlining PARAMS ((tree));
+tree lhd_tree_inlining_convert_parm_for_inlining PARAMS ((tree, tree, tree));
#define LANG_HOOKS_NAME "GNU unknown"
#define LANG_HOOKS_IDENTIFIER_SIZE sizeof (struct lang_identifier)
@@ -103,6 +104,8 @@ void lhd_tree_inlining_end_inlining PARAMS ((tree));
lhd_tree_inlining_start_inlining
#define LANG_HOOKS_TREE_INLINING_END_INLINING \
lhd_tree_inlining_end_inlining
+#define LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
+ lhd_tree_inlining_convert_parm_for_inlining
#define LANG_HOOKS_TREE_INLINING_INITIALIZER { \
LANG_HOOKS_TREE_INLINING_WALK_SUBTREES, \
@@ -114,7 +117,8 @@ void lhd_tree_inlining_end_inlining PARAMS ((tree));
LANG_HOOKS_TREE_INLINING_COPY_RES_DECL_FOR_INLINING, \
LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P, \
LANG_HOOKS_TREE_INLINING_START_INLINING, \
- LANG_HOOKS_TREE_INLINING_END_INLINING \
+ LANG_HOOKS_TREE_INLINING_END_INLINING, \
+ LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
} \
/* Tree dump hooks. */
diff --git a/contrib/gcc/langhooks.c b/contrib/gcc/langhooks.c
index 4ad9ae3..c0ee16c 100644
--- a/contrib/gcc/langhooks.c
+++ b/contrib/gcc/langhooks.c
@@ -28,6 +28,7 @@ Boston, MA 02111-1307, USA. */
#include "rtl.h"
#include "insn-config.h"
#include "integrate.h"
+#include "flags.h"
#include "langhooks.h"
#include "langhooks-def.h"
@@ -153,8 +154,12 @@ lhd_tree_inlining_walk_subtrees (tp,subtrees,func,data,htab)
int
lhd_tree_inlining_cannot_inline_tree_fn (fnp)
- tree *fnp ATTRIBUTE_UNUSED;
+ tree *fnp;
{
+ if (flag_really_no_inline
+ && lookup_attribute ("always_inline", DECL_ATTRIBUTES (*fnp)) == NULL)
+ return 1;
+
return 0;
}
@@ -164,8 +169,11 @@ lhd_tree_inlining_cannot_inline_tree_fn (fnp)
int
lhd_tree_inlining_disregard_inline_limits (fn)
- tree fn ATTRIBUTE_UNUSED;
+ tree fn;
{
+ if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) != NULL)
+ return 1;
+
return 0;
}
@@ -261,6 +269,18 @@ lhd_tree_inlining_end_inlining (fn)
{
}
+/* lang_hooks.tree_inlining.convert_parm_for_inlining performs any
+ language-specific conversion before assigning VALUE to PARM. */
+
+tree
+lhd_tree_inlining_convert_parm_for_inlining (parm, value, fndecl)
+ tree parm ATTRIBUTE_UNUSED;
+ tree value;
+ tree fndecl ATTRIBUTE_UNUSED;
+{
+ return value;
+}
+
/* lang_hooks.tree_dump.dump_tree: Dump language-specific parts of tree
nodes. Returns non-zero if it does not want the usual dumping of the
second argument. */
diff --git a/contrib/gcc/langhooks.h b/contrib/gcc/langhooks.h
index 81ae71b..56b818f 100644
--- a/contrib/gcc/langhooks.h
+++ b/contrib/gcc/langhooks.h
@@ -48,6 +48,9 @@ struct lang_hooks_for_tree_inlining
int (*anon_aggr_type_p) PARAMS ((union tree_node *));
int (*start_inlining) PARAMS ((union tree_node *));
void (*end_inlining) PARAMS ((union tree_node *));
+ union tree_node *(*convert_parm_for_inlining) PARAMS ((union tree_node *,
+ union tree_node *,
+ union tree_node *));
};
/* The following hooks are used by tree-dump.c. */
diff --git a/contrib/gcc/lbasename.c b/contrib/gcc/lbasename.c
new file mode 100644
index 0000000..cea0253
--- /dev/null
+++ b/contrib/gcc/lbasename.c
@@ -0,0 +1,88 @@
+/* Libiberty basename. Like basename, but is not overridden by the
+ system C library.
+ Copyright (C) 2001 Free Software Foundation, Inc.
+
+This file is part of the libiberty library.
+Libiberty is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+Libiberty 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with libiberty; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/*
+
+@deftypefn Replacement {const char*} lbasename (const char *@var{name})
+
+Given a pointer to a string containing a typical pathname
+(@samp{/usr/src/cmd/ls/ls.c} for example), returns a pointer to the
+last component of the pathname (@samp{ls.c} in this case). The
+returned pointer is guaranteed to lie within the original
+string. This latter fact is not true of many vendor C
+libraries, which return special strings or modify the passed
+strings for particular input.
+
+In particular, the empty string returns the same empty string,
+and a path ending in @code{/} returns the empty string after it.
+
+@end deftypefn
+
+*/
+
+#include "ansidecl.h"
+#include "libiberty.h"
+#include "safe-ctype.h"
+
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) \
+ || defined (__DJGPP__) || defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# ifndef DIR_SEPARATOR_2
+# define DIR_SEPARATOR_2 '\\'
+# endif
+#endif
+
+/* Define IS_DIR_SEPARATOR. VMS uses '::', ':', '[...]' and '<...>' to
+ separate the different components of a file specification. It's a
+ bit of a stretch to call ':', ']' and '>' directory separators, so
+ just define the test to find the file name component. */
+#ifdef VMS
+# define IS_DIR_SEPARATOR(ch) ((ch) == ':' || (ch) == ']' || (ch) == '>')
+#else
+# ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+# else
+# define IS_DIR_SEPARATOR(ch) \
+ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+# endif
+#endif
+
+const char *
+lbasename (name)
+ const char *name;
+{
+ const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ /* Skip over a possible disk name. */
+ if (ISALPHA (name[0]) && name[1] == ':')
+ name += 2;
+#endif
+
+ for (base = name; *name; name++)
+ if (IS_DIR_SEPARATOR (*name))
+ base = name + 1;
+
+ return base;
+}
diff --git a/contrib/gcc/libfuncs.h b/contrib/gcc/libfuncs.h
index 59e594e..c3fa09e 100644
--- a/contrib/gcc/libfuncs.h
+++ b/contrib/gcc/libfuncs.h
@@ -36,6 +36,7 @@ enum libfunc_index
LTI_truncxfdf2,
LTI_trunctfdf2,
+ LTI_abort,
LTI_memcpy,
LTI_memmove,
LTI_bcopy,
@@ -162,6 +163,7 @@ extern rtx libfunc_table[LTI_MAX];
#define truncxfdf2_libfunc (libfunc_table[LTI_truncxfdf2])
#define trunctfdf2_libfunc (libfunc_table[LTI_trunctfdf2])
+#define abort_libfunc (libfunc_table[LTI_abort])
#define memcpy_libfunc (libfunc_table[LTI_memcpy])
#define memmove_libfunc (libfunc_table[LTI_memmove])
#define bcopy_libfunc (libfunc_table[LTI_bcopy])
diff --git a/contrib/gcc/libiberty.h b/contrib/gcc/libiberty.h
index cf31366..3e0ca09 100644
--- a/contrib/gcc/libiberty.h
+++ b/contrib/gcc/libiberty.h
@@ -1,4 +1,29 @@
/* Function declarations for libiberty.
+
+ Copyright 2001, 2002 Free Software Foundation, Inc.
+
+ Note - certain prototypes declared in this header file are for
+ functions whoes implementation copyright does not belong to the
+ FSF. Those prototypes are present in this file for reference
+ purposes only and their presence in this file should not construed
+ as an indication of ownership by the FSF of the implementation of
+ those functions in any way or form whatsoever.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
Written by Cygnus Support, 1994.
The libiberty library provides a number of functions which are
@@ -16,10 +41,17 @@ extern "C" {
#include "ansidecl.h"
+#ifdef ANSI_PROTOTYPES
+/* Get a definition for size_t. */
+#include <stddef.h>
+/* Get a definition for va_list. */
+#include <stdarg.h>
+#endif
+
/* Build an argument vector from a string. Allocates memory using
malloc. Use freeargv to free the vector. */
-extern char **buildargv PARAMS ((char *));
+extern char **buildargv PARAMS ((const char *)) ATTRIBUTE_MALLOC;
/* Free a vector returned by buildargv. */
@@ -28,7 +60,7 @@ extern void freeargv PARAMS ((char **));
/* Duplicate an argument vector. Allocates memory using malloc. Use
freeargv to free the vector. */
-extern char **dupargv PARAMS ((char **));
+extern char **dupargv PARAMS ((char **)) ATTRIBUTE_MALLOC;
/* Return the last component of a path name. Note that we can't use a
@@ -36,28 +68,90 @@ extern char **dupargv PARAMS ((char **));
across different systems, sometimes as "char *" and sometimes as
"const char *" */
-#if defined (__GNU_LIBRARY__ ) || defined (__linux__) || defined (__FreeBSD__) || defined (__CYGWIN__) || defined (__CYGWIN32__)
+/* HAVE_DECL_* is a three-state macro: undefined, 0 or 1. If it is
+ undefined, we haven't run the autoconf check so provide the
+ declaration without arguments. If it is 0, we checked and failed
+ to find the declaration so provide a fully prototyped one. If it
+ is 1, we found it so don't provide any declaration at all. */
+#if defined (__GNU_LIBRARY__ ) || defined (__linux__) || defined (__FreeBSD__) || defined (__OpenBSD__) || defined (__CYGWIN__) || defined (__CYGWIN32__) || (defined (HAVE_DECL_BASENAME) && !HAVE_DECL_BASENAME)
extern char *basename PARAMS ((const char *));
#else
+# if !defined (HAVE_DECL_BASENAME)
extern char *basename ();
+# endif
#endif
-/* Concatenate an arbitrary number of strings, up to (char *) NULL.
- Allocates memory using xmalloc. */
+/* A well-defined basename () that is always compiled in. */
+
+extern const char *lbasename PARAMS ((const char *));
+
+/* Concatenate an arbitrary number of strings. You must pass NULL as
+ the last argument of this function, to terminate the list of
+ strings. Allocates memory using xmalloc. */
+
+extern char *concat PARAMS ((const char *, ...)) ATTRIBUTE_MALLOC;
+
+/* Concatenate an arbitrary number of strings. You must pass NULL as
+ the last argument of this function, to terminate the list of
+ strings. Allocates memory using xmalloc. The first argument is
+ not one of the strings to be concatenated, but if not NULL is a
+ pointer to be freed after the new string is created, similar to the
+ way xrealloc works. */
+
+extern char *reconcat PARAMS ((char *, const char *, ...)) ATTRIBUTE_MALLOC;
+
+/* Determine the length of concatenating an arbitrary number of
+ strings. You must pass NULL as the last argument of this function,
+ to terminate the list of strings. */
+
+extern unsigned long concat_length PARAMS ((const char *, ...));
+
+/* Concatenate an arbitrary number of strings into a SUPPLIED area of
+ memory. You must pass NULL as the last argument of this function,
+ to terminate the list of strings. The supplied memory is assumed
+ to be large enough. */
+
+extern char *concat_copy PARAMS ((char *, const char *, ...));
+
+/* Concatenate an arbitrary number of strings into a GLOBAL area of
+ memory. You must pass NULL as the last argument of this function,
+ to terminate the list of strings. The supplied memory is assumed
+ to be large enough. */
+
+extern char *concat_copy2 PARAMS ((const char *, ...));
+
+/* This is the global area used by concat_copy2. */
+
+extern char *libiberty_concat_ptr;
-extern char *concat PARAMS ((const char *, ...));
+/* Concatenate an arbitrary number of strings. You must pass NULL as
+ the last argument of this function, to terminate the list of
+ strings. Allocates memory using alloca. The arguments are
+ evaluated twice! */
+#define ACONCAT(ACONCAT_PARAMS) \
+ (libiberty_concat_ptr = alloca (concat_length ACONCAT_PARAMS + 1), \
+ concat_copy2 ACONCAT_PARAMS)
/* Check whether two file descriptors refer to the same file. */
extern int fdmatch PARAMS ((int fd1, int fd2));
+/* Get the working directory. The result is cached, so don't call
+ chdir() between calls to getpwd(). */
+
+extern char * getpwd PARAMS ((void));
+
/* Get the amount of time the process has run, in microseconds. */
extern long get_run_time PARAMS ((void));
/* Choose a temporary directory to use for scratch files. */
-extern char *choose_temp_base PARAMS ((void));
+extern char *choose_temp_base PARAMS ((void)) ATTRIBUTE_MALLOC;
+
+/* Return a temporary file name or NULL if unable to create one. */
+
+extern char *make_temp_file PARAMS ((const char *)) ATTRIBUTE_MALLOC;
/* Allocate memory filled with spaces. Allocates using malloc. */
@@ -108,47 +202,45 @@ extern int xatexit PARAMS ((void (*fn) (void)));
/* Exit, calling all the functions registered with xatexit. */
-#ifndef __GNUC__
-extern void xexit PARAMS ((int status));
-#else
-void xexit PARAMS ((int status)) __attribute__ ((noreturn));
-#endif
+extern void xexit PARAMS ((int status)) ATTRIBUTE_NORETURN;
/* Set the program name used by xmalloc. */
extern void xmalloc_set_program_name PARAMS ((const char *));
+/* Report an allocation failure. */
+extern void xmalloc_failed PARAMS ((size_t)) ATTRIBUTE_NORETURN;
+
/* Allocate memory without fail. If malloc fails, this will print a
message to stderr (using the name set by xmalloc_set_program_name,
if any) and then call xexit. */
-#ifdef ANSI_PROTOTYPES
-/* Get a definition for size_t. */
-#include <stddef.h>
-#endif
-extern PTR xmalloc PARAMS ((size_t));
-
-/* Reallocate memory without fail. This works like xmalloc.
+extern PTR xmalloc PARAMS ((size_t)) ATTRIBUTE_MALLOC;
- FIXME: We do not declare the parameter types for the same reason as
- xmalloc. */
+/* Reallocate memory without fail. This works like xmalloc. Note,
+ realloc type functions are not suitable for attribute malloc since
+ they may return the same address across multiple calls. */
extern PTR xrealloc PARAMS ((PTR, size_t));
/* Allocate memory without fail and set it to zero. This works like
xmalloc. */
-extern PTR xcalloc PARAMS ((size_t, size_t));
+extern PTR xcalloc PARAMS ((size_t, size_t)) ATTRIBUTE_MALLOC;
/* Copy a string into a memory buffer without fail. */
-extern char *xstrdup PARAMS ((const char *));
+extern char *xstrdup PARAMS ((const char *)) ATTRIBUTE_MALLOC;
+
+/* Copy an existing memory buffer to a new memory buffer without fail. */
+
+extern PTR xmemdup PARAMS ((const PTR, size_t, size_t)) ATTRIBUTE_MALLOC;
/* hex character manipulation routines */
#define _hex_array_size 256
#define _hex_bad 99
-extern char _hex_value[_hex_array_size];
+extern const char _hex_value[_hex_array_size];
extern void hex_init PARAMS ((void));
#define hex_p(c) (hex_value (c) != _hex_bad)
/* If you change this, note well: Some code relies on side effects in
@@ -172,6 +264,51 @@ extern int pexecute PARAMS ((const char *, char * const *, const char *,
extern int pwait PARAMS ((int, int *, int));
+/* Like sprintf but provides a pointer to malloc'd storage, which must
+ be freed by the caller. */
+
+extern int asprintf PARAMS ((char **, const char *, ...)) ATTRIBUTE_PRINTF_2;
+
+/* Like vsprintf but provides a pointer to malloc'd storage, which
+ must be freed by the caller. */
+
+extern int vasprintf PARAMS ((char **, const char *, va_list))
+ ATTRIBUTE_PRINTF(2,0);
+
+#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
+
+/* Drastically simplified alloca configurator. If we're using GCC,
+ we use __builtin_alloca; otherwise we use the C alloca. The C
+ alloca is always available. You can override GCC by defining
+ USE_C_ALLOCA yourself. The canonical autoconf macro C_ALLOCA is
+ also set/unset as it is often used to indicate whether code needs
+ to call alloca(0). */
+extern PTR C_alloca PARAMS ((size_t)) ATTRIBUTE_MALLOC;
+#undef alloca
+#if GCC_VERSION >= 2000 && !defined USE_C_ALLOCA
+# define alloca(x) __builtin_alloca(x)
+# undef C_ALLOCA
+# define ASTRDUP(X) \
+ (__extension__ ({ const char *const libiberty_optr = (X); \
+ const unsigned long libiberty_len = strlen (libiberty_optr) + 1; \
+ char *const libiberty_nptr = alloca (libiberty_len); \
+ (char *) memcpy (libiberty_nptr, libiberty_optr, libiberty_len); }))
+#else
+# define alloca(x) C_alloca(x)
+# undef USE_C_ALLOCA
+# define USE_C_ALLOCA 1
+# undef C_ALLOCA
+# define C_ALLOCA 1
+extern const char *libiberty_optr;
+extern char *libiberty_nptr;
+extern unsigned long libiberty_len;
+# define ASTRDUP(X) \
+ (libiberty_optr = (X), \
+ libiberty_len = strlen (libiberty_optr) + 1, \
+ libiberty_nptr = alloca (libiberty_len), \
+ (char *) memcpy (libiberty_nptr, libiberty_optr, libiberty_len))
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/contrib/gcc/local-alloc.c b/contrib/gcc/local-alloc.c
index 1a6e3cf..c11398f 100644
--- a/contrib/gcc/local-alloc.c
+++ b/contrib/gcc/local-alloc.c
@@ -539,6 +539,7 @@ equiv_init_varies_p (x)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
return 0;
@@ -658,10 +659,10 @@ contains_replace_regs (x)
case LABEL_REF:
case SYMBOL_REF:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case PC:
case CC0:
case HIGH:
- case LO_SUM:
return 0;
case REG:
@@ -708,6 +709,7 @@ memref_referenced_p (memref, x)
case LABEL_REF:
case SYMBOL_REF:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case PC:
case CC0:
case HIGH:
diff --git a/contrib/gcc/longlong.h b/contrib/gcc/longlong.h
index f218a02..c8b9aee 100644
--- a/contrib/gcc/longlong.h
+++ b/contrib/gcc/longlong.h
@@ -1002,6 +1002,21 @@ UDItype __umulsidi3 (USItype, USItype);
#define UMUL_TIME 5
#endif
+#if defined (__SH5__) && __SHMEDIA__ && W_TYPE_SIZE == 32
+#define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v)
+#define count_leading_zeros(count, x) \
+ do \
+ { \
+ UDItype x_ = (USItype)(x); \
+ SItype c_; \
+ \
+ __asm__ ("nsb %1, %0" : "=r" (c_) : "r" (x_)); \
+ (count) = c_ - 31; \
+ } \
+ while (0)
+#define COUNT_LEADING_ZEROS_0 32
+#endif
+
#if defined (__sparc__) && !defined (__arch64__) && !defined (__sparcv9) \
&& W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
diff --git a/contrib/gcc/loop.c b/contrib/gcc/loop.c
index a65595f..d653b5c 100644
--- a/contrib/gcc/loop.c
+++ b/contrib/gcc/loop.c
@@ -235,6 +235,7 @@ FILE *loop_dump_stream;
/* Forward declarations. */
+static void invalidate_loops_containing_label PARAMS ((rtx));
static void find_and_verify_loops PARAMS ((rtx, struct loops *));
static void mark_loop_jump PARAMS ((rtx, struct loop *));
static void prescan_loop PARAMS ((struct loop *));
@@ -1102,7 +1103,25 @@ scan_loop (loop, flags)
optimizing for code size. */
if (! optimize_size)
- move_movables (loop, movables, threshold, insn_count);
+ {
+ move_movables (loop, movables, threshold, insn_count);
+
+ /* Recalculate regs->array if move_movables has created new
+ registers. */
+ if (max_reg_num () > regs->num)
+ {
+ loop_regs_scan (loop, 0);
+ for (update_start = loop_start;
+ PREV_INSN (update_start)
+ && GET_CODE (PREV_INSN (update_start)) != CODE_LABEL;
+ update_start = PREV_INSN (update_start))
+ ;
+ update_end = NEXT_INSN (loop_end);
+
+ reg_scan_update (update_start, update_end, loop_max_reg);
+ loop_max_reg = max_reg_num ();
+ }
+ }
/* Now candidates that still are negative are those not moved.
Change regs->array[I].set_in_loop to indicate that those are not actually
@@ -2474,6 +2493,8 @@ prescan_loop (loop)
loop_info->unknown_address_altered = 1;
loop_info->has_nonconst_call = 1;
}
+ else if (pure_call_p (insn))
+ loop_info->has_nonconst_call = 1;
loop_info->has_call = 1;
if (can_throw_internal (insn))
loop_info->has_multiple_exit_targets = 1;
@@ -2486,16 +2507,17 @@ prescan_loop (loop)
if (set)
{
+ rtx src = SET_SRC (set);
rtx label1, label2;
- if (GET_CODE (SET_SRC (set)) == IF_THEN_ELSE)
+ if (GET_CODE (src) == IF_THEN_ELSE)
{
- label1 = XEXP (SET_SRC (set), 1);
- label2 = XEXP (SET_SRC (set), 2);
+ label1 = XEXP (src, 1);
+ label2 = XEXP (src, 2);
}
else
{
- label1 = SET_SRC (PATTERN (insn));
+ label1 = src;
label2 = NULL_RTX;
}
@@ -2589,6 +2611,17 @@ prescan_loop (loop)
}
}
+/* Invalidate all loops containing LABEL. */
+
+static void
+invalidate_loops_containing_label (label)
+ rtx label;
+{
+ struct loop *loop;
+ for (loop = uid_loop[INSN_UID (label)]; loop; loop = loop->outer)
+ loop->invalid = 1;
+}
+
/* Scan the function looking for loops. Record the start and end of each loop.
Also mark as invalid loops any loops that contain a setjmp or are branched
to from outside the loop. */
@@ -2675,23 +2708,12 @@ find_and_verify_loops (f, loops)
/* Any loop containing a label used in an initializer must be invalidated,
because it can be jumped into from anywhere. */
-
for (label = forced_labels; label; label = XEXP (label, 1))
- {
- for (loop = uid_loop[INSN_UID (XEXP (label, 0))];
- loop; loop = loop->outer)
- loop->invalid = 1;
- }
+ invalidate_loops_containing_label (XEXP (label, 0));
/* Any loop containing a label used for an exception handler must be
invalidated, because it can be jumped into from anywhere. */
-
- for (label = exception_handler_labels; label; label = XEXP (label, 1))
- {
- for (loop = uid_loop[INSN_UID (XEXP (label, 0))];
- loop; loop = loop->outer)
- loop->invalid = 1;
- }
+ for_each_eh_label (invalidate_loops_containing_label);
/* Now scan all insn's in the function. If any JUMP_INSN branches into a
loop that it is not contained within, that loop is marked invalid.
@@ -2715,11 +2737,7 @@ find_and_verify_loops (f, loops)
{
rtx note = find_reg_note (insn, REG_LABEL, NULL_RTX);
if (note)
- {
- for (loop = uid_loop[INSN_UID (XEXP (note, 0))];
- loop; loop = loop->outer)
- loop->invalid = 1;
- }
+ invalidate_loops_containing_label (XEXP (note, 0));
}
if (GET_CODE (insn) != JUMP_INSN)
@@ -3683,8 +3701,19 @@ remove_constant_addition (x)
HOST_WIDE_INT addval = 0;
rtx exp = *x;
+ /* Avoid clobbering a shared CONST expression. */
if (GET_CODE (exp) == CONST)
- exp = XEXP (exp, 0);
+ {
+ if (GET_CODE (XEXP (exp, 0)) == PLUS
+ && GET_CODE (XEXP (XEXP (exp, 0), 0)) == SYMBOL_REF
+ && GET_CODE (XEXP (XEXP (exp, 0), 1)) == CONST_INT)
+ {
+ *x = XEXP (XEXP (exp, 0), 0);
+ return INTVAL (XEXP (XEXP (exp, 0), 1));
+ }
+ return 0;
+ }
+
if (GET_CODE (exp) == CONST_INT)
{
addval = INTVAL (exp);
@@ -5132,6 +5161,11 @@ strength_reduce (loop, flags)
fprintf (loop_dump_stream, "Reg %d: biv eliminated\n",
bl->regno);
}
+ /* See above note wrt final_value. But since we couldn't eliminate
+ the biv, we must set the value after the loop instead of before. */
+ else if (bl->final_value && ! bl->reversed)
+ loop_insn_sink (loop, gen_move_insn (bl->biv->dest_reg,
+ bl->final_value));
}
/* Go through all the instructions in the loop, making all the
@@ -5178,7 +5212,8 @@ strength_reduce (loop, flags)
collected. Always unroll loops that would be as small or smaller
unrolled than when rolled. */
if ((flags & LOOP_UNROLL)
- || (loop_info->n_iterations > 0
+ || (!(flags & LOOP_FIRST_PASS)
+ && loop_info->n_iterations > 0
&& unrolled_insn_copies <= insn_count))
unroll_loop (loop, insn_count, 1);
@@ -6111,13 +6146,13 @@ basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location)
return 1;
case SUBREG:
- /* If this is a SUBREG for a promoted variable, check the inner
- value. */
- if (SUBREG_PROMOTED_VAR_P (x))
- return basic_induction_var (loop, SUBREG_REG (x),
- GET_MODE (SUBREG_REG (x)),
- dest_reg, p, inc_val, mult_val, location);
- return 0;
+ /* If what's inside the SUBREG is a BIV, then the SUBREG. This will
+ handle addition of promoted variables.
+ ??? The comment at the start of this function is wrong: promoted
+ variable increments don't look like it says they do. */
+ return basic_induction_var (loop, SUBREG_REG (x),
+ GET_MODE (SUBREG_REG (x)),
+ dest_reg, p, inc_val, mult_val, location);
case REG:
/* If this register is assigned in a previous insn, look at its
@@ -6179,10 +6214,11 @@ basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location)
case CONST:
/* convert_modes aborts if we try to convert to or from CCmode, so just
exclude that case. It is very unlikely that a condition code value
- would be a useful iterator anyways. */
+ would be a useful iterator anyways. convert_modes aborts if we try to
+ convert a float mode to non-float or vice versa too. */
if (loop->level == 1
- && GET_MODE_CLASS (mode) != MODE_CC
- && GET_MODE_CLASS (GET_MODE (dest_reg)) != MODE_CC)
+ && GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (dest_reg))
+ && GET_MODE_CLASS (mode) != MODE_CC)
{
/* Possible bug here? Perhaps we don't know the mode of X. */
*inc_val = convert_modes (GET_MODE (dest_reg), mode, x, 0);
@@ -7626,9 +7662,9 @@ loop_regs_update (loop, seq)
}
else
{
- rtx set = single_set (seq);
- if (set && GET_CODE (SET_DEST (set)) == REG)
- record_base_value (REGNO (SET_DEST (set)), SET_SRC (set), 0);
+ if (GET_CODE (seq) == SET
+ && GET_CODE (SET_DEST (seq)) == REG)
+ record_base_value (REGNO (SET_DEST (seq)), SET_SRC (seq), 0);
}
}
@@ -7654,7 +7690,7 @@ loop_iv_add_mult_emit_before (loop, b, m, a, reg, before_bb, before_insn)
}
/* Use copy_rtx to prevent unexpected sharing of these rtx. */
- seq = gen_add_mult (copy_rtx (b), m, copy_rtx (a), reg);
+ seq = gen_add_mult (copy_rtx (b), copy_rtx (m), copy_rtx (a), reg);
/* Increase the lifetime of any invariants moved further in code. */
update_reg_last_use (a, before_insn);
@@ -7682,7 +7718,7 @@ loop_iv_add_mult_sink (loop, b, m, a, reg)
rtx seq;
/* Use copy_rtx to prevent unexpected sharing of these rtx. */
- seq = gen_add_mult (copy_rtx (b), m, copy_rtx (a), reg);
+ seq = gen_add_mult (copy_rtx (b), copy_rtx (m), copy_rtx (a), reg);
/* Increase the lifetime of any invariants moved further in code.
???? Is this really necessary? */
@@ -7711,7 +7747,7 @@ loop_iv_add_mult_hoist (loop, b, m, a, reg)
rtx seq;
/* Use copy_rtx to prevent unexpected sharing of these rtx. */
- seq = gen_add_mult (copy_rtx (b), m, copy_rtx (a), reg);
+ seq = gen_add_mult (copy_rtx (b), copy_rtx (m), copy_rtx (a), reg);
loop_insn_hoist (loop, seq);
diff --git a/contrib/gcc/loop.h b/contrib/gcc/loop.h
index 55f70ff..8e3a935 100644
--- a/contrib/gcc/loop.h
+++ b/contrib/gcc/loop.h
@@ -28,6 +28,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define LOOP_UNROLL 1
#define LOOP_BCT 2
#define LOOP_PREFETCH 4
+#define LOOP_FIRST_PASS 8
/* Get the loop info pointer of a loop. */
#define LOOP_INFO(LOOP) ((struct loop_info *) (LOOP)->aux)
diff --git a/contrib/gcc/machmode.def b/contrib/gcc/machmode.def
index 580f6ff..6212334 100644
--- a/contrib/gcc/machmode.def
+++ b/contrib/gcc/machmode.def
@@ -63,50 +63,54 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
there is none. Vector modes use this field to point to the next
vector size, so we can iterate through the different vectors modes.
The ordering is by increasing byte size, with QI coming before HI,
- HI before SI, etc. */
+ HI before SI, etc.
+
+ Eigth arg is the mode of the internal elements in a vector or
+ complex, and VOIDmode if not applicable.
+*/
/* VOIDmode is used when no mode needs to be specified,
as for example on CONST_INT RTL expressions. */
-DEF_MACHMODE (VOIDmode, "VOID", MODE_RANDOM, 0, 0, 0, VOIDmode)
+DEF_MACHMODE (VOIDmode, "VOID", MODE_RANDOM, 0, 0, 0, VOIDmode, VOIDmode)
-DEF_MACHMODE (BImode, "BI", MODE_INT, 1, 1, 1, QImode)
-DEF_MACHMODE (QImode, "QI", MODE_INT, BITS_PER_UNIT, 1, 1, HImode)
-DEF_MACHMODE (HImode, "HI", MODE_INT, BITS_PER_UNIT*2, 2, 2, SImode)
-DEF_MACHMODE (SImode, "SI", MODE_INT, BITS_PER_UNIT*4, 4, 4, DImode)
-DEF_MACHMODE (DImode, "DI", MODE_INT, BITS_PER_UNIT*8, 8, 8, TImode)
-DEF_MACHMODE (TImode, "TI", MODE_INT, BITS_PER_UNIT*16, 16, 16, OImode)
-DEF_MACHMODE (OImode, "OI", MODE_INT, BITS_PER_UNIT*32, 32, 32, VOIDmode)
+DEF_MACHMODE (BImode, "BI", MODE_INT, 1, 1, 1, QImode, VOIDmode)
+DEF_MACHMODE (QImode, "QI", MODE_INT, BITS_PER_UNIT, 1, 1, HImode, VOIDmode)
+DEF_MACHMODE (HImode, "HI", MODE_INT, BITS_PER_UNIT*2, 2, 2, SImode, VOIDmode)
+DEF_MACHMODE (SImode, "SI", MODE_INT, BITS_PER_UNIT*4, 4, 4, DImode, VOIDmode)
+DEF_MACHMODE (DImode, "DI", MODE_INT, BITS_PER_UNIT*8, 8, 8, TImode, VOIDmode)
+DEF_MACHMODE (TImode, "TI", MODE_INT, BITS_PER_UNIT*16, 16, 16, OImode, VOIDmode)
+DEF_MACHMODE (OImode, "OI", MODE_INT, BITS_PER_UNIT*32, 32, 32, VOIDmode, VOIDmode)
/* Pointers on some machines use these types to distinguish them from
ints. Useful if a pointer is 4 bytes but has some bits that are
not significant, so it is really not quite as wide as an integer. */
-DEF_MACHMODE (PQImode, "PQI", MODE_PARTIAL_INT, BITS_PER_UNIT, 1, 1, PHImode)
-DEF_MACHMODE (PHImode, "PHI", MODE_PARTIAL_INT, BITS_PER_UNIT*2, 2, 2, PSImode)
-DEF_MACHMODE (PSImode, "PSI", MODE_PARTIAL_INT, BITS_PER_UNIT*4, 4, 4, PDImode)
-DEF_MACHMODE (PDImode, "PDI", MODE_PARTIAL_INT, BITS_PER_UNIT*8, 8, 8, VOIDmode)
-
-DEF_MACHMODE (QFmode, "QF", MODE_FLOAT, BITS_PER_UNIT, 1, 1, HFmode)
-DEF_MACHMODE (HFmode, "HF", MODE_FLOAT, BITS_PER_UNIT*2, 2, 2, TQFmode)
-DEF_MACHMODE (TQFmode, "TQF", MODE_FLOAT, BITS_PER_UNIT*3, 3, 3, SFmode) /* MIL-STD-1750A */
-DEF_MACHMODE (SFmode, "SF", MODE_FLOAT, BITS_PER_UNIT*4, 4, 4, DFmode)
-DEF_MACHMODE (DFmode, "DF", MODE_FLOAT, BITS_PER_UNIT*8, 8, 8, XFmode)
-DEF_MACHMODE (XFmode, "XF", MODE_FLOAT, BITS_PER_UNIT*12, 12, 12, TFmode) /* IEEE extended */
-DEF_MACHMODE (TFmode, "TF", MODE_FLOAT, BITS_PER_UNIT*16, 16, 16, VOIDmode)
+DEF_MACHMODE (PQImode, "PQI", MODE_PARTIAL_INT, BITS_PER_UNIT, 1, 1, PHImode, VOIDmode)
+DEF_MACHMODE (PHImode, "PHI", MODE_PARTIAL_INT, BITS_PER_UNIT*2, 2, 2, PSImode, VOIDmode)
+DEF_MACHMODE (PSImode, "PSI", MODE_PARTIAL_INT, BITS_PER_UNIT*4, 4, 4, PDImode, VOIDmode)
+DEF_MACHMODE (PDImode, "PDI", MODE_PARTIAL_INT, BITS_PER_UNIT*8, 8, 8, VOIDmode, VOIDmode)
+
+DEF_MACHMODE (QFmode, "QF", MODE_FLOAT, BITS_PER_UNIT, 1, 1, HFmode, VOIDmode)
+DEF_MACHMODE (HFmode, "HF", MODE_FLOAT, BITS_PER_UNIT*2, 2, 2, TQFmode, VOIDmode)
+DEF_MACHMODE (TQFmode, "TQF", MODE_FLOAT, BITS_PER_UNIT*3, 3, 3, SFmode, VOIDmode) /* MIL-STD-1750A */
+DEF_MACHMODE (SFmode, "SF", MODE_FLOAT, BITS_PER_UNIT*4, 4, 4, DFmode, VOIDmode)
+DEF_MACHMODE (DFmode, "DF", MODE_FLOAT, BITS_PER_UNIT*8, 8, 8, XFmode, VOIDmode)
+DEF_MACHMODE (XFmode, "XF", MODE_FLOAT, BITS_PER_UNIT*12, 12, 12, TFmode, VOIDmode) /* IEEE extended */
+DEF_MACHMODE (TFmode, "TF", MODE_FLOAT, BITS_PER_UNIT*16, 16, 16, VOIDmode, VOIDmode)
/* Complex modes. */
-DEF_MACHMODE (QCmode, "QC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*2, 2, 1, HCmode)
-DEF_MACHMODE (HCmode, "HC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*4, 4, 2, SCmode)
-DEF_MACHMODE (SCmode, "SC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*8, 8, 4, DCmode)
-DEF_MACHMODE (DCmode, "DC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*16, 16, 8, XCmode)
-DEF_MACHMODE (XCmode, "XC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*24, 24, 12, TCmode)
-DEF_MACHMODE (TCmode, "TC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*32, 32, 16, VOIDmode)
-
-DEF_MACHMODE (CQImode, "CQI", MODE_COMPLEX_INT, BITS_PER_UNIT*2, 2, 1, CHImode)
-DEF_MACHMODE (CHImode, "CHI", MODE_COMPLEX_INT, BITS_PER_UNIT*4, 4, 2, CSImode)
-DEF_MACHMODE (CSImode, "CSI", MODE_COMPLEX_INT, BITS_PER_UNIT*8, 8, 4, CDImode)
-DEF_MACHMODE (CDImode, "CDI", MODE_COMPLEX_INT, BITS_PER_UNIT*16, 16, 8, CTImode)
-DEF_MACHMODE (CTImode, "CTI", MODE_COMPLEX_INT, BITS_PER_UNIT*32, 32, 16, COImode)
-DEF_MACHMODE (COImode, "COI", MODE_COMPLEX_INT, BITS_PER_UNIT*64, 64, 32, VOIDmode)
+DEF_MACHMODE (QCmode, "QC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*2, 2, 1, HCmode, QFmode)
+DEF_MACHMODE (HCmode, "HC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*4, 4, 2, SCmode, HFmode)
+DEF_MACHMODE (SCmode, "SC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*8, 8, 4, DCmode, SFmode)
+DEF_MACHMODE (DCmode, "DC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*16, 16, 8, XCmode, DFmode)
+DEF_MACHMODE (XCmode, "XC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*24, 24, 12, TCmode, XFmode)
+DEF_MACHMODE (TCmode, "TC", MODE_COMPLEX_FLOAT, BITS_PER_UNIT*32, 32, 16, VOIDmode, TFmode)
+
+DEF_MACHMODE (CQImode, "CQI", MODE_COMPLEX_INT, BITS_PER_UNIT*2, 2, 1, CHImode, QImode)
+DEF_MACHMODE (CHImode, "CHI", MODE_COMPLEX_INT, BITS_PER_UNIT*4, 4, 2, CSImode, HImode)
+DEF_MACHMODE (CSImode, "CSI", MODE_COMPLEX_INT, BITS_PER_UNIT*8, 8, 4, CDImode, SImode)
+DEF_MACHMODE (CDImode, "CDI", MODE_COMPLEX_INT, BITS_PER_UNIT*16, 16, 8, CTImode, DImode)
+DEF_MACHMODE (CTImode, "CTI", MODE_COMPLEX_INT, BITS_PER_UNIT*32, 32, 16, COImode, TImode)
+DEF_MACHMODE (COImode, "COI", MODE_COMPLEX_INT, BITS_PER_UNIT*64, 64, 32, VOIDmode, OImode)
/* Vector modes. */
/* There are no V1xx vector modes. These are equivalent to normal
@@ -114,42 +118,43 @@ DEF_MACHMODE (COImode, "COI", MODE_COMPLEX_INT, BITS_PER_UNIT*64, 64, 32, VOIDmo
/* The wider mode field for vectors follows in order of increasing bit
size with QI coming before HI, HI before SI, and SI before DI
within same bit sizes. */
-DEF_MACHMODE (V2QImode, "V2QI", MODE_VECTOR_INT, BITS_PER_UNIT*2, 2, 1, V4QImode)
-DEF_MACHMODE (V2HImode, "V2HI", MODE_VECTOR_INT, BITS_PER_UNIT*4, 4, 2, V8QImode)
-DEF_MACHMODE (V2SImode, "V2SI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 4, V16QImode)
-DEF_MACHMODE (V2DImode, "V2DI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 8, V8SImode)
+DEF_MACHMODE (V2QImode, "V2QI", MODE_VECTOR_INT, BITS_PER_UNIT*2, 2, 1, V4QImode, QImode)
+DEF_MACHMODE (V2HImode, "V2HI", MODE_VECTOR_INT, BITS_PER_UNIT*4, 4, 2, V8QImode, HImode)
+DEF_MACHMODE (V2SImode, "V2SI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 4, V16QImode, SImode)
+DEF_MACHMODE (V2DImode, "V2DI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 8, V8SImode, DImode)
-DEF_MACHMODE (V4QImode, "V4QI", MODE_VECTOR_INT, BITS_PER_UNIT*4, 4, 1, V2HImode)
-DEF_MACHMODE (V4HImode, "V4HI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 2, V2SImode)
-DEF_MACHMODE (V4SImode, "V4SI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 4, V2DImode)
-DEF_MACHMODE (V4DImode, "V4DI", MODE_VECTOR_INT, BITS_PER_UNIT*32, 32, 8, V8DImode)
+DEF_MACHMODE (V4QImode, "V4QI", MODE_VECTOR_INT, BITS_PER_UNIT*4, 4, 1, V2HImode, QImode)
+DEF_MACHMODE (V4HImode, "V4HI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 2, V2SImode, HImode)
+DEF_MACHMODE (V4SImode, "V4SI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 4, V2DImode, SImode)
+DEF_MACHMODE (V4DImode, "V4DI", MODE_VECTOR_INT, BITS_PER_UNIT*32, 32, 8, V8DImode, DImode)
-DEF_MACHMODE (V8QImode, "V8QI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 1, V4HImode)
-DEF_MACHMODE (V8HImode, "V8HI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 2, V4SImode)
-DEF_MACHMODE (V8SImode, "V8SI", MODE_VECTOR_INT, BITS_PER_UNIT*32, 32, 4, V4DImode)
-DEF_MACHMODE (V8DImode, "V8DI", MODE_VECTOR_INT, BITS_PER_UNIT*64, 64, 8, VOIDmode)
+DEF_MACHMODE (V8QImode, "V8QI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 1, V4HImode, QImode)
+DEF_MACHMODE (V8HImode, "V8HI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 2, V4SImode, HImode)
+DEF_MACHMODE (V8SImode, "V8SI", MODE_VECTOR_INT, BITS_PER_UNIT*32, 32, 4, V4DImode, SImode)
+DEF_MACHMODE (V8DImode, "V8DI", MODE_VECTOR_INT, BITS_PER_UNIT*64, 64, 8, VOIDmode, DImode)
-DEF_MACHMODE (V16QImode, "V16QI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 1, V8HImode)
+DEF_MACHMODE (V16QImode, "V16QI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 1, V8HImode, QImode)
-DEF_MACHMODE (V2SFmode, "V2SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*8, 8, 4, V4SFmode)
-DEF_MACHMODE (V2DFmode, "V2DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*16, 16, 8, V8SFmode)
+DEF_MACHMODE (V2SFmode, "V2SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*8, 8, 4, V4SFmode, SFmode)
+DEF_MACHMODE (V2DFmode, "V2DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*16, 16, 8, V8SFmode, DFmode)
-DEF_MACHMODE (V4SFmode, "V4SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*16, 16, 4, V2DFmode)
-DEF_MACHMODE (V4DFmode, "V4DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*32, 32, 8, V8DFmode)
+DEF_MACHMODE (V4SFmode, "V4SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*16, 16, 4, V2DFmode, SFmode)
+DEF_MACHMODE (V4DFmode, "V4DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*32, 32, 8, V8DFmode, DFmode)
-DEF_MACHMODE (V8SFmode, "V8SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*32, 32, 4,V4DFmode)
-DEF_MACHMODE (V8DFmode, "V8DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*64, 64, 8, VOIDmode)
+DEF_MACHMODE (V8SFmode, "V8SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*32, 32, 4,V4DFmode, SFmode)
+DEF_MACHMODE (V8DFmode, "V8DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*64, 64, 8, VOIDmode, DFmode)
+DEF_MACHMODE (V16SFmode, "V16SF", MODE_VECTOR_FLOAT, 512, 64, 4, VOIDmode, SFmode)
/* BLKmode is used for structures, arrays, etc.
that fit no more specific mode. */
-DEF_MACHMODE (BLKmode, "BLK", MODE_RANDOM, 0, 0, 0, VOIDmode)
+DEF_MACHMODE (BLKmode, "BLK", MODE_RANDOM, 0, 0, 0, VOIDmode, VOIDmode)
/* The modes for representing the condition codes come last. CCmode
is always defined. Additional modes for the condition code can be
specified in the EXTRA_CC_MODES macro. All MODE_CC modes are the
same width as SImode and have VOIDmode as their next wider mode. */
-#define CC(E, M) DEF_MACHMODE (E, M, MODE_CC, BITS_PER_UNIT*4, 4, 4, VOIDmode)
+#define CC(E, M) DEF_MACHMODE (E, M, MODE_CC, BITS_PER_UNIT*4, 4, 4, VOIDmode, VOIDmode)
CC (CCmode, "CC")
@@ -160,14 +165,7 @@ EXTRA_CC_MODES
#undef CC
/* The symbol Pmode stands for one of the above machine modes (usually SImode).
- The tm file specifies which one. It is not a distinct mode. Nevertheless,
- while processing the md file, we wish to treat as a distinct mode so that
- it is preserved intact through to the insn-foo.c files. This eliminates a
- lot of redundancy in ports that support both 32-bit and 64-bit targets. */
-#ifdef GENERATOR_FILE
-#undef Pmode
-DEF_MACHMODE (Pmode, "P", MODE_RANDOM, 0, 0, 0, VOIDmode)
-#endif
+ The tm file specifies which one. It is not a distinct mode. */
/*
Local variables:
diff --git a/contrib/gcc/machmode.h b/contrib/gcc/machmode.h
index 0f285e3..f581cd0 100644
--- a/contrib/gcc/machmode.h
+++ b/contrib/gcc/machmode.h
@@ -24,7 +24,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
/* Make an enum class that gives all the machine modes. */
-#define DEF_MACHMODE(SYM, NAME, TYPE, BITSIZE, SIZE, UNIT, WIDER) SYM,
+#define DEF_MACHMODE(SYM, NAME, TYPE, BITSIZE, SIZE, UNIT, WIDER, INNER) SYM,
enum machine_mode {
#include "machmode.def"
@@ -107,6 +107,12 @@ extern const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES];
#define GET_MODE_MASK(MODE) mode_mask_array[(int) (MODE)]
+extern const enum machine_mode inner_mode_array[NUM_MACHINE_MODES];
+
+/* Return the mode of the inner elements in a vector. */
+
+#define GET_MODE_INNER(MODE) inner_mode_array[(int) (MODE)]
+
#endif /* defined (HOST_WIDE_INT) && ! defined GET_MODE_MASK */
#if ! defined GET_MODE_WIDER_MODE || ! defined GET_MODE_ALIGNMENT \
diff --git a/contrib/gcc/make-temp-file.c b/contrib/gcc/make-temp-file.c
new file mode 100644
index 0000000..8833504
--- /dev/null
+++ b/contrib/gcc/make-temp-file.c
@@ -0,0 +1,179 @@
+/* Utility to pick a temporary filename prefix.
+ Copyright (C) 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
+
+This file is part of the libiberty library.
+Libiberty is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+Libiberty 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with libiberty; see the file COPYING.LIB. If not,
+write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h> /* May get P_tmpdir. */
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_SYS_FILE_H
+#include <sys/file.h> /* May get R_OK, etc. on some systems. */
+#endif
+
+#ifndef R_OK
+#define R_OK 4
+#define W_OK 2
+#define X_OK 1
+#endif
+
+#include "libiberty.h"
+extern int mkstemps PARAMS ((char *, int));
+
+/* '/' works just fine on MS-DOS based systems. */
+#ifndef DIR_SEPARATOR
+#define DIR_SEPARATOR '/'
+#endif
+
+/* Name of temporary file.
+ mktemp requires 6 trailing X's. */
+#define TEMP_FILE "ccXXXXXX"
+#define TEMP_FILE_LEN (sizeof(TEMP_FILE) - 1)
+
+/* Subroutine of choose_tmpdir.
+ If BASE is non-NULL, return it.
+ Otherwise it checks if DIR is a usable directory.
+ If success, DIR is returned.
+ Otherwise NULL is returned. */
+
+static inline const char *try PARAMS ((const char *, const char *));
+
+static inline const char *
+try (dir, base)
+ const char *dir, *base;
+{
+ if (base != 0)
+ return base;
+ if (dir != 0
+ && access (dir, R_OK | W_OK | X_OK) == 0)
+ return dir;
+ return 0;
+}
+
+static const char tmp[] = { DIR_SEPARATOR, 't', 'm', 'p', 0 };
+static const char usrtmp[] =
+{ DIR_SEPARATOR, 'u', 's', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 };
+static const char vartmp[] =
+{ DIR_SEPARATOR, 'v', 'a', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 };
+
+static char *memoized_tmpdir;
+
+/*
+
+@deftypefn Replacement char* choose_tmpdir ()
+
+Returns a pointer to a directory path suitable for creating temporary
+files in.
+
+@end deftypefn
+
+*/
+
+char *
+choose_tmpdir ()
+{
+ const char *base = 0;
+ char *tmpdir;
+ unsigned int len;
+
+ if (memoized_tmpdir)
+ return memoized_tmpdir;
+
+ base = try (getenv ("TMPDIR"), base);
+ base = try (getenv ("TMP"), base);
+ base = try (getenv ("TEMP"), base);
+
+#ifdef P_tmpdir
+ base = try (P_tmpdir, base);
+#endif
+
+ /* Try /var/tmp, /usr/tmp, then /tmp. */
+ base = try (vartmp, base);
+ base = try (usrtmp, base);
+ base = try (tmp, base);
+
+ /* If all else fails, use the current directory! */
+ if (base == 0)
+ base = ".";
+
+ /* Append DIR_SEPARATOR to the directory we've chosen
+ and return it. */
+ len = strlen (base);
+ tmpdir = xmalloc (len + 2);
+ strcpy (tmpdir, base);
+ tmpdir[len] = DIR_SEPARATOR;
+ tmpdir[len+1] = '\0';
+
+ memoized_tmpdir = tmpdir;
+ return tmpdir;
+}
+
+/*
+
+@deftypefn Replacement char* make_temp_file (const char *@var{suffix})
+
+Return a temporary file name (as a string) or @code{NULL} if unable to
+create one. @var{suffix} is a suffix to append to the file name. The
+string is @code{malloc}ed, and the temporary file has been created.
+
+@end deftypefn
+
+*/
+
+char *
+make_temp_file (suffix)
+ const char *suffix;
+{
+ const char *base = choose_tmpdir ();
+ char *temp_filename;
+ int base_len, suffix_len;
+ int fd;
+
+ if (suffix == 0)
+ suffix = "";
+
+ base_len = strlen (base);
+ suffix_len = strlen (suffix);
+
+ temp_filename = xmalloc (base_len
+ + TEMP_FILE_LEN
+ + suffix_len + 1);
+ strcpy (temp_filename, base);
+ strcpy (temp_filename + base_len, TEMP_FILE);
+ strcpy (temp_filename + base_len + TEMP_FILE_LEN, suffix);
+
+ fd = mkstemps (temp_filename, suffix_len);
+ /* If mkstemps failed, then something bad is happening. Maybe we should
+ issue a message about a possible security attack in progress? */
+ if (fd == -1)
+ abort ();
+ /* Similarly if we can not close the file. */
+ if (close (fd))
+ abort ();
+ return temp_filename;
+}
diff --git a/contrib/gcc/md5.c b/contrib/gcc/md5.c
new file mode 100644
index 0000000..9450586
--- /dev/null
+++ b/contrib/gcc/md5.c
@@ -0,0 +1,421 @@
+/* md5.c - Functions to compute MD5 message digest of files or memory blocks
+ according to the definition of MD5 in RFC 1321 from April 1992.
+ Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+
+ NOTE: This source is derived from an old version taken from the GNU C
+ Library (glibc).
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+# include <string.h>
+#else
+# ifndef HAVE_MEMCPY
+# define memcpy(d, s, n) bcopy ((s), (d), (n))
+# endif
+#endif
+
+#include "ansidecl.h"
+#include "md5.h"
+
+#ifdef _LIBC
+# include <endian.h>
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define WORDS_BIGENDIAN 1
+# endif
+#endif
+
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) \
+ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
+#else
+# define SWAP(n) (n)
+#endif
+
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. (RFC 1321, 3.1: Step 1) */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+void
+md5_init_ctx (ctx)
+ struct md5_ctx *ctx;
+{
+ ctx->A = (md5_uint32) 0x67452301;
+ ctx->B = (md5_uint32) 0xefcdab89;
+ ctx->C = (md5_uint32) 0x98badcfe;
+ ctx->D = (md5_uint32) 0x10325476;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result
+ must be in little endian byte order.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+void *
+md5_read_ctx (ctx, resbuf)
+ const struct md5_ctx *ctx;
+ void *resbuf;
+{
+ ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
+ ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
+ ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C);
+ ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D);
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+void *
+md5_finish_ctx (ctx, resbuf)
+ struct md5_ctx *ctx;
+ void *resbuf;
+{
+ /* Take yet unprocessed bytes into account. */
+ md5_uint32 bytes = ctx->buflen;
+ size_t pad;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
+ memcpy (&ctx->buffer[bytes], fillbuf, pad);
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3);
+ *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) |
+ (ctx->total[0] >> 29));
+
+ /* Process last bytes. */
+ md5_process_block (ctx->buffer, bytes + pad + 8, ctx);
+
+ return md5_read_ctx (ctx, resbuf);
+}
+
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+md5_stream (stream, resblock)
+ FILE *stream;
+ void *resblock;
+{
+ /* Important: BLOCKSIZE must be a multiple of 64. */
+#define BLOCKSIZE 4096
+ struct md5_ctx ctx;
+ char buffer[BLOCKSIZE + 72];
+ size_t sum;
+
+ /* Initialize the computation context. */
+ md5_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ do
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+ }
+ while (sum < BLOCKSIZE && n != 0);
+ if (n == 0 && ferror (stream))
+ return 1;
+
+ /* If end of file is reached, end the loop. */
+ if (n == 0)
+ break;
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ md5_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ /* Add the last bytes if necessary. */
+ if (sum > 0)
+ md5_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ md5_finish_ctx (&ctx, resblock);
+ return 0;
+}
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+md5_buffer (buffer, len, resblock)
+ const char *buffer;
+ size_t len;
+ void *resblock;
+{
+ struct md5_ctx ctx;
+
+ /* Initialize the computation context. */
+ md5_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ md5_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return md5_finish_ctx (&ctx, resblock);
+}
+
+
+void
+md5_process_bytes (buffer, len, ctx)
+ const void *buffer;
+ size_t len;
+ struct md5_ctx *ctx;
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&ctx->buffer[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (left_over + add > 64)
+ {
+ md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx);
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
+ (left_over + add) & 63);
+ ctx->buflen = (left_over + add) & 63;
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len > 64)
+ {
+ md5_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ memcpy (ctx->buffer, buffer, len);
+ ctx->buflen = len;
+ }
+}
+
+
+/* These are the four functions used in the four steps of the MD5 algorithm
+ and defined in the RFC 1321. The first function is a little bit optimized
+ (as found in Colin Plumbs public domain implementation). */
+/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+#define FF(b, c, d) (d ^ (b & (c ^ d)))
+#define FG(b, c, d) FF (d, b, c)
+#define FH(b, c, d) (b ^ c ^ d)
+#define FI(b, c, d) (c ^ (b | ~d))
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0. */
+
+void
+md5_process_block (buffer, len, ctx)
+ const void *buffer;
+ size_t len;
+ struct md5_ctx *ctx;
+{
+ md5_uint32 correct_words[16];
+ const md5_uint32 *words = buffer;
+ size_t nwords = len / sizeof (md5_uint32);
+ const md5_uint32 *endp = words + nwords;
+ md5_uint32 A = ctx->A;
+ md5_uint32 B = ctx->B;
+ md5_uint32 C = ctx->C;
+ md5_uint32 D = ctx->D;
+
+ /* First increment the byte count. RFC 1321 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += len;
+ if (ctx->total[0] < len)
+ ++ctx->total[1];
+
+ /* Process all bytes in the buffer with 64 bytes in each round of
+ the loop. */
+ while (words < endp)
+ {
+ md5_uint32 *cwp = correct_words;
+ md5_uint32 A_save = A;
+ md5_uint32 B_save = B;
+ md5_uint32 C_save = C;
+ md5_uint32 D_save = D;
+
+ /* First round: using the given function, the context and a constant
+ the next context is computed. Because the algorithms processing
+ unit is a 32-bit word and it is determined to work on words in
+ little endian byte order we perhaps have to change the byte order
+ before the computation. To reduce the work for the next steps
+ we store the swapped words in the array CORRECT_WORDS. */
+
+#define OP(a, b, c, d, s, T) \
+ do \
+ { \
+ a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
+ ++words; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* It is unfortunate that C does not provide an operator for
+ cyclic rotation. Hope the C compiler is smart enough. */
+#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
+
+ /* Before we start, one word to the strange constants.
+ They are defined in RFC 1321 as
+
+ T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+ */
+
+ /* Round 1. */
+ OP (A, B, C, D, 7, (md5_uint32) 0xd76aa478);
+ OP (D, A, B, C, 12, (md5_uint32) 0xe8c7b756);
+ OP (C, D, A, B, 17, (md5_uint32) 0x242070db);
+ OP (B, C, D, A, 22, (md5_uint32) 0xc1bdceee);
+ OP (A, B, C, D, 7, (md5_uint32) 0xf57c0faf);
+ OP (D, A, B, C, 12, (md5_uint32) 0x4787c62a);
+ OP (C, D, A, B, 17, (md5_uint32) 0xa8304613);
+ OP (B, C, D, A, 22, (md5_uint32) 0xfd469501);
+ OP (A, B, C, D, 7, (md5_uint32) 0x698098d8);
+ OP (D, A, B, C, 12, (md5_uint32) 0x8b44f7af);
+ OP (C, D, A, B, 17, (md5_uint32) 0xffff5bb1);
+ OP (B, C, D, A, 22, (md5_uint32) 0x895cd7be);
+ OP (A, B, C, D, 7, (md5_uint32) 0x6b901122);
+ OP (D, A, B, C, 12, (md5_uint32) 0xfd987193);
+ OP (C, D, A, B, 17, (md5_uint32) 0xa679438e);
+ OP (B, C, D, A, 22, (md5_uint32) 0x49b40821);
+
+ /* For the second to fourth round we have the possibly swapped words
+ in CORRECT_WORDS. Redefine the macro to take an additional first
+ argument specifying the function to use. */
+#undef OP
+#define OP(f, a, b, c, d, k, s, T) \
+ do \
+ { \
+ a += f (b, c, d) + correct_words[k] + T; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* Round 2. */
+ OP (FG, A, B, C, D, 1, 5, (md5_uint32) 0xf61e2562);
+ OP (FG, D, A, B, C, 6, 9, (md5_uint32) 0xc040b340);
+ OP (FG, C, D, A, B, 11, 14, (md5_uint32) 0x265e5a51);
+ OP (FG, B, C, D, A, 0, 20, (md5_uint32) 0xe9b6c7aa);
+ OP (FG, A, B, C, D, 5, 5, (md5_uint32) 0xd62f105d);
+ OP (FG, D, A, B, C, 10, 9, (md5_uint32) 0x02441453);
+ OP (FG, C, D, A, B, 15, 14, (md5_uint32) 0xd8a1e681);
+ OP (FG, B, C, D, A, 4, 20, (md5_uint32) 0xe7d3fbc8);
+ OP (FG, A, B, C, D, 9, 5, (md5_uint32) 0x21e1cde6);
+ OP (FG, D, A, B, C, 14, 9, (md5_uint32) 0xc33707d6);
+ OP (FG, C, D, A, B, 3, 14, (md5_uint32) 0xf4d50d87);
+ OP (FG, B, C, D, A, 8, 20, (md5_uint32) 0x455a14ed);
+ OP (FG, A, B, C, D, 13, 5, (md5_uint32) 0xa9e3e905);
+ OP (FG, D, A, B, C, 2, 9, (md5_uint32) 0xfcefa3f8);
+ OP (FG, C, D, A, B, 7, 14, (md5_uint32) 0x676f02d9);
+ OP (FG, B, C, D, A, 12, 20, (md5_uint32) 0x8d2a4c8a);
+
+ /* Round 3. */
+ OP (FH, A, B, C, D, 5, 4, (md5_uint32) 0xfffa3942);
+ OP (FH, D, A, B, C, 8, 11, (md5_uint32) 0x8771f681);
+ OP (FH, C, D, A, B, 11, 16, (md5_uint32) 0x6d9d6122);
+ OP (FH, B, C, D, A, 14, 23, (md5_uint32) 0xfde5380c);
+ OP (FH, A, B, C, D, 1, 4, (md5_uint32) 0xa4beea44);
+ OP (FH, D, A, B, C, 4, 11, (md5_uint32) 0x4bdecfa9);
+ OP (FH, C, D, A, B, 7, 16, (md5_uint32) 0xf6bb4b60);
+ OP (FH, B, C, D, A, 10, 23, (md5_uint32) 0xbebfbc70);
+ OP (FH, A, B, C, D, 13, 4, (md5_uint32) 0x289b7ec6);
+ OP (FH, D, A, B, C, 0, 11, (md5_uint32) 0xeaa127fa);
+ OP (FH, C, D, A, B, 3, 16, (md5_uint32) 0xd4ef3085);
+ OP (FH, B, C, D, A, 6, 23, (md5_uint32) 0x04881d05);
+ OP (FH, A, B, C, D, 9, 4, (md5_uint32) 0xd9d4d039);
+ OP (FH, D, A, B, C, 12, 11, (md5_uint32) 0xe6db99e5);
+ OP (FH, C, D, A, B, 15, 16, (md5_uint32) 0x1fa27cf8);
+ OP (FH, B, C, D, A, 2, 23, (md5_uint32) 0xc4ac5665);
+
+ /* Round 4. */
+ OP (FI, A, B, C, D, 0, 6, (md5_uint32) 0xf4292244);
+ OP (FI, D, A, B, C, 7, 10, (md5_uint32) 0x432aff97);
+ OP (FI, C, D, A, B, 14, 15, (md5_uint32) 0xab9423a7);
+ OP (FI, B, C, D, A, 5, 21, (md5_uint32) 0xfc93a039);
+ OP (FI, A, B, C, D, 12, 6, (md5_uint32) 0x655b59c3);
+ OP (FI, D, A, B, C, 3, 10, (md5_uint32) 0x8f0ccc92);
+ OP (FI, C, D, A, B, 10, 15, (md5_uint32) 0xffeff47d);
+ OP (FI, B, C, D, A, 1, 21, (md5_uint32) 0x85845dd1);
+ OP (FI, A, B, C, D, 8, 6, (md5_uint32) 0x6fa87e4f);
+ OP (FI, D, A, B, C, 15, 10, (md5_uint32) 0xfe2ce6e0);
+ OP (FI, C, D, A, B, 6, 15, (md5_uint32) 0xa3014314);
+ OP (FI, B, C, D, A, 13, 21, (md5_uint32) 0x4e0811a1);
+ OP (FI, A, B, C, D, 4, 6, (md5_uint32) 0xf7537e82);
+ OP (FI, D, A, B, C, 11, 10, (md5_uint32) 0xbd3af235);
+ OP (FI, C, D, A, B, 2, 15, (md5_uint32) 0x2ad7d2bb);
+ OP (FI, B, C, D, A, 9, 21, (md5_uint32) 0xeb86d391);
+
+ /* Add the starting values of the context. */
+ A += A_save;
+ B += B_save;
+ C += C_save;
+ D += D_save;
+ }
+
+ /* Put checksum in context given as argument. */
+ ctx->A = A;
+ ctx->B = B;
+ ctx->C = C;
+ ctx->D = D;
+}
diff --git a/contrib/gcc/md5.h b/contrib/gcc/md5.h
new file mode 100644
index 0000000..ad51f19
--- /dev/null
+++ b/contrib/gcc/md5.h
@@ -0,0 +1,142 @@
+/* md5.h - Declaration of functions and data types used for MD5 sum
+ computing library functions.
+ Copyright 1995, 1996, 2000 Free Software Foundation, Inc.
+ NOTE: The canonical source of this file is maintained with the GNU C
+ Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _MD5_H
+#define _MD5_H 1
+
+#include <stdio.h>
+
+#if defined HAVE_LIMITS_H || _LIBC
+# include <limits.h>
+#endif
+
+/* The following contortions are an attempt to use the C preprocessor
+ to determine an unsigned integral type that is 32 bits wide. An
+ alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+ doing that would require that the configure script compile and *run*
+ the resulting executable. Locally running cross-compiled executables
+ is usually not possible. */
+
+#ifdef _LIBC
+# include <sys/types.h>
+typedef u_int32_t md5_uint32;
+#else
+# define INT_MAX_32_BITS 2147483647
+
+/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+ This should be valid for all systems GNU cares about because
+ that doesn't include 16-bit systems, and only modern systems
+ (that certainly have <limits.h>) have 64+-bit integral types. */
+
+# ifndef INT_MAX
+# define INT_MAX INT_MAX_32_BITS
+# endif
+
+# if INT_MAX == INT_MAX_32_BITS
+ typedef unsigned int md5_uint32;
+# else
+# if SHRT_MAX == INT_MAX_32_BITS
+ typedef unsigned short md5_uint32;
+# else
+# if LONG_MAX == INT_MAX_32_BITS
+ typedef unsigned long md5_uint32;
+# else
+ /* The following line is intended to evoke an error.
+ Using #error is not portable enough. */
+ "Cannot determine unsigned 32-bit data type."
+# endif
+# endif
+# endif
+#endif
+
+#undef __P
+#if defined (__STDC__) && __STDC__
+#define __P(x) x
+#else
+#define __P(x) ()
+#endif
+
+/* Structure to save state of computation between the single steps. */
+struct md5_ctx
+{
+ md5_uint32 A;
+ md5_uint32 B;
+ md5_uint32 C;
+ md5_uint32 D;
+
+ md5_uint32 total[2];
+ md5_uint32 buflen;
+ char buffer[128];
+};
+
+/*
+ * The following three functions are build up the low level used in
+ * the functions `md5_stream' and `md5_buffer'.
+ */
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+extern void md5_init_ctx __P ((struct md5_ctx *ctx));
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void md5_process_block __P ((const void *buffer, size_t len,
+ struct md5_ctx *ctx));
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void md5_process_bytes __P ((const void *buffer, size_t len,
+ struct md5_ctx *ctx));
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 16 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+extern void *md5_finish_ctx __P ((struct md5_ctx *ctx, void *resbuf));
+
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+extern void *md5_read_ctx __P ((const struct md5_ctx *ctx, void *resbuf));
+
+
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+extern int md5_stream __P ((FILE *stream, void *resblock));
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *md5_buffer __P ((const char *buffer, size_t len, void *resblock));
+
+#endif
diff --git a/contrib/gcc/mkconfig.sh b/contrib/gcc/mkconfig.sh
index b63e40a..f0d97ec 100644
--- a/contrib/gcc/mkconfig.sh
+++ b/contrib/gcc/mkconfig.sh
@@ -11,16 +11,12 @@ if [ -z "$1" ]; then
fi
output=$1
-rm -f $output.T
-
-# We used to exec > $output.T but apparently this has bugs.
-# Use a redirected subshell instead.
-(
+rm -f ${output}T
# Define TARGET_CPU_DEFAULT if the system wants one.
# This substitutes for lots of *.h files.
if [ "$TARGET_CPU_DEFAULT" != "" ]; then
- echo "#define TARGET_CPU_DEFAULT ($TARGET_CPU_DEFAULT)"
+ echo "#define TARGET_CPU_DEFAULT ($TARGET_CPU_DEFAULT)" >> ${output}T
fi
# The first entry in HEADERS may be auto-host.h or auto-build.h;
@@ -28,7 +24,7 @@ fi
if [ -n "$HEADERS" ]; then
set $HEADERS; first=$1
case $first in auto-* )
- echo "#include \"$first\""
+ echo "#include \"$first\"" >> ${output}T
shift
HEADERS=$*
;;
@@ -41,33 +37,35 @@ fi
# rather than system.h allows the typedefs to be used anywhere in GCC.
case $output in
*config.h | *hconfig.h | *tconfig.h)
- echo "#ifdef IN_GCC"
- echo "/* Provide three core typedefs used by everything, if we are compiling"
- echo " GCC. These used to be found in rtl.h and tree.h, but this is no"
- echo " longer practical. Providing these here rather that system.h allows"
- echo " the typedefs to be used everywhere within GCC. */"
- echo "struct rtx_def;"
- echo "typedef struct rtx_def *rtx;"
- echo "struct rtvec_def;"
- echo "typedef struct rtvec_def *rtvec;"
- echo "union tree_node;"
- echo "typedef union tree_node *tree;"
- echo "#endif"
+ cat >> ${output}T <<EOF
+#ifdef IN_GCC
+/* Provide three core typedefs used by everything, if we are compiling
+ GCC. These used to be found in rtl.h and tree.h, but this is no
+ longer practical. Providing these here rather that system.h allows
+ the typedefs to be used everywhere within GCC. */
+struct rtx_def;
+typedef struct rtx_def *rtx;
+struct rtvec_def;
+typedef struct rtvec_def *rtvec;
+union tree_node;
+typedef union tree_node *tree;
+#endif
+EOF
;;
esac
if [ -n "$HEADERS" ]; then
- echo '#ifdef IN_GCC'
+ echo '#ifdef IN_GCC' >> ${output}T
for file in $HEADERS; do
- echo "# include \"$file\""
+ echo "# include \"$file\"" >> ${output}T
done
- echo '#endif'
+ echo '#endif' >> ${output}T
fi
for def in $DEFINES; do
- echo "#ifndef $def" | sed 's/=.*//'
- echo "# define $def" | sed 's/=/ /'
- echo "#endif"
+ echo "#ifndef $def" | sed 's/=.*//' >> ${output}T
+ echo "# define $def" | sed 's/=/ /' >> ${output}T
+ echo "#endif" >> ${output}T
done
# If this is tm_p.h, include tm-preds.h unconditionally.
@@ -76,32 +74,26 @@ done
# but only if GENERATOR_FILE is not defined.
case $output in
*tm_p.h)
- echo "#include \"tm-preds.h\""
+ echo "#include \"tm-preds.h\"" >> ${output}T
;;
*tconfig.h | *hconfig.h)
;;
*)
- echo "#ifndef GENERATOR_FILE"
- echo "# include \"insn-constants.h\""
- echo "# include \"insn-flags.h\""
- echo "#endif"
+ cat >> ${output}T <<EOF
+#ifndef GENERATOR_FILE
+# include "insn-constants.h"
+# include "insn-flags.h"
+#endif
+EOF
;;
esac
-# Prevent obstack.c from thinking it can do i18n of its error message
-# when it's being linked against a build-side program.
-echo '#ifdef GENERATOR_FILE'
-echo '# undef ENABLE_NLS'
-echo '#endif'
-
-) > $output.T
-
# Avoid changing the actual file if possible.
-if [ -f $output ] && cmp $output.T $output >/dev/null 2>&1; then
+if [ -f $output ] && cmp ${output}T $output >/dev/null 2>&1; then
echo $output is unchanged >&2
- rm -f $output.T
+ rm -f ${output}T
else
- mv -f $output.T $output
+ mv -f ${output}T $output
fi
# Touch a stamp file for Make's benefit.
diff --git a/contrib/gcc/mklibgcc.in b/contrib/gcc/mklibgcc.in
index bcc03e2..c5db6f0 100644
--- a/contrib/gcc/mklibgcc.in
+++ b/contrib/gcc/mklibgcc.in
@@ -28,9 +28,11 @@
# SHLIB_LINK
# SHLIB_MULTILIB
# SHLIB_MKMAP
+# SHLIB_MKMAP_OPTS
# SHLIB_MAPFILES
# SHLIB_NM_FLAGS
# SHLIB_INSTALL
+# SHLIB_SLIBDIR_SUFFIXES
# Make needs VPATH to be literal.
echo 'srcdir = @srcdir@'
@@ -231,6 +233,7 @@ for file in $LIB2ADD_ST; do
done
# SHLIB_MKMAP
+# SHLIB_MKMAP_OPTS
# SHLIB_MAPFILES
for ml in $MULTILIBS; do
dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
@@ -255,12 +258,16 @@ for ml in $MULTILIBS; do
libgcc_st_objs="$libgcc_st_objs libgcc/${dir}/$o"
done
- if [ "$SHLIB_LINK" -a "$SHLIB_MKMAP" -a -z "$mapfile" ]; then
- mapfile="libgcc.map"
+ if [ "$SHLIB_LINK" -a "$SHLIB_MKMAP" ]; then
+ mapfile="libgcc/${dir}/libgcc.map"
+ tmpmapfile="libgcc/${dir}/tmp-libgcc.map"
echo ""
echo "${mapfile}: $SHLIB_MKMAP $SHLIB_MAPFILES $libgcc_sh_objs"
- echo ' { $(NM_FOR_TARGET)'" $SHLIB_NM_FLAGS $libgcc_sh_objs; echo %%; cat $SHLIB_MAPFILES; } | "'$(AWK)'" -f $SHLIB_MKMAP > "'tmp-$@'
- echo ' mv tmp-$@ $@'
+ echo ' { $(NM_FOR_TARGET)'" $SHLIB_NM_FLAGS $libgcc_sh_objs; echo %%; \\"
+ echo " cat $SHLIB_MAPFILES | sed -e "'"/^[ ]*#/d" -e '\''s/^%\(if\|else\|elif\|endif\|define\)/#\1/'\'" \\"
+ echo " | $gcc_compile $flags -E -xassembler-with-cpp -; \\"
+ echo ' } | $(AWK)'" -f $SHLIB_MKMAP $SHLIB_MKMAP_OPTS > ${tmpmapfile}"
+ echo ' mv '"$tmpmapfile"' $@'
fi
shlib_deps="$shlib_deps $mapfile"
@@ -270,10 +277,24 @@ for ml in $MULTILIBS; do
shlib_deps="$shlib_deps $dir/$f"
done
+ libgcc_a_objs="$libgcc_objs $libgcc_st_objs"
+
+ if [ "@libgcc_visibility@" = yes -a "$SHLIB_LINK" ]; then
+ libgcc_a_objs=
+ echo ""
+ for o in $libgcc_objs $libgcc_st_objs; do
+ # .oS objects will have all non-local symbol definitions .hidden
+ oS=`echo ${o} | sed s~${objext}'$~.oS~g'`
+ echo "${oS}: stmp-dirs ${o}"
+ echo ' @$(NM_FOR_TARGET) '${SHLIB_NM_FLAGS} ${o}' | $(AWK) '\''NF == 3 { print "\t.hidden", $$3 }'\'' | $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) '${flags}' -r -nostdinc -nostdlib -o $@ '${o}' -xassembler -'
+ libgcc_a_objs="${libgcc_a_objs} ${oS}"
+ done
+ fi
+
echo ""
- echo "${dir}/libgcc.a: $libgcc_objs $libgcc_st_objs"
+ echo "${dir}/libgcc.a: $libgcc_a_objs"
echo " -rm -rf ${dir}/libgcc.a"
- echo ' $(AR_CREATE_FOR_TARGET)' ${dir}/libgcc.a $libgcc_objs $libgcc_st_objs
+ echo ' $(AR_CREATE_FOR_TARGET)' ${dir}/libgcc.a $libgcc_a_objs
echo ' if $(RANLIB_TEST_FOR_TARGET) ; then' \\
echo ' $(RANLIB_FOR_TARGET)' ${dir}/libgcc.a ';' \\
echo ' else true; fi;'
@@ -289,11 +310,31 @@ for ml in $MULTILIBS; do
echo ' else true; fi;'
if [ -z "$SHLIB_MULTILIB" ]; then
- if [ "$dir" = "." ]; then
- shlib_base_name="libgcc_s";
+ if [ "$dir" = . ]; then
+ shlib_base_name=libgcc_s
else
shlib_base_name=libgcc_s_`echo $dir | sed s,/,_,g`
fi
+ shlib_so_name="$shlib_base_name"
+ shlib_dir=
+ if [ -n "$SHLIB_SLIBDIR_SUFFIXES" ]; then
+ if [ "$dir" != . ]; then
+ shlib_dir="$dir"/
+ for suffix_pair in $SHLIB_SLIBDIR_SUFFIXES ; do
+ base_ml_dir=`echo ${suffix_pair} | sed -e 's/:.*$//' -e 's/=/$(EQ)/g'`
+ if [ "$dir" = "$base_ml_dir" ]; then
+ shlib_so_name=libgcc_s
+ break
+ else
+ canon_dir=`echo $dir | sed -n -e "s:$base_ml_dir/::p"`
+ if [ -n "$canon_dir" ]; then
+ shlib_so_name=libgcc_s_`echo $canon_dir | sed s,/,_,g`
+ break
+ fi
+ fi
+ done
+ fi
+ fi
echo ""
echo "${dir}/${shlib_base_name}${SHLIB_EXT}: $shlib_deps"
echo " $SHLIB_LINK" \
@@ -301,7 +342,9 @@ for ml in $MULTILIBS; do
-e "s%@multilib_dir@%$dir%g" \
-e "s%@shlib_objs@%$libgcc_sh_objs%g" \
-e "s%@shlib_base_name@%$shlib_base_name%g" \
- -e "s%@shlib_map_file@%$mapfile%g"
+ -e "s%@shlib_map_file@%$mapfile%g" \
+ -e "s%@shlib_so_name@%$shlib_so_name%g" \
+ -e "s%@shlib_dir@%$shlib_dir%g"
elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
shlib_base_name="libgcc_s";
echo ""
@@ -311,7 +354,9 @@ for ml in $MULTILIBS; do
-e "s%@multilib_dir@%$dir%g" \
-e "s%@shlib_objs@%$libgcc_sh_objs%g" \
-e "s%@shlib_base_name@%$shlib_base_name%g" \
- -e "s%@shlib_map_file@%$mapfile%g"
+ -e "s%@shlib_map_file@%$mapfile%g" \
+ -e "s%@shlib_so_name@%$shlib_base_name%g" \
+ -e "s%@shlib_dir@%%g"
fi
fi
done
@@ -407,17 +452,61 @@ for ml in $MULTILIBS; do
echo ' $(RANLIB_FOR_TARGET)' ${ldir}/libgcc_eh.a
if [ -z "$SHLIB_MULTILIB" ]; then
- if [ "$dir" = "." ]; then
- shlib_base_name="libgcc_s";
+ if [ "$dir" = . ]; then
+ shlib_base_name=libgcc_s
else
shlib_base_name=libgcc_s_`echo $dir | sed s,/,_,g`
fi
+ shlib_so_name="$shlib_base_name"
+ shlib_dir=
+ shlib_slibdir_qual=
+ if [ -n "$SHLIB_SLIBDIR_SUFFIXES" ]; then
+ shlib_slibdir_qual=none
+ if [ "$dir" != . ]; then
+ shlib_dir="$dir"/
+ for suffix_pair in $SHLIB_SLIBDIR_SUFFIXES ; do
+ base_ml_dir=`echo ${suffix_pair} | sed -e 's/:.*$//' -e 's/=/$(EQ)/g'`
+ if [ "$dir" = "$base_ml_dir" ]; then
+ shlib_so_name=libgcc_s
+ shlib_slibdir_qual=`echo ${suffix_pair} | sed -e 's/^[^:]*://'`
+ break
+ else
+ canon_dir=`echo $dir | sed -n -e "s:$base_ml_dir/::p"`
+ if [ -n "$canon_dir" ]; then
+ shlib_so_name=libgcc_s_`echo $canon_dir | sed s,/,_,g`
+ shlib_slibdir_qual=`echo ${suffix_pair} | sed -e 's/^[^:]*://'`
+ break
+ fi
+ fi
+ done
+ fi
+ if [ "$shlib_slibdir_qual" = none ]; then
+ for suffix_pair in $SHLIB_SLIBDIR_SUFFIXES ; do
+ base_ml_dir=`echo ${suffix_pair} | sed -e 's/:.*$//' -e 's/=/$(EQ)/g'`
+ shlib_slibdir_qual=`echo ${suffix_pair} | sed -e 's/^[^:]*://'`
+ for ml2 in $MULTILIBS; do
+ dir2=`echo ${ml2} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
+ if [ "$base_ml_dir" = "$dir2" ]; then
+ shlib_slibdir_qual=
+ break
+ fi
+ done
+ if [ -n "$shlib_slibdir_qual" ]; then break; fi
+ done
+ fi
+ fi
echo " $SHLIB_INSTALL" \
- | sed -e "s%@shlib_base_name@%$shlib_base_name%g"
+ | sed -e "s%@shlib_base_name@%$shlib_base_name%g" \
+ -e "s%@shlib_so_name@%$shlib_so_name%g" \
+ -e "s%@shlib_dir@%$shlib_dir%g" \
+ -e "s%@shlib_slibdir_qual@%$shlib_slibdir_qual%g"
elif [ "$SHLIB_MULTILIB" = "$dir" ]; then
shlib_base_name="libgcc_s";
echo " $SHLIB_INSTALL" \
- | sed -e "s%@shlib_base_name@%$shlib_base_name%g"
+ | sed -e "s%@shlib_base_name@%$shlib_base_name%g" \
+ -e "s%@shlib_so_name@%$shlib_base_name%g" \
+ -e "s%@shlib_dir@%%g" \
+ -e "s%@shlib_slibdir_qual@%%g"
fi
fi
done
diff --git a/contrib/gcc/mkmap-symver.awk b/contrib/gcc/mkmap-symver.awk
index c6e3533f..51b6df2 100644
--- a/contrib/gcc/mkmap-symver.awk
+++ b/contrib/gcc/mkmap-symver.awk
@@ -92,7 +92,11 @@ function output(lib) {
printf(" global:\n");
for (sym in ver)
if ((ver[sym] == lib) && (sym in def))
- printf("\t%s;\n", sym);
+ {
+ printf("\t%s;\n", sym);
+ if (dotsyms)
+ printf("\t.%s;\n", sym);
+ }
if (inherit[lib])
printf("} %s;\n", inherit[lib]);
diff --git a/contrib/gcc/objc/lang-specs.h b/contrib/gcc/objc/lang-specs.h
index 2abf633..66e705b 100644
--- a/contrib/gcc/objc/lang-specs.h
+++ b/contrib/gcc/objc/lang-specs.h
@@ -27,15 +27,15 @@ Boston, MA 02111-1307, USA. */
external preprocessor if -save-temps or -traditional is given. */
"%{E|M|MM:%(trad_capable_cpp) -lang-objc %{ansi:-std=c89} %(cpp_options)}\
%{!E:%{!M:%{!MM:\
- %{save-temps:%(trad_capable_cpp) -lang-objc %{ansi:-std=c89}\
- %(cpp_options) %b.mi \n\
- cc1obj -fpreprocessed %b.mi %(cc1_options) %{gen-decls}}\
- %{!save-temps:\
+ %{save-temps|no-integrated-cpp:%(trad_capable_cpp) -lang-objc %{ansi:-std=c89}\
+ %(cpp_options) %{save-temps:%b.mi} %{!save-temps:%g.mi} \n\
+ cc1obj -fpreprocessed %{save-temps:%b.mi} %{!save-temps:%g.mi} %(cc1_options) %{gen-decls}}\
+ %{!save-temps:%{!no-integrated-cpp:\
%{traditional|ftraditional|traditional-cpp:\
tradcpp0 -lang-objc %{ansi:-std=c89} %(cpp_options) %{!pipe:%g.mi} |\n\
cc1obj -fpreprocessed %{!pipe:%g.mi} %(cc1_options) %{gen-decls}}\
%{!traditional:%{!ftraditional:%{!traditional-cpp:\
- cc1obj %{ansi:-std=c89} %(cpp_unique_options) %(cc1_options) %{gen-decls}}}}}\
+ cc1obj %{ansi:-std=c89} %(cpp_unique_options) %(cc1_options) %{gen-decls}}}}}}\
%{!fsyntax-only:%(invoke_as)}}}}", 0},
{".mi", "@objc-cpp-output", 0},
{"@objc-cpp-output",
diff --git a/contrib/gcc/objc/objc-act.c b/contrib/gcc/objc/objc-act.c
index 91b2223..02cb099 100644
--- a/contrib/gcc/objc/objc-act.c
+++ b/contrib/gcc/objc/objc-act.c
@@ -1773,7 +1773,7 @@ build_module_descriptor ()
c_expand_expr_stmt (decelerator);
- finish_function (0);
+ finish_function (0, 0);
return XEXP (DECL_RTL (init_function_decl), 0);
}
@@ -2393,6 +2393,13 @@ objc_copy_list (list, head)
while (list)
{
tail = copy_node (list);
+
+ /* The following statement fixes a bug when inheriting instance
+ variables that are declared to be bitfields. finish_struct
+ expects to find the width of the bitfield in DECL_INITIAL. */
+ if (DECL_BIT_FIELD (tail) && DECL_INITIAL (tail) == 0)
+ DECL_INITIAL (tail) = DECL_SIZE (tail);
+
newlist = chainon (newlist, tail);
list = TREE_CHAIN (list);
}
@@ -7300,7 +7307,7 @@ void
finish_method_def ()
{
lang_expand_function_end = objc_expand_function_end;
- finish_function (0);
+ finish_function (0, 1);
lang_expand_function_end = NULL;
/* Required to implement _msgSuper. This must be done AFTER finish_function,
@@ -8323,7 +8330,7 @@ handle_impent (impent)
string = (char *) alloca (strlen (class_name) + 30);
- sprintf (string, "*%sobjc_class_name_%s",
+ sprintf (string, "%sobjc_class_name_%s",
(flag_next_runtime ? "." : "__"), class_name);
}
else if (TREE_CODE (impent->imp_context) == CATEGORY_IMPLEMENTATION_TYPE)
diff --git a/contrib/gcc/objc/objc-lang.c b/contrib/gcc/objc/objc-lang.c
index 7e2cae7..874a9c3 100644
--- a/contrib/gcc/objc/objc-lang.c
+++ b/contrib/gcc/objc/objc-lang.c
@@ -60,6 +60,9 @@ static void objc_post_options PARAMS ((void));
#undef LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P
#define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P \
anon_aggr_type_p
+#undef LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING
+#define LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
+ c_convert_parm_for_inlining
/* Each front end provides its own hooks, for toplev.c. */
const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
diff --git a/contrib/gcc/obstack.c b/contrib/gcc/obstack.c
index bc318b3..02560c9 100644
--- a/contrib/gcc/obstack.c
+++ b/contrib/gcc/obstack.c
@@ -2,8 +2,8 @@
Copyright (C) 1988,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
- NOTE: The canonical source of this file is maintained with the GNU C Library.
- Bugs can be reported to bug-glibc@gnu.org.
+ NOTE: This source is derived from an old version taken from the GNU C
+ Library (glibc).
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
@@ -451,7 +451,7 @@ _obstack_memory_used (h)
/* Define the error handler. */
#ifndef _
-# ifdef HAVE_LIBINTL_H
+# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
# include <libintl.h>
# ifndef _
# define _(Str) gettext (Str)
diff --git a/contrib/gcc/obstack.h b/contrib/gcc/obstack.h
index 38e9677..d86d9f2 100644
--- a/contrib/gcc/obstack.h
+++ b/contrib/gcc/obstack.h
@@ -1,5 +1,7 @@
/* obstack.h - object stack macros
- Copyright (C) 1988,89,90,91,92,93,94,96,97,98 Free Software Foundation, Inc.
+ Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998,
+ 1999, 2000
+ Free Software Foundation, Inc.
NOTE: The canonical source of this file is maintained with the GNU C Library.
@@ -143,12 +145,16 @@ extern "C" {
#if defined _LIBC || defined HAVE_STRING_H
# include <string.h>
-# define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
+# if defined __STDC__ && __STDC__
+# define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
+# else
+# define _obstack_memcpy(To, From, N) memcpy ((To), (char *)(From), (N))
+# endif
#else
# ifdef memcpy
-# define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
+# define _obstack_memcpy(To, From, N) memcpy ((To), (char *)(From), (N))
# else
-# define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N))
+# define _obstack_memcpy(To, From, N) bcopy ((char *)(From), (To), (N))
# endif
#endif
@@ -385,7 +391,7 @@ __extension__ \
int __len = (length); \
if (__o->next_free + __len > __o->chunk_limit) \
_obstack_newchunk (__o, __len); \
- _obstack_memcpy (__o->next_free, (char *) (where), __len); \
+ _obstack_memcpy (__o->next_free, (where), __len); \
__o->next_free += __len; \
(void) 0; })
@@ -395,7 +401,7 @@ __extension__ \
int __len = (length); \
if (__o->next_free + __len + 1 > __o->chunk_limit) \
_obstack_newchunk (__o, __len + 1); \
- _obstack_memcpy (__o->next_free, (char *) (where), __len); \
+ _obstack_memcpy (__o->next_free, (where), __len); \
__o->next_free += __len; \
*(__o->next_free)++ = 0; \
(void) 0; })
@@ -510,14 +516,14 @@ __extension__ \
( (h)->temp = (length), \
(((h)->next_free + (h)->temp > (h)->chunk_limit) \
? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \
- _obstack_memcpy ((h)->next_free, (char *) (where), (h)->temp), \
+ _obstack_memcpy ((h)->next_free, (where), (h)->temp), \
(h)->next_free += (h)->temp)
# define obstack_grow0(h,where,length) \
( (h)->temp = (length), \
(((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \
? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \
- _obstack_memcpy ((h)->next_free, (char *) (where), (h)->temp), \
+ _obstack_memcpy ((h)->next_free, (where), (h)->temp), \
(h)->next_free += (h)->temp, \
*((h)->next_free)++ = 0)
diff --git a/contrib/gcc/optabs.c b/contrib/gcc/optabs.c
index 2a2ebb3..7249ffa 100644
--- a/contrib/gcc/optabs.c
+++ b/contrib/gcc/optabs.c
@@ -186,12 +186,16 @@ widen_operand (op, mode, oldmode, unsignedp, no_extend)
{
rtx result;
- /* If we must extend do so. If OP is either a constant or a SUBREG
- for a promoted object, also extend since it will be more efficient to
- do so. */
+ /* If we don't have to extend and this is a constant, return it. */
+ if (no_extend && GET_MODE (op) == VOIDmode)
+ return op;
+
+ /* If we must extend do so. If OP is a SUBREG for a promoted object, also
+ extend since it will be more efficient to do so unless the signedness of
+ a promoted object differs from our extension. */
if (! no_extend
- || GET_MODE (op) == VOIDmode
- || (GET_CODE (op) == SUBREG && SUBREG_PROMOTED_VAR_P (op)))
+ || (GET_CODE (op) == SUBREG && SUBREG_PROMOTED_VAR_P (op)
+ && SUBREG_PROMOTED_UNSIGNED_P (op) == unsignedp))
return convert_modes (mode, oldmode, op, unsignedp);
/* If MODE is no wider than a single word, we return a paradoxical
@@ -2735,11 +2739,18 @@ emit_no_conflict_block (insns, target, op0, op1, equiv)
these from the list. */
for (insn = insns; insn; insn = next)
{
- rtx set = 0;
+ rtx set = 0, note;
int i;
next = NEXT_INSN (insn);
+ /* Some ports (cris) create an libcall regions at their own. We must
+ avoid any potential nesting of LIBCALLs. */
+ if ((note = find_reg_note (insn, REG_LIBCALL, NULL)) != NULL)
+ remove_note (insn, note);
+ if ((note = find_reg_note (insn, REG_RETVAL, NULL)) != NULL)
+ remove_note (insn, note);
+
if (GET_CODE (PATTERN (insn)) == SET || GET_CODE (PATTERN (insn)) == USE
|| GET_CODE (PATTERN (insn)) == CLOBBER)
set = PATTERN (insn);
@@ -2902,6 +2913,14 @@ emit_libcall_block (insns, target, result, equiv)
for (insn = insns; insn; insn = next)
{
rtx set = single_set (insn);
+ rtx note;
+
+ /* Some ports (cris) create an libcall regions at their own. We must
+ avoid any potential nesting of LIBCALLs. */
+ if ((note = find_reg_note (insn, REG_LIBCALL, NULL)) != NULL)
+ remove_note (insn, note);
+ if ((note = find_reg_note (insn, REG_RETVAL, NULL)) != NULL)
+ remove_note (insn, note);
next = NEXT_INSN (insn);
@@ -4941,6 +4960,7 @@ init_optabs ()
truncxfdf2_libfunc = init_one_libfunc ("__truncxfdf2");
trunctfdf2_libfunc = init_one_libfunc ("__trunctfdf2");
+ abort_libfunc = init_one_libfunc ("abort");
memcpy_libfunc = init_one_libfunc ("memcpy");
memmove_libfunc = init_one_libfunc ("memmove");
bcopy_libfunc = init_one_libfunc ("bcopy");
diff --git a/contrib/gcc/output.h b/contrib/gcc/output.h
index 1a2eefb..0e11df3 100644
--- a/contrib/gcc/output.h
+++ b/contrib/gcc/output.h
@@ -1,7 +1,7 @@
/* Declarations for insn-output.c. These functions are defined in recog.c,
final.c, and varasm.c.
Copyright (C) 1987, 1991, 1994, 1997, 1998,
- 1999, 2000, 2001 Free Software Foundation, Inc.
+ 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GCC.
@@ -81,7 +81,7 @@ extern rtx alter_subreg PARAMS ((rtx *));
/* Report inconsistency between the assembler template and the operands.
In an `asm', it's the user's fault; otherwise, the compiler's fault. */
-extern void output_operand_lossage PARAMS ((const char *));
+extern void output_operand_lossage PARAMS ((const char *, ...)) ATTRIBUTE_PRINTF_1;
/* Output a string of assembler code, substituting insn operands.
Defined in final.c. */
@@ -231,6 +231,8 @@ extern void mergeable_constant_section PARAMS ((enum machine_mode,
/* Declare DECL to be a weak symbol. */
extern void declare_weak PARAMS ((tree));
+/* Merge weak status. */
+extern void merge_weak PARAMS ((tree, tree));
#endif /* TREE_CODE */
/* Emit any pending weak declarations. */
@@ -484,9 +486,6 @@ extern const char *user_label_prefix;
#define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
(VAR) = ((SYMBOL_NAME) + ((SYMBOL_NAME)[0] == '*'))
#endif
-/* Assign unique numbers to labels generated for profiling. */
-
-extern int profile_label_no;
/* Default target function prologue and epilogue assembler output. */
extern void default_function_pro_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
@@ -512,7 +511,8 @@ extern void no_asm_to_stream PARAMS ((FILE *));
#define SECTION_MERGE 0x08000 /* contains mergeable data */
#define SECTION_STRINGS 0x10000 /* contains zero terminated strings without
embedded zeros */
-#define SECTION_MACH_DEP 0x20000 /* subsequent bits reserved for target */
+#define SECTION_OVERRIDE 0x20000 /* allow override of default flags */
+#define SECTION_MACH_DEP 0x40000 /* subsequent bits reserved for target */
extern unsigned int get_named_section_flags PARAMS ((const char *));
extern bool set_named_section_flags PARAMS ((const char *, unsigned int));
diff --git a/contrib/gcc/partition.c b/contrib/gcc/partition.c
new file mode 100644
index 0000000..0715472
--- /dev/null
+++ b/contrib/gcc/partition.c
@@ -0,0 +1,191 @@
+/* List implementation of a partition of consecutive integers.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Contributed by CodeSourcery, LLC.
+
+ This file is part of GNU CC.
+
+ GNU CC 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.
+
+ GNU CC 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 GNU CC; see the file COPYING. If not, write to
+ the Free Software Foundation, 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "libiberty.h"
+#include "partition.h"
+
+static int elem_compare PARAMS ((const void *, const void *));
+
+/* Creates a partition of NUM_ELEMENTS elements. Initially each
+ element is in a class by itself. */
+
+partition
+partition_new (num_elements)
+ int num_elements;
+{
+ int e;
+
+ partition part = (partition)
+ xmalloc (sizeof (struct partition_def) +
+ (num_elements - 1) * sizeof (struct partition_elem));
+ part->num_elements = num_elements;
+ for (e = 0; e < num_elements; ++e)
+ {
+ part->elements[e].class_element = e;
+ part->elements[e].next = &(part->elements[e]);
+ part->elements[e].class_count = 1;
+ }
+
+ return part;
+}
+
+/* Freeds a partition. */
+
+void
+partition_delete (part)
+ partition part;
+{
+ free (part);
+}
+
+/* Unites the classes containing ELEM1 and ELEM2 into a single class
+ of partition PART. If ELEM1 and ELEM2 are already in the same
+ class, does nothing. Returns the canonical element of the
+ resulting union class. */
+
+int
+partition_union (part, elem1, elem2)
+ partition part;
+ int elem1;
+ int elem2;
+{
+ struct partition_elem *elements = part->elements;
+ struct partition_elem *e1;
+ struct partition_elem *e2;
+ struct partition_elem *p;
+ struct partition_elem *old_next;
+ /* The canonical element of the resulting union class. */
+ int class_element = elements[elem1].class_element;
+
+ /* If they're already in the same class, do nothing. */
+ if (class_element == elements[elem2].class_element)
+ return class_element;
+
+ /* Make sure ELEM1 is in the larger class of the two. If not, swap
+ them. This way we always scan the shorter list. */
+ if (elements[elem1].class_count < elements[elem2].class_count)
+ {
+ int temp = elem1;
+ elem1 = elem2;
+ elem2 = temp;
+ class_element = elements[elem1].class_element;
+ }
+
+ e1 = &(elements[elem1]);
+ e2 = &(elements[elem2]);
+
+ /* Keep a count of the number of elements in the list. */
+ elements[class_element].class_count
+ += elements[e2->class_element].class_count;
+
+ /* Update the class fields in elem2's class list. */
+ e2->class_element = class_element;
+ for (p = e2->next; p != e2; p = p->next)
+ p->class_element = class_element;
+
+ /* Splice ELEM2's class list into ELEM1's. These are circular
+ lists. */
+ old_next = e1->next;
+ e1->next = e2->next;
+ e2->next = old_next;
+
+ return class_element;
+}
+
+/* Compare elements ELEM1 and ELEM2 from array of integers, given a
+ pointer to each. Used to qsort such an array. */
+
+static int
+elem_compare (elem1, elem2)
+ const void *elem1;
+ const void *elem2;
+{
+ int e1 = * (const int *) elem1;
+ int e2 = * (const int *) elem2;
+ if (e1 < e2)
+ return -1;
+ else if (e1 > e2)
+ return 1;
+ else
+ return 0;
+}
+
+/* Prints PART to the file pointer FP. The elements of each
+ class are sorted. */
+
+void
+partition_print (part, fp)
+ partition part;
+ FILE *fp;
+{
+ char *done;
+ int num_elements = part->num_elements;
+ struct partition_elem *elements = part->elements;
+ int *class_elements;
+ int e;
+
+ /* Flag the elements we've already printed. */
+ done = (char *) xmalloc (num_elements);
+ memset (done, 0, num_elements);
+
+ /* A buffer used to sort elements in a class. */
+ class_elements = (int *) xmalloc (num_elements * sizeof (int));
+
+ fputc ('[', fp);
+ for (e = 0; e < num_elements; ++e)
+ /* If we haven't printed this element, print its entire class. */
+ if (! done[e])
+ {
+ int c = e;
+ int count = elements[elements[e].class_element].class_count;
+ int i;
+
+ /* Collect the elements in this class. */
+ for (i = 0; i < count; ++i) {
+ class_elements[i] = c;
+ done[c] = 1;
+ c = elements[c].next - elements;
+ }
+ /* Sort them. */
+ qsort ((void *) class_elements, count, sizeof (int), elem_compare);
+ /* Print them. */
+ fputc ('(', fp);
+ for (i = 0; i < count; ++i)
+ fprintf (fp, i == 0 ? "%d" : " %d", class_elements[i]);
+ fputc (')', fp);
+ }
+ fputc (']', fp);
+
+ free (done);
+}
+
diff --git a/contrib/gcc/partition.h b/contrib/gcc/partition.h
new file mode 100644
index 0000000..851422a
--- /dev/null
+++ b/contrib/gcc/partition.h
@@ -0,0 +1,81 @@
+/* List implementation of a partition of consecutive integers.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Contributed by CodeSourcery, LLC.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GCC is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING. If not, write to
+ the Free Software Foundation, 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* This package implements a partition of consecutive integers. The
+ elements are partitioned into classes. Each class is represented
+ by one of its elements, the canonical element, which is chosen
+ arbitrarily from elements in the class. The principal operations
+ on a partition are FIND, which takes an element, determines its
+ class, and returns the canonical element for that class, and UNION,
+ which unites the two classes that contain two given elements into a
+ single class.
+
+ The list implementation used here provides constant-time finds. By
+ storing the size of each class with the class's canonical element,
+ it is able to perform unions over all the classes in the partition
+ in O (N log N) time. */
+
+#ifndef _PARTITION_H
+#define _PARTITION_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include <ansidecl.h>
+#include <stdio.h>
+
+struct partition_elem
+{
+ /* The canonical element that represents the class containing this
+ element. */
+ int class_element;
+ /* The next element in this class. Elements in each class form a
+ circular list. */
+ struct partition_elem* next;
+ /* The number of elements in this class. Valid only if this is the
+ canonical element for its class. */
+ unsigned class_count;
+};
+
+typedef struct partition_def
+{
+ /* The number of elements in this partition. */
+ int num_elements;
+ /* The elements in the partition. */
+ struct partition_elem elements[1];
+} *partition;
+
+extern partition partition_new PARAMS((int));
+extern void partition_delete PARAMS((partition));
+extern int partition_union PARAMS((partition,
+ int,
+ int));
+extern void partition_print PARAMS((partition,
+ FILE*));
+
+/* Returns the canonical element corresponding to the class containing
+ ELEMENT__ in PARTITION__. */
+
+#define partition_find(partition__, element__) \
+ ((partition__)->elements[(element__)].class_element)
+
+#endif /* _PARTITION_H */
diff --git a/contrib/gcc/predict.c b/contrib/gcc/predict.c
index 6961a33..bcafef2 100644
--- a/contrib/gcc/predict.c
+++ b/contrib/gcc/predict.c
@@ -955,6 +955,7 @@ estimate_bb_frequencies (loops)
for (i = -2; i < n_basic_blocks; i++)
{
basic_block bb;
+ volatile double tmp;
if (i == -2)
bb = ENTRY_BLOCK_PTR;
@@ -962,8 +963,12 @@ estimate_bb_frequencies (loops)
bb = EXIT_BLOCK_PTR;
else
bb = BASIC_BLOCK (i);
- bb->frequency
- = BLOCK_INFO (bb)->frequency * BB_FREQ_MAX / freq_max + 0.5;
+
+ /* ??? Prevent rounding differences due to optimization on x86. */
+ tmp = BLOCK_INFO (bb)->frequency * BB_FREQ_MAX;
+ tmp /= freq_max;
+ tmp += 0.5;
+ bb->frequency = tmp;
}
free_aux_for_blocks ();
diff --git a/contrib/gcc/protoize.c b/contrib/gcc/protoize.c
index f8d8a9e..3b710a5 100644
--- a/contrib/gcc/protoize.c
+++ b/contrib/gcc/protoize.c
@@ -22,6 +22,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "config.h"
#include "system.h"
#include "intl.h"
+#include "cppdefault.h"
#include <setjmp.h>
#include <signal.h>
@@ -194,54 +195,6 @@ static const unexpansion unexpansions[] = {
static const int hash_mask = (HASH_TABLE_SIZE - 1);
-/* Make a table of default system include directories
- just as it is done in cpp. */
-
-#ifndef STANDARD_INCLUDE_DIR
-#define STANDARD_INCLUDE_DIR "/usr/include"
-#endif
-
-#ifndef LOCAL_INCLUDE_DIR
-#define LOCAL_INCLUDE_DIR "/usr/local/include"
-#endif
-
-static const struct default_include { const char *const fname;
- const char *const component;
- const int x1, x2; } include_defaults[]
-#ifdef INCLUDE_DEFAULTS
- = INCLUDE_DEFAULTS;
-#else
- = {
- /* Pick up GNU C++ specific include files. */
- { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 },
-#ifdef CROSS_COMPILE
- /* This is the dir for fixincludes. Put it just before
- the files that we fix. */
- { GCC_INCLUDE_DIR, "GCC", 0, 0 },
- /* For cross-compilation, this dir name is generated
- automatically in Makefile.in. */
- { CROSS_INCLUDE_DIR, 0, 0, 0 },
- /* This is another place that the target system's headers might be. */
- { TOOL_INCLUDE_DIR, "BINUTILS", 0, 0 },
-#else /* not CROSS_COMPILE */
- /* This should be /use/local/include and should come before
- the fixincludes-fixed header files. */
- { LOCAL_INCLUDE_DIR, 0, 0, 1 },
- /* This is here ahead of GCC_INCLUDE_DIR because assert.h goes here.
- Likewise, behind LOCAL_INCLUDE_DIR, where glibc puts its assert.h. */
- { TOOL_INCLUDE_DIR, "BINUTILS", 0, 0 },
- /* This is the dir for fixincludes. Put it just before
- the files that we fix. */
- { GCC_INCLUDE_DIR, "GCC", 0, 0 },
- /* Some systems have an extra dir of include files. */
-#ifdef SYSTEM_INCLUDE_DIR
- { SYSTEM_INCLUDE_DIR, 0, 0, 0 },
-#endif
- { STANDARD_INCLUDE_DIR, 0, 0, 0},
-#endif /* not CROSS_COMPILE */
- { 0, 0, 0, 0}
- };
-#endif /* no INCLUDE_DEFAULTS */
/* Datatype for lists of directories or filenames. */
struct string_list
@@ -748,7 +701,7 @@ in_system_include_dir (path)
if (! is_abspath (path))
abort (); /* Must be an absolutized filename. */
- for (p = include_defaults; p->fname; p++)
+ for (p = cpp_include_defaults; p->fname; p++)
if (!strncmp (path, p->fname, strlen (p->fname))
&& IS_DIR_SEPARATOR (path[strlen (p->fname)]))
return 1;
diff --git a/contrib/gcc/recog.c b/contrib/gcc/recog.c
index ec0ec88..d74e399 100644
--- a/contrib/gcc/recog.c
+++ b/contrib/gcc/recog.c
@@ -753,6 +753,7 @@ find_single_use_1 (dest, loc)
case LABEL_REF:
case SYMBOL_REF:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CLOBBER:
return 0;
@@ -1967,7 +1968,9 @@ offsettable_address_p (strictp, mode, y)
of the specified mode. We assume that if Y and Y+c are
valid addresses then so is Y+d for all 0<d<c. adjust_address will
go inside a LO_SUM here, so we do so as well. */
- if (GET_CODE (y) == LO_SUM)
+ if (GET_CODE (y) == LO_SUM
+ && mode != BLKmode
+ && mode_sz <= GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT)
z = gen_rtx_LO_SUM (GET_MODE (y), XEXP (y, 0),
plus_constant (XEXP (y, 1), mode_sz - 1));
else
@@ -3018,8 +3021,10 @@ peephole2_optimize (dump_file)
int i, b;
#ifdef HAVE_conditional_execution
sbitmap blocks;
- int changed;
+ bool changed;
#endif
+ bool do_cleanup_cfg = false;
+ bool do_rebuild_jump_labels = false;
/* Initialize the regsets we're going to use. */
for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
@@ -3029,7 +3034,7 @@ peephole2_optimize (dump_file)
#ifdef HAVE_conditional_execution
blocks = sbitmap_alloc (n_basic_blocks);
sbitmap_zero (blocks);
- changed = 0;
+ changed = false;
#else
count_or_remove_death_notes (NULL, 1);
#endif
@@ -3062,8 +3067,9 @@ peephole2_optimize (dump_file)
prev = PREV_INSN (insn);
if (INSN_P (insn))
{
- rtx try;
+ rtx try, before_try, x;
int match_len;
+ rtx note;
/* Record this insn. */
if (--peep2_current < 0)
@@ -3115,7 +3121,6 @@ peephole2_optimize (dump_file)
note = XEXP (note, 1))
switch (REG_NOTE_KIND (note))
{
- case REG_EH_REGION:
case REG_NORETURN:
case REG_SETJMP:
case REG_ALWAYS_RETURN:
@@ -3145,10 +3150,66 @@ peephole2_optimize (dump_file)
if (i >= MAX_INSNS_PER_PEEP2 + 1)
i -= MAX_INSNS_PER_PEEP2 + 1;
+ note = find_reg_note (peep2_insn_data[i].insn,
+ REG_EH_REGION, NULL_RTX);
+
/* Replace the old sequence with the new. */
try = emit_insn_after (try, peep2_insn_data[i].insn);
+ before_try = PREV_INSN (insn);
delete_insn_chain (insn, peep2_insn_data[i].insn);
+ /* Re-insert the EH_REGION notes. */
+ if (note)
+ {
+ edge eh_edge;
+
+ for (eh_edge = bb->succ; eh_edge
+ ; eh_edge = eh_edge->succ_next)
+ if (eh_edge->flags & EDGE_EH)
+ break;
+
+ for (x = try ; x != before_try ; x = PREV_INSN (x))
+ if (GET_CODE (x) == CALL_INSN
+ || (flag_non_call_exceptions
+ && may_trap_p (PATTERN (x))
+ && !find_reg_note (x, REG_EH_REGION, NULL)))
+ {
+ REG_NOTES (x)
+ = gen_rtx_EXPR_LIST (REG_EH_REGION,
+ XEXP (note, 0),
+ REG_NOTES (x));
+
+ if (x != bb->end && eh_edge)
+ {
+ edge nfte, nehe;
+ int flags;
+
+ nfte = split_block (bb, x);
+ flags = EDGE_EH | EDGE_ABNORMAL;
+ if (GET_CODE (x) == CALL_INSN)
+ flags |= EDGE_ABNORMAL_CALL;
+ nehe = make_edge (nfte->src, eh_edge->dest,
+ flags);
+
+ nehe->probability = eh_edge->probability;
+ nfte->probability
+ = REG_BR_PROB_BASE - nehe->probability;
+
+ do_cleanup_cfg |= purge_dead_edges (nfte->dest);
+#ifdef HAVE_conditional_execution
+ SET_BIT (blocks, nfte->dest->index);
+ changed = true;
+#endif
+ bb = nfte->src;
+ eh_edge = nehe;
+ }
+ }
+
+ /* Converting possibly trapping insn to non-trapping is
+ possible. Zap dummy outgoing edges. */
+ do_cleanup_cfg |= purge_dead_edges (bb);
+ }
+
#ifdef HAVE_conditional_execution
/* With conditional execution, we cannot back up the
live information so easily, since the conditional
@@ -3156,7 +3217,7 @@ peephole2_optimize (dump_file)
So record that we've made a modification to this
block and update life information at the end. */
SET_BIT (blocks, b);
- changed = 1;
+ changed = true;
for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
peep2_insn_data[i].insn = NULL_RTX;
@@ -3169,25 +3230,35 @@ peephole2_optimize (dump_file)
COPY_REG_SET (live, peep2_insn_data[i].live_before);
/* Update life information for the new sequence. */
+ x = try;
do
{
- if (INSN_P (try))
+ if (INSN_P (x))
{
if (--i < 0)
i = MAX_INSNS_PER_PEEP2;
- peep2_insn_data[i].insn = try;
- propagate_one_insn (pbi, try);
+ peep2_insn_data[i].insn = x;
+ propagate_one_insn (pbi, x);
COPY_REG_SET (peep2_insn_data[i].live_before, live);
}
- try = PREV_INSN (try);
+ x = PREV_INSN (x);
}
- while (try != prev);
+ while (x != prev);
/* ??? Should verify that LIVE now matches what we
had before the new sequence. */
peep2_current = i;
#endif
+
+ /* If we generated a jump instruction, it won't have
+ JUMP_LABEL set. Recompute after we're done. */
+ for (x = try; x != before_try; x = PREV_INSN (x))
+ if (GET_CODE (x) == JUMP_INSN)
+ {
+ do_rebuild_jump_labels = true;
+ break;
+ }
}
}
@@ -3202,9 +3273,23 @@ peephole2_optimize (dump_file)
FREE_REG_SET (peep2_insn_data[i].live_before);
FREE_REG_SET (live);
+ if (do_rebuild_jump_labels)
+ rebuild_jump_labels (get_insns ());
+
+ /* If we eliminated EH edges, we may be able to merge blocks. Further,
+ we've changed global life since exception handlers are no longer
+ reachable. */
+ if (do_cleanup_cfg)
+ {
+ cleanup_cfg (0);
+ update_life_info (0, UPDATE_LIFE_GLOBAL_RM_NOTES, PROP_DEATH_NOTES);
+ }
#ifdef HAVE_conditional_execution
- count_or_remove_death_notes (blocks, 1);
- update_life_info (blocks, UPDATE_LIFE_LOCAL, PROP_DEATH_NOTES);
+ else
+ {
+ count_or_remove_death_notes (blocks, 1);
+ update_life_info (blocks, UPDATE_LIFE_LOCAL, PROP_DEATH_NOTES);
+ }
sbitmap_free (blocks);
#endif
}
diff --git a/contrib/gcc/reg-stack.c b/contrib/gcc/reg-stack.c
index c0915a5..424b204 100644
--- a/contrib/gcc/reg-stack.c
+++ b/contrib/gcc/reg-stack.c
@@ -2854,6 +2854,7 @@ convert_regs (file)
}
}
+ fixup_abnormal_edges ();
if (inserted)
commit_edge_insertions ();
diff --git a/contrib/gcc/regclass.c b/contrib/gcc/regclass.c
index d064e24..93a5edb 100644
--- a/contrib/gcc/regclass.c
+++ b/contrib/gcc/regclass.c
@@ -2416,6 +2416,7 @@ reg_scan_mark_refs (x, insn, note_flag, min_regno)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CC0:
case PC:
case SYMBOL_REF:
diff --git a/contrib/gcc/regmove.c b/contrib/gcc/regmove.c
index 9530128..59b1005 100644
--- a/contrib/gcc/regmove.c
+++ b/contrib/gcc/regmove.c
@@ -1328,19 +1328,22 @@ regmove_optimize (f, nregs, regmove_dump_file)
}
src_class = reg_preferred_class (REGNO (src));
dst_class = reg_preferred_class (REGNO (dst));
- if (! regclass_compatible_p (src_class, dst_class))
+
+ if (! (src_note = find_reg_note (insn, REG_DEAD, src)))
{
- if (!copy_src)
- {
- copy_src = src;
- copy_dst = dst;
- }
+ /* We used to force the copy here like in other cases, but
+ it produces worse code, as it eliminates no copy
+ instructions and the copy emitted will be produced by
+ reload anyway. On patterns with multiple alternatives,
+ there may be better sollution availble.
+
+ In particular this change produced slower code for numeric
+ i387 programs. */
+
continue;
}
- /* Can not modify an earlier insn to set dst if this insn
- uses an old value in the source. */
- if (reg_overlap_mentioned_p (dst, SET_SRC (set)))
+ if (! regclass_compatible_p (src_class, dst_class))
{
if (!copy_src)
{
@@ -1350,7 +1353,9 @@ regmove_optimize (f, nregs, regmove_dump_file)
continue;
}
- if (! (src_note = find_reg_note (insn, REG_DEAD, src)))
+ /* Can not modify an earlier insn to set dst if this insn
+ uses an old value in the source. */
+ if (reg_overlap_mentioned_p (dst, SET_SRC (set)))
{
if (!copy_src)
{
@@ -1360,7 +1365,6 @@ regmove_optimize (f, nregs, regmove_dump_file)
continue;
}
-
/* If src is set once in a different basic block,
and is set equal to a constant, then do not use
it for this optimization, as this would make it
@@ -2327,19 +2331,17 @@ combine_stack_adjustments_for_block (bb)
HOST_WIDE_INT last_sp_adjust = 0;
rtx last_sp_set = NULL_RTX;
struct csa_memlist *memlist = NULL;
- rtx pending_delete;
- rtx insn, next;
+ rtx insn, next, set;
struct record_stack_memrefs_data data;
+ bool end_of_block = false;
- for (insn = bb->head; ; insn = next)
+ for (insn = bb->head; !end_of_block ; insn = next)
{
- rtx set;
-
- pending_delete = NULL_RTX;
+ end_of_block = insn == bb->end;
next = NEXT_INSN (insn);
if (! INSN_P (insn))
- goto processed;
+ continue;
set = single_set_for_csa (insn);
if (set)
@@ -2361,7 +2363,7 @@ combine_stack_adjustments_for_block (bb)
{
last_sp_set = insn;
last_sp_adjust = this_adjust;
- goto processed;
+ continue;
}
/* If not all recorded memrefs can be adjusted, or the
@@ -2393,9 +2395,9 @@ combine_stack_adjustments_for_block (bb)
this_adjust))
{
/* It worked! */
- pending_delete = insn;
+ delete_insn (insn);
last_sp_adjust += this_adjust;
- goto processed;
+ continue;
}
}
@@ -2414,16 +2416,20 @@ combine_stack_adjustments_for_block (bb)
last_sp_adjust += this_adjust;
free_csa_memlist (memlist);
memlist = NULL;
- goto processed;
+ continue;
}
}
- /* Combination failed. Restart processing from here. */
+ /* Combination failed. Restart processing from here. If
+ deallocation+allocation conspired to cancel, we can
+ delete the old deallocation insn. */
+ if (last_sp_set && last_sp_adjust == 0)
+ delete_insn (insn);
free_csa_memlist (memlist);
memlist = NULL;
last_sp_set = insn;
last_sp_adjust = this_adjust;
- goto processed;
+ continue;
}
/* Find a predecrement of exactly the previous adjustment and
@@ -2449,15 +2455,12 @@ combine_stack_adjustments_for_block (bb)
stack_pointer_rtx),
0))
{
- if (last_sp_set == bb->head)
- bb->head = NEXT_INSN (last_sp_set);
delete_insn (last_sp_set);
-
free_csa_memlist (memlist);
memlist = NULL;
last_sp_set = NULL_RTX;
last_sp_adjust = 0;
- goto processed;
+ continue;
}
}
@@ -2467,7 +2470,7 @@ combine_stack_adjustments_for_block (bb)
&& !for_each_rtx (&PATTERN (insn), record_stack_memrefs, &data))
{
memlist = data.memlist;
- goto processed;
+ continue;
}
memlist = data.memlist;
@@ -2477,20 +2480,15 @@ combine_stack_adjustments_for_block (bb)
&& (GET_CODE (insn) == CALL_INSN
|| reg_mentioned_p (stack_pointer_rtx, PATTERN (insn))))
{
+ if (last_sp_set && last_sp_adjust == 0)
+ delete_insn (last_sp_set);
free_csa_memlist (memlist);
memlist = NULL;
last_sp_set = NULL_RTX;
last_sp_adjust = 0;
}
-
- processed:
- if (insn == bb->end)
- break;
-
- if (pending_delete)
- delete_insn (pending_delete);
}
- if (pending_delete)
- delete_insn (pending_delete);
+ if (last_sp_set && last_sp_adjust == 0)
+ delete_insn (last_sp_set);
}
diff --git a/contrib/gcc/regrename.c b/contrib/gcc/regrename.c
index b830b88..efdd9f9 100644
--- a/contrib/gcc/regrename.c
+++ b/contrib/gcc/regrename.c
@@ -325,7 +325,12 @@ regrename_optimize ()
/* See whether it accepts all modes that occur in
definition and uses. */
for (tmp = this; tmp; tmp = tmp->next_use)
- if (! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc)))
+ if (! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc))
+ || (tmp->need_caller_save_reg
+ && ! (HARD_REGNO_CALL_PART_CLOBBERED
+ (reg, GET_MODE (*tmp->loc)))
+ && (HARD_REGNO_CALL_PART_CLOBBERED
+ (new_reg, GET_MODE (*tmp->loc)))))
break;
if (! tmp)
{
@@ -673,6 +678,7 @@ scan_rtx (insn, loc, class, action, type, earlyclobber)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
case CC0:
@@ -758,7 +764,7 @@ build_def_use (bb)
rtx note;
rtx old_operands[MAX_RECOG_OPERANDS];
rtx old_dups[MAX_DUP_OPERANDS];
- int i;
+ int i, icode;
int alt;
int predicated;
@@ -778,6 +784,7 @@ build_def_use (bb)
(6) For any write we find in an operand, make a new chain.
(7) For any REG_UNUSED, close any chains we just opened. */
+ icode = recog_memoized (insn);
extract_insn (insn);
constrain_operands (1);
preprocess_constraints ();
@@ -821,8 +828,16 @@ build_def_use (bb)
}
for (i = 0; i < recog_data.n_dups; i++)
{
+ int dup_num = recog_data.dup_num[i];
+
old_dups[i] = *recog_data.dup_loc[i];
*recog_data.dup_loc[i] = cc0_rtx;
+
+ /* For match_dup of match_operator or match_parallel, share
+ them, so that we don't miss changes in the dup. */
+ if (icode >= 0
+ && insn_data[icode].operand[dup_num].eliminable == 0)
+ old_dups[i] = recog_data.operand[dup_num];
}
scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_all_read,
@@ -1090,6 +1105,14 @@ kill_value (x, vd)
rtx x;
struct value_data *vd;
{
+ /* SUBREGS are supposed to have been eliminated by now. But some
+ ports, e.g. i386 sse, use them to smuggle vector type information
+ through to instruction selection. Each such SUBREG should simplify,
+ so if we get a NULL we've done something wrong elsewhere. */
+
+ if (GET_CODE (x) == SUBREG)
+ x = simplify_subreg (GET_MODE (x), SUBREG_REG (x),
+ GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
if (REG_P (x))
{
unsigned int regno = REGNO (x);
@@ -1173,10 +1196,11 @@ kill_set_value (x, set, data)
void *data;
{
struct value_data *vd = data;
- if (GET_CODE (set) != CLOBBER && REG_P (x))
+ if (GET_CODE (set) != CLOBBER)
{
kill_value (x, vd);
- set_value_regno (REGNO (x), GET_MODE (x), vd);
+ if (REG_P (x))
+ set_value_regno (REGNO (x), GET_MODE (x), vd);
}
}
diff --git a/contrib/gcc/reload1.c b/contrib/gcc/reload1.c
index 5211b5f..d67bd1e 100644
--- a/contrib/gcc/reload1.c
+++ b/contrib/gcc/reload1.c
@@ -41,6 +41,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "real.h"
#include "toplev.h"
#include "except.h"
+#include "tree.h"
/* This file contains the reload pass of the compiler, which is
run after register allocation has been done. It checks that
@@ -459,7 +460,7 @@ static void failed_reload PARAMS ((rtx, int));
static int set_reload_reg PARAMS ((int, int));
static void reload_cse_delete_noop_set PARAMS ((rtx, rtx));
static void reload_cse_simplify PARAMS ((rtx));
-static void fixup_abnormal_edges PARAMS ((void));
+void fixup_abnormal_edges PARAMS ((void));
extern void dump_needs PARAMS ((struct insn_chain *));
/* Initialize the reload pass once per compilation. */
@@ -790,7 +791,12 @@ reload (first, global)
i = REGNO (SET_DEST (set));
if (i > LAST_VIRTUAL_REGISTER)
{
- if (GET_CODE (x) == MEM)
+ /* It can happen that a REG_EQUIV note contains a MEM
+ that is not a legitimate memory operand. As later
+ stages of reload assume that all addresses found
+ in the reg_equiv_* arrays were originally legitimate,
+ we ignore such REG_EQUIV notes. */
+ if (memory_operand (x, VOIDmode))
{
/* Always unshare the equivalence, so we can
substitute into this insn without touching the
@@ -1278,6 +1284,11 @@ reload (first, global)
unused_insn_chains = 0;
fixup_abnormal_edges ();
+ /* Replacing pseudos with their memory equivalents might have
+ created shared rtx. Subsequent passes would get confused
+ by this, so unshare everything here. */
+ unshare_all_rtl_again (first);
+
return failure;
}
@@ -2057,10 +2068,19 @@ alter_reg (i, from_reg)
memory. If this is a shared MEM, make a copy. */
if (REGNO_DECL (i))
{
- if (from_reg != -1 && spill_stack_slot[from_reg] == x)
- x = copy_rtx (x);
+ rtx decl = DECL_RTL_IF_SET (REGNO_DECL (i));
+
+ /* We can do this only for the DECLs home pseudo, not for
+ any copies of it, since otherwise when the stack slot
+ is reused, nonoverlapping_memrefs_p might think they
+ cannot overlap. */
+ if (decl && GET_CODE (decl) == REG && REGNO (decl) == (unsigned) i)
+ {
+ if (from_reg != -1 && spill_stack_slot[from_reg] == x)
+ x = copy_rtx (x);
- set_mem_expr (x, REGNO_DECL (i));
+ set_mem_expr (x, REGNO_DECL (i));
+ }
}
/* Save the stack slot for later. */
@@ -2282,6 +2302,7 @@ eliminate_regs (x, mem_mode, insn)
{
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CONST:
case SYMBOL_REF:
case CODE_LABEL:
@@ -2552,7 +2573,7 @@ eliminate_regs (x, mem_mode, insn)
)
|| x_size == new_size)
)
- return adjust_address_nv (x, GET_MODE (x), SUBREG_BYTE (x));
+ return adjust_address_nv (new, GET_MODE (x), SUBREG_BYTE (x));
else
return gen_rtx_SUBREG (GET_MODE (x), new, SUBREG_BYTE (x));
}
@@ -2660,6 +2681,7 @@ elimination_effects (x, mem_mode)
{
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CONST:
case SYMBOL_REF:
case CODE_LABEL:
@@ -3749,6 +3771,7 @@ scan_paradoxical_subregs (x)
case SYMBOL_REF:
case LABEL_REF:
case CONST_DOUBLE:
+ case CONST_VECTOR: /* shouldn't happen, but just in case. */
case CC0:
case PC:
case USE:
@@ -5552,6 +5575,7 @@ choose_reload_regs (chain)
&& ! TEST_HARD_REG_BIT (reg_reloaded_dead, i))
/* Don't clobber the frame pointer. */
|| (i == HARD_FRAME_POINTER_REGNUM
+ && frame_pointer_needed
&& rld[r].out)
/* Don't really use the inherited spill reg
if we need it wider than we've got it. */
@@ -5722,7 +5746,9 @@ choose_reload_regs (chain)
/* If we found an equivalent reg, say no code need be generated
to load it, and use it as our reload reg. */
- if (equiv != 0 && regno != HARD_FRAME_POINTER_REGNUM)
+ if (equiv != 0
+ && (regno != HARD_FRAME_POINTER_REGNUM
+ || !frame_pointer_needed))
{
int nr = HARD_REGNO_NREGS (regno, rld[r].mode);
int k;
@@ -8011,6 +8037,7 @@ static void
reload_cse_delete_noop_set (insn, value)
rtx insn, value;
{
+ bool purge = BLOCK_FOR_INSN (insn)->end == insn;
if (value)
{
PATTERN (insn) = gen_rtx_USE (VOIDmode, value);
@@ -8019,6 +8046,8 @@ reload_cse_delete_noop_set (insn, value)
}
else
delete_insn (insn);
+ if (purge)
+ purge_dead_edges (BLOCK_FOR_INSN (insn));
}
/* See whether a single set SET is a noop. */
@@ -9457,7 +9486,7 @@ copy_eh_notes (insn, x)
proper call and fix the damage.
Similar handle instructions throwing exceptions internally. */
-static void
+void
fixup_abnormal_edges ()
{
int i;
@@ -9501,8 +9530,19 @@ fixup_abnormal_edges ()
next = NEXT_INSN (insn);
if (INSN_P (insn))
{
- insert_insn_on_edge (PATTERN (insn), e);
+ rtx seq;
+
delete_insn (insn);
+
+ /* We're not deleting it, we're moving it. */
+ INSN_DELETED_P (insn) = 0;
+
+ /* Emit a sequence, rather than scarfing the pattern, so
+ that we don't lose REG_NOTES etc. */
+ /* ??? Could copy the test from gen_sequence, but don't
+ think it's worth the bother. */
+ seq = gen_rtx_SEQUENCE (VOIDmode, gen_rtvec (1, insn));
+ insert_insn_on_edge (seq, e);
}
insn = next;
}
diff --git a/contrib/gcc/reorg.c b/contrib/gcc/reorg.c
index b1c33f5..659fc00 100644
--- a/contrib/gcc/reorg.c
+++ b/contrib/gcc/reorg.c
@@ -511,7 +511,8 @@ emit_delay_sequence (insn, list, length)
case REG_LABEL:
/* Keep the label reference count up to date. */
- LABEL_NUSES (XEXP (note, 0)) ++;
+ if (GET_CODE (XEXP (note, 0)) == CODE_LABEL)
+ LABEL_NUSES (XEXP (note, 0)) ++;
break;
default:
@@ -749,7 +750,8 @@ optimize_skip (insn)
|| GET_CODE (PATTERN (trial)) == SEQUENCE
|| recog_memoized (trial) < 0
|| (! eligible_for_annul_false (insn, 0, trial, flags)
- && ! eligible_for_annul_true (insn, 0, trial, flags)))
+ && ! eligible_for_annul_true (insn, 0, trial, flags))
+ || can_throw_internal (trial))
return 0;
/* There are two cases where we are just executing one insn (we assume
@@ -1085,9 +1087,14 @@ get_branch_condition (insn, target)
|| (GET_CODE (XEXP (src, 2)) == LABEL_REF
&& XEXP (XEXP (src, 2), 0) == target))
&& XEXP (src, 1) == pc_rtx)
- return gen_rtx_fmt_ee (reverse_condition (GET_CODE (XEXP (src, 0))),
- GET_MODE (XEXP (src, 0)),
- XEXP (XEXP (src, 0), 0), XEXP (XEXP (src, 0), 1));
+ {
+ enum rtx_code rev;
+ rev = reversed_comparison_code (XEXP (src, 0), insn);
+ if (rev != UNKNOWN)
+ return gen_rtx_fmt_ee (rev, GET_MODE (XEXP (src, 0)),
+ XEXP (XEXP (src, 0), 0),
+ XEXP (XEXP (src, 0), 1));
+ }
return 0;
}
@@ -2121,7 +2128,8 @@ fill_simple_delay_slots (non_jumps_p)
&& GET_CODE (trial) == JUMP_INSN
&& simplejump_p (trial)
&& eligible_for_delay (insn, slots_filled, trial, flags)
- && no_labels_between_p (insn, trial))
+ && no_labels_between_p (insn, trial)
+ && ! can_throw_internal (trial))
{
rtx *tmp;
slots_filled++;
@@ -2191,7 +2199,7 @@ fill_simple_delay_slots (non_jumps_p)
/* Can't separate set of cc0 from its use. */
&& ! (reg_mentioned_p (cc0_rtx, pat) && ! sets_cc0_p (pat))
#endif
- )
+ && ! can_throw_internal (trial))
{
trial = try_split (pat, trial, 1);
next_trial = prev_nonnote_insn (trial);
@@ -2267,7 +2275,7 @@ fill_simple_delay_slots (non_jumps_p)
Presumably, we should also check to see if we could get
back to this function via `setjmp'. */
- && !can_throw_internal (insn)
+ && ! can_throw_internal (insn)
&& (GET_CODE (insn) != JUMP_INSN
|| ((condjump_p (insn) || condjump_in_parallel_p (insn))
&& ! simplejump_p (insn)
@@ -2334,7 +2342,8 @@ fill_simple_delay_slots (non_jumps_p)
#endif
&& ! (maybe_never && may_trap_p (pat))
&& (trial = try_split (pat, trial, 0))
- && eligible_for_delay (insn, slots_filled, trial, flags))
+ && eligible_for_delay (insn, slots_filled, trial, flags)
+ && ! can_throw_internal(trial))
{
next_trial = next_nonnote_insn (trial);
delay_list = add_to_delay_list (trial, delay_list);
@@ -2386,7 +2395,8 @@ fill_simple_delay_slots (non_jumps_p)
#endif
&& ! (maybe_never && may_trap_p (PATTERN (next_trial)))
&& (next_trial = try_split (PATTERN (next_trial), next_trial, 0))
- && eligible_for_delay (insn, slots_filled, next_trial, flags))
+ && eligible_for_delay (insn, slots_filled, next_trial, flags)
+ && ! can_throw_internal (trial))
{
rtx new_label = next_active_insn (next_trial);
@@ -2490,7 +2500,7 @@ fill_simple_delay_slots (non_jumps_p)
/* Don't want to mess with cc0 here. */
&& ! reg_mentioned_p (cc0_rtx, pat)
#endif
- )
+ && ! can_throw_internal (trial))
{
trial = try_split (pat, trial, 1);
if (ELIGIBLE_FOR_EPILOGUE_DELAY (trial, slots_filled))
@@ -2631,7 +2641,7 @@ fill_slots_from_thread (insn, condition, thread, opposite_thread, likely,
&& ! (reg_mentioned_p (cc0_rtx, pat)
&& (! own_thread || ! sets_cc0_p (pat)))
#endif
- )
+ && ! can_throw_internal (trial))
{
rtx prior_insn;
@@ -2732,12 +2742,13 @@ fill_slots_from_thread (insn, condition, thread, opposite_thread, likely,
temporarily increment the use count on any referenced
label lest it be deleted by delete_related_insns. */
note = find_reg_note (trial, REG_LABEL, 0);
- if (note)
+ /* REG_LABEL could be NOTE_INSN_DELETED_LABEL too. */
+ if (note && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
LABEL_NUSES (XEXP (note, 0))++;
delete_related_insns (trial);
- if (note)
+ if (note && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
LABEL_NUSES (XEXP (note, 0))--;
}
else
@@ -2867,8 +2878,10 @@ fill_slots_from_thread (insn, condition, thread, opposite_thread, likely,
trial = new_thread;
pat = PATTERN (trial);
- if (GET_CODE (trial) != INSN || GET_CODE (pat) != SET
- || ! eligible_for_delay (insn, 0, trial, flags))
+ if (GET_CODE (trial) != INSN
+ || GET_CODE (pat) != SET
+ || ! eligible_for_delay (insn, 0, trial, flags)
+ || can_throw_internal (trial))
return 0;
dest = SET_DEST (pat), src = SET_SRC (pat);
@@ -3279,7 +3292,8 @@ relax_delay_slots (first)
insn, redirect the jump to the following insn process again. */
trial = next_active_insn (target_label);
if (trial && GET_CODE (PATTERN (trial)) != SEQUENCE
- && redundant_insn (trial, insn, 0))
+ && redundant_insn (trial, insn, 0)
+ && ! can_throw_internal (trial))
{
rtx tmp;
@@ -3684,10 +3698,6 @@ dbr_schedule (first, file)
/* It is not clear why the line below is needed, but it does seem to be. */
unfilled_firstobj = (rtx *) obstack_alloc (&unfilled_slots_obstack, 0);
- /* Reposition the prologue and epilogue notes in case we moved the
- prologue/epilogue insns. */
- reposition_prologue_and_epilogue_notes (first);
-
if (file)
{
int i, j, need_comma;
diff --git a/contrib/gcc/resource.c b/contrib/gcc/resource.c
index 5b19fe4..f306abb 100644
--- a/contrib/gcc/resource.c
+++ b/contrib/gcc/resource.c
@@ -212,6 +212,7 @@ mark_referenced_resources (x, res, include_delayed_effects)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case PC:
case SYMBOL_REF:
case LABEL_REF:
@@ -645,6 +646,7 @@ mark_set_resources (x, res, in_dest, mark_type)
case USE:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case LABEL_REF:
case SYMBOL_REF:
case CONST:
diff --git a/contrib/gcc/rtl.c b/contrib/gcc/rtl.c
index 7f4a4d5..c50201b 100644
--- a/contrib/gcc/rtl.c
+++ b/contrib/gcc/rtl.c
@@ -115,7 +115,7 @@ const char * const rtx_name[NUM_RTX_CODE] = {
/* Indexed by machine mode, gives the name of that machine mode.
This name does not include the letters "mode". */
-#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER) NAME,
+#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) NAME,
const char * const mode_name[NUM_MACHINE_MODES] = {
#include "machmode.def"
@@ -125,7 +125,7 @@ const char * const mode_name[NUM_MACHINE_MODES] = {
/* Indexed by machine mode, gives the class mode for GET_MODE_CLASS. */
-#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER) CLASS,
+#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) CLASS,
const enum mode_class mode_class[NUM_MACHINE_MODES] = {
#include "machmode.def"
@@ -136,7 +136,7 @@ const enum mode_class mode_class[NUM_MACHINE_MODES] = {
/* Indexed by machine mode, gives the length of the mode, in bits.
GET_MODE_BITSIZE uses this. */
-#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER) BITSIZE,
+#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) BITSIZE,
const unsigned short mode_bitsize[NUM_MACHINE_MODES] = {
#include "machmode.def"
@@ -147,7 +147,7 @@ const unsigned short mode_bitsize[NUM_MACHINE_MODES] = {
/* Indexed by machine mode, gives the length of the mode, in bytes.
GET_MODE_SIZE uses this. */
-#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER) SIZE,
+#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) SIZE,
const unsigned char mode_size[NUM_MACHINE_MODES] = {
#include "machmode.def"
@@ -158,7 +158,7 @@ const unsigned char mode_size[NUM_MACHINE_MODES] = {
/* Indexed by machine mode, gives the length of the mode's subunit.
GET_MODE_UNIT_SIZE uses this. */
-#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER) UNIT,
+#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) UNIT,
const unsigned char mode_unit_size[NUM_MACHINE_MODES] = {
#include "machmode.def" /* machine modes are documented here */
@@ -170,7 +170,7 @@ const unsigned char mode_unit_size[NUM_MACHINE_MODES] = {
(QI -> HI -> SI -> DI, etc.) Widening multiply instructions
use this. */
-#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER) \
+#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) \
(unsigned char) WIDER,
const unsigned char mode_wider_mode[NUM_MACHINE_MODES] = {
@@ -179,7 +179,7 @@ const unsigned char mode_wider_mode[NUM_MACHINE_MODES] = {
#undef DEF_MACHMODE
-#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER) \
+#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) \
((BITSIZE) >= HOST_BITS_PER_WIDE_INT) ? ~(unsigned HOST_WIDE_INT) 0 : ((unsigned HOST_WIDE_INT) 1 << (BITSIZE)) - 1,
/* Indexed by machine mode, gives mask of significant bits in mode. */
@@ -188,6 +188,17 @@ const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES] = {
#include "machmode.def"
};
+#undef DEF_MACHMODE
+
+#define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) INNER,
+
+/* Indexed by machine mode, gives the mode of the inner elements in a
+ vector type. */
+
+const enum machine_mode inner_mode_array[NUM_MACHINE_MODES] = {
+#include "machmode.def"
+};
+
/* Indexed by mode class, gives the narrowest mode for each class.
The Q modes are always of width 1 (2 for complex) - it is impossible
for any mode to be narrower.
@@ -346,6 +357,7 @@ copy_rtx (orig)
case QUEUED:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case CODE_LABEL:
case PC:
@@ -431,105 +443,6 @@ copy_rtx (orig)
return copy;
}
-/* Similar to `copy_rtx' except that if MAY_SHARE is present, it is
- placed in the result directly, rather than being copied. */
-
-rtx
-copy_most_rtx (orig, may_share)
- rtx orig;
- rtx may_share;
-{
- rtx copy;
- int i, j;
- RTX_CODE code;
- const char *format_ptr;
-
- if (orig == may_share)
- return orig;
-
- code = GET_CODE (orig);
-
- switch (code)
- {
- case REG:
- case QUEUED:
- case CONST_INT:
- case CONST_DOUBLE:
- case SYMBOL_REF:
- case CODE_LABEL:
- case PC:
- case CC0:
- return orig;
- default:
- break;
- }
-
- copy = rtx_alloc (code);
- PUT_MODE (copy, GET_MODE (orig));
- copy->in_struct = orig->in_struct;
- copy->volatil = orig->volatil;
- copy->unchanging = orig->unchanging;
- copy->integrated = orig->integrated;
- copy->frame_related = orig->frame_related;
-
- format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
-
- for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
- {
- switch (*format_ptr++)
- {
- case 'e':
- XEXP (copy, i) = XEXP (orig, i);
- if (XEXP (orig, i) != NULL && XEXP (orig, i) != may_share)
- XEXP (copy, i) = copy_most_rtx (XEXP (orig, i), may_share);
- break;
-
- case 'u':
- XEXP (copy, i) = XEXP (orig, i);
- break;
-
- case 'E':
- case 'V':
- XVEC (copy, i) = XVEC (orig, i);
- if (XVEC (orig, i) != NULL)
- {
- XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
- for (j = 0; j < XVECLEN (copy, i); j++)
- XVECEXP (copy, i, j)
- = copy_most_rtx (XVECEXP (orig, i, j), may_share);
- }
- break;
-
- case 'w':
- XWINT (copy, i) = XWINT (orig, i);
- break;
-
- case 'n':
- case 'i':
- XINT (copy, i) = XINT (orig, i);
- break;
-
- case 't':
- XTREE (copy, i) = XTREE (orig, i);
- break;
-
- case 's':
- case 'S':
- XSTR (copy, i) = XSTR (orig, i);
- break;
-
- case '0':
- /* Copy this through the wide int field; that's safest. */
- X0WINT (copy, i) = X0WINT (orig, i);
- break;
-
- default:
- abort ();
- }
- }
- return copy;
-}
-
/* Create a new copy of an rtx. Only copy just one level. */
rtx
@@ -560,7 +473,13 @@ unsigned int
get_mode_alignment (mode)
enum machine_mode mode;
{
- unsigned int alignment = GET_MODE_UNIT_SIZE (mode);
+ unsigned int alignment;
+
+ if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
+ || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
+ alignment = GET_MODE_UNIT_SIZE (mode);
+ else
+ alignment = GET_MODE_SIZE (mode);
/* Extract the LSB of the size. */
alignment = alignment & -alignment;
@@ -626,6 +545,7 @@ rtx_equal_p (x, y)
case SCRATCH:
case CONST_DOUBLE:
case CONST_INT:
+ case CONST_VECTOR:
return 0;
default:
diff --git a/contrib/gcc/rtl.def b/contrib/gcc/rtl.def
index fc12af2..8fad650 100644
--- a/contrib/gcc/rtl.def
+++ b/contrib/gcc/rtl.def
@@ -585,6 +585,9 @@ DEF_RTL_EXPR(CONST_INT, "const_int", "w", 'o')
there may be from 1 to 4; see rtl.c. */
DEF_RTL_EXPR(CONST_DOUBLE, "const_double", CONST_DOUBLE_FORMAT, 'o')
+/* Describes a vector constant. */
+DEF_RTL_EXPR(CONST_VECTOR, "const_vector", "E", 'x')
+
/* String constant. Used only for attributes right now. */
DEF_RTL_EXPR(CONST_STRING, "const_string", "s", 'o')
@@ -972,10 +975,6 @@ DEF_RTL_EXPR(VEC_SELECT, "vec_select", "ee", 'x')
combined and is the concatenation of the two source vectors. */
DEF_RTL_EXPR(VEC_CONCAT, "vec_concat", "ee", 'x')
-/* Describes a vector constant. Each part of the PARALLEL that is operand 0
- describes a constant for one of the subparts. */
-DEF_RTL_EXPR(VEC_CONST, "vec_const", "e", 'x')
-
/* Describes an operation that converts a small vector into a larger one by
duplicating the input values. The output vector mode must have the same
submodes as the input vector mode, and the number of output parts must be
diff --git a/contrib/gcc/rtl.h b/contrib/gcc/rtl.h
index ef4c5f8..b9a9f10 100644
--- a/contrib/gcc/rtl.h
+++ b/contrib/gcc/rtl.h
@@ -255,6 +255,7 @@ struct rtvec_def {
(GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \
|| GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE \
|| GET_CODE (X) == CONST || GET_CODE (X) == HIGH \
+ || GET_CODE (X) == CONST_VECTOR \
|| GET_CODE (X) == CONSTANT_P_RTX)
/* General accessor macros for accessing the fields of an rtx. */
@@ -823,6 +824,12 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
/* Link for chain of all CONST_DOUBLEs in use in current function. */
#define CONST_DOUBLE_CHAIN(r) XCEXP (r, 0, CONST_DOUBLE)
+/* For a CONST_VECTOR, return element #n. */
+#define CONST_VECTOR_ELT(RTX, N) XCVECEXP (RTX, 0, N, CONST_VECTOR)
+
+/* For a CONST_VECTOR, return the number of elements in a vector. */
+#define CONST_VECTOR_NUNITS(RTX) XCVECLEN (RTX, 0, CONST_VECTOR)
+
/* For a SUBREG rtx, SUBREG_REG extracts the value we want a subreg of.
SUBREG_BYTE extracts the byte-number. */
@@ -1294,6 +1301,7 @@ extern rtx force_const_mem PARAMS ((enum machine_mode, rtx));
/* In varasm.c */
extern rtx get_pool_constant PARAMS ((rtx));
+extern rtx get_pool_constant_mark PARAMS ((rtx, bool *));
extern enum machine_mode get_pool_mode PARAMS ((rtx));
extern rtx get_pool_constant_for_function PARAMS ((struct function *, rtx));
extern enum machine_mode get_pool_mode_for_function PARAMS ((struct function *, rtx));
@@ -1482,6 +1490,7 @@ extern rtx find_reg_equal_equiv_note PARAMS ((rtx));
extern int find_reg_fusage PARAMS ((rtx, enum rtx_code, rtx));
extern int find_regno_fusage PARAMS ((rtx, enum rtx_code,
unsigned int));
+extern int pure_call_p PARAMS ((rtx));
extern void remove_note PARAMS ((rtx, rtx));
extern int side_effects_p PARAMS ((rtx));
extern int volatile_refs_p PARAMS ((rtx));
@@ -1808,7 +1817,7 @@ extern enum rtx_code reversed_comparison_code_parts PARAMS ((enum rtx_code,
rtx, rtx, rtx));
extern void delete_for_peephole PARAMS ((rtx, rtx));
extern int condjump_in_parallel_p PARAMS ((rtx));
-extern void never_reached_warning PARAMS ((rtx));
+extern void never_reached_warning PARAMS ((rtx, rtx));
extern void purge_line_number_notes PARAMS ((rtx));
extern void copy_loop_headers PARAMS ((rtx));
diff --git a/contrib/gcc/rtlanal.c b/contrib/gcc/rtlanal.c
index f185c61..d6efc74 100644
--- a/contrib/gcc/rtlanal.c
+++ b/contrib/gcc/rtlanal.c
@@ -64,6 +64,7 @@ rtx_unstable_p (x)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
return 0;
@@ -139,6 +140,7 @@ rtx_varies_p (x, for_alias)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
return 0;
@@ -502,6 +504,7 @@ count_occurrences (x, find, count_dest)
case REG:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case CODE_LABEL:
case PC:
@@ -580,7 +583,8 @@ reg_mentioned_p (reg, in)
case CONST_INT:
return GET_CODE (reg) == CONST_INT && INTVAL (in) == INTVAL (reg);
-
+
+ case CONST_VECTOR:
case CONST_DOUBLE:
/* These are kept unique for a given value. */
return 0;
@@ -829,6 +833,7 @@ regs_set_between_p (x, start, end)
{
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CONST:
case SYMBOL_REF:
case LABEL_REF:
@@ -875,6 +880,7 @@ modified_between_p (x, start, end)
{
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CONST:
case SYMBOL_REF:
case LABEL_REF:
@@ -930,6 +936,7 @@ modified_in_p (x, insn)
{
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CONST:
case SYMBOL_REF:
case LABEL_REF:
@@ -1535,17 +1542,12 @@ note_stores (x, fun, data)
dest = XEXP (dest, 0);
/* If we have a PARALLEL, SET_DEST is a list of EXPR_LIST expressions,
- each of whose first operand is a register. We can't know what
- precisely is being set in these cases, so make up a CLOBBER to pass
- to the function. */
+ each of whose first operand is a register. */
if (GET_CODE (dest) == PARALLEL)
{
for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
if (XEXP (XVECEXP (dest, 0, i), 0) != 0)
- (*fun) (XEXP (XVECEXP (dest, 0, i), 0),
- gen_rtx_CLOBBER (VOIDmode,
- XEXP (XVECEXP (dest, 0, i), 0)),
- data);
+ (*fun) (XEXP (XVECEXP (dest, 0, i), 0), x, data);
}
else
(*fun) (dest, x, data);
@@ -1924,6 +1926,31 @@ find_regno_fusage (insn, code, regno)
return 0;
}
+
+/* Return true if INSN is a call to a pure function. */
+
+int
+pure_call_p (insn)
+ rtx insn;
+{
+ rtx link;
+
+ if (GET_CODE (insn) != CALL_INSN || ! CONST_OR_PURE_CALL_P (insn))
+ return 0;
+
+ /* Look for the note that differentiates const and pure functions. */
+ for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
+ {
+ rtx u, m;
+
+ if (GET_CODE (u = XEXP (link, 0)) == USE
+ && GET_CODE (m = XEXP (u, 0)) == MEM && GET_MODE (m) == BLKmode
+ && GET_CODE (XEXP (m, 0)) == SCRATCH)
+ return 1;
+ }
+
+ return 0;
+}
/* Remove register note NOTE from the REG_NOTES of INSN. */
@@ -2021,6 +2048,7 @@ volatile_insn_p (x)
case CONST_INT:
case CONST:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CC0:
case PC:
case REG:
@@ -2087,6 +2115,7 @@ volatile_refs_p (x)
case CONST_INT:
case CONST:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CC0:
case PC:
case REG:
@@ -2153,6 +2182,7 @@ side_effects_p (x)
case CONST_INT:
case CONST:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CC0:
case PC:
case REG:
@@ -2231,6 +2261,7 @@ may_trap_p (x)
/* Handle these cases quickly. */
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case LABEL_REF:
case CONST:
@@ -2339,6 +2370,7 @@ inequality_comparisons_p (x)
case CC0:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CONST:
case LABEL_REF:
case SYMBOL_REF:
@@ -2405,6 +2437,40 @@ replace_rtx (x, from, to)
if (x == 0)
return 0;
+ if (GET_CODE (x) == SUBREG)
+ {
+ rtx new = replace_rtx (SUBREG_REG (x), from, to);
+
+ if (GET_CODE (new) == CONST_INT)
+ {
+ x = simplify_subreg (GET_MODE (x), new,
+ GET_MODE (SUBREG_REG (x)),
+ SUBREG_BYTE (x));
+ if (! x)
+ abort ();
+ }
+ else
+ SUBREG_REG (x) = new;
+
+ return x;
+ }
+ else if (GET_CODE (x) == ZERO_EXTEND)
+ {
+ rtx new = replace_rtx (XEXP (x, 0), from, to);
+
+ if (GET_CODE (new) == CONST_INT)
+ {
+ x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
+ new, GET_MODE (XEXP (x, 0)));
+ if (! x)
+ abort ();
+ }
+ else
+ XEXP (x, 0) = new;
+
+ return x;
+ }
+
fmt = GET_RTX_FORMAT (GET_CODE (x));
for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
{
@@ -2452,6 +2518,7 @@ replace_regs (x, reg_map, nregs, replace_dest)
case CC0:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case CONST:
case SYMBOL_REF:
case LABEL_REF:
@@ -2542,6 +2609,7 @@ computed_jump_p_1 (x)
case CONST:
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case REG:
return 1;
diff --git a/contrib/gcc/sched-deps.c b/contrib/gcc/sched-deps.c
index 9f20aad..5fb23b7 100644
--- a/contrib/gcc/sched-deps.c
+++ b/contrib/gcc/sched-deps.c
@@ -723,6 +723,7 @@ sched_analyze_2 (deps, x, insn)
{
case CONST_INT:
case CONST_DOUBLE:
+ case CONST_VECTOR:
case SYMBOL_REF:
case CONST:
case LABEL_REF:
diff --git a/contrib/gcc/sched-int.h b/contrib/gcc/sched-int.h
index 47910a0..f5a8808 100644
--- a/contrib/gcc/sched-int.h
+++ b/contrib/gcc/sched-int.h
@@ -294,6 +294,7 @@ extern void rm_other_notes PARAMS ((rtx, rtx));
extern int insn_issue_delay PARAMS ((rtx));
extern int set_priorities PARAMS ((rtx, rtx));
+extern rtx sched_emit_insn PARAMS ((rtx));
extern void schedule_block PARAMS ((int, int));
extern void sched_init PARAMS ((FILE *));
extern void sched_finish PARAMS ((void));
diff --git a/contrib/gcc/sched-rgn.c b/contrib/gcc/sched-rgn.c
index e5a241b..ab65e2c 100644
--- a/contrib/gcc/sched-rgn.c
+++ b/contrib/gcc/sched-rgn.c
@@ -294,6 +294,8 @@ static int haifa_classify_insn PARAMS ((rtx));
static int is_prisky PARAMS ((rtx, int, int));
static int is_exception_free PARAMS ((rtx, int, int));
+static bool sets_likely_spilled PARAMS ((rtx));
+static void sets_likely_spilled_1 PARAMS ((rtx, rtx, void *));
static void add_branch_dependences PARAMS ((rtx, rtx));
static void compute_block_backward_dependences PARAMS ((int));
void debug_dependencies PARAMS ((void));
@@ -337,7 +339,7 @@ is_cfg_nonregular ()
/* If we have exception handlers, then we consider the cfg not well
structured. ?!? We should be able to handle this now that flow.c
computes an accurate cfg for EH. */
- if (exception_handler_labels)
+ if (current_function_has_exception_handlers ())
return 1;
/* If we have non-jumping insns which refer to labels, then we consider
@@ -2268,6 +2270,31 @@ static struct sched_info region_sched_info =
0, 0
};
+/* Determine if PAT sets a CLASS_LIKELY_SPILLED_P register. */
+
+static bool
+sets_likely_spilled (pat)
+ rtx pat;
+{
+ bool ret = false;
+ note_stores (pat, sets_likely_spilled_1, &ret);
+ return ret;
+}
+
+static void
+sets_likely_spilled_1 (x, pat, data)
+ rtx x, pat;
+ void *data;
+{
+ bool *ret = (bool *) data;
+
+ if (GET_CODE (pat) == SET
+ && REG_P (x)
+ && REGNO (x) < FIRST_PSEUDO_REGISTER
+ && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (x))))
+ *ret = true;
+}
+
/* Add dependences so that branches are scheduled to run last in their
block. */
@@ -2277,15 +2304,22 @@ add_branch_dependences (head, tail)
{
rtx insn, last;
- /* For all branches, calls, uses, clobbers, and cc0 setters, force them
- to remain in order at the end of the block by adding dependencies and
- giving the last a high priority. There may be notes present, and
- prev_head may also be a note.
+ /* For all branches, calls, uses, clobbers, cc0 setters, and instructions
+ that can throw exceptions, force them to remain in order at the end of
+ the block by adding dependencies and giving the last a high priority.
+ There may be notes present, and prev_head may also be a note.
Branches must obviously remain at the end. Calls should remain at the
end since moving them results in worse register allocation. Uses remain
- at the end to ensure proper register allocation. cc0 setters remaim
- at the end because they can't be moved away from their cc0 user. */
+ at the end to ensure proper register allocation.
+
+ cc0 setters remaim at the end because they can't be moved away from
+ their cc0 user.
+
+ Insns setting CLASS_LIKELY_SPILLED_P registers (usually return values)
+ are not moved before reload because we can wind up with register
+ allocation failures. */
+
insn = tail;
last = 0;
while (GET_CODE (insn) == CALL_INSN
@@ -2293,10 +2327,12 @@ add_branch_dependences (head, tail)
|| (GET_CODE (insn) == INSN
&& (GET_CODE (PATTERN (insn)) == USE
|| GET_CODE (PATTERN (insn)) == CLOBBER
+ || can_throw_internal (insn)
#ifdef HAVE_cc0
|| sets_cc0_p (PATTERN (insn))
#endif
- ))
+ || (!reload_completed
+ && sets_likely_spilled (PATTERN (insn)))))
|| GET_CODE (insn) == NOTE)
{
if (GET_CODE (insn) != NOTE)
diff --git a/contrib/gcc/sibcall.c b/contrib/gcc/sibcall.c
index 6c2dc5c..6e753fa 100644
--- a/contrib/gcc/sibcall.c
+++ b/contrib/gcc/sibcall.c
@@ -31,6 +31,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "basic-block.h"
#include "output.h"
#include "except.h"
+#include "tree.h"
/* In case alternate_exit_block contains copy from pseudo, to return value,
record the pseudo here. In such case the pseudo must be set to function
@@ -572,7 +573,7 @@ optimize_sibling_and_tail_recursive_calls ()
{
rtx insn, insns;
basic_block alternate_exit = EXIT_BLOCK_PTR;
- int current_function_uses_addressof;
+ bool no_sibcalls_this_function = false;
int successful_sibling_call = 0;
int replaced_call_placeholder = 0;
edge e;
@@ -595,6 +596,12 @@ optimize_sibling_and_tail_recursive_calls ()
if (n_basic_blocks == 0)
return;
+ /* If we are using sjlj exceptions, we may need to add a call to
+ _Unwind_SjLj_Unregister at exit of the function. Which means
+ that we cannot do any sibcall transformations. */
+ if (USING_SJLJ_EXCEPTIONS && current_function_has_exception_handlers ())
+ no_sibcalls_this_function = true;
+
return_value_pseudo = NULL_RTX;
/* Find the exit block.
@@ -655,7 +662,7 @@ optimize_sibling_and_tail_recursive_calls ()
/* If the function uses ADDRESSOF, we can't (easily) determine
at this point if the value will end up on the stack. */
- current_function_uses_addressof = sequence_uses_addressof (insns);
+ no_sibcalls_this_function |= sequence_uses_addressof (insns);
/* Walk the insn chain and find any CALL_PLACEHOLDER insns. We need to
select one of the insn sequences attached to each CALL_PLACEHOLDER.
@@ -685,11 +692,10 @@ optimize_sibling_and_tail_recursive_calls ()
/* See if there are any reasons we can't perform either sibling or
tail call optimizations. We must be careful with stack slots
- which are live at potential optimization sites. ??? The first
- test is overly conservative and should be replaced. */
- if (frame_offset
- /* Can't take address of local var if used by recursive call. */
- || current_function_uses_addressof
+ which are live at potential optimization sites. */
+ if (no_sibcalls_this_function
+ /* ??? Overly conservative. */
+ || frame_offset
/* Any function that calls setjmp might have longjmp called from
any called function. ??? We really should represent this
properly in the CFG so that this needn't be special cased. */
@@ -725,6 +731,7 @@ optimize_sibling_and_tail_recursive_calls ()
if (successful_sibling_call)
{
rtx insn;
+ tree arg;
/* A sibling call sequence invalidates any REG_EQUIV notes made for
this function's incoming arguments.
@@ -749,6 +756,16 @@ optimize_sibling_and_tail_recursive_calls ()
if (INSN_P (insn))
purge_mem_unchanging_flag (PATTERN (insn));
}
+
+ /* Similarly, invalidate RTX_UNCHANGING_P for any incoming
+ arguments passed in registers. */
+ for (arg = DECL_ARGUMENTS (current_function_decl);
+ arg;
+ arg = TREE_CHAIN (arg))
+ {
+ if (REG_P (DECL_RTL (arg)))
+ RTX_UNCHANGING_P (DECL_RTL (arg)) = false;
+ }
}
/* There may have been NOTE_INSN_BLOCK_{BEGIN,END} notes in the
diff --git a/contrib/gcc/simplify-rtx.c b/contrib/gcc/simplify-rtx.c
index 2db3ec0..2896041 100644
--- a/contrib/gcc/simplify-rtx.c
+++ b/contrib/gcc/simplify-rtx.c
@@ -99,7 +99,8 @@ static rtx neg_const_int PARAMS ((enum machine_mode, rtx));
static int simplify_plus_minus_op_data_cmp PARAMS ((const void *,
const void *));
static rtx simplify_plus_minus PARAMS ((enum rtx_code,
- enum machine_mode, rtx, rtx));
+ enum machine_mode, rtx,
+ rtx, int));
static void check_fold_consts PARAMS ((PTR));
#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
static void simplify_unary_real PARAMS ((PTR));
@@ -137,23 +138,20 @@ simplify_gen_binary (code, mode, op0, op1)
/* If this simplifies, do it. */
tem = simplify_binary_operation (code, mode, op0, op1);
-
if (tem)
return tem;
- /* Handle addition and subtraction of CONST_INT specially. Otherwise,
- just form the operation. */
+ /* Handle addition and subtraction specially. Otherwise, just form
+ the operation. */
- if (GET_CODE (op1) == CONST_INT
- && GET_MODE (op0) != VOIDmode
- && (code == PLUS || code == MINUS))
+ if (code == PLUS || code == MINUS)
{
- if (code == MINUS)
- op1 = neg_const_int (mode, op1);
- return plus_constant (op0, INTVAL (op1));
+ tem = simplify_plus_minus (code, mode, op0, op1, 1);
+ if (tem)
+ return tem;
}
- else
- return gen_rtx_fmt_ee (code, mode, op0, op1);
+
+ return gen_rtx_fmt_ee (code, mode, op0, op1);
}
/* If X is a MEM referencing the constant pool, return the real value.
@@ -528,8 +526,10 @@ simplify_unary_operation (code, mode, op, op_mode)
break;
case ZERO_EXTEND:
+ /* When zero-extending a CONST_INT, we need to know its
+ original mode. */
if (op_mode == VOIDmode)
- op_mode = mode;
+ abort ();
if (GET_MODE_BITSIZE (op_mode) == HOST_BITS_PER_WIDE_INT)
{
/* If we were really extending the mode,
@@ -587,7 +587,8 @@ simplify_unary_operation (code, mode, op, op_mode)
/* We can do some operations on integer CONST_DOUBLEs. Also allow
for a DImode operation on a CONST_INT. */
- else if (GET_MODE (trueop) == VOIDmode && width <= HOST_BITS_PER_INT * 2
+ else if (GET_MODE (trueop) == VOIDmode
+ && width <= HOST_BITS_PER_WIDE_INT * 2
&& (GET_CODE (trueop) == CONST_DOUBLE
|| GET_CODE (trueop) == CONST_INT))
{
@@ -631,8 +632,10 @@ simplify_unary_operation (code, mode, op, op_mode)
break;
case ZERO_EXTEND:
- if (op_mode == VOIDmode
- || GET_MODE_BITSIZE (op_mode) > HOST_BITS_PER_WIDE_INT)
+ if (op_mode == VOIDmode)
+ abort ();
+
+ if (GET_MODE_BITSIZE (op_mode) > HOST_BITS_PER_WIDE_INT)
return 0;
hv = 0;
@@ -1147,7 +1150,7 @@ simplify_binary_operation (code, mode, op0, op1)
&& GET_CODE (XEXP (op0, 0)) == PLUS)
|| (GET_CODE (op1) == CONST
&& GET_CODE (XEXP (op1, 0)) == PLUS))
- && (tem = simplify_plus_minus (code, mode, op0, op1)) != 0)
+ && (tem = simplify_plus_minus (code, mode, op0, op1, 0)) != 0)
return tem;
break;
@@ -1284,7 +1287,7 @@ simplify_binary_operation (code, mode, op0, op1)
&& GET_CODE (XEXP (op0, 0)) == PLUS)
|| (GET_CODE (op1) == CONST
&& GET_CODE (XEXP (op1, 0)) == PLUS))
- && (tem = simplify_plus_minus (code, mode, op0, op1)) != 0)
+ && (tem = simplify_plus_minus (code, mode, op0, op1, 0)) != 0)
return tem;
/* Don't let a relocatable value get a negative coeff. */
@@ -1723,7 +1726,12 @@ simplify_binary_operation (code, mode, op0, op1)
Rather than test for specific case, we do this by a brute-force method
and do all possible simplifications until no more changes occur. Then
- we rebuild the operation. */
+ we rebuild the operation.
+
+ If FORCE is true, then always generate the rtx. This is used to
+ canonicalize stuff emitted from simplify_gen_binary. Note that this
+ can still fail if the rtx is too complex. It won't fail just because
+ the result is not 'simpler' than the input, however. */
struct simplify_plus_minus_op_data
{
@@ -1744,10 +1752,11 @@ simplify_plus_minus_op_data_cmp (p1, p2)
}
static rtx
-simplify_plus_minus (code, mode, op0, op1)
+simplify_plus_minus (code, mode, op0, op1, force)
enum rtx_code code;
enum machine_mode mode;
rtx op0, op1;
+ int force;
{
struct simplify_plus_minus_op_data ops[8];
rtx result, tem;
@@ -1781,7 +1790,7 @@ simplify_plus_minus (code, mode, op0, op1)
case PLUS:
case MINUS:
if (n_ops == 7)
- return 0;
+ return NULL_RTX;
ops[n_ops].op = XEXP (this_op, 1);
ops[n_ops].neg = (this_code == MINUS) ^ this_neg;
@@ -1799,9 +1808,18 @@ simplify_plus_minus (code, mode, op0, op1)
break;
case CONST:
- ops[i].op = XEXP (this_op, 0);
- input_consts++;
- changed = 1;
+ if (n_ops < 7
+ && GET_CODE (XEXP (this_op, 0)) == PLUS
+ && CONSTANT_P (XEXP (XEXP (this_op, 0), 0))
+ && CONSTANT_P (XEXP (XEXP (this_op, 0), 1)))
+ {
+ ops[i].op = XEXP (XEXP (this_op, 0), 0);
+ ops[n_ops].op = XEXP (XEXP (this_op, 0), 1);
+ ops[n_ops].neg = this_neg;
+ n_ops++;
+ input_consts++;
+ changed = 1;
+ }
break;
case NOT:
@@ -1833,9 +1851,14 @@ simplify_plus_minus (code, mode, op0, op1)
while (changed);
/* If we only have two operands, we can't do anything. */
- if (n_ops <= 2)
+ if (n_ops <= 2 && !force)
return NULL_RTX;
+ /* Count the number of CONSTs we didn't split above. */
+ for (i = 0; i < n_ops; i++)
+ if (GET_CODE (ops[i].op) == CONST)
+ input_consts++;
+
/* Now simplify each pair of operands until nothing changes. The first
time through just simplify constants against each other. */
@@ -1936,8 +1959,9 @@ simplify_plus_minus (code, mode, op0, op1)
sure we count a CONST as two operands. If we have the same
number of operands, but have made more CONSTs than before, this
is also an improvement, so accept it. */
- if (n_ops + n_consts > input_ops
- || (n_ops + n_consts == input_ops && n_consts <= input_consts))
+ if (!force
+ && (n_ops + n_consts > input_ops
+ || (n_ops + n_consts == input_ops && n_consts <= input_consts)))
return NULL_RTX;
/* Put a non-negated operand first. If there aren't any, make all
diff --git a/contrib/gcc/splay-tree.c b/contrib/gcc/splay-tree.c
index b6bb5a6..7999447 100644
--- a/contrib/gcc/splay-tree.c
+++ b/contrib/gcc/splay-tree.c
@@ -1,5 +1,5 @@
/* A splay-tree datatype.
- Copyright (C) 1998 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
Contributed by Mark Mitchell (mark@markmitchell.com).
This file is part of GNU CC.
@@ -32,6 +32,8 @@ Boston, MA 02111-1307, USA. */
#include <stdlib.h>
#endif
+#include <stdio.h>
+
#include "libiberty.h"
#include "splay-tree.h"
@@ -68,7 +70,7 @@ splay_tree_delete_helper (sp, node)
if (sp->delete_value)
(*sp->delete_value)(node->value);
- free ((char*) node);
+ (*sp->deallocate) ((char*) node, sp->allocate_data);
}
/* Help splay SP around KEY. PARENT and GRANDPARENT are the parent
@@ -225,9 +227,29 @@ splay_tree_foreach_helper (sp, node, fn, data)
return splay_tree_foreach_helper (sp, node->right, fn, data);
}
+
+/* An allocator and deallocator based on xmalloc. */
+static void *
+splay_tree_xmalloc_allocate (size, data)
+ int size;
+ void *data ATTRIBUTE_UNUSED;
+{
+ return xmalloc (size);
+}
+
+static void
+splay_tree_xmalloc_deallocate (object, data)
+ void *object;
+ void *data ATTRIBUTE_UNUSED;
+{
+ free (object);
+}
+
+
/* Allocate a new splay tree, using COMPARE_FN to compare nodes,
DELETE_KEY_FN to deallocate keys, and DELETE_VALUE_FN to deallocate
- values. */
+ values. Use xmalloc to allocate the splay tree structure, and any
+ nodes added. */
splay_tree
splay_tree_new (compare_fn, delete_key_fn, delete_value_fn)
@@ -235,11 +257,35 @@ splay_tree_new (compare_fn, delete_key_fn, delete_value_fn)
splay_tree_delete_key_fn delete_key_fn;
splay_tree_delete_value_fn delete_value_fn;
{
- splay_tree sp = (splay_tree) xmalloc (sizeof (struct splay_tree));
+ return (splay_tree_new_with_allocator
+ (compare_fn, delete_key_fn, delete_value_fn,
+ splay_tree_xmalloc_allocate, splay_tree_xmalloc_deallocate, 0));
+}
+
+
+/* Allocate a new splay tree, using COMPARE_FN to compare nodes,
+ DELETE_KEY_FN to deallocate keys, and DELETE_VALUE_FN to deallocate
+ values. */
+
+splay_tree
+splay_tree_new_with_allocator (compare_fn, delete_key_fn, delete_value_fn,
+ allocate_fn, deallocate_fn, allocate_data)
+ splay_tree_compare_fn compare_fn;
+ splay_tree_delete_key_fn delete_key_fn;
+ splay_tree_delete_value_fn delete_value_fn;
+ splay_tree_allocate_fn allocate_fn;
+ splay_tree_deallocate_fn deallocate_fn;
+ void *allocate_data;
+{
+ splay_tree sp = (splay_tree) (*allocate_fn) (sizeof (struct splay_tree_s),
+ allocate_data);
sp->root = 0;
sp->comp = compare_fn;
sp->delete_key = delete_key_fn;
sp->delete_value = delete_value_fn;
+ sp->allocate = allocate_fn;
+ sp->deallocate = deallocate_fn;
+ sp->allocate_data = allocate_data;
return sp;
}
@@ -251,20 +297,20 @@ splay_tree_delete (sp)
splay_tree sp;
{
splay_tree_delete_helper (sp, sp->root);
- free ((char*) sp);
+ (*sp->deallocate) ((char*) sp, sp->allocate_data);
}
/* Insert a new node (associating KEY with DATA) into SP. If a
previous node with the indicated KEY exists, its data is replaced
- with the new value. */
+ with the new value. Returns the new node. */
-void
+splay_tree_node
splay_tree_insert (sp, key, value)
splay_tree sp;
splay_tree_key key;
splay_tree_value value;
{
- int comparison;
+ int comparison = 0;
splay_tree_splay (sp, key);
@@ -284,7 +330,9 @@ splay_tree_insert (sp, key, value)
/* Create a new node, and insert it at the root. */
splay_tree_node node;
- node = (splay_tree_node) xmalloc (sizeof (struct splay_tree_node));
+ node = ((splay_tree_node)
+ (*sp->allocate) (sizeof (struct splay_tree_node_s),
+ sp->allocate_data));
node->key = key;
node->value = value;
@@ -303,8 +351,51 @@ splay_tree_insert (sp, key, value)
node->right->left = 0;
}
- sp->root = node;
- }
+ sp->root = node;
+ }
+
+ return sp->root;
+}
+
+/* Remove KEY from SP. It is not an error if it did not exist. */
+
+void
+splay_tree_remove (sp, key)
+ splay_tree sp;
+ splay_tree_key key;
+{
+ splay_tree_splay (sp, key);
+
+ if (sp->root && (*sp->comp) (sp->root->key, key) == 0)
+ {
+ splay_tree_node left, right;
+
+ left = sp->root->left;
+ right = sp->root->right;
+
+ /* Delete the root node itself. */
+ if (sp->delete_value)
+ (*sp->delete_value) (sp->root->value);
+ (*sp->deallocate) (sp->root, sp->allocate_data);
+
+ /* One of the children is now the root. Doesn't matter much
+ which, so long as we preserve the properties of the tree. */
+ if (left)
+ {
+ sp->root = left;
+
+ /* If there was a right child as well, hang it off the
+ right-most leaf of the left child. */
+ if (right)
+ {
+ while (left->right)
+ left = left->right;
+ left->right = right;
+ }
+ }
+ else
+ sp->root = right;
+ }
}
/* Lookup KEY in SP, returning VALUE if present, and NULL
@@ -323,6 +414,106 @@ splay_tree_lookup (sp, key)
return 0;
}
+/* Return the node in SP with the greatest key. */
+
+splay_tree_node
+splay_tree_max (sp)
+ splay_tree sp;
+{
+ splay_tree_node n = sp->root;
+
+ if (!n)
+ return NULL;
+
+ while (n->right)
+ n = n->right;
+
+ return n;
+}
+
+/* Return the node in SP with the smallest key. */
+
+splay_tree_node
+splay_tree_min (sp)
+ splay_tree sp;
+{
+ splay_tree_node n = sp->root;
+
+ if (!n)
+ return NULL;
+
+ while (n->left)
+ n = n->left;
+
+ return n;
+}
+
+/* Return the immediate predecessor KEY, or NULL if there is no
+ predecessor. KEY need not be present in the tree. */
+
+splay_tree_node
+splay_tree_predecessor (sp, key)
+ splay_tree sp;
+ splay_tree_key key;
+{
+ int comparison;
+ splay_tree_node node;
+
+ /* If the tree is empty, there is certainly no predecessor. */
+ if (!sp->root)
+ return NULL;
+
+ /* Splay the tree around KEY. That will leave either the KEY
+ itself, its predecessor, or its successor at the root. */
+ splay_tree_splay (sp, key);
+ comparison = (*sp->comp)(sp->root->key, key);
+
+ /* If the predecessor is at the root, just return it. */
+ if (comparison < 0)
+ return sp->root;
+
+ /* Otherwise, find the leftmost element of the right subtree. */
+ node = sp->root->left;
+ if (node)
+ while (node->right)
+ node = node->right;
+
+ return node;
+}
+
+/* Return the immediate successor KEY, or NULL if there is no
+ predecessor. KEY need not be present in the tree. */
+
+splay_tree_node
+splay_tree_successor (sp, key)
+ splay_tree sp;
+ splay_tree_key key;
+{
+ int comparison;
+ splay_tree_node node;
+
+ /* If the tree is empty, there is certainly no predecessor. */
+ if (!sp->root)
+ return NULL;
+
+ /* Splay the tree around KEY. That will leave either the KEY
+ itself, its predecessor, or its successor at the root. */
+ splay_tree_splay (sp, key);
+ comparison = (*sp->comp)(sp->root->key, key);
+
+ /* If the successor is at the root, just return it. */
+ if (comparison > 0)
+ return sp->root;
+
+ /* Otherwise, find the rightmost element of the left subtree. */
+ node = sp->root->right;
+ if (node)
+ while (node->left)
+ node = node->left;
+
+ return node;
+}
+
/* Call FN, passing it the DATA, for every node in SP, following an
in-order traversal. If FN every returns a non-zero value, the
iteration ceases immediately, and the value is returned.
diff --git a/contrib/gcc/splay-tree.h b/contrib/gcc/splay-tree.h
index e828fe7..4b7a7bf 100644
--- a/contrib/gcc/splay-tree.h
+++ b/contrib/gcc/splay-tree.h
@@ -1,21 +1,21 @@
/* A splay-tree datatype.
- Copyright (C) 1998 Free Software Foundation, Inc.
+ Copyright 1998, 1999, 2000 Free Software Foundation, Inc.
Contributed by Mark Mitchell (mark@markmitchell.com).
-This file is part of GNU CC.
+This file is part of GCC.
-GNU CC is free software; you can redistribute it and/or modify it
+GCC is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
-GNU CC is distributed in the hope that it will be useful, but
+GCC is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
+along with GCC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
@@ -44,7 +44,7 @@ typedef unsigned long int splay_tree_key;
typedef unsigned long int splay_tree_value;
/* Forward declaration for a node in the tree. */
-typedef struct splay_tree_node *splay_tree_node;
+typedef struct splay_tree_node_s *splay_tree_node;
/* The type of a function which compares two splay-tree keys. The
function should return values as for qsort. */
@@ -61,8 +61,20 @@ typedef void (*splay_tree_delete_value_fn) PARAMS((splay_tree_value));
/* The type of a function used to iterate over the tree. */
typedef int (*splay_tree_foreach_fn) PARAMS((splay_tree_node, void*));
+/* The type of a function used to allocate memory for tree root and
+ node structures. The first argument is the number of bytes needed;
+ the second is a data pointer the splay tree functions pass through
+ to the allocator. This function must never return zero. */
+typedef void *(*splay_tree_allocate_fn) PARAMS((int, void *));
+
+/* The type of a function used to free memory allocated using the
+ corresponding splay_tree_allocate_fn. The first argument is the
+ memory to be freed; the latter is a data pointer the splay tree
+ functions pass through to the freer. */
+typedef void (*splay_tree_deallocate_fn) PARAMS((void *, void *));
+
/* The nodes in the splay tree. */
-struct splay_tree_node
+struct splay_tree_node_s
{
/* The key. */
splay_tree_key key;
@@ -76,7 +88,7 @@ struct splay_tree_node
};
/* The splay tree itself. */
-typedef struct splay_tree
+typedef struct splay_tree_s
{
/* The root of the tree. */
splay_tree_node root;
@@ -89,18 +101,44 @@ typedef struct splay_tree
/* The deallocate-value function. NULL if no cleanup is necessary. */
splay_tree_delete_value_fn delete_value;
+
+ /* Allocate/free functions, and a data pointer to pass to them. */
+ splay_tree_allocate_fn allocate;
+ splay_tree_deallocate_fn deallocate;
+ void *allocate_data;
+
} *splay_tree;
extern splay_tree splay_tree_new PARAMS((splay_tree_compare_fn,
splay_tree_delete_key_fn,
splay_tree_delete_value_fn));
+extern splay_tree splay_tree_new_with_allocator
+ PARAMS((splay_tree_compare_fn,
+ splay_tree_delete_key_fn,
+ splay_tree_delete_value_fn,
+ splay_tree_allocate_fn,
+ splay_tree_deallocate_fn,
+ void *));
extern void splay_tree_delete PARAMS((splay_tree));
-extern void splay_tree_insert PARAMS((splay_tree,
+extern splay_tree_node splay_tree_insert
+ PARAMS((splay_tree,
splay_tree_key,
splay_tree_value));
+extern void splay_tree_remove PARAMS((splay_tree,
+ splay_tree_key));
extern splay_tree_node splay_tree_lookup
PARAMS((splay_tree,
splay_tree_key));
+extern splay_tree_node splay_tree_predecessor
+ PARAMS((splay_tree,
+ splay_tree_key));
+extern splay_tree_node splay_tree_successor
+ PARAMS((splay_tree,
+ splay_tree_key));
+extern splay_tree_node splay_tree_max
+ PARAMS((splay_tree));
+extern splay_tree_node splay_tree_min
+ PARAMS((splay_tree));
extern int splay_tree_foreach PARAMS((splay_tree,
splay_tree_foreach_fn,
void*));
diff --git a/contrib/gcc/ssa-ccp.c b/contrib/gcc/ssa-ccp.c
index 9d2d9c9..4dc0aa9 100644
--- a/contrib/gcc/ssa-ccp.c
+++ b/contrib/gcc/ssa-ccp.c
@@ -1218,4 +1218,8 @@ ssa_fast_dce (df)
}
sbitmap_free (worklist);
+
+ /* Update the use-def chains in the df_analyzer as needed. */
+ df_analyse (df_analyzer, 0,
+ DF_RD_CHAIN | DF_RU_CHAIN | DF_REG_INFO | DF_HARD_REGS);
}
diff --git a/contrib/gcc/stmt.c b/contrib/gcc/stmt.c
index 5d0e4c4..e010893 100644
--- a/contrib/gcc/stmt.c
+++ b/contrib/gcc/stmt.c
@@ -2149,15 +2149,23 @@ resolve_operand_name_1 (p, outputs, inputs)
/* Resolve the name to a number. */
for (op = 0, t = outputs; t ; t = TREE_CHAIN (t), op++)
{
- const char *c = IDENTIFIER_POINTER (TREE_PURPOSE (TREE_PURPOSE (t)));
- if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
- goto found;
+ tree id = TREE_PURPOSE (TREE_PURPOSE (t));
+ if (id)
+ {
+ const char *c = IDENTIFIER_POINTER (id);
+ if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
+ goto found;
+ }
}
for (t = inputs; t ; t = TREE_CHAIN (t), op++)
{
- const char *c = IDENTIFIER_POINTER (TREE_PURPOSE (TREE_PURPOSE (t)));
- if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
- goto found;
+ tree id = TREE_PURPOSE (TREE_PURPOSE (t));
+ if (id)
+ {
+ const char *c = IDENTIFIER_POINTER (id);
+ if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
+ goto found;
+ }
}
*q = '\0';
@@ -2295,10 +2303,6 @@ warn_if_unused_value (exp)
if (VOID_TYPE_P (TREE_TYPE (exp)))
return 0;
- /* If this is an expression with side effects, don't warn. */
- if (TREE_SIDE_EFFECTS (exp))
- return 0;
-
switch (TREE_CODE (exp))
{
case PREINCREMENT_EXPR:
@@ -2358,7 +2362,7 @@ warn_if_unused_value (exp)
|| TREE_CODE (tem) == CALL_EXPR)
return 0;
}
- goto warn;
+ goto maybe_warn;
case INDIRECT_REF:
/* Don't warn about automatic dereferencing of references, since
@@ -2381,7 +2385,11 @@ warn_if_unused_value (exp)
&& TREE_CODE_LENGTH (TREE_CODE (exp)) == 0)
return 0;
- warn:
+ maybe_warn:
+ /* If this is an expression with side effects, don't warn. */
+ if (TREE_SIDE_EFFECTS (exp))
+ return 0;
+
warning_with_file_and_line (emit_filename, emit_lineno,
"value computed is not used");
return 1;
@@ -2396,12 +2404,16 @@ clear_last_expr ()
last_expr_type = 0;
}
-/* Begin a statement which will return a value.
- Return the RTL_EXPR for this statement expr.
- The caller must save that value and pass it to expand_end_stmt_expr. */
+/* Begin a statement-expression, i.e., a series of statements which
+ may return a value. Return the RTL_EXPR for this statement expr.
+ The caller must save that value and pass it to
+ expand_end_stmt_expr. If HAS_SCOPE is nonzero, temporaries created
+ in the statement-expression are deallocated at the end of the
+ expression. */
tree
-expand_start_stmt_expr ()
+expand_start_stmt_expr (has_scope)
+ int has_scope;
{
tree t;
@@ -2409,7 +2421,10 @@ expand_start_stmt_expr ()
so that rtl_expr_chain doesn't become garbage. */
t = make_node (RTL_EXPR);
do_pending_stack_adjust ();
- start_sequence_for_rtl_expr (t);
+ if (has_scope)
+ start_sequence_for_rtl_expr (t);
+ else
+ start_sequence ();
NO_DEFER_POP;
expr_stmts_for_value++;
last_expr_value = NULL_RTX;
@@ -3658,9 +3673,7 @@ expand_nl_goto_receivers (thisblock)
if (any_invalid)
{
expand_nl_goto_receiver ();
- emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "abort"), LCT_NORETURN,
- VOIDmode, 0);
- emit_barrier ();
+ expand_builtin_trap ();
}
nonlocal_goto_handler_labels = label_list;
@@ -3962,7 +3975,7 @@ expand_decl (decl)
: GET_MODE_BITSIZE (DECL_MODE (decl)));
DECL_USER_ALIGN (decl) = 0;
- x = assign_temp (TREE_TYPE (decl), 1, 1, 1);
+ x = assign_temp (decl, 1, 1, 1);
set_mem_attributes (x, decl, 1);
SET_DECL_RTL (decl, x);
@@ -4161,6 +4174,23 @@ expand_decl_cleanup (decl, cleanup)
}
return 1;
}
+
+/* Like expand_decl_cleanup, but maybe only run the cleanup if an exception
+ is thrown. */
+
+int
+expand_decl_cleanup_eh (decl, cleanup, eh_only)
+ tree decl, cleanup;
+ int eh_only;
+{
+ int ret = expand_decl_cleanup (decl, cleanup);
+ if (cleanup && ret)
+ {
+ tree node = block_stack->data.block.cleanups;
+ CLEANUP_EH_ONLY (node) = eh_only;
+ }
+ return ret;
+}
/* DECL is an anonymous union. CLEANUP is a cleanup for DECL.
DECL_ELTS is the list of elements that belong to DECL's type.
@@ -4193,6 +4223,11 @@ expand_anon_union_decl (decl, cleanup, decl_elts)
tree cleanup_elt = TREE_PURPOSE (t);
enum machine_mode mode = TYPE_MODE (TREE_TYPE (decl_elt));
+ /* If any of the elements are addressable, so is the entire
+ union. */
+ if (TREE_USED (decl_elt))
+ TREE_USED (decl) = 1;
+
/* Propagate the union's alignment to the elements. */
DECL_ALIGN (decl_elt) = DECL_ALIGN (decl);
DECL_USER_ALIGN (decl_elt) = DECL_USER_ALIGN (decl);
@@ -4264,7 +4299,7 @@ expand_cleanups (list, dont_do, in_fixup, reachable)
if (! in_fixup && using_eh_for_cleanups_p)
expand_eh_region_end_cleanup (TREE_VALUE (tail));
- if (reachable)
+ if (reachable && !CLEANUP_EH_ONLY (tail))
{
/* Cleanups may be run multiple times. For example,
when exiting a binding contour, we expand the
@@ -4876,20 +4911,20 @@ add_case_node (low, high, label, duplicate)
/* Returns the number of possible values of TYPE.
Returns -1 if the number is unknown, variable, or if the number does not
fit in a HOST_WIDE_INT.
- Sets *SPARENESS to 2 if TYPE is an ENUMERAL_TYPE whose values
+ Sets *SPARSENESS to 2 if TYPE is an ENUMERAL_TYPE whose values
do not increase monotonically (there may be duplicates);
to 1 if the values increase monotonically, but not always by 1;
otherwise sets it to 0. */
HOST_WIDE_INT
-all_cases_count (type, spareness)
+all_cases_count (type, sparseness)
tree type;
- int *spareness;
+ int *sparseness;
{
tree t;
HOST_WIDE_INT count, minval, lastval;
- *spareness = 0;
+ *sparseness = 0;
switch (TREE_CODE (type))
{
@@ -4928,11 +4963,12 @@ all_cases_count (type, spareness)
{
HOST_WIDE_INT thisval = tree_low_cst (TREE_VALUE (t), 0);
- if (*spareness == 2 || thisval < lastval)
- *spareness = 2;
+ if (*sparseness == 2 || thisval <= lastval)
+ *sparseness = 2;
else if (thisval != minval + count)
- *spareness = 1;
+ *sparseness = 1;
+ lastval = thisval;
count++;
}
}
@@ -5213,11 +5249,13 @@ free_case_nodes (cn)
/* Terminate a case (Pascal) or switch (C) statement
in which ORIG_INDEX is the expression to be tested.
+ If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
+ type as given in the source before any compiler conversions.
Generate the code to test it and jump to the right place. */
void
-expand_end_case (orig_index)
- tree orig_index;
+expand_end_case_type (orig_index, orig_type)
+ tree orig_index, orig_type;
{
tree minval = NULL_TREE, maxval = NULL_TREE, range = NULL_TREE;
rtx default_label = 0;
@@ -5241,6 +5279,8 @@ expand_end_case (orig_index)
index_expr = thiscase->data.case_stmt.index_expr;
index_type = TREE_TYPE (index_expr);
unsignedp = TREE_UNSIGNED (index_type);
+ if (orig_type == NULL)
+ orig_type = TREE_TYPE (orig_index);
do_pending_stack_adjust ();
@@ -5261,9 +5301,9 @@ expand_end_case (orig_index)
No sense trying this if there's a default case, however. */
if (!thiscase->data.case_stmt.default_label
- && TREE_CODE (TREE_TYPE (orig_index)) == ENUMERAL_TYPE
+ && TREE_CODE (orig_type) == ENUMERAL_TYPE
&& TREE_CODE (index_expr) != INTEGER_CST)
- check_for_full_enumeration_handling (TREE_TYPE (orig_index));
+ check_for_full_enumeration_handling (orig_type);
/* If we don't have a default-label, create one here,
after the body of the switch. */
@@ -5420,7 +5460,7 @@ expand_end_case (orig_index)
default code is emitted. */
use_cost_table
- = (TREE_CODE (TREE_TYPE (orig_index)) != ENUMERAL_TYPE
+ = (TREE_CODE (orig_type) != ENUMERAL_TYPE
&& estimate_case_costs (thiscase->data.case_stmt.case_list));
balance_case_nodes (&thiscase->data.case_stmt.case_list, NULL);
emit_case_nodes (index, thiscase->data.case_stmt.case_list,
diff --git a/contrib/gcc/stor-layout.c b/contrib/gcc/stor-layout.c
index 91aa454..2db4675 100644
--- a/contrib/gcc/stor-layout.c
+++ b/contrib/gcc/stor-layout.c
@@ -30,6 +30,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "expr.h"
#include "toplev.h"
#include "ggc.h"
+#include "target.h"
/* Set to one when set_sizetype has been called. */
static int sizetype_set;
@@ -503,6 +504,7 @@ start_record_layout (t)
rli->offset = size_zero_node;
rli->bitpos = bitsize_zero_node;
+ rli->prev_field = 0;
rli->pending_statics = 0;
rli->packed_maybe_necessary = 0;
@@ -787,8 +789,26 @@ place_field (rli, field)
/* Record must have at least as much alignment as any field.
Otherwise, the alignment of the field within the record is
meaningless. */
+ if ((* targetm.ms_bitfield_layout_p) (rli->t)
+ && type != error_mark_node
+ && DECL_BIT_FIELD_TYPE (field)
+ && ! integer_zerop (TYPE_SIZE (type))
+ && integer_zerop (DECL_SIZE (field)))
+ {
+ if (rli->prev_field
+ && DECL_BIT_FIELD_TYPE (rli->prev_field)
+ && ! integer_zerop (DECL_SIZE (rli->prev_field)))
+ {
+ rli->record_align = MAX (rli->record_align, desired_align);
+ rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type));
+ }
+ else
+ desired_align = 1;
+ }
+ else
#ifdef PCC_BITFIELD_TYPE_MATTERS
if (PCC_BITFIELD_TYPE_MATTERS && type != error_mark_node
+ && ! (* targetm.ms_bitfield_layout_p) (rli->t)
&& DECL_BIT_FIELD_TYPE (field)
&& ! integer_zerop (TYPE_SIZE (type)))
{
@@ -878,6 +898,7 @@ place_field (rli, field)
variable-sized fields, we need not worry about compatibility. */
#ifdef PCC_BITFIELD_TYPE_MATTERS
if (PCC_BITFIELD_TYPE_MATTERS
+ && ! (* targetm.ms_bitfield_layout_p) (rli->t)
&& TREE_CODE (field) == FIELD_DECL
&& type != error_mark_node
&& DECL_BIT_FIELD (field)
@@ -907,6 +928,7 @@ place_field (rli, field)
#ifdef BITFIELD_NBYTES_LIMITED
if (BITFIELD_NBYTES_LIMITED
+ && ! (* targetm.ms_bitfield_layout_p) (rli->t)
&& TREE_CODE (field) == FIELD_DECL
&& type != error_mark_node
&& DECL_BIT_FIELD_TYPE (field)
@@ -940,6 +962,50 @@ place_field (rli, field)
}
#endif
+ /* See the docs for TARGET_MS_BITFIELD_LAYOUT_P for details. */
+ if ((* targetm.ms_bitfield_layout_p) (rli->t)
+ && TREE_CODE (field) == FIELD_DECL
+ && type != error_mark_node
+ && ! DECL_PACKED (field)
+ && rli->prev_field
+ && DECL_SIZE (field)
+ && host_integerp (DECL_SIZE (field), 1)
+ && DECL_SIZE (rli->prev_field)
+ && host_integerp (DECL_SIZE (rli->prev_field), 1)
+ && host_integerp (rli->offset, 1)
+ && host_integerp (TYPE_SIZE (type), 1)
+ && host_integerp (TYPE_SIZE (TREE_TYPE (rli->prev_field)), 1)
+ && ((DECL_BIT_FIELD_TYPE (rli->prev_field)
+ && ! integer_zerop (DECL_SIZE (rli->prev_field)))
+ || (DECL_BIT_FIELD_TYPE (field)
+ && ! integer_zerop (DECL_SIZE (field))))
+ && (! simple_cst_equal (TYPE_SIZE (type),
+ TYPE_SIZE (TREE_TYPE (rli->prev_field)))
+ /* If the previous field was a zero-sized bit-field, either
+ it was ignored, in which case we must ensure the proper
+ alignment of this field here, or it already forced the
+ alignment of this field, in which case forcing the
+ alignment again is harmless. So, do it in both cases. */
+ || (DECL_BIT_FIELD_TYPE (rli->prev_field)
+ && integer_zerop (DECL_SIZE (rli->prev_field)))))
+ {
+ unsigned int type_align = TYPE_ALIGN (type);
+
+ if (rli->prev_field
+ && DECL_BIT_FIELD_TYPE (rli->prev_field)
+ /* If the previous bit-field is zero-sized, we've already
+ accounted for its alignment needs (or ignored it, if
+ appropriate) while placing it. */
+ && ! integer_zerop (DECL_SIZE (rli->prev_field)))
+ type_align = MAX (type_align,
+ TYPE_ALIGN (TREE_TYPE (rli->prev_field)));
+
+ if (maximum_field_alignment != 0)
+ type_align = MIN (type_align, maximum_field_alignment);
+
+ rli->bitpos = round_up (rli->bitpos, type_align);
+ }
+
/* Offset so far becomes the position of this field after normalizing. */
normalize_rli (rli);
DECL_FIELD_OFFSET (field) = rli->offset;
@@ -966,6 +1032,8 @@ place_field (rli, field)
if (known_align != actual_align)
layout_decl (field, actual_align);
+ rli->prev_field = field;
+
/* Now add size of this field to the size of the record. If the size is
not constant, treat the field as being a multiple of bytes and just
adjust the offset, resetting the bit position. Otherwise, apportion the
@@ -1514,8 +1582,13 @@ layout_type (type)
&& (TYPE_MODE (TREE_TYPE (type)) != BLKmode
|| TYPE_NO_FORCE_BLK (TREE_TYPE (type))))
{
- TYPE_MODE (type)
- = mode_for_size_tree (TYPE_SIZE (type), MODE_INT, 1);
+ /* One-element arrays get the component type's mode. */
+ if (simple_cst_equal (TYPE_SIZE (type),
+ TYPE_SIZE (TREE_TYPE (type))))
+ TYPE_MODE (type) = TYPE_MODE (TREE_TYPE (type));
+ else
+ TYPE_MODE (type)
+ = mode_for_size_tree (TYPE_SIZE (type), MODE_INT, 1);
if (TYPE_MODE (type) != BLKmode
&& STRICT_ALIGNMENT && TYPE_ALIGN (type) < BIGGEST_ALIGNMENT
diff --git a/contrib/gcc/symcat.h b/contrib/gcc/symcat.h
new file mode 100644
index 0000000..61ce1e9
--- /dev/null
+++ b/contrib/gcc/symcat.h
@@ -0,0 +1,49 @@
+/* Symbol concatenation utilities.
+
+ Copyright (C) 1998, 2000 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef SYM_CAT_H
+#define SYM_CAT_H
+
+#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
+#define CONCAT2(a,b) a##b
+#define CONCAT3(a,b,c) a##b##c
+#define CONCAT4(a,b,c,d) a##b##c##d
+#define STRINGX(s) #s
+#else
+/* Note one should never pass extra whitespace to the CONCATn macros,
+ e.g. CONCAT2(foo, bar) because traditonal C will keep the space between
+ the two labels instead of concatenating them. Instead, make sure to
+ write CONCAT2(foo,bar). */
+#define CONCAT2(a,b) a/**/b
+#define CONCAT3(a,b,c) a/**/b/**/c
+#define CONCAT4(a,b,c,d) a/**/b/**/c/**/d
+#define STRINGX(s) "s"
+#endif
+
+#define XCONCAT2(a,b) CONCAT2(a,b)
+#define XCONCAT3(a,b,c) CONCAT3(a,b,c)
+#define XCONCAT4(a,b,c,d) CONCAT4(a,b,c,d)
+
+/* Note the layer of indirection here is typically used to allow
+ stringification of the expansion of macros. I.e. "#define foo
+ bar", "XSTRING(foo)", to yield "bar". Be aware that this only
+ works for __STDC__, not for traditional C which will still resolve
+ to "foo". */
+#define XSTRING(s) STRINGX(s)
+
+#endif /* SYM_CAT_H */
diff --git a/contrib/gcc/system.h b/contrib/gcc/system.h
index 9bd0599..0577708 100644
--- a/contrib/gcc/system.h
+++ b/contrib/gcc/system.h
@@ -594,7 +594,7 @@ typedef char _Bool;
SET_DEFAULT_TYPE_ATTRIBUTES SET_DEFAULT_DECL_ATTRIBUTES \
MERGE_MACHINE_TYPE_ATTRIBUTES MERGE_MACHINE_DECL_ATTRIBUTES \
MD_INIT_BUILTINS MD_EXPAND_BUILTIN ASM_OUTPUT_CONSTRUCTOR \
- ASM_OUTPUT_DESTRUCTOR
+ ASM_OUTPUT_DESTRUCTOR SIGNED_CHAR_SPEC
/* And other obsolete target macros, or macros that used to be in target
headers and were not used, and may be obsolete or may never have
@@ -605,7 +605,7 @@ typedef char _Bool;
OMIT_EH_TABLE EASY_DIV_EXPR IMPLICIT_FIX_EXPR \
LONGJMP_RESTORE_FROM_STACK MAX_INT_TYPE_SIZE ASM_IDENTIFY_GCC \
STDC_VALUE TRAMPOLINE_ALIGN ASM_IDENTIFY_GCC_AFTER_SOURCE \
- SLOW_ZERO_EXTEND SUBREG_REGNO_OFFSET
+ SLOW_ZERO_EXTEND SUBREG_REGNO_OFFSET DWARF_LINE_MIN_INSTR_LENGTH
#endif /* IN_GCC */
diff --git a/contrib/gcc/target-def.h b/contrib/gcc/target-def.h
index feeb2c7..71987f5 100644
--- a/contrib/gcc/target-def.h
+++ b/contrib/gcc/target-def.h
@@ -1,5 +1,5 @@
/* Default initializers for a generic GCC target.
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
@@ -164,6 +164,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES default_set_default_type_attributes
#define TARGET_INSERT_ATTRIBUTES default_insert_attributes
#define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P default_function_attribute_inlinable_p
+#define TARGET_MS_BITFIELD_LAYOUT_P default_ms_bitfield_layout_p
/* In builtins.c. */
#define TARGET_INIT_BUILTINS default_init_builtins
@@ -174,6 +175,9 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define TARGET_SECTION_TYPE_FLAGS default_section_type_flags
#endif
+/* In hook.c. */
+#define TARGET_CANNOT_MODIFY_JUMPS_P hook_void_bool_false
+
/* The whole shebang. */
#define TARGET_INITIALIZER \
{ \
@@ -186,9 +190,13 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
TARGET_SET_DEFAULT_TYPE_ATTRIBUTES, \
TARGET_INSERT_ATTRIBUTES, \
TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P, \
+ TARGET_MS_BITFIELD_LAYOUT_P, \
TARGET_INIT_BUILTINS, \
TARGET_EXPAND_BUILTIN, \
TARGET_SECTION_TYPE_FLAGS, \
TARGET_HAVE_NAMED_SECTIONS, \
- TARGET_HAVE_CTORS_DTORS \
+ TARGET_HAVE_CTORS_DTORS, \
+ TARGET_CANNOT_MODIFY_JUMPS_P \
}
+
+#include "hooks.h"
diff --git a/contrib/gcc/target.h b/contrib/gcc/target.h
index 355a910..5ee9aa6 100644
--- a/contrib/gcc/target.h
+++ b/contrib/gcc/target.h
@@ -1,5 +1,5 @@
/* Data structure definitions for a generic GCC target.
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
@@ -162,6 +162,10 @@ struct gcc_target
can be inlined despite its machine attributes, false otherwise. */
bool (* function_attribute_inlinable_p) PARAMS ((tree fndecl));
+ /* Return true if bitfields in RECORD_TYPE should follow the
+ Microsoft Visual C++ bitfield layout rules. */
+ bool (* ms_bitfield_layout_p) PARAMS ((tree record_type));
+
/* Set up target-specific built-in functions. */
void (* init_builtins) PARAMS ((void));
@@ -180,6 +184,10 @@ struct gcc_target
/* True if "native" constructors and destructors are supported,
false if we're using collect2 for the job. */
bool have_ctors_dtors;
+
+ /* True if new jumps cannot be created, to replace existing ones or
+ not, at the current point in the compilation. */
+ bool (* cannot_modify_jumps_p) PARAMS ((void));
};
extern struct gcc_target targetm;
diff --git a/contrib/gcc/tradcif.y b/contrib/gcc/tradcif.y
index 4598d61..953e2d6 100644
--- a/contrib/gcc/tradcif.y
+++ b/contrib/gcc/tradcif.y
@@ -344,8 +344,7 @@ yylex ()
/* Sign-extend the constant if chars are signed on target machine. */
{
- if (lookup ((const unsigned char *)"__CHAR_UNSIGNED__",
- sizeof ("__CHAR_UNSIGNED__")-1, -1)
+ if (flag_signed_char == 0
|| ((c >> (CHAR_TYPE_SIZE - 1)) & 1) == 0)
yylval.integer.value = c & ((1 << CHAR_TYPE_SIZE) - 1);
else
diff --git a/contrib/gcc/tradcpp.c b/contrib/gcc/tradcpp.c
index 11c5fd3..f6bc24a 100644
--- a/contrib/gcc/tradcpp.c
+++ b/contrib/gcc/tradcpp.c
@@ -86,6 +86,13 @@ int inhibit_warnings = 0;
/* Non-0 means don't output the preprocessed program. */
int inhibit_output = 0;
+/* Nonzero means chars are signed. */
+#if DEFAULT_SIGNED_CHAR
+int flag_signed_char = 1;
+#else
+int flag_signed_char = 0;
+#endif
+
/* Nonzero means warn if slash-star appears in a comment. */
int warn_comments;
@@ -423,6 +430,7 @@ static void grow_outbuf PARAMS ((FILE_BUF *, int));
static int handle_directive PARAMS ((FILE_BUF *, FILE_BUF *));
static void process_include PARAMS ((struct file_name_list *,
const U_CHAR *, int, int, FILE_BUF *));
+static void fixup_newlines PARAMS ((FILE_BUF *));
static void finclude PARAMS ((int, const char *,
struct file_name_list *, FILE_BUF *));
static void init_dependency_output PARAMS ((void));
@@ -627,6 +635,10 @@ main (argc, argv)
user_label_prefix = "_";
else if (!strcmp (argv[i], "-fno-leading-underscore"))
user_label_prefix = "";
+ else if (!strcmp (argv[i], "-fsigned-char"))
+ flag_signed_char = 1;
+ else if (!strcmp (argv[i], "-funsigned-char"))
+ flag_signed_char = 0;
break;
case 'M':
@@ -937,6 +949,7 @@ main (argc, argv)
}
fp->bufp = fp->buf;
fp->if_stack = if_stack;
+ fixup_newlines (fp);
/* Make sure data ends with a newline. And put a null after it. */
@@ -2579,6 +2592,42 @@ process_include (stackp, fbeg, flen, system_header_p, op)
}
}
+/* Replace all CR NL, NL CR and CR sequences with NL. */
+
+static void
+fixup_newlines (FILE_BUF *fp)
+{
+ U_CHAR *p, *q, *end;
+
+ if (fp->length <= 0)
+ return;
+
+ end = fp->buf + fp->length;
+ *end = '\r';
+ p = (U_CHAR *) strchr ((const char *) fp->buf, '\r');
+ *end = '\0';
+ if (p == end)
+ return;
+
+ if (p > fp->buf && p[-1] == '\n')
+ p--;
+ q = p;
+ while (p < end)
+ switch (*p)
+ {
+ default:
+ *q++ = *p++;
+ break;
+ case '\n':
+ case '\r':
+ p += 1 + (p[0] + p[1] == '\n' + '\r');
+ *q++ = '\n';
+ break;
+ }
+
+ fp->length = q - fp->buf;
+}
+
/* Process the contents of include file FNAME, already open on descriptor F,
with output to OP. */
@@ -2653,6 +2702,7 @@ finclude (f, fname, nhd, op)
fp->length = st_size;
}
close (f);
+ fixup_newlines (fp);
/* Make sure data ends with a newline. And put a null after it. */
@@ -5105,6 +5155,9 @@ initialize_builtins ()
#endif
install_value ("__REGISTER_PREFIX__", REGISTER_PREFIX);
install_value ("__USER_LABEL_PREFIX__", user_label_prefix);
+
+ if (flag_signed_char == 0)
+ install_value ("__CHAR_UNSIGNED__", "1");
}
#undef DSC
#undef install_spec
diff --git a/contrib/gcc/tradcpp.h b/contrib/gcc/tradcpp.h
index 0c16cfa..89940d0 100644
--- a/contrib/gcc/tradcpp.h
+++ b/contrib/gcc/tradcpp.h
@@ -35,6 +35,7 @@ extern void fancy_abort PARAMS ((int, const char *)) ATTRIBUTE_NORETURN;
extern struct hashnode *lookup PARAMS ((const unsigned char *, int, int));
extern int parse_c_expression PARAMS ((const char *)); /* in tradcif.y */
extern int test_assertion PARAMS ((unsigned char **));
+extern int flag_signed_char;
#define is_idchar(x) ISIDNUM(x)
#define is_idstart(x) ISIDST(x)
diff --git a/contrib/gcc/tree-dump.c b/contrib/gcc/tree-dump.c
index 9eac6e0..d8d8e23 100644
--- a/contrib/gcc/tree-dump.c
+++ b/contrib/gcc/tree-dump.c
@@ -548,6 +548,13 @@ dequeue_and_dump (di)
dump_next_stmt (di, t);
break;
+ case CLEANUP_STMT:
+ dump_stmt (di, t);
+ dump_child ("decl", CLEANUP_DECL (t));
+ dump_child ("expr", CLEANUP_EXPR (t));
+ dump_next_stmt (di, t);
+ break;
+
case COMPOUND_STMT:
dump_stmt (di, t);
dump_child ("body", COMPOUND_BODY (t));
diff --git a/contrib/gcc/tree-inline.c b/contrib/gcc/tree-inline.c
index 02ba716..5aa141a 100644
--- a/contrib/gcc/tree-inline.c
+++ b/contrib/gcc/tree-inline.c
@@ -480,9 +480,11 @@ initialize_inlined_parameters (id, args, fn)
tree init_stmt;
tree var;
tree value;
+ tree cleanup;
/* Find the initializer. */
- value = a ? TREE_VALUE (a) : NULL_TREE;
+ value = (*lang_hooks.tree_inlining.convert_parm_for_inlining)
+ (p, a ? TREE_VALUE (a) : NULL_TREE, fn);
/* If the parameter is never assigned to, we may not need to
create a new variable here at all. Instead, we may be able
@@ -558,16 +560,26 @@ initialize_inlined_parameters (id, args, fn)
TREE_CHAIN (init_stmt) = init_stmts;
init_stmts = init_stmt;
}
+
+ /* See if we need to clean up the declaration. */
+ cleanup = maybe_build_cleanup (var);
+ if (cleanup)
+ {
+ tree cleanup_stmt;
+ /* Build the cleanup statement. */
+ cleanup_stmt = build_stmt (CLEANUP_STMT, var, cleanup);
+ /* Add it to the *front* of the list; the list will be
+ reversed below. */
+ TREE_CHAIN (cleanup_stmt) = init_stmts;
+ init_stmts = cleanup_stmt;
+ }
}
/* Evaluate trailing arguments. */
for (; a; a = TREE_CHAIN (a))
{
tree init_stmt;
- tree value;
-
- /* Find the initializer. */
- value = a ? TREE_VALUE (a) : NULL_TREE;
+ tree value = TREE_VALUE (a);
if (! value || ! TREE_SIDE_EFFECTS (value))
continue;
@@ -842,6 +854,8 @@ expand_call_inline (tp, walk_subtrees, data)
type of the statement expression is the return type of the
function call. */
expr = build1 (STMT_EXPR, TREE_TYPE (TREE_TYPE (fn)), NULL_TREE);
+ /* There is no scope associated with the statement-expression. */
+ STMT_EXPR_NO_SCOPE (expr) = 1;
/* Local declarations will be replaced by their equivalents in this
map. */
@@ -1223,6 +1237,7 @@ walk_tree (tp, func, data, htab_)
case IDENTIFIER_NODE:
case INTEGER_CST:
case REAL_CST:
+ case VECTOR_CST:
case STRING_CST:
case REAL_TYPE:
case COMPLEX_TYPE:
diff --git a/contrib/gcc/tree.c b/contrib/gcc/tree.c
index 76b341a..bd89387 100644
--- a/contrib/gcc/tree.c
+++ b/contrib/gcc/tree.c
@@ -558,6 +558,35 @@ build_int_2_wide (low, hi)
return t;
}
+/* Return a new VECTOR_CST node whose type is TYPE and whose values
+ are in a list pointed by VALS. */
+
+tree
+build_vector (type, vals)
+ tree type, vals;
+{
+ tree v = make_node (VECTOR_CST);
+ int over1 = 0, over2 = 0;
+ tree link;
+
+ TREE_VECTOR_CST_ELTS (v) = vals;
+ TREE_TYPE (v) = type;
+
+ /* Iterate through elements and check for overflow. */
+ for (link = vals; link; link = TREE_CHAIN (link))
+ {
+ tree value = TREE_VALUE (link);
+
+ over1 |= TREE_OVERFLOW (value);
+ over2 |= TREE_CONSTANT_OVERFLOW (value);
+ }
+
+ TREE_OVERFLOW (v) = over1;
+ TREE_CONSTANT_OVERFLOW (v) = over2;
+
+ return v;
+}
+
/* Return a new REAL_CST node whose type is TYPE and value is D. */
tree
@@ -2736,6 +2765,16 @@ default_function_attribute_inlinable_p (fndecl)
return false;
}
+/* Default value of targetm.ms_bitfield_layout_p that always returns
+ false. */
+bool
+default_ms_bitfield_layout_p (record)
+ tree record ATTRIBUTE_UNUSED;
+{
+ /* By default, GCC does not use the MS VC++ bitfield layout rules. */
+ return false;
+}
+
/* Return non-zero if IDENT is a valid name for attribute ATTR,
or zero if not.
@@ -3376,7 +3415,20 @@ tree_int_cst_lt (t1, t2)
if (t1 == t2)
return 0;
- if (! TREE_UNSIGNED (TREE_TYPE (t1)))
+ if (TREE_UNSIGNED (TREE_TYPE (t1)) != TREE_UNSIGNED (TREE_TYPE (t2)))
+ {
+ int t1_sgn = tree_int_cst_sgn (t1);
+ int t2_sgn = tree_int_cst_sgn (t2);
+
+ if (t1_sgn < t2_sgn)
+ return 1;
+ else if (t1_sgn > t2_sgn)
+ return 0;
+ /* Otherwise, both are non-negative, so we compare them as
+ unsigned just in case one of them would overflow a signed
+ type. */
+ }
+ else if (! TREE_UNSIGNED (TREE_TYPE (t1)))
return INT_CST_LT (t1, t2);
return INT_CST_LT_UNSIGNED (t1, t2);
@@ -3397,8 +3449,10 @@ tree_int_cst_compare (t1, t2)
return 0;
}
-/* Return 1 if T is an INTEGER_CST that can be represented in a single
- HOST_WIDE_INT value. If POS is nonzero, the result must be positive. */
+/* Return 1 if T is an INTEGER_CST that can be manipulated efficiently on
+ the host. If POS is zero, the value can be represented in a single
+ HOST_WIDE_INT. If POS is nonzero, the value must be positive and can
+ be represented in a single unsigned HOST_WIDE_INT. */
int
host_integerp (t, pos)
@@ -3410,9 +3464,9 @@ host_integerp (t, pos)
&& ((TREE_INT_CST_HIGH (t) == 0
&& (HOST_WIDE_INT) TREE_INT_CST_LOW (t) >= 0)
|| (! pos && TREE_INT_CST_HIGH (t) == -1
- && (HOST_WIDE_INT) TREE_INT_CST_LOW (t) < 0)
- || (! pos && TREE_INT_CST_HIGH (t) == 0
- && TREE_UNSIGNED (TREE_TYPE (t)))));
+ && (HOST_WIDE_INT) TREE_INT_CST_LOW (t) < 0
+ && ! TREE_UNSIGNED (TREE_TYPE (t)))
+ || (pos && TREE_INT_CST_HIGH (t) == 0)));
}
/* Return the HOST_WIDE_INT least significant bits of T if it is an
@@ -3758,29 +3812,6 @@ build_index_type (maxval)
return itype;
}
-/* Builds a signed or unsigned integer type of precision PRECISION.
- Used for C bitfields whose precision does not match that of
- built-in target types. */
-tree
-build_nonstandard_integer_type (precision, unsignedp)
- unsigned int precision;
- int unsignedp;
-{
- tree itype = make_node (INTEGER_TYPE);
-
- TYPE_PRECISION (itype) = precision;
-
- if (unsignedp)
- fixup_unsigned_type (itype);
- else
- fixup_signed_type (itype);
-
- if (host_integerp (TYPE_MAX_VALUE (itype), 1))
- return type_hash_canon (tree_low_cst (TYPE_MAX_VALUE (itype), 1), itype);
-
- return itype;
-}
-
/* Create a range of some discrete type TYPE (an INTEGER_TYPE,
ENUMERAL_TYPE, BOOLEAN_TYPE, or CHAR_TYPE), with
low bound LOWVAL and high bound HIGHVAL.
@@ -4504,16 +4535,23 @@ append_random_chars (template)
compiles since this can cause bootstrap comparison errors. */
if (stat (main_input_filename, &st) < 0)
- abort ();
-
- /* In VMS, ino is an array, so we have to use both values. We
- conditionalize that. */
+ {
+ /* This can happen when preprocessed text is shipped between
+ machines, e.g. with bug reports. Assume that uniqueness
+ isn't actually an issue. */
+ value = 1;
+ }
+ else
+ {
+ /* In VMS, ino is an array, so we have to use both values. We
+ conditionalize that. */
#ifdef VMS
#define INO_TO_INT(INO) ((int) (INO)[1] << 16 ^ (int) (INO)[2])
#else
#define INO_TO_INT(INO) INO
#endif
- value = st.st_dev ^ INO_TO_INT (st.st_ino) ^ st.st_mtime;
+ value = st.st_dev ^ INO_TO_INT (st.st_ino) ^ st.st_mtime;
+ }
}
template += strlen (template);
@@ -4920,6 +4958,7 @@ build_common_tree_nodes_2 (short_double)
unsigned_V16QI_type_node
= make_vector (V16QImode, unsigned_intQI_type_node, 1);
+ V16SF_type_node = make_vector (V16SFmode, float_type_node, 0);
V4SF_type_node = make_vector (V4SFmode, float_type_node, 0);
V4SI_type_node = make_vector (V4SImode, intSI_type_node, 0);
V2SI_type_node = make_vector (V2SImode, intSI_type_node, 0);
diff --git a/contrib/gcc/tree.def b/contrib/gcc/tree.def
index 39ea31c..9cfe139 100644
--- a/contrib/gcc/tree.def
+++ b/contrib/gcc/tree.def
@@ -269,6 +269,9 @@ DEFTREECODE (REAL_CST, "real_cst", 'c', 3)
Also there is TREE_CST_RTL. */
DEFTREECODE (COMPLEX_CST, "complex_cst", 'c', 3)
+/* Contents are in TREE_VECTOR_CST_ELTS field. */
+DEFTREECODE (VECTOR_CST, "vector_cst", 'c', 3)
+
/* Contents are TREE_STRING_LENGTH and TREE_STRING_POINTER fields.
Also there is TREE_CST_RTL. */
DEFTREECODE (STRING_CST, "string_cst", 'c', 3)
diff --git a/contrib/gcc/tree.h b/contrib/gcc/tree.h
index 51898d7..9346f7d 100644
--- a/contrib/gcc/tree.h
+++ b/contrib/gcc/tree.h
@@ -122,8 +122,9 @@ struct tree_common
{
tree chain;
tree type;
- void *aux;
+
ENUM_BITFIELD(tree_code) code : 8;
+
unsigned side_effects_flag : 1;
unsigned constant_flag : 1;
unsigned addressable_flag : 1;
@@ -131,6 +132,7 @@ struct tree_common
unsigned readonly_flag : 1;
unsigned unsigned_flag : 1;
unsigned asm_written_flag: 1;
+ unsigned unused_0 : 1;
unsigned used_flag : 1;
unsigned nothrow_flag : 1;
@@ -148,10 +150,7 @@ struct tree_common
unsigned lang_flag_4 : 1;
unsigned lang_flag_5 : 1;
unsigned lang_flag_6 : 1;
- /* This flag is presently unused. However, language front-ends
- should not make use of this flag; it is reserved for future
- expansion. */
- unsigned dummy : 1;
+ unsigned unused_1 : 1;
};
/* The following table lists the uses of each of the above flags and
@@ -175,14 +174,17 @@ struct tree_common
TREE_VIA_VIRTUAL in
TREE_LIST or TREE_VEC
TREE_CONSTANT_OVERFLOW in
- INTEGER_CST, REAL_CST, COMPLEX_CST
+ INTEGER_CST, REAL_CST, COMPLEX_CST, VECTOR_CST
TREE_SYMBOL_REFERENCED in
IDENTIFIER_NODE
+ CLEANUP_EH_ONLY in
+ TARGET_EXPR, WITH_CLEANUP_EXPR, CLEANUP_STMT,
+ TREE_LIST elements of a block's cleanup list.
public_flag:
TREE_OVERFLOW in
- INTEGER_CST, REAL_CST, COMPLEX_CST
+ INTEGER_CST, REAL_CST, COMPLEX_CST, VECTOR_CST
TREE_PUBLIC in
VAR_DECL or FUNCTION_DECL or IDENTIFIER_NODE
TREE_VIA_PUBLIC in
@@ -195,7 +197,7 @@ struct tree_common
TREE_VIA_PRIVATE in
TREE_LIST or TREE_VEC
TREE_PRIVATE in
- ??? unspecified nodes
+ ..._DECL
protected_flag:
@@ -204,7 +206,7 @@ struct tree_common
TREE_VEC
TREE_PROTECTED in
BLOCK
- ??? unspecified nodes
+ ..._DECL
side_effects_flag:
@@ -504,6 +506,11 @@ extern void tree_class_check_failed PARAMS ((const tree, int,
In a CONSTRUCTOR, nonzero means allocate static storage. */
#define TREE_STATIC(NODE) ((NODE)->common.static_flag)
+/* In a TARGET_EXPR, WITH_CLEANUP_EXPR, CLEANUP_STMT, or element of a
+ block's cleanup list, means that the pertinent cleanup should only be
+ executed if an exception is thrown, not on normal exit of its scope. */
+#define CLEANUP_EH_ONLY(NODE) ((NODE)->common.static_flag)
+
/* In a CONVERT_EXPR, NOP_EXPR or COMPOUND_EXPR, this means the node was
made implicitly and should not lead to an "unused value" warning. */
#define TREE_NO_UNUSED_WARNING(NODE) ((NODE)->common.static_flag)
@@ -512,9 +519,10 @@ extern void tree_class_check_failed PARAMS ((const tree, int,
chain is via a `virtual' declaration. */
#define TREE_VIA_VIRTUAL(NODE) ((NODE)->common.static_flag)
-/* In an INTEGER_CST, REAL_CST, or COMPLEX_CST, this means there was an
- overflow in folding. This is distinct from TREE_OVERFLOW because ANSI C
- requires a diagnostic when overflows occur in constant expressions. */
+/* In an INTEGER_CST, REAL_CST, COMPLEX_CST, or VECTOR_CST this means
+ there was an overflow in folding. This is distinct from
+ TREE_OVERFLOW because ANSI C requires a diagnostic when overflows
+ occur in constant expressions. */
#define TREE_CONSTANT_OVERFLOW(NODE) ((NODE)->common.static_flag)
/* In an IDENTIFIER_NODE, this means that assemble_name was called with
@@ -522,9 +530,10 @@ extern void tree_class_check_failed PARAMS ((const tree, int,
#define TREE_SYMBOL_REFERENCED(NODE) \
(IDENTIFIER_NODE_CHECK (NODE)->common.static_flag)
-/* In an INTEGER_CST, REAL_CST, of COMPLEX_CST, this means there was an
- overflow in folding, and no warning has been issued for this subexpression.
- TREE_OVERFLOW implies TREE_CONSTANT_OVERFLOW, but not vice versa. */
+/* In an INTEGER_CST, REAL_CST, COMPLEX_CST, or VECTOR_CST, this means
+ there was an overflow in folding, and no warning has been issued
+ for this subexpression. TREE_OVERFLOW implies
+ TREE_CONSTANT_OVERFLOW, but not vice versa. */
#define TREE_OVERFLOW(NODE) ((NODE)->common.public_flag)
/* In a VAR_DECL or FUNCTION_DECL,
@@ -707,9 +716,9 @@ struct tree_int_cst
} int_cst;
};
-/* In REAL_CST, STRING_CST, COMPLEX_CST nodes, and CONSTRUCTOR nodes,
- and generally in all kinds of constants that could
- be given labels (rather than being immediate). */
+/* In REAL_CST, STRING_CST, COMPLEX_CST, VECTOR_CST nodes, and
+ CONSTRUCTOR nodes, and generally in all kinds of constants that
+ could be given labels (rather than being immediate). */
#define TREE_CST_RTL(NODE) (CST_OR_CONSTRUCTOR_CHECK (NODE)->real_cst.rtl)
@@ -752,6 +761,16 @@ struct tree_complex
tree real;
tree imag;
};
+
+/* In a VECTOR_CST node. */
+#define TREE_VECTOR_CST_ELTS(NODE) (VECTOR_CST_CHECK (NODE)->vector.elements)
+
+struct tree_vector
+{
+ struct tree_common common;
+ rtx rtl;
+ tree elements;
+};
#include "hashtable.h"
@@ -1843,6 +1862,7 @@ union tree_node
struct tree_common common;
struct tree_int_cst int_cst;
struct tree_real_cst real_cst;
+ struct tree_vector vector;
struct tree_string string;
struct tree_complex complex;
struct tree_identifier identifier;
@@ -1910,6 +1930,7 @@ enum tree_index
TI_UV16QI_TYPE,
TI_V4SF_TYPE,
+ TI_V16SF_TYPE,
TI_V4SI_TYPE,
TI_V8HI_TYPE,
TI_V8QI_TYPE,
@@ -1992,6 +2013,7 @@ extern tree global_trees[TI_MAX];
#define V4HI_type_node global_trees[TI_V4HI_TYPE]
#define V2SI_type_node global_trees[TI_V2SI_TYPE]
#define V2SF_type_node global_trees[TI_V2SF_TYPE]
+#define V16SF_type_node global_trees[TI_V16SF_TYPE]
/* An enumeration of the standard C integer types. These must be
ordered so that shorter types appear before longer ones. */
@@ -2091,6 +2113,7 @@ extern tree build PARAMS ((enum tree_code, tree, ...));
extern tree build_nt PARAMS ((enum tree_code, ...));
extern tree build_int_2_wide PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT));
+extern tree build_vector PARAMS ((tree, tree));
extern tree build_real PARAMS ((tree, REAL_VALUE_TYPE));
extern tree build_real_from_int_cst PARAMS ((tree, tree));
extern tree build_complex PARAMS ((tree, tree, tree));
@@ -2234,6 +2257,7 @@ extern int default_comp_type_attributes PARAMS ((tree, tree));
extern void default_set_default_type_attributes PARAMS ((tree));
extern void default_insert_attributes PARAMS ((tree, tree *));
extern bool default_function_attribute_inlinable_p PARAMS ((tree));
+extern bool default_ms_bitfield_layout_p PARAMS ((tree));
/* Split a list of declspecs and attributes into two. */
@@ -2323,6 +2347,8 @@ typedef struct record_layout_info_s
/* The alignment of the record so far, allowing for the record to be
padded only at the end, in bits. */
unsigned int unpadded_align;
+ /* The previous field layed out. */
+ tree prev_field;
/* The static variables (i.e., class variables, as opposed to
instance variables) encountered in T. */
tree pending_statics;
@@ -2728,7 +2754,7 @@ extern int type_num_arguments PARAMS ((tree));
extern int in_control_zone_p PARAMS ((void));
extern void expand_fixups PARAMS ((rtx));
-extern tree expand_start_stmt_expr PARAMS ((void));
+extern tree expand_start_stmt_expr PARAMS ((int));
extern tree expand_end_stmt_expr PARAMS ((tree));
extern void expand_expr_stmt PARAMS ((tree));
extern void expand_expr_stmt_value PARAMS ((tree, int, int));
@@ -2772,7 +2798,8 @@ extern struct nesting * current_nesting_level PARAMS ((void));
extern tree last_cleanup_this_contour PARAMS ((void));
extern void expand_start_case PARAMS ((int, tree, tree,
const char *));
-extern void expand_end_case PARAMS ((tree));
+extern void expand_end_case_type PARAMS ((tree, tree));
+#define expand_end_case(cond) expand_end_case_type (cond, NULL)
extern int add_case_node PARAMS ((tree, tree,
tree, tree *));
extern int pushcase PARAMS ((tree,
@@ -2862,7 +2889,6 @@ extern tree getdecls PARAMS ((void));
/* Function to return the chain of structure tags in the current scope level. */
extern tree gettags PARAMS ((void));
-extern tree build_nonstandard_integer_type PARAMS ((unsigned int, int));
extern tree build_range_type PARAMS ((tree, tree, tree));
/* In alias.c */
@@ -3064,6 +3090,7 @@ extern void expand_elseif PARAMS ((tree));
extern void save_stack_pointer PARAMS ((void));
extern void expand_decl PARAMS ((tree));
extern int expand_decl_cleanup PARAMS ((tree, tree));
+extern int expand_decl_cleanup_eh PARAMS ((tree, tree, int));
extern void expand_anon_union_decl PARAMS ((tree, tree, tree));
extern void move_cleanups_up PARAMS ((void));
extern void expand_start_case_dummy PARAMS ((void));
diff --git a/contrib/gcc/unroll.c b/contrib/gcc/unroll.c
index 9a0cfcf..6936a71 100644
--- a/contrib/gcc/unroll.c
+++ b/contrib/gcc/unroll.c
@@ -727,8 +727,7 @@ unroll_loop (loop, insn_count, strength_reduce_p)
if (max_labelno > 0)
{
- map->label_map = (rtx *) xmalloc (max_labelno * sizeof (rtx));
-
+ map->label_map = (rtx *) xcalloc (max_labelno, sizeof (rtx));
local_label = (char *) xcalloc (max_labelno, sizeof (char));
}
@@ -2222,6 +2221,7 @@ copy_loop_body (loop, copy_start, copy_end, map, exit_label, last_iteration,
pattern = copy_rtx_and_substitute (PATTERN (insn), map, 0);
copy = emit_call_insn (pattern);
REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map);
+ SIBLING_CALL_P (copy) = SIBLING_CALL_P (insn);
/* Because the USAGE information potentially contains objects other
than hard registers, we need to copy it. */
@@ -3744,7 +3744,18 @@ loop_iterations (loop)
for (biv_inc = bl->biv; biv_inc; biv_inc = biv_inc->next_iv)
{
if (loop_insn_first_p (v->insn, biv_inc->insn))
- offset -= INTVAL (biv_inc->add_val);
+ {
+ if (REG_P (biv_inc->add_val))
+ {
+ if (loop_dump_stream)
+ fprintf (loop_dump_stream,
+ "Loop iterations: Basic induction var add_val is REG %d.\n",
+ REGNO (biv_inc->add_val));
+ return 0;
+ }
+
+ offset -= INTVAL (biv_inc->add_val);
+ }
}
}
if (loop_dump_stream)
diff --git a/contrib/gcc/unwind-dw2-fde-glibc.c b/contrib/gcc/unwind-dw2-fde-glibc.c
index 33c678f..94fe6d1 100644
--- a/contrib/gcc/unwind-dw2-fde-glibc.c
+++ b/contrib/gcc/unwind-dw2-fde-glibc.c
@@ -29,6 +29,10 @@
segment and dl_iterate_phdr to avoid register/deregister calls at
DSO load/unload. */
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+
#include "auto-host.h" /* For HAVE_LD_EH_FRAME_HDR. */
#include "tconfig.h"
#ifndef inhibit_libc
diff --git a/contrib/gcc/varasm.c b/contrib/gcc/varasm.c
index 955a98e..6dfc292 100644
--- a/contrib/gcc/varasm.c
+++ b/contrib/gcc/varasm.c
@@ -166,9 +166,7 @@ static unsigned HOST_WIDE_INT array_size_for_constructor PARAMS ((tree));
static unsigned min_align PARAMS ((unsigned, unsigned));
static void output_constructor PARAMS ((tree, HOST_WIDE_INT,
unsigned int));
-#ifdef ASM_WEAKEN_LABEL
-static void remove_from_pending_weak_list PARAMS ((const char *));
-#endif
+static void globalize_decl PARAMS ((tree));
static int in_named_entry_eq PARAMS ((const PTR, const PTR));
static hashval_t in_named_entry_hash PARAMS ((const PTR));
#ifdef ASM_OUTPUT_BSS
@@ -189,6 +187,7 @@ static int const_str_htab_eq PARAMS ((const void *x, const void *y));
static void const_str_htab_del PARAMS ((void *));
static void asm_emit_uninitialised PARAMS ((tree, const char*, int, int));
static void resolve_unique_section PARAMS ((tree, int));
+static void mark_weak PARAMS ((tree));
static enum in_section { no_section, in_text, in_data, in_named
#ifdef BSS_SECTION_ASM_OP
@@ -445,11 +444,15 @@ named_section (decl, name, reloc)
flags = (* targetm.section_type_flags) (decl, name, reloc);
/* Sanity check user variables for flag changes. Non-user
- section flag changes will abort in named_section_flags. */
+ section flag changes will abort in named_section_flags.
+ However, don't complain if SECTION_OVERRIDE is set.
+ We trust that the setter knows that it is safe to ignore
+ the default flags for this decl. */
if (decl && ! set_named_section_flags (name, flags))
{
- error_with_decl (decl, "%s causes a section type conflict");
flags = get_named_section_flags (name);
+ if ((flags & SECTION_OVERRIDE) == 0)
+ error_with_decl (decl, "%s causes a section type conflict");
}
named_section_flags (name, flags);
@@ -1233,18 +1236,7 @@ assemble_start_function (decl, fnname)
weak_global_object_name = name;
}
-#ifdef ASM_WEAKEN_LABEL
- if (DECL_WEAK (decl))
- {
- ASM_WEAKEN_LABEL (asm_out_file, fnname);
- /* Remove this function from the pending weak list so that
- we do not emit multiple .weak directives for it. */
- remove_from_pending_weak_list
- (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
- }
- else
-#endif
- ASM_GLOBALIZE_LABEL (asm_out_file, fnname);
+ globalize_decl (decl);
}
/* Do any machine/system dependent processing of the function name */
@@ -1403,6 +1395,10 @@ asm_emit_uninitialised (decl, name, size, rounded)
destination = asm_dest_common;
}
+ if (destination == asm_dest_bss)
+ globalize_decl (decl);
+ resolve_unique_section (decl, 0);
+
if (flag_shared_data)
{
switch (destination)
@@ -1427,8 +1423,6 @@ asm_emit_uninitialised (decl, name, size, rounded)
}
}
- resolve_unique_section (decl, 0);
-
switch (destination)
{
#ifdef ASM_EMIT_BSS
@@ -1639,20 +1633,7 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
/* First make the assembler name(s) global if appropriate. */
if (TREE_PUBLIC (decl) && DECL_NAME (decl))
- {
-#ifdef ASM_WEAKEN_LABEL
- if (DECL_WEAK (decl))
- {
- ASM_WEAKEN_LABEL (asm_out_file, name);
- /* Remove this variable from the pending weak list so that
- we do not emit multiple .weak directives for it. */
- remove_from_pending_weak_list
- (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
- }
- else
-#endif
- ASM_GLOBALIZE_LABEL (asm_out_file, name);
- }
+ globalize_decl (decl);
/* Output any data that we will need to use the address of. */
if (DECL_INITIAL (decl) == error_mark_node)
@@ -1686,7 +1667,7 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
if (!dont_output_data)
{
- if (DECL_INITIAL (decl))
+ if (DECL_INITIAL (decl) && DECL_INITIAL (decl) != error_mark_node)
/* Output the actual data. */
output_constant (DECL_INITIAL (decl),
tree_low_cst (DECL_SIZE_UNIT (decl), 1),
@@ -2378,7 +2359,8 @@ decode_addr_const (exp, value)
value->offset = offset;
}
-enum kind { RTX_DOUBLE, RTX_INT };
+/* We do RTX_UNSPEC + XINT (blah), so nothing can go after RTX_UNSPEC. */
+enum kind { RTX_UNKNOWN, RTX_DOUBLE, RTX_INT, RTX_VECTOR, RTX_UNSPEC };
struct rtx_const
{
ENUM_BITFIELD(kind) kind : 16;
@@ -2387,6 +2369,10 @@ struct rtx_const
union real_extract du;
struct addr_const addr;
struct {HOST_WIDE_INT high, low;} di;
+
+ /* The max vector size we have is 8 wide. This should be enough. */
+ HOST_WIDE_INT veclo[16];
+ HOST_WIDE_INT vechi[16];
} un;
};
@@ -3296,7 +3282,11 @@ output_constant_def (exp, defer)
encoded in it. */
if (! found)
{
- ENCODE_SECTION_INFO (exp);
+ /* Take care not to invoque ENCODE_SECTION_INFO for constants
+ which don't have a TREE_CST_RTL. */
+ if (TREE_CODE (exp) != INTEGER_CST)
+ ENCODE_SECTION_INFO (exp);
+
desc->rtl = rtl;
desc->label = XSTR (XEXP (desc->rtl, 0), 0);
}
@@ -3576,6 +3566,34 @@ decode_rtx_const (mode, x, value)
}
break;
+ case CONST_VECTOR:
+ {
+ int units, i;
+ rtx elt;
+
+ units = CONST_VECTOR_NUNITS (x);
+ value->kind = RTX_VECTOR;
+ value->mode = mode;
+
+ for (i = 0; i < units; ++i)
+ {
+ elt = CONST_VECTOR_ELT (x, i);
+ if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
+ {
+ value->un.veclo[i] = (HOST_WIDE_INT) INTVAL (elt);
+ value->un.vechi[i] = 0;
+ }
+ else if (GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
+ {
+ value->un.veclo[i] = (HOST_WIDE_INT) CONST_DOUBLE_LOW (elt);
+ value->un.vechi[i] = (HOST_WIDE_INT) CONST_DOUBLE_HIGH (elt);
+ }
+ else
+ abort ();
+ }
+ }
+ break;
+
case CONST_INT:
value->un.addr.offset = INTVAL (x);
break;
@@ -3606,10 +3624,28 @@ decode_rtx_const (mode, x, value)
break;
default:
- abort ();
+ value->kind = RTX_UNKNOWN;
+ break;
+ }
+
+ if (value->kind == RTX_INT && value->un.addr.base != 0
+ && GET_CODE (value->un.addr.base) == UNSPEC)
+ {
+ /* For a simple UNSPEC, the base is set to the
+ operand, the kind field is set to the index of
+ the unspec expression.
+ Together with the code below, in case that
+ the operand is a SYMBOL_REF or LABEL_REF,
+ the address of the string or the code_label
+ is taken as base. */
+ if (XVECLEN (value->un.addr.base, 0) == 1)
+ {
+ value->kind = RTX_UNSPEC + XINT (value->un.addr.base, 1);
+ value->un.addr.base = XVECEXP (value->un.addr.base, 0, 0);
+ }
}
- if (value->kind == RTX_INT && value->un.addr.base != 0)
+ if (value->kind > RTX_DOUBLE && value->un.addr.base != 0)
switch (GET_CODE (value->un.addr.base))
{
case SYMBOL_REF:
@@ -3639,8 +3675,11 @@ simplify_subtraction (x)
decode_rtx_const (GET_MODE (x), XEXP (x, 0), &val0);
decode_rtx_const (GET_MODE (x), XEXP (x, 1), &val1);
- if (val0.un.addr.base == val1.un.addr.base)
+ if (val0.kind > RTX_DOUBLE
+ && val0.kind == val1.kind
+ && val0.un.addr.base == val1.un.addr.base)
return GEN_INT (val0.un.addr.offset - val1.un.addr.offset);
+
return x;
}
@@ -3842,6 +3881,19 @@ get_pool_constant (addr)
return (find_pool_constant (cfun, addr))->constant;
}
+/* Given a constant pool SYMBOL_REF, return the corresponding constant
+ and whether it has been output or not. */
+
+rtx
+get_pool_constant_mark (addr, pmarked)
+ rtx addr;
+ bool *pmarked;
+{
+ struct pool_constant *pool = find_pool_constant (cfun, addr);
+ *pmarked = (pool->mark != 0);
+ return pool->constant;
+}
+
/* Likewise, but for the constant pool of a specific function. */
rtx
@@ -3982,6 +4034,46 @@ output_constant_pool (fnname, fndecl)
assemble_integer (x, GET_MODE_SIZE (pool->mode), pool->align, 1);
break;
+ case MODE_VECTOR_FLOAT:
+ {
+ int i, units;
+ rtx elt;
+
+ if (GET_CODE (x) != CONST_VECTOR)
+ abort ();
+
+ units = CONST_VECTOR_NUNITS (x);
+
+ for (i = 0; i < units; i++)
+ {
+ elt = CONST_VECTOR_ELT (x, i);
+ memcpy ((char *) &u,
+ (char *) &CONST_DOUBLE_LOW (elt),
+ sizeof u);
+ assemble_real (u.d, GET_MODE_INNER (pool->mode), pool->align);
+ }
+ }
+ break;
+
+ case MODE_VECTOR_INT:
+ {
+ int i, units;
+ rtx elt;
+
+ if (GET_CODE (x) != CONST_VECTOR)
+ abort ();
+
+ units = CONST_VECTOR_NUNITS (x);
+
+ for (i = 0; i < units; i++)
+ {
+ elt = CONST_VECTOR_ELT (x, i);
+ assemble_integer (elt, GET_MODE_UNIT_SIZE (pool->mode),
+ pool->align, 1);
+ }
+ }
+ break;
+
default:
abort ();
}
@@ -4230,6 +4322,7 @@ initializer_constant_valid_p (value, endtype)
return TREE_STATIC (value) ? null_pointer_node : 0;
case INTEGER_CST:
+ case VECTOR_CST:
case REAL_CST:
case STRING_CST:
case COMPLEX_CST:
@@ -4348,8 +4441,37 @@ initializer_constant_valid_p (value, endtype)
tree op0, op1;
op0 = TREE_OPERAND (value, 0);
op1 = TREE_OPERAND (value, 1);
- STRIP_NOPS (op0);
- STRIP_NOPS (op1);
+
+ /* Like STRIP_NOPS except allow the operand mode to widen.
+ This works around a feature of fold that simplfies
+ (int)(p1 - p2) to ((int)p1 - (int)p2) under the theory
+ that the narrower operation is cheaper. */
+
+ while (TREE_CODE (op0) == NOP_EXPR
+ || TREE_CODE (op0) == CONVERT_EXPR
+ || TREE_CODE (op0) == NON_LVALUE_EXPR)
+ {
+ tree inner = TREE_OPERAND (op0, 0);
+ if (inner == error_mark_node
+ || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
+ || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))
+ > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
+ break;
+ op0 = inner;
+ }
+
+ while (TREE_CODE (op1) == NOP_EXPR
+ || TREE_CODE (op1) == CONVERT_EXPR
+ || TREE_CODE (op1) == NON_LVALUE_EXPR)
+ {
+ tree inner = TREE_OPERAND (op1, 0);
+ if (inner == error_mark_node
+ || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
+ || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))
+ > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
+ break;
+ op1 = inner;
+ }
if (TREE_CODE (op0) == ADDR_EXPR
&& TREE_CODE (TREE_OPERAND (op0, 0)) == LABEL_DECL
@@ -4465,6 +4587,7 @@ output_constant (exp, size, align)
break;
case ARRAY_TYPE:
+ case VECTOR_TYPE:
if (TREE_CODE (exp) == CONSTRUCTOR)
{
output_constructor (exp, size, align);
@@ -4864,39 +4987,80 @@ output_constructor (exp, size, align)
assemble_zeros (size - total_bytes);
}
-
-/* This structure contains any weak symbol declarations waiting
+/* This TREE_LIST contains any weak symbol declarations waiting
to be emitted. */
-struct weak_syms
-{
- struct weak_syms * next;
- const char * name;
- const char * value;
-};
+static tree weak_decls;
-static struct weak_syms * weak_decls;
+/* Mark DECL as weak. */
-/* Add function NAME to the weak symbols list. VALUE is a weak alias
- associated with NAME. */
-
-int
-add_weak (name, value)
- const char *name;
- const char *value;
+static void
+mark_weak (decl)
+ tree decl;
{
- struct weak_syms *weak;
+ DECL_WEAK (decl) = 1;
- weak = (struct weak_syms *) xmalloc (sizeof (struct weak_syms));
+ if (DECL_RTL_SET_P (decl)
+ && GET_CODE (DECL_RTL (decl)) == MEM
+ && XEXP (DECL_RTL (decl), 0)
+ && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
+ SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
+}
+
+/* Merge weak status between NEWDECL and OLDDECL. */
- if (weak == NULL)
- return 0;
+void
+merge_weak (newdecl, olddecl)
+ tree newdecl;
+ tree olddecl;
+{
+ if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
+ return;
- weak->next = weak_decls;
- weak->name = name;
- weak->value = value;
- weak_decls = weak;
+ if (SUPPORTS_WEAK
+ && DECL_WEAK (newdecl)
+ && DECL_EXTERNAL (newdecl) && DECL_EXTERNAL (olddecl)
+ && (TREE_CODE (olddecl) != VAR_DECL || ! TREE_STATIC (olddecl))
+ && TREE_USED (olddecl)
+ && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)))
+ warning_with_decl (newdecl, "weak declaration of `%s' after first use results in unspecified behavior");
- return 1;
+ if (DECL_WEAK (newdecl))
+ {
+ tree wd;
+
+ /* NEWDECL is weak, but OLDDECL is not. */
+
+ /* If we already output the OLDDECL, we're in trouble; we can't
+ go back and make it weak. This error cannot caught in
+ declare_weak because the NEWDECL and OLDDECL was not yet
+ been merged; therefore, TREE_ASM_WRITTEN was not set. */
+ if (TREE_CODE (olddecl) == FUNCTION_DECL && TREE_ASM_WRITTEN (olddecl))
+ error_with_decl (newdecl,
+ "weak declaration of `%s' must precede definition");
+
+ if (SUPPORTS_WEAK)
+ {
+ /* We put the NEWDECL on the weak_decls list at some point.
+ Replace it with the OLDDECL. */
+ for (wd = weak_decls; wd; wd = TREE_CHAIN (wd))
+ if (TREE_VALUE (wd) == newdecl)
+ {
+ TREE_VALUE (wd) = olddecl;
+ break;
+ }
+ /* We may not find the entry on the list. If NEWDECL is a
+ weak alias, then we will have already called
+ globalize_decl to remove the entry; in that case, we do
+ not need to do anything. */
+ }
+
+ /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping. */
+ mark_weak (olddecl);
+ }
+ else
+ /* OLDDECL was weak, but NEWDECL was not explicitly marked as
+ weak. Just update NEWDECL to indicate that it's weak too. */
+ mark_weak (newdecl);
}
/* Declare DECL to be a weak symbol. */
@@ -4907,14 +5071,17 @@ declare_weak (decl)
{
if (! TREE_PUBLIC (decl))
error_with_decl (decl, "weak declaration of `%s' must be public");
- else if (TREE_ASM_WRITTEN (decl))
+ else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
error_with_decl (decl, "weak declaration of `%s' must precede definition");
else if (SUPPORTS_WEAK)
- add_weak (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), NULL);
+ {
+ if (! DECL_WEAK (decl))
+ weak_decls = tree_cons (NULL, decl, weak_decls);
+ }
else
warning_with_decl (decl, "weak declaration of `%s' not supported");
- DECL_WEAK (decl) = 1;
+ mark_weak (decl);
}
/* Emit any pending weak declarations. */
@@ -4922,48 +5089,65 @@ declare_weak (decl)
void
weak_finish ()
{
- if (SUPPORTS_WEAK)
+ tree t;
+
+ for (t = weak_decls; t ; t = TREE_CHAIN (t))
{
- struct weak_syms *t;
- for (t = weak_decls; t; t = t->next)
- {
-#ifdef ASM_OUTPUT_WEAK_ALIAS
- ASM_OUTPUT_WEAK_ALIAS (asm_out_file, t->name, t->value);
+ tree decl = TREE_VALUE (t);
+ const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
+
+ if (! TREE_USED (decl))
+ continue;
+
+#ifdef ASM_WEAKEN_DECL
+ ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL);
#else
#ifdef ASM_WEAKEN_LABEL
- if (t->value)
- abort ();
- ASM_WEAKEN_LABEL (asm_out_file, t->name);
+ ASM_WEAKEN_LABEL (asm_out_file, name);
+#else
+#ifdef ASM_OUTPUT_WEAK_ALIAS
+ warning ("only weak aliases are supported in this configuration");
+ return;
+#endif
#endif
#endif
- }
}
}
-/* Remove NAME from the pending list of weak symbols. This prevents
- the compiler from emitting multiple .weak directives which confuses
- some assemblers. */
-#ifdef ASM_WEAKEN_LABEL
+/* Emit the assembly bits to indicate that DECL is globally visible. */
+
static void
-remove_from_pending_weak_list (name)
- const char *name;
+globalize_decl (decl)
+ tree decl;
{
- struct weak_syms *t;
- struct weak_syms **p;
+ const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
- for (p = &weak_decls; *p; )
+#if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
+ if (DECL_WEAK (decl))
{
- t = *p;
- if (strcmp (name, t->name) == 0)
- {
- *p = t->next;
- free (t);
- }
- else
- p = &(t->next);
+ tree *p, t;
+
+#ifdef ASM_WEAKEN_DECL
+ ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
+#else
+ ASM_WEAKEN_LABEL (asm_out_file, name);
+#endif
+
+ /* Remove this function from the pending weak list so that
+ we do not emit multiple .weak directives for it. */
+ for (p = &weak_decls; (t = *p) ; )
+ {
+ if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
+ *p = TREE_CHAIN (t);
+ else
+ p = &TREE_CHAIN (t);
+ }
+ return;
}
+#endif
+
+ ASM_GLOBALIZE_LABEL (asm_out_file, name);
}
-#endif /* ASM_WEAKEN_LABEL */
/* Emit an assembler directive to make the symbol for DECL an alias to
the symbol for TARGET. */
@@ -4982,22 +5166,8 @@ assemble_alias (decl, target)
#ifdef ASM_OUTPUT_DEF
/* Make name accessible from other files, if appropriate. */
-
if (TREE_PUBLIC (decl))
- {
-#ifdef ASM_WEAKEN_LABEL
- if (DECL_WEAK (decl))
- {
- ASM_WEAKEN_LABEL (asm_out_file, name);
- /* Remove this function from the pending weak list so that
- we do not emit multiple .weak directives for it. */
- remove_from_pending_weak_list
- (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
- }
- else
-#endif
- ASM_GLOBALIZE_LABEL (asm_out_file, name);
- }
+ globalize_decl (decl);
#ifdef ASM_OUTPUT_DEF_FROM_DECLS
ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
@@ -5005,12 +5175,16 @@ assemble_alias (decl, target)
ASM_OUTPUT_DEF (asm_out_file, name, IDENTIFIER_POINTER (target));
#endif
TREE_ASM_WRITTEN (decl) = 1;
-#else
-#ifdef ASM_OUTPUT_WEAK_ALIAS
+#else /* !ASM_OUTPUT_DEF */
+#if defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
if (! DECL_WEAK (decl))
warning ("only weak aliases are supported in this configuration");
+#ifdef ASM_WEAKEN_DECL
+ ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
+#else
ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
+#endif
TREE_ASM_WRITTEN (decl) = 1;
#else
warning ("alias definitions not supported in this configuration; ignored");
@@ -5071,6 +5245,7 @@ init_varasm_once ()
mark_const_hash_entry);
ggc_add_root (&const_str_htab, 1, sizeof const_str_htab,
mark_const_str_htab);
+ ggc_add_tree_root (&weak_decls, 1);
const_alias_set = new_alias_set ();
}
diff --git a/contrib/gcc/version.c b/contrib/gcc/version.c
index b124c40..2e6c73a 100644
--- a/contrib/gcc/version.c
+++ b/contrib/gcc/version.c
@@ -1,4 +1,4 @@
#include "ansidecl.h"
#include "version.h"
-const char *const version_string = "3.1 20020201 (experimental)";
+const char *const version_string = "3.1 20020509 (prerelease)";
diff --git a/contrib/gcc/vmsdbgout.c b/contrib/gcc/vmsdbgout.c
index 8b19775..7332389 100644
--- a/contrib/gcc/vmsdbgout.c
+++ b/contrib/gcc/vmsdbgout.c
@@ -1458,15 +1458,26 @@ lookup_filename (file_name)
if (stat (file_name, &statbuf) == 0)
{
- cdt = 10000000 * (statbuf.st_ctime + vms_epoch_offset);
- ebk = statbuf.st_size / 512 + 1;
- ffb = statbuf.st_size - ((statbuf.st_size / 512) * 512);
+ long gmtoff;
#ifdef VMS
+ struct tm *ts;
+
+ /* Adjust for GMT */
+ ts = (struct tm *) localtime (&statbuf.st_ctime);
+ gmtoff = ts->tm_gmtoff;
+
+ /* VMS has multiple file format types */
rfo = statbuf.st_fab_rfm;
#else
+ /* Is GMT adjustment an issue with a cross-compiler? */
+ gmtoff = 0;
+
/* Assume stream LF type file */
rfo = 2;
#endif
+ cdt = 10000000 * (statbuf.st_ctime + gmtoff + vms_epoch_offset);
+ ebk = statbuf.st_size / 512 + 1;
+ ffb = statbuf.st_size - ((statbuf.st_size / 512) * 512);
fnam = full_name (file_name);
flen = strlen (fnam);
}
@@ -1639,7 +1650,7 @@ vmsdbgout_init (main_input_filename)
module_producer
= (char *) xmalloc (strlen (language_string) + 1
- + strlen (version_string + 1));
+ + strlen (version_string) + 1);
sprintf (module_producer, "%s %s", language_string, version_string);
ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0);
OpenPOWER on IntegriCloud